2010-06-26 2 views
3

Я пытаюсь программно сохранить узлы типа CCK, используя drupal_execute(). Создаются пустые узлы; ни одно из полей CCK не сохраняется. Очевидно, что первая строка в drupal_process_form() отвечает:

$form_state['values'] = array(); 

Так что мой вопрос почему «ценности» стираются, и что более важно, как я могу сохранить CCK поля с помощью drupal_execute()?

Я попробовал save_node(), который хорошо работал; однако я бы предпочел первое, поскольку он вызывает подтверждение.

ответ

3

Массив значений очищается в drupal_process_form(), потому что он будет заселен с $_POST глобально позже. Если вы посмотрите на drupal_execute(), вы увидите, что он делает обратное, то есть заполняет $_POST глобальным из прошедшего в $form_state['values'].

Я думаю, что это сделано для того, чтобы обработка формы работала так же, как и для «нормальной» формы, поэтому drupal_execute в основном устанавливает сцену так, чтобы все выглядело примерно так же, как с «нормальным» 'представить позже.

Это означает, что ваш подход в основном правильный и должен работать - если этого не происходит, должно быть что-то еще не так. Я не могу догадаться, что это может быть, но вы можете проверить this thread на некоторые обсуждения вашего подхода и тему поля CCK (это смешанная тема, обсуждающая подход node_save(), но связанная часть может соответствовать вашей конкретной ситуации) ,

+0

Спасибо за объяснение. Я думаю, что раньше я сталкивался с этой нитью; это было полезно. Я имею дело с более чем 200 полями в одном типе (это всего лишь прототип, он должен быть нормализован в конце концов) на данный момент, и довольно сложно найти виновника. Я заметил, что form_get_errors() испускает сообщения только для стандартных полей, таких как title; есть ли другой способ извлечь ошибки проверки? – Stan

+0

@Stan: Другого способа я не знаю. Вы уверены, что это не просто проблема времени (веса), т. Е. Что ваш вызов 'form_get_errors()' встречается перед функциями CCKs validation, где вызывается? –

+0

Ну 'form_get_errors()' вызывается сразу после 'drupal_execute()'. Я буду использовать 'node_save()' на данный момент или до тех пор, пока количество полей станет более управляемым. – Stan

Смежные вопросы