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

[Résolu] Indexation recherche et catégories
http://www.automne-cms.org/forum/viewtopic.php?f=2&t=517
Page 1 sur 2

Auteur:  dbanon [ Ven Juin 05, 2009 2:27 pm ]
Sujet du message:  [Résolu] Indexation recherche et catégories

Bonjour,

Je voudrais utiliser la fonction "loadObject" pour l'indexation de l'objet d'un module.
Je souhaite récupérer la première catégorie de l'objet en cours {Article:id}. Pour moi ça ressemblerait un peu à ça (sauf que ça doit pas s'utiliser comme ça :D et que dans l'exemple je prends pas la première catégorie) :
Code :
<atm-function function="loadObject" object="{Article}" value="{Article:id}">
{page:7097:url}?item={Article:id}&cat={Article:Categories:fieldID}
</atm-function>

Mais ça ne fonctionne pas... Comment utiliser cette fonction ?

Merci !

Auteur:  Sébastien [ Lun Juin 08, 2009 10:30 am ]
Sujet du message: 

Alors là je ne comprends pas du tout de quoi il est question :shock:
Citer:
Je voudrais utiliser la fonction "loadObject" pour l'indexation de l'objet d'un module.

Cette phrase demande un peu plus de détails, j'ai besoin du contexte parce que je ne vois pas du tout ce que tu veux faire.

Seb

Auteur:  dbanon [ Lun Juin 08, 2009 1:18 pm ]
Sujet du message: 

Bonjour,

Oui c'est vrai qu'on comprend rien, donc je reformule :D :

Je veux en fait modifier la manière dont les articles d'actualité sont indexés (modification de l'application Actualités et de l'objet Article). Actuellement j'ai ça dans la partie Indexation de l'objet Article :

Code :
<?php
      if(!is_object($cms_language)){
         $cms_language = new CMS_language();
      }
      $sLang = $cms_language->getCode();
?>

<atm-if what="{var:string:sLang} == 'fr'">
   {page:7097:url}?item={Article:id}
</atm-if>
<atm-if what="{var:string:sLang} != 'fr'">
   {page:7145:url}?item={Article:id}
</atm-if>


Donc pour chaque article, le lien va être de la forme :
page7097.php?item=123 (ou page7145.php?item=123)

Je veux modifier ce code d'indexation pour ne pas aller systématiquement sur la page 7097 (ou 7145) mais que cette page dépende de la première catégorie de l'article.
Le problème est que je n'arrive pas à récupérer la première catégorie de l'article. Je pensais pouvoir le faire à l'aide de la fonction loadObject mais je n'arrive pas à la faire fonctionner (ou alors elle ne peut pas me servir pour ce que je veux faire).

J'espère que maintenant c'est un peu plus compréhensible....

Merci !

Auteur:  Sébastien [ Lun Juin 08, 2009 1:26 pm ]
Sujet du message: 

C'est plus clair, mais je ne suis pas sur d'avoir bien tout compris.

Déjà, tu parle de l'indexation de l'article actualité, j'imagine, qu'il s'agit de son indexation dans le moteur de recherche ?

Ensuite, c'est là que ça n'est pas très clair, tu veux rediriger le détail des résultats de recherche en fonction de la 1ère catégorie de l'article. Qu'entends tu par "1ère catégorie" ? Y a t'il plusieurs champs catégories ou bien est ce un champ catégories multiple pour lequel tu voudrai obtenir la première catégorie ?

Enfin, pourquoi ne pas faire quelque chose de ce style (par exemple) ?
Code :
<atm-if what="{Article:categorie:id} == '1'">
   {page:7097:url}?item={Article:id}
</atm-if>
<atm-if what="{Article:categorie:id} == '2'">
   {page:7145:url}?item={Article:id}
</atm-if>

Auteur:  dbanon [ Lun Juin 08, 2009 1:39 pm ]
Sujet du message: 

Alors effectivement quand je parle d'indexation, c'est bien indexation dans le moteur de recherche.
Le champ catégories est multivalué, donc pour un article il peut y avoir plusieurs catégories. Du coup quand je dis "première catégorie", ça veut dire la première catégorie retournée par Automne.
Du coup si j'utilise :

Code :
<atm-if what="{Article:categorie:id} == '1'">
   {page:7097:url}?item={Article:id}
</atm-if>


qu'est ce que "{Article:categorie:id}" est sensé me retourner (puisque plusieurs catégories sont associées à un article) ?
Pour tester j'ai tapé (pour voir la valeur de {Article:categorie:id} dans l'URL) :

Code :
{page:7097:url}?item={Article:id}&cat={Article:categorie:id}


Mais le lien était alors de la forme : http://hote.com/ (sans rien à la suite). J'imagine que ça vient du fait que j'ai plusieurs catégories pour cet article ?

Auteur:  Sébastien [ Lun Juin 08, 2009 1:51 pm ]
Sujet du message: 

