[РЕШЕНО]Почему hook_form_alter вызывается дважды?

Главные вкладки

Аватар пользователя zzzzzz zzzzzz 4 июля 2015 в 20:28
<?php
hook_form_
[IDФормы]_alter(&$form, &$form_state$form_id){
    
$file file(__DIR__.'/test.php');
    
$file $file[0] + 1;
    
file_put_contents(__DIR__.'/text.php'$file);
}
?>

Инициализирую text.php значением 0

Открываю ноду на редактирование, hook_form_[IDФормы]_alter отработал и значение в файле text.php увеличилось на единицу, получается 1.
Теперь нажимаю кнопку сохранения и text.php становится уже 2

Так и должно быть или мои руки виноваты?
Что делать в этом случае

P.S. hook_form_[IDФормы]_alter я использую чтобы повесить свой обработчик перед основным(array_unshift($form['#submit'], 'my_cutom_handler');), который перед сохранением ноды инициализирует текстовое поле.

Комментарии

Аватар пользователя serega111 serega111 5 июля 2015 в 13:35

hook_form_alter вызывается 1й раз, когда форма строится для отображения, hook_form_alter вызывается 2 раз, когда друпал формирует $form_state из пост запроса, hook_form_alter будет вызван 3й раз, если не произошло редиректа на другую страницу, опять для отображения формы

Аватар пользователя zzzzzz zzzzzz 5 июля 2015 в 13:54

Ребят, что делать если второй вызов хук форм не устраивает? Друпал гигант, должен же быть другой выриант?
Поиском пользовался

Аватар пользователя zzzzzz zzzzzz 5 июля 2015 в 14:08

мне нужно выполнить некоторый код только в момент когда форма строится, и ничего не делать когда отправляем форму(submit)

Аватар пользователя zzzzzz zzzzzz 6 июля 2015 в 11:00

мне нужно изменить некоторые поля перед выводом формы и выполнить некоторый код. Как это реализовать без хук формы?

Аватар пользователя zzzzzz zzzzzz 6 июля 2015 в 11:52

В общем озадачил меня друпал. Отвечаю сам.
Сравнив массив $form_state в случае когда форма рендерится и отправляется, заметил то в первом случае $form_state['input'] возвращает пустой массив, а во втором со знамениями формы.

Отсюда решение проверить (array)$form_state на налиие клюа "input"

<?php
if( empty($form_state['input']) ) {
    
//hook_form_alter выполнился в перавый раз
}
else {
    
//во второй
}
?>