Critère qui se veut conditionelle et comparative en même temps

Bonsoir,

Sur la table ARTICLES j'ai ajouté un champ de date. Ce champ possède une vrai date ou il a la valeur "000-00-00". Et je veux filtrer sur ce champ seulement si un parametre 'madate' est mise dans l'URL :

<BOUCLE1(ARTICLES){madate < #ENV{madate}}>
...

marche bien, lorsque le paramètre est présent.
Mais lorsqu'il n'y a pas de paramètere j'ai besoin que tous les articles s'affiche.

En fait j'aurais besoin de
<BOUCLE1(ARTICLES){madate < #ENV{madate} ?}>

-- mais qui ne marche pas, évidemment.

Est-ce que quelqu'un a une idée comment je devrais essayer de résoudre ce problème ?

merci,
Paolo

Paolo a écrit :

Est-ce que quelqu'un a une idée comment je devrais essayer de résoudre ce problème ?

un truc à la louche :
   <BOUCLE1(ARTICLES){madate < #ENV{madate}|sinon{9999-99-99}}>

(pas testé sur ce coup)

denisb a écrit :

(pas testé sur ce coup)

testé.
ok.

Je dirais même plus :

<BOUCLE1(ARTICLES){madate < #ENV{madate,9999-99-99}>

Pas testé non plus, c’est juste pour le fun :wink:

Laurent

denisb a écrit :

Laurent a écrit :

<BOUCLE1(ARTICLES){madate < #ENV{madate,9999-99-99}>

plus joli !
testé, ok.

Laurent wrote:

<BOUCLE1(ARTICLES){madate < #ENV{madate,9999-99-99}>

Merci à toi et à denisb.
Pourtant cela ne marche pas chez moi.

Par exemple, lorsque #ENV{madate}=1989-01-01
je reçois les articles non seulement qui ont une vraie date avant 1989-01-01, mais aussi tous les autres qui n'ont pas de vraie date et qui ont la valeur par défaut "0000-00-00".

Paolo

Dans la mesure où 0000-00-00 est bien inférieur à 1989-01-01 il doit falloir ajouter un critère de plus du genre

<BOUCLE1(ARTICLES){madate < #ENV{madate,9999-99-99}{madate > 0000-00-00}>

Paolo a écrit :

Laurent wrote:

Dans la mesure où 0000-00-00 est bien inférieur à 1989-01-01 il doit falloir ajouter un critère de plus du genre

<BOUCLE1(ARTICLES){madate < #ENV{madate,9999-99-99}{madate > 0000-00-00}>

Et comme ça, lorsque je n'ai pas de "madate" dans l'URL je n'aurai pas tous les articles, mais seulement ceux pour qui cette date a été fixée. Il me semble que cela coince soit d'un côté, soit de l'autre.

Paolo

Je ne suis pas sûr de mon coup…

[(#SET{montest,[(#ENV{madate}|!={’’}|?{‹ 0000-00-00 ›,‹ toto ›})]})]
<BOUCLE1(ARTICLES){madate < #ENV{madate,9999-99-99}{madate !== ^(#GET{montest})$}>

Paolo a écrit :

Laurent wrote:

Je ne suis pas sûr de mon coup...

[(#SET{montest,[(#ENV{madate}|!={''}|?{'0000-00-00','toto'})]})]
<BOUCLE1(ARTICLES){madate < #ENV{madate,9999-99-99}{madate !== ^(#GET{montest})$}>

Alors, après un ou deux testes, il semble que cela marche ! (Il manque juste un crochet fermant dans le premier critère.)

Mais je ne vois pas pourquoi encore. Je vais essayer de comprendre :wink:

D'ailleurs, comme il s'agit d'une date de naissance, et je découvre que je peux utiliser le critère {age_xxx} dessus (c'est à dire, si je donne le nom "date_birth" au champ, le critère {age_birth} s'y applique), je vais essayer de convertir ton code pour ce critère. Mon idée c'est d'avoir deux <INPUT> : agemin et agemax pour faire des critères comme :

{age_birth <= #ENV{agemin}|mult{365}}
{age_birth >= #ENV{agemax}|mult{365}}

seulement, j'y rencontre exactement le même problème des 0000-00-00. Ton idée va être précieuse alors.

merci, Paolo

Vite fait si ca peut t’aider à comprendre :

tu crée une variable montest.

Si ENV{madate} existe alors tu affectes la valeur 0000-00-00 à la variable montest, ensuite du dit que tu veux toutes les dates inférieures à ENV{madate} et différentes de 0000-00-00
Si ENV{madate} n’existe pas alors tu donne une valeur bidon (ici ‹ toto ›) à montest pour être sur que ENV{madate} sera toujours différente de montest et donc te renvoie toutes les valeurs inférieures à 9999-99-99

Un peu tiré par les cheveux mais si quelqu’un à mieux je suis curieux de voir la soluce :slight_smile:

Laurent

Paolo a écrit :

Laurent wrote:

Vite fait si ca peut t'aider à comprendre :

Oui, merci - 5 minutes de calme m'ont permis de comprendre ton astuce.

Un peu tiré par les cheveux mais si quelqu'un à mieux je suis curieux de voir la soluce :slight_smile:

Je pense qu'on peut demander aux devs si quelque chose comme
{age > #ENV{agemin} ?} ne pourrait pas être inventé. L'utilité est (je pense) évidente. Mais pour le moment je suis bien reconnaissant de ton idée !

Paolo

Paolo a écrit :

Un peu tiré par les cheveux mais si quelqu'un à mieux je suis curieux de voir la soluce :slight_smile:

<BOUCLE_art_mot(ARTICLES)
      {date < #ENV{la_date, 9999-99-99}}
      {date !IN #ENV{la_date}|?{0000-00-00, 9999-99-99}}
>

si variable dans l'url,
alors tous les articles antérieurs à date *sauf* date = 0000-00-00
   ?page=test_boucle&la_date=2009-01-11

   SELECT articles.id_article, articles.date, articles.lang
     FROM spip_articles AS `articles`
    WHERE articles.statut = 'publie'
      AND articles.date < '9999-12-31'
      AND articles.date < '2009-01-11'
      AND articles.date NOT IN ('0000-00-00')

si pas de variable dans l'url,
alors tous les articles *y compris* date = 0000-00-00
   ?page=test_boucle

   SELECT articles.id_article, articles.date, articles.lang
     FROM spip_articles AS `articles`
    WHERE articles.statut = 'publie'
      AND articles.date < '9999-12-31'
      AND articles.date < '9999-99-99'
      AND articles.date NOT IN ('9999-99-99')

Joli :slight_smile:

Mais donc il n’y a pas besoin des crochets sur les variables filtrées dans un critère de boucle ? Chavais pas, c’est cool !

Laurent

denisb a écrit :

denisb wrote:

<BOUCLE_art_mot(ARTICLES)
     {date < #ENV{la_date, 9999-99-99}}
     {date !IN #ENV{la_date}|?{0000-00-00, 9999-99-99}}
>

Oui, merci. En effet pas besoin d'expression régulière.

{date_birth < #ENV{agemin,9999-99-99}|approxdate}
{date_birth != #ENV{agemin}|?{0000-00-00, 9999-99-99}}

et dans mes_fonctions.php :

function approxdate( $age=NULL ) {
   if (($age == "9999-99-99")) { return $age; }
$mydate = strtotime(date('Y-m-d'));
$mydate = strtotime("-".$age."Year", $mydate);
return date('Y-m-d', $mydate);
}

Ainsi, un url avec agemin=21 me donne seulement ceux qui ont au moins 21 ans, en excluant les incertains et un url sans paramètre agemin rend toutes les fiches.

Grand merci à vous deux !

Paolo