2010-03-19 5 views
2

Je crée une importation et une exportation personnalisées, en ce moment comme un script externe (via bootstrap), je prévois de créer un module de façon plus générique lateron.Drupal bootstrap script: comment obtenir la liste de tous les nœuds de type x?

Je construis une interface pour nagios et pour la gestion de notre hôte et la configuration de nagios btw. Peut-être que cela pourrait devenir utile pour d'autres environnements (gestion de réseau)

Maintenant, j'ai besoin de savoir comment obtenir la liste de tous les nœuds de type x?

Je veux éviter le SQL direct.

Une suggestion que je suis arrivé était de faire un flux et l'analyser mais j'acess les drupal db une douzaine de fois pour extraire divers nœuds, il est étrange de faire une demande de web pour une chose

Alors ce que je je cherche comme débutant dev est juste drupal un pointeur vers api module de recherche de base pour cette tâche

TIA florian

+0

Je coche enfin ce problème résolu - Thx pour de l'aide !! :) – groovehunter

Répondre

5

Pourquoi voulez-vous éviter d'utiliser SQL? Si vous souhaitez obtenir des informations sur ce qui se trouve dans votre base de données, comme tous les nœuds de type x, la seule façon de l'obtenir est d'utiliser une requête SQL, à moins que vous n'ayez déjà extrait les données.

Une requête comme

db_query("SELECT title, nid FROM {node} WHERE type = 'x';"); 

ne doit pas être la chose qui ruine votre performance.

Edit:
Le lien fourni est un de Drupal 7, de sorte que vous devez être une lecture attentive cela. La raison en est que dans Drupal 7, il n'est pas seulement possible d'utiliser db_query qui est essentiellement l'encapsuleur pour les fonctions php mysql_query, pg_query. C'est un peu différent et en l'utilisant, vous n'aurez pas à utiliser le code spécifique à db. Quoi qu'il en soit, Drupal 7 est quelque chose qui ressemble un peu à un ORM. Je n'ai pas lu à ce sujet en détail, mais l'idée est que vous pouvez construire une requête en utilisant des commandes sur un objet. C'est probablement ce que vous cherchez. Cependant, Drupal 7 n'est pas du tout prêt pour les sites de production. Il y a encore beaucoup de problèmes critiques et de problèmes de sécurité. Donc, ce ne sera pas une possibilité pour un certain temps.

Edit 2:
Si vous voulez obtenir le titre de noeud et le corps, c'est ce que vous devez faire:

$type = 'x'; 
$query = db_query("SELECT r.nid, r.title, r.body FROM {node} AS n 
        LEFT JOIN {node_revisions} AS r ON r.nid = n.nid 
        WHERE type = '%s';", array($type)); 
$nodes = array(); 
while ($node = db_fetch_object($query)) { 
    $nodes[$node->nid] = $node; 
} 

Vous pouvez utiliser db_fetch_array au lieu de db_fetch_object` si vous voulez extraire des tableaux au lieu d'objets de la DB.

+0

ok je vais avec ça si c'est recommandé et il n'y a pas d'appel api pour cela. C'est juste parce que j'ai beaucoup travaillé avec les ORM pendant environ un an ... Donc je l'ai fait mais je ne vois que db_fetch_array ($ query) resp ..,. Object qui retourne un seul tableau ou objet.!? – groovehunter

+0

ok je devrais m'entendre avec ces docs. Pas besoin de commenter ça, merci. http://drupal.org/node/310072 – groovehunter

+0

ces documents sont confus/faux ... maintenant je suis enfin sur la bonne voie – groovehunter

1

Views est généralement comment créer des requêtes de base de données sans les écrire dans Drupal, mais cette requête est si simple que je ne suis pas sûr que ça vaut les frais généraux de vue d'apprentissage, à peine 5 lignes après que vous avez bootstrappés Drupal:

$nodes = array(); 
$results = db_query("SELECT nid FROM {node} WHERE type = '%s'", $type); 
while ($result = db_fetch_object($result)) { 
    $nodes[] = node_load($result->nid); 
} 
+0

C'est une très mauvaise idée de faire node_load sur un grand ensemble de noeuds, il va exécuter un grand ensemble de crochets et de requêtes. – googletorp

+1

je vois. Dans mon cas il y en a environ 20 et j'ai besoin du corps et de quelques champs de cck. Donc, je garde mon code et j'appelle node_load. thx aussi Scott. Au moins votre indice avec "db_fetch_object" a fonctionné, toutes les autres méthodes ont retourné un ensemble vide en quelque sorte j'étais trop banane. x; D – groovehunter

0

Doit utiliser SQL pour cela.

http://api.drupal.org/api/function/node_get_types/6

compte node =

$node_types = node_get_types(); 

$type_count = array(); 

foreach ($node_types as $type) { 
    $result = db_fetch_object(db_query('SELECT count(nid) AS node_count FROM {node} WHERE type = "%s"'), $type); 
    $type_count[$type] = $result['count(nid)']; 
} 

print_r($type_count); 

nœuds et leur type:

$node_types = node_get_types(); 

$nodes = array(); 

foreach ($node_types as $type) { 
    $result = db_query('SELECT nid, title FROM {node} WHERE type = "%s"'), $type); 

    while ($node = db_fetch_object($result)) { 
     $nodes[] = array('Type' => $type, 'Title' => $node->title); 
    } 
} 

print_r($nodes); 

Quelque chose comme ça. Je mange le déjeuner donc je n'ai pas testé cela mais je l'ai fait avant ainsi cela devrait fonctionner. Drupal 6.

0

Les migrate module peuvent être d'intérêt pour vous. Il prend également en charge drush afin que vous puissiez écrire des choses assez facilement.

2

Il s'agit d'une question assez ancienne, mais pour quiconque vient à travers cette page maintenant, dans la meilleure pratique de Drupal 7.x est d'utiliser des requêtes dynamiques.

Donc, si vous voulez sélectionner tous les nœuds de type x, vous pouvez effectuer les opérations suivantes:

$articles = db_select('node') 
->fields('node', array('nid', 'title')) 
->condition('type', 'x', '=') 
->execute() 
->fetchAllKeyed(); 

La variable $ articles devrait alors être un tableau de tous les nœuds de type x, calée par JNV avec le tableaux valeur correspondante définie sur le titre du noeud. J'espère que cela peut aider.

Questions connexes