Нюанс при загрузке форм через drupal_get_form

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

Аватар пользователя gilmor gilmor 6 января 2011 в 19:14

Хочу поделиться одним смешным моментом, на поиски которого потратил два вечера.

В друпале есть замечательный метод drupal_get_form, который позволяет загружать формы по FORM_ID.

Рабочий пример использования:

<?php
        print drupal_get_form('user_register');
?>

Меня интересовала форма menu_overview_form (отвечает за "List items" для меню),
применительно к primary-links

Я нашел, что в функции бывает дополнительный параметр, который передается в конструктор формы, если таковой требуется
(спасибо http://www.drupal.ru/node/30663)

Заглянув в модуль Menu, посмотрел что ждет конструктор и записал так:

<?php
        $menu = array('menu_name' => 'primary-links');
        print drupal_get_form('menu_overview_form', $menu);
?>

Долго мучал варианты, но упорно получаю ошибку:

warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'menu_overview_form' was given in \www\includes\form.inc on line 378.

дескать, callback не валидный, а значит у вас не правильный FORM_ID.
но в FORM_ID я был уверен и не понимал где и почему отпал callback.

в какой-то момент, уже формулируя свои мысли и догадки, чтобы обратиться за помощью,
я обратил внимание, что мой callback находиться не в файле-модуле, в файле-инклуде.
и тут мне подумалось, а что если Drupal не подтягивает его сам при таком вызове...

решил сделать это руками:

<?php
        [user=include]include[/user] 'modules/menu/menu.admin.inc';

        $menu = array('menu_name' => 'primary-links');
        print drupal_get_form('menu_overview_form', $menu);
?>

о чудо, оно заработало!

Нюанс оказался в том, что инклуды надо инклудить Wink

p.s.
раз уж дело сформулировал, решил отправить.
но уже не как вопрос, а как ответ.
вдруг кому-то пригодиться.

Комментарии