Drupal 6, как опубликовать узел из кода - PullRequest
0 голосов
/ 22 июля 2011

Как опубликовать узел из php кода?Пробовал простой запрос db_query("UPDATE {node} SET status = 1 WHERE nid = %d", $nid);, но он не работает.Мой сценарий: по умолчанию узлы не опубликованы.Я изменяю форму узла редактирования, чтобы добавить текстовое поле.Если пользователь вводит правильный код, узел становится опубликованным.Поэтому я добавил еще одну функцию отправки в form_alter и в эту функцию, проверяя код и, если он прав, пытаясь обновить статус узла до опубликованного.

Ответы [ 4 ]

4 голосов
/ 23 июля 2011
<?php
// load the node object
$node = node_load($nid);
// set status property to 1
$node->status = 1;
// re-save the node
node_save($node);
?>

Кроме того, я видел ваш комментарий об использовании $ form ['nid'] ['# value']. Вы уверены, что переменная содержит значение идентификатора узла? Обычно вы выполняете код в обработчике отправки формы, что означает, что вы будете использовать что-то вроде: $ form_state ['values'] ['nid'], чтобы получить значение элемента $ form ['nid'].

Пример:

<?php
function mymodule_myform() {
  $form = array();
  $form['nid'] = array(
    '#type' => 'textfield',
    '#title' => 'Node ID to Publish'
  );
  $form['submit'] = array('#type' => 'submit', '#value' => 'Submit');
}

function mymodule_myform_submit($form, &$form_state) {
  $node = node_load($form_state['values']['nid']);

  if ($node) {
    $node->status = 1;
    node_save($node);
  }
}
1 голос
/ 23 июля 2011

Лучше не кодировать напрямую схему db, так как написание запросов самостоятельно создает избыточность. Вы всегда должны использовать API узла.

Drupal вызывает api узла при выполнении сохранения узла. Это дает всем другим модулям в вашем приложении возможность изменять узел любым удобным для них способом. Таким образом, вполне вероятно, что ваш код работает правильно, просто не так, как вы ожидаете. Например, другой модуль может установить состояние узла после того, как вы его установите, и перепишите свое значение.

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

См:
http://api.drupal.org/api/drupal/modules--node--node.module/function/node_save/6

0 голосов
/ 23 июля 2011
  1. Убедитесь, что ваш пользовательский модуль / тема включен.

  2. Я также попытался бы создать узел через интерфейс Drupal (сделать его неопубликованным).Затем запустите db_query("UPDATE {node} SET status = 1 WHERE nid = %d", [paste_just_created_node_id_here]); в своем пользовательском модуле и посмотрите, работает ли он.

0 голосов
/ 22 июля 2011

Попробуйте использовать функции node_load и node_save, встроенные в drupal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...