CMS Automne
http://www.automne-cms.org/forum/

[Résolu] Affichage d'un objet selon une date
http://www.automne-cms.org/forum/viewtopic.php?f=2&t=652
Page 1 sur 2

Auteur:  Jean-Christophe B. [ Mar Mai 25, 2010 9:34 pm ]
Sujet du message:  [Résolu] Affichage d'un objet selon une date

Bonsoir,

Je continue mon exploration d'Automne CMS et j'ai donc à nouveau besoin d'aide.

J'ai créé un module pour gérer les spectacles d'une association. Dans ce module, j'ai un objet Spectacle qui comporte plusieurs champs dont un qui permet de stocker la date à laquelle va avoir lieu le spectacle.

L'idée est de pouvoir créer deux rangées: une qui affiche les spectacles à venir—donc ceux dont la date est supérieure à celle du jour, et une avec les spectacles passés. Et c'est là où je bloque. J'imagine que je dois utiliser la balise <atm-if> mais je ne sais pas commencer récupérer la date du jour afin de gérer la condition. Voici mon début de code:
Code :
<row>
  <block module="spectacles" id="spectacles" language="fr">
    <ul>
      <atm-search what="{Spectacle}" name="spectacles">
        <atm-search-order search="spectacles" type="{Spectacle:Date:fieldID}" direction="asc" />
        <atm-result search="spectacles">
          <atm-if what="{Spectacle:Date:fieldID}>{DateDuJour}">
            <li>{Spectacle:Date:label} - {Spectacle:Lieu:label} <em>{Spectacle:Etablissement:label}</em></li>
          </atm-if>
        </atm-result>
      </atm-search>
    </ul>
  </block>
</row>

J'ai mis {DateDujour} simplement pour illustrer mon code (je me doute bien que ce n'est pas la bonne syntaxe !).
Je ne sais pas non plus si on peut utiliser directement l'opérateur de comparaison > dans le code.

Quelqu'un pourrait-il m'éclairer ?

Auteur:  Sébastien [ Mer Mai 26, 2010 8:56 am ]
Sujet du message:  Re: Affichage d'un objet selon une date

Bonjour Jean-Christophe,

Voila la bonne syntaxe :

Code :
<row>
  <block module="spectacles" id="spectacles" language="fr">
    <ul>
      <?php
      $today = date('Y-m-d');
      ?>
      <atm-search what="{Spectacle}" name="spectacles">
        <atm-search-order search="spectacles" type="{Spectacle:Date:fieldID}" direction="asc" />
        <atm-search-param search="spectacles" type="{Spectacle:Date:fieldID}" value="{var:string:today}" operator="&gt;" />
        <atm-result search="spectacles">
            <li>{Spectacle:Date:label} - {Spectacle:Lieu:label} <em>{Spectacle:Etablissement:label}</em></li>
        </atm-result>
      </atm-search>
    </ul>
  </block>
</row>


En gros, tu déclares ta date dans une variable PHP, puis tu passes ça en filtre sur ta recherche avec un opérateur pour spécifier que tu cherches uniquement les spectacles supérieurs à cette date.
Pour éviter une erreur de parsing XML, il te faut encoder le '>' dans ton paramètre operator.

Seb

Auteur:  Jean-Christophe B. [ Mer Mai 26, 2010 10:12 am ]
Sujet du message:  Re: Affichage d'un objet selon une date

Bonjour Sébastien,

