Сценарий загрузки drupal: как получить список всех узлов типа x? - PullRequest
2 голосов
/ 19 марта 2010

Я создаю пользовательский импорт и экспорт, на данный момент в качестве внешнего скрипта (с помощью начальной загрузки), я планирую позже создать более общий модуль.

Я создаю интерфейс для nagios, а также для нашего управления хостом и конфигурации nagios. Может быть, это может быть полезно для других сред (управление сетью)

Теперь мне нужно знать, как получить список всех узлов типа x?

Я хочу избежать прямого SQL.

Я получил предложение сделать rss и разобрать его но я беру Drupal db несколько раз, чтобы извлечь различные узлы, так что странно делать веб-запрос для одной вещи

Так что я ищу новичка drupal dev, это просто указатель на API базового поиска для этой задачи

TIA Флориан

Ответы [ 5 ]

5 голосов
/ 19 марта 2010

Почему вы хотите избежать использования SQL?

Если вы хотите получить информацию о том, что находится в вашей базе данных, как и все узлы типа x, единственный способ получить это - выполнить SQL-запрос, если у вас уже не извлечены данные.

запрос типа

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

не должно быть то, что разрушает вашу производительность.

Edit:
Ссылка, которую вы предоставили, взята с Drupal 7, поэтому вы должны быть осторожны, читая это. Причина в том, что в Drupal 7 возможно не только использовать db_query, который в основном является оберткой для функций php mysql_query, pg_query. Это немного по-другому, и, используя его, вам не придется использовать код db_specific. В любом случае, новое в Drupal 7 - это что-то вроде ORM. Я не читал об этом подробно, но идея в том, что вы можете построить запрос, используя команды для объекта. Это, вероятно, то, что вы после. Тем не менее, Drupal 7 вообще не готов для производственных площадок. Есть еще много критических вопросов и проблем безопасности. Так что это не будет возможным в течение достаточно долгого времени.

Редактировать 2:
Если вы хотите получить заголовок и тело узла, это то, что вы должны сделать:

$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;
}

Вы можете использовать db_fetch_array вместо db_fetch_object`, если хотите извлечь массивы вместо объектов из БД.

2 голосов
/ 10 января 2013

Это довольно старый вопрос, но для всех, кто сейчас сталкивается с этой страницей, в Drupal 7.x рекомендуется использовать динамические запросы.

Итак, если вы хотите выбрать все узлы типа x, вы можете сделать следующее:

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

В этом случае переменная $ article должна быть массивом всех узлов типа x, ключом которого является nid, а значение массива, соответствующее значению заголовка узла. Надеюсь, что это может помочь.

1 голос
/ 19 марта 2010

Представления - это, как правило, создание запросов к базе данных без их написания в Drupal, но этот запрос настолько прост, что я не уверен, что оно стоит затрат на изучение представлений, всего 5 строк после загрузки 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 голосов
/ 22 марта 2010

Миграционный модуль может вас заинтересовать. Он также поддерживает drush , так что вы можете довольно легко писать сценарии.

0 голосов
/ 19 марта 2010

Должен использовать SQL для этого.

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

Количество узлов =

$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);

Узлы и их тип:

$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);

Нечто подобное. Я ем обед, поэтому я не проверял это, но я делал это раньше, так что это должно работать Drupal 6.

...