Les avertissements suivants se sont produits :
Warning [2] Undefined array key 0 - Line: 1640 - File: showthread.php PHP 8.2.18 (Linux)
File Line Function
/inc/class_error.php 153 errorHandler->error
/showthread.php 1640 errorHandler->error_callback
/showthread.php 915 buildtree




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Nouveau plugin : trier les champs d'un objet
#1
Pour cmsms 1.11
Basé sur le plugin de Bredt : http://www.cmsmadesimple.fr/forum/viewtopic.php?id=3769

Vous avez une page "artistes et vous avez créé des pages enfants avec le nom de tous ces artistes.
Vous souhaiteriez créer une navigation latérale qui affiche tous les noms des artistes dans l'ordre alphabétique (ou inverse) sans devoir réorganiser l'ordre des pages enfants dans l'administration ?

Vous souhaitez afficher les news dans l'ordre alphabétique inverse des titres ?

Vous souhaitez afficher les "définitions de champs" des news dans l'ordre des 'id', du 'name', du 'type' ou encore de sa 'value' ?

Vous souhaitez ordonner les array d'un objet ?

Ce plugin est votre meilleur ami Smile

Tutoriel :
En premier lieu, vous téléchargez le plugin que vous placerez dans le dossier plugins
OU
code à coller dans un fichier (modifier.sort_object_array.php) que vous placerez dans le répertoire plugins.
Code :
[== Indéfini ==]
<?php
/**
* Smarty plugin
*/

/**
* Smarty sort_object_array modifier plugin
*
* Type:     modifier
* Name:     sort_object_array
* Help : http://www.cmsmadesimple.fr/forum/viewtopic.php?id=4439
* @link
* @author   Jean le Chauve
* @param array
* @param string
* @return array
* put '-' before the value for inverse
*/

function smarty_cms_modifier_sort_object_array($objArray, $sortby='')
{
    if (!is_array($objArray)) {
        die("not array, you cannot use the modificator sort_object_array with this variable");
    }
    $dir = '>';
    if ($sortby[0] == '-')
    {
        $sortby = substr($sortby, 1);
        $dir = '<';
    }
    $cmp = create_function('$a,$b', 'return strtolower($a->'.$sortby.')'.$dir.'strtolower($b->'.$sortby.');');    
    usort($objArray, $cmp);
    return $objArray;
}
?>

1) Explication pour la gestion de menu :
Copiez le gabarit de menu de votre sidebar et collez-le dans un nouveau que vous appellerez "artistes"
Code :
{if $count > 0}
<ul>
{foreach from=$nodelist|sort_object_array:'menutext' item=node}
{if $node->depth > $node->prevdepth}
{repeat string="<ul>" times=$node->depth-$node->prevdepth}
{elseif $node->depth < $node->prevdepth}
{repeat string="</li></ul>" times=$node->prevdepth-$node->depth}
</li>
{elseif $node->index > 0}</li>
{/if}
{if $node->parent == true or ($node->current == true and $node->haschildren == true)}
<li class="menuactive menuparent"><a class="menuactive menuparent" href="{$node->url}"><span>{$node->menutext}</span></a>
{elseif $node->haschildren == true and $node->type != 'sectionheader' and $node->type != 'separator'}
<li class="parent"><a class="parent" href="{$node->url}"><span>{$node->menutext}</span></a>
{elseif $node->current == true}
<li class="currentpage"><span>{$node->menutext}</span>
{elseif $node->type == 'sectionheader'}
<li class="sectionheader"><span>{$node->menutext}</span>
{elseif $node->type == 'separator'}
<li class="separator" style="list-style-type: none;"> <hr />
{else}
<li><a href="{$node->url}"><span>{$node->menutext}</span></a>
{/if}
{/foreach}
{repeat string="</li></ul>" times=$node->depth-1}</li>
</ul>
{/if}
Vous n'avez qu'à ajouter le modificateur du plugin (|sort_object_array:'menutext') sur le premier foreach (ligne 3)
Je l'ai déjà fait pour vous Wink
Ensuite, vous ouvrez votre gabarit de page et vous collez le code suivant dans votre sidebar
Code :
[== Indéfini ==]
<div class="pageSidebar">            
    <span class='titlesidebar'>Tous les artistes</span>
    {menu template="artistes" start_level="2"}
</div>

2) Explications pour afficher le sommaire des news dans l'ordre alphabétique inverse des titres :
Cherchez la ligne
Code :
{foreach from=$items item='entry'}
et ajoutez le modificateur :
Code :
[== Indéfini ==]
{foreach from=$items|sort_object_array:'-title' item='entry'}
Vous avez vu ? Il y a un - devant le champ à trier.
Un - devant le nom du champ à trier inverse l'ordre de tri (s'il n'y a que le nom on obtient l'ordre ascendant).

3) Explications pour trier les définitions de champ :
Ouvrez votre gabarit de détail des news et ajoutez le modificateur :
Code :
[== Indéfini ==]
{if isset($entry->fields)}
  {foreach from=$entry->fields|sort_object_array:'name' item='field'}
     <div class="NewsDetailField">
Pour connaître les valeurs possibles, placez {$entry->fields|var_dump}
et vous obtiendrez plus ou moins ceci :
array (size=5)
'image' =>
object(news_field)[157]
private '_data' =>
array (size=7)
'id' => string '1' (length=1)
'name' => string 'image' (length=5)
'type' => string 'textbox' (length=7)
'max_length' => string '255' (length=3)
'item_order' => string '1' (length=1)
'public' => string '1' (length=1)
'value' => string 'eee' (length=3)
'champs2' =>
object(news_field)[153]
private '_data' =>
array (size=7)
'id' => string '2' (length=1)
'name' => string 'champs2' (length=7)
'type' => string 'textbox' (length=7)
'max_length' => string '255' (length=3)
'item_order' => string '2' (length=1)
'public' => string '1' (length=1)
'value' => string 'ceci est e champs 2' (length=19)
'champs3' =>
...

Enjoy Smile
Répondre


Messages dans ce sujet

Atteindre :


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