Merci bien, je comprends mon erreur et surtout, j'ai enfin saisi l'utilité de la balise <atm-search-param>. J'avoue qu'au départ, j'avais du mal à définir dans quel cas l'utiliser (d'où mon erreur de partir sur <atm-if>). Cette fois-ci, c'est très clair.

Pour en revenir au code, il manquait simplement le paramètre mandatory et ça fonctionne à merveille. Je reposte le code complet au cas où quelqu'un aurait le même besoin:
Code :
<row>
  <block module="spectacles" id="spectacles" language="fr">
    <ul>
      <?php
      $today = date('Y-m-d');
      ?>
      <atm-search what="{Spectacle}" name="spectacles">
        <atm-search-order search="spectacles" type="{Spectacle:Date:fieldID}" direction="asc" />
        <atm-search-param search="spectacles" type="{Spectacle:Date:fieldID}" value="{var:string:today}" operator="&gt;" mandatory="true" />
        <atm-result search="spectacles">
            <li>{Spectacle:Date:label} - {Spectacle:Lieu:label} <em>{Spectacle:Etablissement:label}</em></li>
        </atm-result>
      </atm-search>
    </ul>
  </block>
</row>

Je peux donc continuer à avancer sur mon projet... :D

Auteur:  Frank [ Mer Mai 26, 2010 10:49 am ]
Sujet du message:  Re: [Résolu] Affichage d'un objet selon une date

... suite à ta demande, on est en train de réfléchir sur la possibilité de pouvoir utiliser la syntaxe des variables Automne pour accéder à la date du jour et pouvoir faire des traitements dessus. Si tu as d'autres idées sur le sujet, n'hésites pas.

Pour la date du jour ça pourrait ressembler à {date:today:d/m/Y} pa exemple mais on peut imaginer aussi pouvoir utiliser ce genre de choses {date:+2weeks:format} ...

Pour l'utilité de la balise <atm-search-param>, comme son nom l'indique il sert à spécifier les paramètres d'une recherche dans un module.

Il est vrai que la documentation est peut-être un peu trop succincte sur le sujet
Citer:
Paramètre de recherche :
Code :
<atm-search-param search="searchName" type="paramType" value="paramValue" mandatory="mandatoryValue" />


Permet de limiter les résultats de la recherche à des paramètres donnés.

Auteur:  Jean-Christophe B. [ Mer Mai 26, 2010 5:13 pm ]
Sujet du message:  Re: [Résolu] Affichage d'un objet selon une date

Frank a écrit:
... suite à ta demande, on est en train de réfléchir sur la possibilité de pouvoir utiliser la syntaxe des variables Automne pour accéder à la date du jour et pouvoir faire des traitements dessus. Si tu as d'autres idées sur le sujet, n'hésites pas.

Pour la date du jour ça pourrait ressembler à {date:today:d/m/Y} pa exemple mais on peut imaginer aussi pouvoir utiliser ce genre de choses {date:+2weeks:format} ...


Effectivement, ça pourrait être bien pratique. Surtout pour les personnes comme moi qui sont très versés HTML/CSS mais un peu moins PHP. Quoique la fonction date(), ça reste assez simple à utiliser...

Je n'ai pas d'idées particulières sur ce sujet pour le moment, mais j'y repenserais à l'occasion... Je suis loin d'en avoir fini avec le développement du projet et il me reste encore pas mal de choses à maîtriser.

Auteur:  Frank [ Mer Mai 26, 2010 5:21 pm ]
Sujet du message:  Re: [Résolu] Affichage d'un objet selon une date

Jean-Christophe B a écrit:
Effectivement, ça pourrait être bien pratique. Surtout pour les personnes comme moi qui sont très versés HTML/CSS mais un peu moins PHP. Quoique la fonction date(), ça reste assez simple à utiliser...


En effet Automne vise clairement les intégrateurs front-end, pour le moment il va falloir encore passer par la fonction date() mais on a noté ça dans la TODO :)

Auteur:  Jean-Christophe B. [ Lun Juin 07, 2010 10:30 am ]
Sujet du message:  Re: [Résolu] Affichage d'un objet selon une date

Je reprends ce fil car j'ai besoin d'aide sur le code créé précédemment.

Mon besoin maintenant est de créer une liste déroulante pour trier les spectacles passés par année. Voici le code que j'ai créé pour le moment:
Code :
<row>
  <block module="spectacles" id="spectacles" language="fr">
   
    <form action="{page:self:url}" method="get">
      <label for="annee">Année</label><br />
      <select id="annee" name="annee">
        <option value=""> </option>
        <option value="2010">2010</option>
        <option value="2009">2009</option>
      </select>
      <input type="submit" name="search" id="submitSearch" value="ok" />
    </form>
   
    <ul class="liste-spectacles">
      <?php
        $today = date('Y-m-d');
        ?>
      <atm-search what="{Spectacle}" name="spectacles">
        <atm-search-param search="spectacles" type="{Spectacle:Date:formatedValue|Y}" value="{request:int:annee}" mandatory="false" />
        <atm-search-order search="spectacles" type="{Spectacle:Date:fieldID}" direction="asc" />
        <atm-search-param search="spectacles" type="{Spectacle:Date:fieldID}" value="{var:string:today}" operator="&lt;" mandatory="true" />
        <atm-search-param search="spectacles" type="{Spectacle:Date:fieldID}" value="block" mandatory="false" />
        <atm-result search="spectacles">
          <li>{Spectacle:Date:formatedValue|d M Y} - {Spectacle:Lieu:label} <em>{Spectacle:Etablissement:label}</em></li>
        </atm-result>
      </atm-search>
    </ul>
  </block>
</row>

