<?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');
), который перед сохранением ноды инициализирует текстовое поле.
Комментарии
ключевое
hook_form_alter вызывается 1й раз, когда форма строится для отображения, hook_form_alter вызывается 2 раз, когда друпал формирует $form_state из пост запроса, hook_form_alter будет вызван 3й раз, если не произошло редиректа на другую страницу, опять для отображения формы
Ребят, что делать если второй вызов хук форм не устраивает? Друпал гигант, должен же быть другой выриант?
Поиском пользовался
может прям в хуке можно проверить?
мне нужно выполнить некоторый код только в момент когда форма строится, и ничего не делать когда отправляем форму(submit)
а рядом с render($form) нельзя написать ваш код ?
зачем тут хук_форм_алтер
не совсем понял что вы имеете ввиду?
мне нужно изменить некоторые поля перед выводом формы и выполнить некоторый код. Как это реализовать без хук формы?
В общем озадачил меня друпал. Отвечаю сам.
Сравнив массив
$form_state
в случае когда форма рендерится и отправляется, заметил то в первом случае$form_state['input']
возвращает пустой массив, а во втором со знамениями формы.Отсюда решение проверить
(array)$form_state
на налиие клюа "input"<?php
if( empty($form_state['input']) ) {
//hook_form_alter выполнился в перавый раз
}
else {
//во второй
}
?>
а вы попробуйте сгенерировать ошибку в самой форме - и посмотрите что вам прийдет в инпуте )