Comment charger un nœud en fonction de son titre?

32

Je ne connais que le titre d'un nœud, et je veux charger le nœud en utilisant node_load().

Comment je fais ça?

sokratis
la source
Si c'est une page normale, vous devriez obtenir NID, arg(1)ce sera le nœud / X pour toutes les pages. et node_load()fonctionne uniquement sur NID
GoodSp33d
mon url est projects / {username} / {node title}, c'est pourquoi j'utilise arg (2)
helxsz
dans drupal 7, vous ne pouvez pas utiliser node_load () pour obtenir le nœud par son titre, juste par nid
abd
Vos titres sont-ils uniques?
Artur
2
Duplication possible de Comment charger un nœud par une valeur de champ?
kenorb

Réponses:

17

Dans Drupal 6, vous pouvez utiliser le code suivant.

$node = node_load(array('title' => 'node title'));

Si vous connaissez également le type du nœud, vous pouvez utiliser le code suivant.

$node = node_load(array('title' => 'node title', 'type' => 'page'));

node_load () renvoie toujours un seul nœud. En effet, la fonction ne boucle pas sur la ressource de résultat de requête de base de données renvoyée par db_query () .

  if ($revision) {
    array_unshift($arguments, $revision);
    $node = db_fetch_object(db_query('SELECT ' . $fields . ' FROM {node} n INNER JOIN {users} u ON u.uid = n.uid INNER JOIN {node_revisions} r ON r.nid = n.nid AND r.vid = %d WHERE ' . $cond, $arguments));
  }
  else {
    $node = db_fetch_object(db_query('SELECT ' . $fields . ' FROM {node} n INNER JOIN {users} u ON u.uid = n.uid INNER JOIN {node_revisions} r ON r.vid = n.vid WHERE ' . $cond, $arguments));
  }
Blake Senftner
la source
3
@sokratis Gardez à l'esprit que les titres ne doivent pas nécessairement être uniques et peuvent être modifiés à tout moment. Si vous pouvez passer au référencement par identifiant de nœud, ce serait plus sûr.
David L
4
Drupal n'est pas fan de CamelCase.
Sivaji
1
Cet exemple ne fonctionnera tout simplement pas dans D7. node_load(). Ont modifié la balise de question pour refléter cela.
Chapabu
3
Version D7 (bien qu'en utilisant le $conditionsparamètre obsolète ):$nodes = node_load_multiple(array(), array('title' => 'node title'));
Clive
47

Dans Drupal 7, les paramètres de node_load()ont été modifiés. Pour obtenir les nœuds qui correspondent à certaines conditions, vous devez utiliser la classe EntityFieldQuery .

$query = new EntityFieldQuery();


 $entities = $query->entityCondition('entity_type', 'node')
  ->propertyCondition('type', 'your_node_type')
  ->propertyCondition('title', 'your node title')
  ->propertyCondition('status', 1)
  ->range(0,1)
  ->execute();

  if (!empty($entities['node'])) {
    $node = node_load(array_shift(array_keys($entities['node'])));
  }
Tamer Zoubi
la source
1
node_load (array ('title' => 'node title', 'type' => 'page')) - ceci sera bientôt obsolète, donc cette réponse est correcte.
Nikit
1
C'est si long pour charger un seul nœud; /
kenorb
12

Drupal 7

Voici un moyen plus simple (comme déjà suggéré par Clive et chez SO ):

$nodes = node_load_multiple(NULL, array("title" => "Foo Bar"));
$node = current($nodes);

et beaucoup plus facile à retenir que d'utiliser la classe EntityFieldQuery .

Voir aussi: Obtenir par programmation des nœuds par titre dans Drupal 7 à SO

Kenorb
la source
1
ce devrait être la réponse acceptée!
Alex Skrypnyk
3
belle approche, malheur destiné à mourir, comme exposé dans [ api.drupal.org/api/drupal/modules%21node%21node.module/function/… (fonction node_load_multiple) @todo Remove $conditions in Drupal 8.
août
10

Dans Drupal 7, vous pouvez utiliser un code similaire au suivant.

$result = db_query("SELECT n.nid FROM {node} n WHERE n.title = :title AND n.type = :type", array(":title"=> $title, ":type"=> $type));  
$nid = $result->fetchField();
abd
la source
vous accueillez: D.
abd
6

Dans Drupal 8, exécutez ceci:

$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadByProperties(['title' => $title]);
foreach ( $nodes as $node ) {
  $node->doSomething(...);
}

$node sera un objet nœud entièrement instancié.

user1359
la source
1

Aussi dans Drupal 8

$nids = \Drupal::entityQuery('node')
->condition('title', 'YourNodeTitle')
->sort('nid', 'DESC')
->execute();

et ensuite:

$node = \Drupal\node\Entity\Node::load(HEREYOUNODEID);

N'oubliez pas que vous avez besoin

use Drupal\node\Entity\Node;
Yaina Villafañes
la source