Загрузка предыдущей редакции узла


Когда вы получаете узел, как вы загружаете предыдущую версию (ревизию)?

Я знаю, как загрузить ревизию, но не знаю, как получить номер предыдущей ревизии ($node->vid-это текущая ревизия).

Спасибо

3 2

3 ответа:

Предположим, что у вас есть объект node $node, Вы можете использовать следующий код для получения предыдущей редакции.

$previous_vid = db_result( 
  db_query('SELECT MAX(vid) AS vid FROM {node_revisions} WHERE vid < %d AND nid = %d', $node->vid, $node->nid)
);

Как только у вас есть предыдущая редакция, вы можете загрузить новый объект узла с помощью node_load(array('nid' => $node-nid, 'vid' => $previous_vid)).

Код должен проверить, возвращает ли db_result() FALSE, в случае отсутствия предыдущей редакции. Обратите внимание, что поле vid является глобальным для каждого узла; оно не содержит одного и того же значения для разных узлов.

Спасибо всем.

Я нашел и другое решение:

  $revisions = node_revision_list($node);
  next($revisions);
  if ($preview_key = key($revisions)) {
    $preview_revision = $revisions[$preview_key];
    $old_node = node_load($node->nid, $preview_revision->vid);
  }

Но если у вас много ревизий, вы получаете большой массив.

Если я понимаю, что вы пытаетесь сделать; вы хотите получить предварительный просмотр узла после того, как кто-то отправит изменения?

Кнопка предварительного просмотра имеет свой собственный обработчик отправки, node_form_build_preview(). Там он создает новый объект узла, используя данные в $form_state, и запускает node_preview(), который возвращает разметку для предварительного просмотра.

Если вы хотите захватить этот предварительный просмотр, когда пользователь нажимает кнопку предварительного просмотра, вам нужно будет использовать hook_form_alter Чтобы добавить еще один обработчик отправки в предварительный просмотр кнопка:

$['form']['buttons']['preview']['#submit'][] = 'mymodule_custom_preview';

Где mymodule_custom_preview-это имя вашей пользовательской функции отправки. Взгляните на node_form_build_preview() для руководства, но ваша функция отправки будет выглядеть примерно так:

function mymodule_custom_preview($form, &$form_state) {
  $node = node_form_submit_build_node($form, $form_state);
  $preview = node_preview($node);
}

Также взгляните на node_form(), это дает вам представление о том, как структурирована форма узла. Когда вы все закончите, у вас будет код в вашем модуле, который выглядит примерно так:

function mymodule_form_alter(&$form, $form_state, $form_id) {
  if (strstr($form_id, '_node_form') !== FALSE) {
    $['form']['buttons']['preview']['#submit'][] = 'mymodule_custom_preview';
  }
}

function mymodule_custom_preview($form, &$form_state) {
  $node = node_form_submit_build_node($form, $form_state);
  $preview = node_preview($node);

  // Do what you will with $preview.
}