Bien entendu, ça ne fonctionne pas.
Pour récupérer l'année de l'objet, j'ai utilisé la syntaxe {Spectacle:Date:formatedValue|Y} que j'ai passé comme valeur type dans un atm-search mais apparemment, ce n'est pas accepté.

Quelle serait donc la bonne syntaxe à utiliser ?
J'ai lu dans un autre fil qu'on pouvait utiliser la fonction getYear() mais j'avoue que je ne sais pas trop comment l'utiliser.

Deux autre questions liées à ce même code:
  • Dans l'affichage de la date des spectacles, j'utilise {Spectacle:Date:formatedValue|d M Y}. Ca fonctionne, mais c'est affiché en anglais. Ai-je oublié quelque chose pour passer l'affichage des dates en français ?
  • Pour le moment, les années de la liste déroulante sont codées en "dur". Comment les générer dynamiquement ?

Merci par avance.
Une fois que j'aurais réglé ces différents points, ça pourra faire un tutoriel bien utile à ajouter dans la documentation. :)

Auteur:  Sébastien [ Lun Juin 07, 2010 10:41 am ]
Sujet du message:  Re: [Résolu] Affichage d'un objet selon une date

Pour ta recherche par année, essaye plutôt ça :
Code :
<atm-search-param search="spectacles" type="{Spectacle:Date:fieldID}" value="{request:int:annee}-01-01" mandatory="false" operator="&gt;=" />
<?php
        $nextyear = {request:int:annee} + 1;
?>
<atm-search-param search="spectacles" type="{Spectacle:Date:fieldID}" value="{var:int:nextyear}-01-01" mandatory="false" operator="&lt;" />

ça permet de faire une recherche ou tous les éléments sont supérieurs ou égal au 1er janvier de l'année passée et inférieur au 1er janvier de l'année suivante. ça devrait mieux fonctionner.
Attention par contre à cette ligne dans ton code qui sera aussi prise en compte :
Code :
<atm-search-param search="spectacles" type="{Spectacle:Date:fieldID}" value="{var:string:today}" operator="&lt;" mandatory="true" />


Pour l'affichage des dates en français, tu n'as rien oublié mais il te faut la version 4.0.2 d'Automne (qui sort aujourd'hui).
Coder dynamiquement tes années dans ton select est un peu plus délicat. Il te faut d'abord faire une recherche pour trouver l'année de départ de tes spectacles (un atm-search qui ne cherche qu'un seul résultat classé par année décroissante peux te faire ça). Puis, il te faut faire une boucle en PHP (un while fera l'affaire) pour créer toutes les options de ton select depuis cette date et jusqu'à aujourd'hui.

Dis moi si tu galères je t'aiderai pour ton code.

Auteur:  Jean-Christophe B. [ Lun Juin 07, 2010 11:27 am ]
Sujet du message:  Re: [Résolu] Affichage d'un objet selon une date

Pour la recherche par année, c'est ok. Ca fonctionne... :D
Je n 'aurais pas envisagé la solution sous cet angle donc j'ai bien fait de poser la question.

En ce qui concerne l'affichage des années, je vais me pencher dessus et j'appellerais à l'aide si ça ne va pas.

Et merci pour les précisions concernant la version 4.0.2.
Je mettrais donc à jour dès qu'elle sera publiée.

Auteur:  Frank [ Lun Juin 07, 2010 11:36 am ]
Sujet du message:  Re: [Résolu] Affichage d'un objet selon une date

Jean-Christophe B. a écrit:
Et merci pour les précisions concernant la version 4.0.2.
Je mettrais donc à jour dès qu'elle sera publiée.


Attention ça sort du four, c'est encore chaud :)
http://www.automne.ws/web/fr/5-blog.php?item=530

Auteur:  Jean-Christophe B. [ Lun Juin 07, 2010 12:58 pm ]
Sujet du message:  Re: [Résolu] Affichage d'un objet selon une date

Frank a écrit:
Jean-Christophe B. a écrit:
Et merci pour les précisions concernant la version 4.0.2.
Je mettrais donc à jour dès qu'elle sera publiée.


Attention ça sort du four, c'est encore chaud :)
http://www.automne.ws/web/fr/5-blog.php?item=530


Super! Bravo à l'équipe pour cette mise à jour très riche en nouveautés...
Je vais à jour de suite, histoire de profiter des nouvelles possibilités!

Auteur:  Jean-Christophe B. [ Mar Juin 08, 2010 1:21 pm ]
Sujet du message:  Re: [Résolu] Affichage d'un objet selon une date

