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