Использование hook_forms

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

Аватар пользователя tworogue tworogue 29 августа 2013 в 12:09

Доброго всем времени суток!

В ходе обучения появился следующий вопрос. Предположим, для тизера каждой ноды, опубликованной на главной странице, требуется создать для администратора кнопку "Удалить", по нажатию которой происходит удаление, показывается сообщение об удалении и делается drupal_goto() на главную. Как в этом случае строить формы, используя hook_forms?

Комментарии

Аватар пользователя Drupal Coder Drupal Coder 30 августа 2013 в 12:12

Если несколько форм с одинаковым form_id вывести на одной и той же странице, то, даже если у форм будут разные параметры, отрабатывать будет всегда только первая, не зависимо то того, какую форму сабмитим:

<?php

// Вывод форм сверху вниз на одной странице.
drupal_get_form('mymodule_mydelete_form', $node_id1);
drupal_get_form('mymodule_mydelete_form', $node_id2);
drupal_get_form('mymodule_mydelete_form', $node_id3);
drupal_get_form('mymodule_mydelete_form', $node_id4);

function mymodule_mydelete_form($form, &$form_state, $node_id) {
...
}

function mymodule_mydelete_form_submit($form, &$form_state) {
// $form_state['build_info']['args'] всегда содержит только $node_id1!
...
}

?>

Так происходит потому, что у каждой формы на странице должен быть уникальный form_id, т.е. можно сделать так:
<?php
drupal_get_form('mymodule_mydelete_form_' . $node_id1, $node_id1);
drupal_get_form('mymodule_mydelete_form_' . $node_id2, $node_id2);
drupal_get_form('mymodule_mydelete_form_' . $node_id3, $node_id3);
drupal_get_form('mymodule_mydelete_form_' . $node_id4, $node_id4);
...

?>

Но как тогда Drupal узнает какие коллбеки вызывать для валидации и сабмита форм с такими id? Тут то нам и нужен hook_forms, который позволяет привязать динамически генерируемые form_id к конкретным коллбекам, например mymodule_mydelete_form_submit().

Этот хук будет вызываться для всех форм, а возвращать наш коллбек надо только для наших форм, т.е. тех у которых $form_id вида mymodule_mydelete_form_*. Это можно сделать например проверкой строки $form_id через preg_match().

Пример такого использования hook_forms дан в комментах на страницах документации хука:
https://api.drupal.org/comment/48318#comment-48318

@duozersk Это задача на освоение hook_forms() на курсах от drupal-coder.ru. На вопросы по Drupal отвечаем на drupal.ru чтобы не писать по несколько раз одно и то же. За одно может кто-то дополнит ответ.