J'ai finalement simplifié la situation pour la liste déroulante. Je connais l'année du 1er spectacle donc celle-ci reste fixe. Voici donc le code pour le moment (il me reste juste à récupérer l'année en cours avec PHP, à la place de 2010):
Code :
<row>
  <block module="spectacles" id="spectacles" language="fr">
    <form action="{page:self:url}" method="get" id="tri-annee">
      <label for="annee">Sélectionner une année</label>
      <select id="annee" name="annee">
        <?php         
          for($a=2006; $a<=2010; $a++) {       
            print '<option value="'.$a.'">'.$a.'</option>';
          } ?>     
      </select>
      <input type="submit" name="search" id="submitSearch" value="ok" />
    </form>
   
    <ul class="liste-spectacles">
      <?php
        $today = date('Y-m-d');
        ?>
      <atm-search what="{Spectacle}" name="spectacles">
        <atm-search-param search="spectacles" type="{Spectacle:Date:fieldID}" value="{request:int:annee}-01-01" mandatory="false" operator="&gt;=" />
        <?php $nextyear = {request:int:annee} + 1;?>
        <atm-search-param search="spectacles" type="{Spectacle:Date:fieldID}" value="{var:int:nextyear}-01-01" mandatory="false" operator="&lt;" />
        <atm-search-order search="spectacles" type="{Spectacle:Date:fieldID}" direction="asc" />
        <atm-search-param search="spectacles" type="{Spectacle:Date:fieldID}" value="{var:string:today}" operator="&lt;" mandatory="true" />
        <atm-search-param search="spectacles" type="{Spectacle:Date:fieldID}" value="block" mandatory="false" />
        <atm-result search="spectacles">
          <li>{Spectacle:Date:label} - {Spectacle:Lieu:label} <em>{Spectacle:Etablissement:label}</em></li>
        </atm-result>
      </atm-search>
    </ul>
  </block>
</row>

Ca fonctionne, mais les options s'affichent en tout début de bloc, et non pas dans le <select>. Voici le code source:
Code :
<option value="2006">2006</option><option value="2007">2007</option><option value="2008">2008</option><option value="2009">2009</option><option value="2010">2010</option>
<form action="XXX/web/13-spectacles-passes.php" method="get" id="tri-annee">
   <label for="annee">Sélectionner une année</label>
   <select id="annee" name="annee">
   
   </select>
   <input type="submit" name="search" id="submitSearch" value="ok" />
</form>
 

Etonnant, non ? Serait-je passé à côté de quelque chose ?

Auteur:  Sébastien [ Mar Juin 08, 2010 2:39 pm ]
Sujet du message:  Re: [Résolu] Affichage d'un objet selon une date

Tu ne dois pas faire :
Citer:
print '<option value="'.$a.'">'.$a.'</option>';

Mais plutôt :
Code :
$content .= '<option value="'.$a.'">'.$a.'</option>';


Le contenu des rangées polymod est mis dans cette variable $content, il n'est pas envoyé directement au navigateur.

Pour l'année en cours en PHP c'est simple, tu fais
Code :
for($a = 2006; $a <= date('Y'); $a++) {

Auteur:  Jean-Christophe B. [ Mar Juin 08, 2010 3:07 pm ]
Sujet du message:  Re: [Résolu] Affichage d'un objet selon une date

Ah, je comprends mieux. J'ai dû passer à côté de cette info dans la doc...
Bref, cette fois-ci mes options s'affichent bien là où elles doivent être. :)

Auteur:  Jean-Christophe B. [ Mer Juin 09, 2010 2:02 pm ]
Sujet du message:  Re: [Résolu] Affichage d'un objet selon une date

J'ai une petite question supplémentaire, un peu plus générale.
Dans le cas où un objet n'aurait pas de champ Date, peut-on se baser sur le date de publication de l'objet pour faire le tri ? Par exemple:
Code :
<atm-search-param search="spectacles" type="publication date after" value="{request:int:annee}-01-01" mandatory="false" />
      <?php $nextyear = {request:int:annee} + 1;?>
      <atm-search-param search="spectacles" type="publication date before" value="{var:int:nextyear}-01-01" mandatory="false" />

Je viens de tester, mais ça ne fonctionne pas. A mon avis, je n'ai pas encore bien compris le fonctionnement de "publication date".
Quelle serait la bonne méthode ? Faut-il également ajouter un opérateur de comparaison ?

Je pose la question car j'aimerais faire des tri annuels sur d'autres objets, qui eux n'ont pas de champ Date.
Au pire, je pourrais toujours créer un champ Date qui se remplit automatiquement, et m'en servir pour le tri...

Page 1 sur 2 Le fuseau horaire est UTC [Heure d’été]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/