Как публиковать неопубликованные узлы программно

16

У меня есть несколько неопубликованных узлов, для которых у меня есть идентификаторы их узлов. Как я могу их программно опубликовать? Правильно ли добиться этого в пользовательском модуле с помощью запроса, подобного следующему?

db_query("UPDATE {node} SET status = 1 WHERE nid = %d", $nid)
Джим Гаслингсон
источник
Хотя он не самый чистый, он один из самых быстрых.
Оскар Кальво
3
Основная проблема этого метода заключается в том, что он не обновляется node_revision, поэтому он вызывает несогласованность.
artfulrobot

Ответы:

21

Используется db_query()метод Drupal 6, который не используется в Drupal 7. Чтобы добиться своей работы, я предлагаю этот код (без каких-либо ручных запросов).

// load the node object
$node = node_load($nid);
// set status property to 1
$node->status = 1;
// re-save the node
node_save($node);

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

$nids = array();
// Load all nodes in one go for better performance.
$nodes = node_load_multiple($nids);
foreach ($nodes as $node) {
  // set status property to 1
  $node->status = 1;
  // re-save the node
  node_save($node);
}
Юсеф
источник
3
А? db_queryэто метод Drupal 7 тоже. Просто принимает разные аргументы.
@andrewtweber, да, теперь это часть drupal, но посмотри на первую версию drupal 7, а затем утверждай !!!
Юсеф
Какой хук я должен использовать? Я добавил в hook_node_submit, но я получаю ошибку. Любая помощь?
Сократись
@sokratis в hook_form_alter добавьте свой собственный submitобработчик, затем в пользовательском обработчике отправки вы можете использовать что-то вроде этого.
Юсеф
Не забывайте цитаты. $ node-> status = "1";
Selwyn Polit
8

когда вы используете node_load (), node_load_multiple () для загрузки (нескольких) узлов, существует много ловушек, вызываемых модулями, такими как hook_node_load , hook_node_operations , hook_node_prepare , hook_node_accesse . Но при выполнении запроса непосредственно к схеме drupal эти хуки будут игнорироваться и приводят ко многим проблемам.

Запросы:

db_query("UPDATE {node} SET `status` = '1' WHERE `nid` =:nid ;"
    ,array(':nid'=>$node->nid));

db_query("UPDATE {node_revision} SET `status` = '1' WHERE `nid` =:nid AND  `vid` =:vid;"
    ,array(':nid'=>$node->nid,'vid'=> $node->vid));

Просто используйте приведенный выше код, если node_load () или node_load_multiple () не работают из-за нехватки доступной памяти.

Б Раванбахш
источник