Sujet fermé
Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5

[Résolu] Créer un lien vers une page dans un événement CGCalendar
#3

Merci pour la balise {setlist} qui me donne la solution la plus simple 100% Smarty.
Pour résumé, j'ai trouvé 3 solutions à mon problème.


[h]Solution 1 avec une UDT utilisant eval()[/h]

Code :
{assign var=liste_pages value={cms_module module="Navigator" template="Pages List in ArrayString" number_of_levels=2 childrenof="projets"}}
{eval_string_to_be_array liste_pages=$liste_pages}
{html_options name="m1_field_LienInterne" options=$tableau_pages selected=28}

Détail de mon gabarit Pages List in ArrayString de type Navigator::Navigation :
Code :
{strip}
{* simple navigation / Note : function can only be defined once *}

{function name=Liste_pages depth=1}
[
{foreach $data as $node}{* build the menu item node *}
  {if $node->type == 'sectionheader'}
  {else if $node->type == 'separator'}
  {else}{* regular item *}
   {if $depth==0}{* 1er niveau *}
    {if $node@index != 1},{/if}'{$node->menutext|escape:"quotes"}'=>
   {elseif $depth==1}{* les enfants projets-associatifs et projets-educatifs *}
    '{$node->id}'=>'{$node->menutext|escape:"quotes"}'{if !$node@last},{/if}{*"\n"*}
   {/if}
   {if isset($node->children)}
    {Liste_pages data=$node->children depth=$depth+1}
   {/if}
  {/if}
{/foreach}
]
{/function}

{if isset($nodes)}
{Liste_pages data=$nodes depth=0}
{/if}
{/strip}

Retourne une chaîne de la forme "['Projets associatifs'=>['29'=>'Projet 1','15'=>'Projet 2','28'=>'Projet 3'],'Projets éducatifs'=>['10'=>'Projet 4','33'=>'Projet 5','34'=>'Projet 6']]" pour créer un tableau de valeurs qui est utilisé dans l'admin pour créer un menu déroulant des pages projets avec {html_options} dans CGCalendar.
Smarty n'arrivant pas à créer un tableau avec cette chaîne, il faut utiliser l'UDT {eval_string_to_be_array liste_pages=$liste_pages} contenant eval("\$resultat = array($myVar);"); pour forcer l'évaluation de la chaine et la stocker sous forme de tableau dans $tableau_pages.

Détail de mon UDT {eval_string_to_be_array} :
Code :
[== PHP ==]
/* récupère $liste_pages créé avec {assign var=liste_pages value={cms_module module="Navigator" template="Pages List in ArrayString" number_of_levels=2 childrenof="projets"}}
** et retourne $tableau_pages avec {eval_string_to_be_array liste_pages=$liste_pages}
*/

if (!empty($params['liste_pages'])) {
  $string = $params['liste_pages'];
  eval("\$resultat = $string;"); //force l'évaluation de la chaîne en tableau et la stocke dans $resultat
  $smarty->assign('tableau_pages', $resultat);
}
 

[h]Solution 2 avec une UDT utilisant 2 boucles foreach pour découper ma chaîne[/h]

Code :
{assign var=liste_pages value={cms_module module="Navigator" template="Pages List in CustomString" number_of_levels=2 childrenof="projets"}}
{custom_string_to_array liste_pages=$liste_pages}
{html_options name="m1_field_LienInterne" options=$tableau_pages selected=28}

Détail de mon gabarit Pages List in CustomString de type Navigator::Navigation :
Code :
{strip}
{* simple navigation / Note : function can only be defined once *}

{function name=Liste_pages depth=1}
{foreach $data as $node}{* build the menu item node *}
  {if $node->type == 'sectionheader'}
  {else if $node->type == 'separator'}
  {else}{* regular item *}
   {if $depth==0}{* 1er niveau *}
    {if $node@index != 1}‡A‡{/if}{$node->menutext|escape:"quotes"}‡B‡
   {elseif $depth==1}{* les enfants de projets-associatifs et projets-educatifs *}
    {$node->id}‡C‡{$node->menutext|escape:"quotes"}{if !$node@last}‡B‡{/if}{*"\n"*}
   {/if}
   {if isset($node->children)}
    {Liste_pages data=$node->children depth=$depth+1}
   {/if}
  {/if}
{/foreach}
{/function}

