Доброго всем времени суток!
В ходе обучения появился следующий вопрос. Предположим, для тизера каждой ноды, опубликованной на главной странице, требуется создать для администратора кнопку "Удалить", по нажатию которой происходит удаление, показывается сообщение об удалении и делается drupal_goto() на главную. Как в этом случае строить формы, используя hook_forms?
Комментарии
Используйте contextual links - https://drupal.org/project/ccl
Если несколько форм с одинаковым 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 чтобы не писать по несколько раз одно и то же. За одно может кто-то дополнит ответ.