В каком порядке вставляются узлы при их создании? - PullRequest
0 голосов
/ 20 сентября 2009

В Drupal, если вы хотите вставить что-то в таблицу узлов, «nid» может быть нулевым, а «vid» - нет. Обратное верно для таблицы node_revision.

В каком порядке вставляются узлы при их создании?

Я не могу вставить в таблицу узлов, потому что у меня нет идентификатора ревизии; Я не могу вставить в таблицу node_revision, потому что у меня нет идентификатора узла.

Кроме того, есть ли какая-то функция, которая может легко сделать эту вставку для вас?

Ответы [ 2 ]

3 голосов
/ 20 сентября 2009

Доступен код функции node_save ; Вы пытались увидеть, как это работает?

Вот часть, которая относится к созданию узла:

if ($node->is_new) {
  _node_save_revision($node, $user->uid);
  drupal_write_record('node', $node);
  db_query('UPDATE {node_revisions} SET nid = %d WHERE vid = %d', $node->nid, $node->vid);
  $op = 'insert';
}

По-видимому, сначала он сохраняет ревизию узла, и только затем сохраняет сам узел.

После этого запись node_revisions обновляется, чтобы установить значение nid.


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

0 голосов
/ 02 октября 2012

В Drupal 7 порядок инвертирован по сравнению с Drupal 6: сначала сохраняется узел, а затем сохраняется версия узла.

// Save the node and node revision.
if ($node->is_new) {
  // For new nodes, save new records for both the node itself and the node
  // revision.
  drupal_write_record('node', $node);
  _node_save_revision($node, $user->uid);
  $op = 'insert';
}

Также, когда узел обновляется, узел сначала сохраняется, а затем сохраняется версия узла.

  // For existing nodes, update the node record which matches the value of
  // $node->nid.
  drupal_write_record('node', $node, 'nid');
  // Then, if a new node revision was requested, save a new record for
  // that; otherwise, update the node revision record which matches the
  // value of $node->vid.
  if (!empty($node->revision)) {
    _node_save_revision($node, $user->uid);
  }
  else {
    _node_save_revision($node, $user->uid, 'vid');
    $update_node = FALSE;
  }
  $op = 'update';

После сохранения версии узла строка узла обновляется.

if ($update_node) {
  db_update('node')
    ->fields(array('vid' => $node->vid))
    ->condition('nid', $node->nid)
    ->execute();
}

В Drupal 7 поле vid для таблицы узлов может быть NULL, тогда как поля nid и vid для node_revision не NULL, хотя значение nid по умолчанию равно 0.

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