uk flag

Snippets Drupal 7 - Charger des nodes

Charger des nodes facilement en utilisant EntityFieldQuery

L'API EntityFieldQuery est très utile pour charger des nodes. Ce snippet permet de l'utiliser facilement:

/**
 * Charger des nodes
 *
 * @param  string/array  $type       Le type de node recherché (article, document...)
 * @param  integer       $limit      Le nombre de node à charger
 * @param  boolean       $pager      Faut-il ou non afficher un pager
 * @param  array         $conditions Un tableau de conditions à passer à EntityFieldQuery
 * @return array         Un tableau de nodes chargés ou un tableau vide
 *
 */

function my_module_load_nodes($type, $limit = 10, $pager = FALSE, $conditions = array()) {
    $query = new EntityFieldQuery();
    if ($pager === true) {
        $query->entityCondition('entity_type', 'node')->pager($limit);
    } else {
        $query->entityCondition('entity_type', 'node')->range(0, $limit);
    }
    if (is_string($type)) {
        $query->propertyCondition('type', $type);
    } elseif (is_array($type)) {
        $query->propertyCondition('type', $type, 'IN');
    }
    if (is_array($conditions)) {
        foreach ($conditions as $condition) {
            if (isset($condition['method']) && isset($condition['params'])) {
                call_user_func_array(array($query, $condition['method']), $condition['params']);
            }
        }
    }
    $query->propertyCondition('status', 1);

    $results = $query->execute();
    if (!empty($results['node'])) {
        return node_load_multiple(array_keys($results['node']));
    }
    return array();
}
                             

Exemple d'utilisation:


$conditions[] = array('method' => 'propertyOrderBy', 'params' => array('sticky', 'DESC'));
$conditions[] = array('method' => 'propertyOrderBy', 'params' => array('created', 'DESC'));
$conditions[] = array('method' => 'fieldCondition', 'params' => array('my_field_name', 'tid', 'my_term_id'));
$conditions[] = array('method' => 'fieldCondition', 'params' => array('my_field_name', 'value', 'my_value'));

$nodes = my_module_load_nodes('article', 30, TRUE, $conditions);
$variables['nodes'] = $nodes;
$variables['pager'] = theme('pager');
return theme('my_theme', $variables);

                                

Charger les nodes d'une liste du module nodequeue

Le module Nodequeue permet de réaliser des listes ordonnées de nodes via l'administration Drupal. Cette fonction permet de charger une liste de nodes en indiquant son nom:

/**
* Charger les nodes d'une liste dont on connait le "machine_name"
*
* @param  string    $machine_name  Le machine_name de la queue
* @param  integer   $from          La node à partir de laquelle commencer
* @param  integer   $count         Le nombre de nodes à charger
* @return array()                  Un tableau de nodes chargés ou un tableau vide
*
*/
function my_module_nodequeue_load_nodes($machine_name, $from = 0, $count = 10) {
    $queue = nodequeue_load_queue_by_name($machine_name);
    if (!empty($queue)) {
        $subqueue = current(nodequeue_load_subqueues_by_queue($queue->qid));
        if (!empty($subqueue->sqid)) {
            $query = db_select('node', 'n')
            ->fields('n', array('nid'))
            ->condition('nn.sqid', $subqueue->sqid)
            ->orderBy('nn.position', 'ASC');
            $query->join('nodequeue_nodes', 'nn', 'n.nid = nn.nid');
            $query->condition('n.status', 1);
            $result = $query->range($from, $count)->execute()->fetchCol();
            $data = array();
            foreach ($result as $key => $nid) {
                $data[$nid] = node_load($nid);
            }
            return $data;
        }
    }
    return array();
}
                    

Exemple d'utilisation:


$nodes = my_module_nodequeue_load_nodes('my_list');