Drupal FAPI: добавление элементов формы в форму узла после проверки - PullRequest
1 голос
/ 22 мая 2010

Я использую Drupal 6.x. В своем собственном модуле я изменяю каждый узел формы и добавляю в него свой собственный обработчик проверки, используя

$form['#validate'][] = 'my_own_validation_function';

Тогда у меня есть функция

function my_own_validation_function($form, &$form_state)
{
  //if validation fails, i would like to rebuild the form to add additional form elements in hook_form_alter
  $form_state['rebuild'] = True;
}

Моя проблема в том, что функции проверки не учитывают мое 'rebuild' = True, потому что форма никогда не обрабатывается hook_form_alter после проверки. Но мне нужен hook_form_alter, чтобы добавить мой дополнительный элемент формы.

Есть ли решение моей проблемы? Или изменения form_state в собственном обработчике проверки не учитываются, даже если я установил & $ form_state в качестве «указателя»?

Спасибо и ура.

Ответы [ 3 ]

1 голос
/ 26 мая 2010

хорошо, теперь я понял! Все было хорошо, но одна ошибка: в моем собственном обработчике проверки я устанавливаю form_set_error и, если есть ошибка, и $ form_state ['rebuild'] = true, функция drupal_get_form не будет перестраивать форму, пока не будет ошибки формы. Я нашел это в форме. В строке 141

if ((!empty($form_state['storage']) || !empty($form_state['rebuild'])) && !empty($form_state['submitted']) && !form_get_errors()) {
0 голосов
/ 24 мая 2010

я тоже так думал, что должен работать.Я знаю, что флаг перестроения не будет установлен в hook_form_alter.Но моя проблема в том, что hook_form_alter больше не вызывается после проверки с ошибкой проверки.Вы уверены, что это работает на формах CCK true или только на собственных формах, созданных drupal_get_form?

0 голосов
/ 23 мая 2010

Вы уверены, что ваш hook_form_alter больше не вызывается, или вы просто проверяете свойство rebuild на true там?

IIRC, ваш подход правильный - установка $form_state['rebuild'] = True во время проверки должна привести к перестройке формы. Но обычно можно установить дополнительный «указатель» (например, $form_state['myModule_rebuild_indicator'] = TRUE и проверить это в hook_form_alter (свойство rebuild снова будет ложным в этой точке ).

...