Développer avec RBS Change : [PHPTal] Lien vers une rubrique

  • 46396.1

    08/11/2011 10:24


    David Guillot
    Rang : Expert
    Bonjour,

    Je souhaite créer un lien vers une page tagguée d'une rubrique. J'ai essayé
    <a change:link="tag functional_bookmarks_bookmark-list; topic mytopic" />
    ("mytopic" étant un objet website/topic), mais rien n'y fait...

    Comment faire un tel lien ? Ai-je la bonne approche ?

    Merci d'avance
  • 46396.2

    08/11/2011 11:25


    Gaël Port
    Titre : Développeur RBS Change
    Rang : Expert
    Bonjour,

    Ce n'est pas faisable directement avec change:link : celui-ci prend systématiquement la page courante comme référence en ce qui concerne les tags fonctionnels.

    En fait ce qu'on fait en général, c'est mettre la page de liste en page d'index de la rubrique, du coup on se contente d'un lien vers la rubrique (qui mènera sur sa page d'index). Ensuite une fois dans la rubrique les autres pages fonctionnelles sont accédée naturellement contextuellement à celle-ci.

    Si ça ne convient pas, il est toujours possible de rechercher la page en question dans le code du bloc (via la méthode getDocumentBySiblingTag du TagService) ou bien générer son URL directement (via la méthode getTagUrlForContext du LinkHelper).
  • 46396.3

    08/11/2011 13:27


    fpaterno
    Rang : Adepte
    Bonjour,

    la méthode getTagUrlForContext semble la plus adaptée à ce que nous souhaitons faire.

    Celle-ci est utilisée de cette manière (directement dans une template) :
    <ul tal:repeat="subCategory subCategories">
      <li>
        <a tal:attributes="href php:LinkHelper::getTagUrlForContext('functional_bookmarks_bookmark-list', subCategory)"
           tal:content="subCategory/getLabel" />
      </li>
    </ul>
    

    Les objets subCategories sont récupérés de la manière suivante :
    $topicService = website_TopicService::getInstance();
    $query = $topicService->createQuery()->add(Restrictions::eq("id", $topicId));
    $topic = $query->findUnique();
                
    $subCategories = $topic->getChildrenTopics();
    $request->setAttribute('subCategories', $subCategories);
    

    Cela ne fonctionne cependant pas :
    - sans le 2nd paramètre (subCategory), j'obtiens l'url de la page contenant le tag par défaut (à la racine de l'arborescence créée).
    - avec le 2nd paramètre (subCategory), je n'obtiens aucune URL. Je m'attendais cependant à ce qu'il trouve la page associée au tag "functional_bookmarks_bookmark-list" dans le contexte spécifié (le topic).

    Ce 2nd paramètre peut-il prendre en compte n'importe quel type d'objet (et dans mon cas un simple topic) ?
    Merci d'avance
  • 46396.4 en réponse à 46396.3 écrit par fpaterno

    08/11/2011 14:41


    Gaël Port
    Titre : Développeur RBS Change
    Rang : Expert
    Alors oui, je n'ai pas précisé plus haut mais le contexte attendu par cette méthode est une page ou une rubrique. Si c'est une page, il cherchera dans les pages sœurs, si c'est une rubrique il recherchera par rapport à sa page d'index.

    Ceci implique notamment que si vous donnez une rubrique sans page d'index, ça ne marchera pas.



    Sinon, en passant, ce code là :
    $topicService = website_TopicService::getInstance();
    $query = $topicService->createQuery()->add(Restrictions::eq("id", $topicId));
    $topic = $query->findUnique();
    Peut être largement simplifié en :
    $topic = website_persistentdocument_topic::getInstanceById($topicId);
    C'est la meilleure méthode lorsqu'on connait le type à l'avance, parce qu'on gagne la complétion sur les IDE qui la gèrent vu que cette méthode là est typée.

    Et si on ne connait pas le type, c'est la méthode DocumentHelper::getDocumentInstance($id));.
  • 46396.5

    08/11/2011 15:08


    fpaterno
    Rang : Adepte
    Merci pour l'astuce concernant la simplification de recherche de documents par id.

    Concernant la recherche de page, nous n'y arrivons toujours pas. Le résultat est le même si j'associe la page présente dans une rubrique en page par défaut.

    En réalité, nous sommes dans la situation suivante. Nous avons un dossier nommé "Root" dans lequel se trouve :
    - Une arborescence complète (plusieurs dossiers et sous dossiers)
    - Une page "Liste" qui contient le bloc "modules_bookmarks_BookmarkContextualList" et a pour tag "functional_bookmarks_bookmark-list"

    RBS duplique automatiquement la page "Liste" dans les sous-dossier du dossier "Root" et nous permet donc automatiquement d'avoir la liste des liens associés dans le dossier sélectionné.

    Notre but et de pouvoir réaliser des liens direct vers ces pages dupliqués.
    C'est pour cela que nous souhaitions utiliser la méthode LinkHelper avec pour second paramètre le dossier afin de pouvoir récupérer, non pas la page située à la racine du dossier "Root", mais une page dupliquée présente dans un des dossiers de l'arborescence (context).
  • 46396.6

    08/11/2011 15:39


    Gaël Port
    Titre : Développeur RBS Change
    Rang : Expert
    En fait dans ce cas là, si vous n'avez pas d'autre page à mettre en index, ce que je ferais moi c'est :
    - mettre la page de liste en page d'index de la rubrique (clic droit sur la page dans la liste et "Définir comme page d'index")
    - mettre les références de cette page en page d'index des sous-rubriques (clic droit sur la page dans la liste et "Définir les références comme page d'index")
    - faire directement des liens vers les rubriques et sous-rubriques (du type change:link="document topic")

    Notons que comme les opérations "Définir comme page d'index" et "Définir les références comme page d'index" sont deux opérations distinctes, il est du coup possible si besoin d'avoir une page de contenu libre comme page d'index à la racine et utiliser les pages de liste comme index des sous-rubriques.

    Édité par Gaël Port 08/11/2011 15:40

  • 46396.7

    09/11/2011 16:20


    fpaterno
    Rang : Adepte
    C'est tout à fait ce dont j'avais besoin.
    Je n'avais pas pris connaissance du"Définir les références comme page d'index".
    Merci !

    EDIT : cela fonctionne parfaitement. Cependant, je souhaite pouvoir "Définir les références comme page d'index" directement dans mon fichier initData. J'ai trouvé la propriété isIndexPageForSubTopics qui semble correspondre mais il s'agit d'un champ sérialisé ...

    Comment peut-on réaliser l'initialisation automatiquement dans ce cas ?
    Merci !

    Édité par fpaterno 09/11/2011 17:18

  • 46396.8

    09/11/2011 17:47


    Gaël Port
    Titre : Développeur RBS Change
    Rang : Expert
    Il y a un exemple dans le fichier catalog/setup/shopDefaultStructure.xml : la première page créée comporte la liste des produits et des sous-rayons et est donc à passer comme page d'index de chaque rayon.

    On utilise alors la balise execute qui peremet d'appeler une méthode sur la classe php qui représente un document dans un script d'import. Dans le cas d'une page il s'agit de website/persistentdocument/import/PageScriptDocumentElement.class.php et elle contient la méthode setPageRefAsIndex dédiée à ça.

    <page label="Contenu du rayon" isIndexPage="true" navigationVisibility="hidden">
    	<tag name="functional_catalog_product-list" />
    	<tag name="functional_catalog_shelf-list" />
    	<changecontent for="content-block">
    		<changeblock type="modules_catalog_shelfContextualList" />
    		<changeblock type="modules_catalog_productContextualList" />
    	</changecontent>	
    	<execute method="setPageRefAsIndex" />
    </page>
    Attention cependant à bien appeler cette méthode après avoir créé les sous-rubriques puisque ça ne vaut que pour les sous-rubriques existantes au moment de l'appel.


    Cela dit, effectivement, la propriété isIndexPageForSubTopics devrait marcher aussi (je viens de (re)découvrir son existence du coup...). En théorie, le fait qu'il s'agisse d'une propriété sérialisée ne devrait pas empêcher de la définir depuis un script xml.


    En gros en faisant l'execute cité plus haut, on agit sur les références existantes à ce moment là, tandis que la propriété vaut pour les références créées par la suite.

    Édité par Gaël Port 10/11/2011 09:26

  • 46396.9

    10/11/2011 10:34


    fpaterno
    Rang : Adepte
    La balise execute fonctionne très bien dans ce cas précis.
    Merci beaucoup !
 
Merci de prendre connaissance et de respecter les règles des forums.
 
1377 membres
Aucun membre connecté