ok, dans ce cas, je ne comprends pas en quoi la première catégorie est plus importante que les autres ?
Mais quoi qu'il en soit, dans ce cas effectivement mon exemple ne peut pas marcher, il faudrait dans ce cas faire quelque chose de ce genre :

Code :
{Article:categorie:0|id}


Note que le "categorie" est à changer en fonction du nom de ton champ (reporte toi à l'aide du champ pour avoir son nom exact).

Par ailleurs, la fonction que je te donne là n'est pas documentée et je ne sais plus quand elle a été mise en place, mais ça devrai pouvoir fonctionner.

Auteur:  dbanon [ Lun Juin 08, 2009 2:04 pm ]
Sujet du message: 

Il n'y a effectivement pas de priorités entre les catégories, j'en prends donc une au "hasard".
J'ai testé la fonction, mais ça ne semble pas fonctionner.
J'ai ce code là dans le champ d'indexation :

Code :
{page:7097:url}?cat={Article:Categories:0|id}


Et le lien qui apparait dans le moteur de recherche est :

/7097-page-test.php?cat={Article:Categories:0|id}

On dirait qu'il n'interprète pas le code.

PS : Je suis sur Automne 3.3.2
PS2 : Mon champ s'appelle "Catégories" et devient donc "Categories" dans l'aide du champ

Auteur:  Sébastien [ Lun Juin 08, 2009 2:06 pm ]
Sujet du message: 

et as tu testé avec ce code ?
Code :
{page:7097:url}?cat={Article:Categories:id}


Si oui, ça donne quoi ensuite ?

Auteur:  dbanon [ Lun Juin 08, 2009 2:12 pm ]
Sujet du message: 

Là aussi il me met :

/7097-toutes-les-actualites.php?cat={Article:Categories:id}

J'ai testé avec d'autres champs ({Article:id} et {Article:Titre:value}) et ces tags sont bien remplacés par leur valeur...

Auteur:  Sébastien [ Lun Juin 08, 2009 2:21 pm ]
Sujet du message: 

Alors y a pas le choix, il va falloir que tu passe par un tag atm-loop.

De tête je ne me souvient plus exactement de la syntaxe, mais en gros il va falloir que tu fasse un truc comme ça :

Code :
<atm-loop on="{Article:Categories:values}">
  <atm-if what="{firstloop}">
    {page:7097:url}?cat={Article:Categories:values:id}
  </atm-if>
</atm-loop>

Auteur:  dbanon [ Lun Juin 08, 2009 2:30 pm ]
Sujet du message: 

Merci ça fonctionne comme ça !

Auteur:  dbanon [ Lun Juin 08, 2009 4:06 pm ]
Sujet du message: 

Du coup j'ai une nouvelle question...

Voilà la structure du module actualités :
Code :
Objets :
- Article
  - Titre
  - Catégories
  - ...
- Page détail par catégorie
  - Titre (chaine)
  - Catégorie (catégorie)
  - Langue (langue)
  - Page détail (page)
- Page détail par défaut
  - Titre (chaine)
  - Langue (langue)
  - Page détail (page)


Le principe est le suivant :
Dans la recherche, si un résultat est un article de la catégorie "Divers", le lien du résultat devra pointer vers l'attribut "Page détail" de l'objet "Page détail par catégorie" qui a pour catégorie "Divers" et pour langue la langue de l'article. Si l'objet "Page détail par catégorie" n'existe pas pour la catégorie et la langue, on va alors chercher l'attribut "Page détail" de l'objet "Page détail par défaut" qui a la même langue que l'article.

J'ai mis au point ce principe pour les flux RSS grâce aux tags de recherche (<block> et <atm-search>) et ça fonctionne mais dans la recherche cela semble fonctionner sauf qu'apparemment ces tags ajoutent des tags HTML. Du coup le résultat de la recherche donne des choses étranges avec des tags HTML au milieu !
Je me suis rendu compte que dans l'aide à la syntaxe pour la partie indexation du moteur de recherche, la section "Recherche" n'est pas présente alors qu'elle l'est pour les flux RSS... est-ce que l'utilisation de ces tags n'est pas supportée pour l'indexation ? Y a-t-il un moyen de contourner le problème ?

Encore une fois, si je suis pas clair, je peux préciser !

Auteur:  Sébastien [ Lun Juin 08, 2009 4:22 pm ]
Sujet du message: 

Non, pas de tags Recherche dans l'indexation. Cette zone ne sert qu'a générer l'URL pour atteindre l'élément affiché en résultat du moteur de recherche et rien d'autre.
Faire une recherche ici n'a donc pas d'intérêt, et, pire que tout, cela ralentirai énormément l'affichage des résultats du moteur de recherche. Cette zone doit donc rester la plus simple possible (c'est pourquoi je n'aime déjà pas l'emploi d'un tag atm-loop là dedans ...).

Ceci étant dit, les tags de recherche fonctionneront, cette limitation n'est que visuelle et n'a que pour but d'éviter que les gens mettent tout et n'importe quoi dans ce champ sachant que cela a un impact très négatif sur les performances du moteur de recherche ensuite.

Donc si tu as des tags HTML c'est qu'il doit y avoir un pb quelque part. Peux tu me copier ce que tu as mis dans le champ en question que je puisse voir ce qu'il se passe ?

Auteur:  dbanon [ Lun Juin 08, 2009 4:33 pm ]
Sujet du message: 

Voilà le code que j'ai dans le champs d'indexation :

Code :
<?php
      if(!is_object($cms_language)){
         $cms_language = new CMS_language();
      }
      $sLang = $cms_language->getCode();
      
      $item = {Article:id};
?>

<atm-loop on="{Article:Categories:values}">
   <atm-if what="{firstloop}">
      <block module="pNews">
         <atm-search what="{Page_detail_par_categorie}" name="detailSelect">   
            <atm-search-param search="detailSelect" type="{Page_detail_par_categorie:Categorie:fieldID}" value="{Article:Categories:values:id}" mandatory="true" />
            <atm-search-param search="detailSelect" type="{Page_detail_par_categorie:Langue:fieldID}" value="{var:string:sLang}" mandatory="true" />
            <atm-search-limit search="detailSelect" value="1" />
            <atm-result search="detailSelect">
               <?php
                  $page_detail = {Page_detail_par_categorie:Page_detail:label};
                  $url = getPageURL($page_detail, true) ."?item=". $item;
               ?>
            </atm-result>
            <atm-noresult search="detailSelect">
               <atm-search what="{Page_detail_par_defaut}" name="defautSelect">         
                  <atm-search-param search="defautSelect" type="{Page_detail_par_defaut:Langue:fieldID}" value="{var:string:sLang}" mandatory="true" />
                  <atm-search-limit search="defautSelect" value="1" />         
                  <atm-result search="defautSelect">
                     <?php
                        $page_detail = {Page_detail_par_defaut:Page_detail:label};
                        $url = getPageURL($page_detail, true) ."?item=". $item;
                     ?>
                  </atm-result>
               </atm-search>
            </atm-noresult>
         </atm-search>
      </block>
   </atm-if>
</atm-loop>


et le code généré lors de la recherche pour un article :

Code :
<a pnews="" href="http://localhost<block module=">
" title="Concours, culture, parutions - Divers">Concours, culture, parutions - Divers</a>

Auteur:  Sébastien [ Lun Juin 08, 2009 4:45 pm ]
Sujet du message: 

Voila le code que tu devrai mettre :
Code :
<?php
   if(!is_object($cms_language)){
      $cms_language = new CMS_language();
   }
   $sLang = $cms_language->getCode();
   $item = {Article:id};
?>
<atm-loop on="{Article:Categories:values}">
   <atm-if what="{firstloop}">
      <atm-search what="{Page_detail_par_categorie}" name="detailSelect">
         <atm-search-param search="detailSelect" type="{Page_detail_par_categorie:Categorie:fieldID}" value="{Article:Categories:values:id}" mandatory="true" />
         <atm-search-param search="detailSelect" type="{Page_detail_par_categorie:Langue:fieldID}" value="{var:string:sLang}" mandatory="true" />
         <atm-search-limit search="detailSelect" value="1" />
         <atm-result search="detailSelect">
            <?php
               $page_detail = {Page_detail_par_categorie:Page_detail:label};
               $url = getPageURL($page_detail, true) ."?item=". $item;
            ?>
         </atm-result>
         <atm-noresult search="detailSelect">
            <atm-search what="{Page_detail_par_defaut}" name="defautSelect">
               <atm-search-param search="defautSelect" type="{Page_detail_par_defaut:Langue:fieldID}" value="{var:string:sLang}" mandatory="true" />
               <atm-search-limit search="defautSelect" value="1" />
               <atm-result search="defautSelect">
                  <?php
                     $page_detail = {Page_detail_par_defaut:Page_detail:label};
                     $url = getPageURL($page_detail, true) ."?item=". $item;
                  ?>
               </atm-result>
            </atm-search>
         </atm-noresult>
      </atm-search>
   </atm-if>
</atm-loop>
<?php
   echo $url;
?>


Maintenant j'ai jamais testé ça et je ne suis pas sur que le echo $url; à la fin soit bien ce qu'il faille mettre (un $content = $url; serait peut-être mieux ...?).

La section de code qui va s'occuper de traiter ça se trouve dans le fichier /automne/classes/modules/ase/interfaces/polymod.php, ligne ~422 (cherche un eval). Tu peux essayer de voir ce que te sors l'instruction $objectDefinition->getValue('compiledIndexURL') et tu peux ensuite adapter ton code pour qu'il fonctionne mais ne touche au fichier en question que pour faire tes tests sans quoi tes modifications seraient perdues à la prochaine mise à jour.

Seb

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