Отмена изменения узла из модуля - PullRequest
1 голос
/ 22 сентября 2010

Я создаю модуль для Drupal 6 (то, что он делает, не имеет большого значения; я потратил долго время на поиски других решений этой проблемы, и сворачивание собственного, безусловно, самое простое), и я столкнулся с чем-то вроде концептуального дорожного препятствия.

Так же, как модуль uploadpath, я создаю каталог на основе ( через шаблон замены)свойства узла.Например, создавая узел с типом содержимого «assignmentindex» под названием «Foobar», мой модуль создаст папку sites/default/files/assignmentindex/Foobar.

Проблема возникает (как и ожидалось) во время событий update, когда целевой каталог ужесуществует или не может быть создан по какой-то другой странной причине (единственная, о которой я могу мечтать сейчас, - это исчерпание инодов, но я уверен, что есть другие условия сбоя).Очевидно, чтобы избежать потери данных, исходную папку нужно оставить в покое, но это нарушает связь между каталогом и узлом.Таким образом, я вижу 3 разные возможности:

  • Откат всего узла
  • Откат только измененного заголовка
  • Ничего не откатывается (но показывает ошибку)

Первый Вопрос в том, какой из них лучше?Откат всего узла уничтожает потенциально огромный объем работы, откат только заголовка сбивает с толку, а откат ничего не означает, что имена не синхронизированы.В настоящее время я предпочитаю просто откатить заголовок, но я очень ценю мысли по этому поводу.

Вопрос second : как?Я уже переключил соответствующий $op на presaveupdate), чтобы исходный узел был доступен через

$old_node = node_load($node->id);

и откатил одно полепотенциально может просто сделать

$node->title = $old_node-title;

, но это кажется неоптимальным, и мне любопытно, есть ли лучший способ добиться этого.

Извините за длинный вопрос, изаранее большое спасибо за помощь.

1 Ответ

0 голосов
/ 22 сентября 2010

В качестве альтернативы рассмотренным выше: если вам не нужны импортированные / программно созданные узлы, вы можете добавить обработчик проверки при отправке формы узла. Валидация имеет доступ как к новым, так и к старым узлам и может отклонить отправку пользователю более стандартным способом.

function custom_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#id'] == 'node-form') {
    $form['#validate'][] = '_custom_node_form_validate';
  }
}

function _custom_node_form_validate(&$form, &$form_state) {
  $old_node = $form['#node'];
  $new_node = $form_state['values'];
}
...