développement

Quelques notes pour répondre à des problématiques rencontrées au travail.

eZ Publish : exemples de fetches PHP et template

Les fetches eZ Publish sont un moyen de récupérer une liste de nœuds (objets de type eZContentObjectTreeNode) en PHP ou depuis un template. Dans les deux cas, la méthode est sensiblement la même.

Pour connaître tous les paramètres possibles de chacune des versions, se référer à :

  • en template, la documentation en ligne
  • en PHP, les premières lignes de la fonction eZContentObjectTreeNode::subTreeByNodeID

La version template content list peut être appelée en PHP en passant par eZFunctionHandler::execute(). Cela permet d’utiliser strictement les mêmes paramètres entre PHP et langage de template. Mais cette méthode est à éviter selon moi, car elle passe par une couche d’astraction supplémentaire par rapport à son homologue subTreeByNodeID.


Le classique

Récupération des enfants directs du nœud n°67, qui sont de type client, classés par priorité décroissante puis par ordre alphabétique :

$nodes = eZContentObjectTreeNode::subTreeByNodeID(
    array(
        'ClassFilterType' => 'include', // Filtre par liste blanche
        'ClassFilterArray' => array(
            'client' // Le(s) type(s) d'objet(s) à récupérer
        ),
        'Depth' => 1, // Enfants directs du parent <=> à une profondeur de 1 sous le noeud n°67
        'SortBy' => array(array('priority', false), array('name', true))
    ),
    67 // Peut également être un array : array(67)
);
{def $nodes = fetch('content', 'list', hash('parent_node_id', 67,
                                            'class_filter_type', 'include'
                                            'class_filter_array', array('client'),
                                            'depth', 1,
                                            'sort_by', array(hash('priority', false()), hash('name', true())) ))}

Le débridé

Récupération des enfants des nœuds n°67 et 68, sans limite de profondeur, et sans tenir compte des droits d’accès, classés selon la méthode de tri paramétrée en back-office (onglet Classement du nœud) :

$nodes = eZContentObjectTreeNode::subTreeByNodeID(
    array(
        'Limitation' => array(),
        'SortBy' => $node->sortArray()
    ),
    array(67, 68)
);
{def $nodes = fetch('content', 'list', hash('parent_node_id', array(67, 68),
                                            'limitation', array(),
                                            'sort_by', $node.sort_array))}

Le prévoyant

Récupération des enfants du nœud n°67, en forçant le chargement du datamap (et sa mise en cache s’il est activé). Charger le datamap des nœuds depuis la fonction de fetch n’est pas une obligation pour y accéder ensuite mais le gain de performances est important ; tout est fetché en une seule connexion à la base de données.

$nodes = eZContentObjectTreeNode::subTreeByNodeID(
    array(
        'LoadDataMap' => true
    ),
    array(67) // Le noeud parent
);
{def $nodes = fetch('content', 'list', hash('parent_node_id', array(67),
                                            'load_data_map', true()))}

Le sournois

Récupération des objets de type pays depuis la racine de l’arbre des contenus, ayant un nom commençant par Au ou une date de publication postérieure au 01/01/2014 :

$ini = eZINI::instance('content.ini');

// La racine des contenus (2 par défaut)
$rootNodeID = $ini->variable('NodeSettings', 'RootNode');

$nodes = eZContentObjectTreeNode::subTreeByNodeID(
    array(
        'AttributeFilter' => array(
            'or', // Inclusif. Ce paramètre peut être omis, auquel cas la condition sera 'and'
            array('pays/name', 'like', "Au*"),
            array('published', '>=', 1388530800) // Timestamp correspondant au 01/01/2014 à minuit
        )
    ),
    $rootNodeID
);
{def $root_node_id = ezini('NodeSettings', 'RootNode', 'content.ini')
     $nodes = fetch('content', 'list', hash('parent_node_id', $root_node_id,
                                            'attribute_filter', array('or',
                                                                      array('pays/name', 'like', "Au*"),
                                                                      array('published', '>=', 1388530800)))))}

Pour en savoir plus sur les filtres disponibles, se référer à la documentation, et si ça ne suffit pas, à la méthode createAttributeFilterSQLStrings() de eZContentObjectTreeNode. Les possibilités sont nombreuses, mais si les attribute filters ne permettent pas de répondre à votre besoin, vous pouvez créer un extended attribute filter. Vous pourrez alors descendre plus bas niveau et personnaliser la requête SQL . Rendez-vous dans un prochain article !

Publié le 27/03/2014
dans la catégorie développement.
Dernière mise à jour le 03/06/2017.

Tags : ezpublish php

1 commentaire

Nicolas 28/03/2014

Excellent El Robico :)

Poster un commentaire

Votre adresse e-mail ne sera pas affichée sur le site.