Как остановить Drupal для установки даты изменения узла при создании?

9

Это мой второй вопрос о моих проблемах с созданием собственного скрипта миграции.

Я создаю только новые узлы и не беспокоюсь об обновлениях.

Код:

        $node = new stdClass();
        $node->type = 'migrate';
        $node->title = $content['title'];
        $node->language = LANGUAGE_NONE;

        $node->created = (int) date('U',strtotime($content['created']));

        $modified = $content['modified'];               
        if (! empty($modified) && $modified != '0000-00-00 00:00:00') {
            $modified = (int) date('U',strtotime($modified));
        } else {
            $modified = 0;
        }               
        $node->changed = $modified;

        node_object_prepare($node);

        #some lines later
        node_save($node);

Например, мой $ified установлен в 0 и после сохранения я вижу обновленный столбец этой строки узла в списке содержимого администратора с текущим значением даты и времени.

Codium
источник

Ответы:

14

Вы должны быть в состоянии сохранить исходное changedвремя, сначала установив пользовательское свойство для объекта узла, скажем $node->modified, в вашем сценарии миграции, перед вызовом node_save(), а затем реализовав ловушку node_presave:

/**
 * Implements hook_node_presave().
 */
function mymodule_node_presave($node) {
  $node->changed = $node->modified;
}

Это будет работать, так как node_save()устанавливается $node->changedдо вызова всех реализуемых модулей hook_node_presave().

jhedstrom
источник
Да, это работает на 100% :)
Codium
1
Подозреваю, меня за это застрелят, но если, как и я, вы запускаете недолговечный скрипт через drush, который не является частью модуля, и вы не хотите реализовывать модуль просто для реализации ловушки и т. Д., Тогда он работает db_query('UPDATE {node} SET created=:created, changed=:changed WHERE nid=:nid', array(':created'=>$whatever,':changed'=>$whatever,':nid'=>$node->nid));после сохранения.
artfulrobot
Ненавижу, что мы должны что-то делать так же неловко, как ловушка (неловко, потому что изменения происходят в совершенно другом сегменте кода), но это вина Drupal, а не ваша. +1
Кенни Уайлэнд