{if isset($nodes)}
{Liste_pages data=$nodes depth=0}
{/if}
{/strip}

Retourne une chaîne de la forme "Projets associatifs‡B‡29‡C‡Projet 1‡B‡15‡C‡Projet 2‡B‡28‡C‡Projet 3‡A‡Projets éducatifs‡B‡10‡C‡Projet 4‡B‡33‡C‡Projet 5‡B‡34‡C‡Projet 6" pour créer un tableau de valeurs qui est utilisé dans l'admin pour créer un menu déroulant des pages projets avec {html_options} dans CGCalendar.
Comme séparateur j'utilise ‡A‡ pour le niveau 1, ‡B‡ pour le niveau 2, ‡C‡ entre "idPage" et "Titre page".
Il faut utiliser l'UDT {custom_string_to_array liste_pages=$liste_pages} pour segmenter la chaine et la retourner sous forme de tableau dans $tableau_pages.

Détail de mon UDT {custom_string_to_array} :
Code :
[== PHP ==]
/* récupère $liste_pages créé avec {assign var=liste_pages value={cms_module module="Navigator" template="Pages List in CustomString" number_of_levels=2 childrenof="projets"}}
** et retourne $tableau_pages avec {custom_string_to_array liste_pages=$liste_pages}
*/

if (!empty($params['liste_pages'])) {
  //$string = $params['liste_pages'];
  $niv1 = explode("‡A‡",$params['liste_pages']);
  $resultat = array();
  foreach($niv1 as $item){
    $resultat2 = array();
    $niv2 = explode("‡B‡",$item);
    foreach($niv2 as $key=>$item2){
      if ($key > 0){
        $niv3 = explode("‡C‡",$item2);
        $resultat2[$niv3[0]] = $niv3[1];
      }
    }
    $resultat[$niv2[0]] = $resultat2;
  }
  $smarty->assign('tableau_pages', $resultat);
}
 

[h]Solution 3 : 100% Smarty[/h]
Code :
{setlist var=tableau_pages value={cms_module module="Navigator" template="Pages List in JSONString" number_of_levels=2 childrenof="projets"}}
{html_options name="m1_field_LienInterne" options=$tableau_pages selected=28}

Détail de mon gabarit Pages List in JSONString de type Navigator::Navigation :
Code :
{strip}
{* simple navigation / Note : function can only be defined once *}

{function name=Liste_pages depth=1}
{ldelim}
{foreach $data as $node}{* build the menu item node *}
  {if $node->type == 'sectionheader'}
  {else if $node->type == 'separator'}
  {else}{* regular item *}
   {if $depth==0}{* 1er niveau *}
    {if $node@index != 1},{/if}"{$node->menutext|escape:"quotes"}":
   {elseif $depth==1}{* les enfants projets-associatifs et projets-educatifs *}
    "{$node->id}":"{$node->menutext|escape:"quotes"}"{if !$node@last},{/if}{*"\n"*}
   {/if}
   {if isset($node->children)}
    {Liste_pages data=$node->children depth=$depth+1}
   {/if}
  {/if}
{/foreach}
{rdelim}
{/function}

{if isset($nodes)}
{Liste_pages data=$nodes depth=0}
{/if}
{/strip}

Retourne une chaîne JSON de la forme '{"Projets associatifs":{"29":"Projet 1","15":"Projet 2","28":"Projet 3"},"Projets éducatifs":{"10":"Projet 4","33":"Projet 5","34":"Projet 6"}}' utilisée par {setlist} pour créer un tableau de valeurs utilisé dans l'admin pour créer un menu déroulant des pages projets avec {html_options} dans CGCalendar.
Sujet fermé


Messages dans ce sujet

Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)