Trier suivant le nombre de sous-éléments

Lundi 24/01/2011, 14h08 | Pierre Martel

templates

Vous souhaitez trier par un fetch vos noeuds suivant leur nombre de sous-éléments, par exemple pour afficher les articles les plus commentés ? Hélas il n'existe pas de clause à cet effet dans le sort_by.

Pour cela il faut passer par un extended attribute filter qu'on va utiliser dans notre sort_by (on utilise simplement l'extended attribute filter pour ajouter une clause dans le SQL mais il n'y a pas de filtre, c'est un principe intéressant qui pourrait resservir pour d'autres cas).

Le fichier tonextension/classes/nodechildrencountfilter.php :

 <?php
class NodeChildrenCountFilter
{
    function NodeChildrenCountFilter(){}

    function createSqlParts( $params )
    {

        return array('tables' => '', 'joins' => '', 'columns' => ', ( SELECT count(*) FROM ezcontentobject_tree ezcontentobject_tree_2  WHERE ezcontentobject_tree_2.parent_node_id = ezcontentobject_tree.node_id) AS children_count ');
    }
}
?>

Le fichier tonextension/settings/extendedattributefilter.ini.append.php :

<?php /*

[nodechildrencountfilter]
ExtensionName=www
ClassName=NodeChildrenCountFilter
FileName=classes/nodechildrencountfilter.php
MethodName=createSqlParts

*/ ?>

Exemple de fetch dans un template :

{def $articles=fetch(content, list, hash( 
    parent_node_id, $node.node_id, 
    class_filter_type, 'include', 
    class_filter_array, array('event'), 
    extended_attribute_filter, hash( 
        'id', 'nodechildrencountfilter', 
        'params', hash( ) 
    ), 
    sort_by, array( 
        array('children_count', false()) 
    ),
    load_data_map, false()
))}

(J'en profite pour vous montrer, si vous ne le savez pas, le paramètre load_data_map, si on n'a pas besoin de la data_map, ça nous fait gagner en perfs).

Merci à Ivo Lukac



Commentaires

Aucun commentaire.