Хочу поделиться одним смешным моментом, на поиски которого потратил два вечера.
В друпале есть замечательный метод drupal_get_form, который позволяет загружать формы по FORM_ID.
Рабочий пример использования:
Меня интересовала форма menu_overview_form (отвечает за "List items" для меню),
применительно к primary-links
Я нашел, что в функции бывает дополнительный параметр, который передается в конструктор формы, если таковой требуется
(спасибо http://www.drupal.ru/node/30663)
Заглянув в модуль Menu, посмотрел что ждет конструктор и записал так:
$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 не подтягивает его сам при таком вызове...
решил сделать это руками:
[user=include]include[/user] 'modules/menu/menu.admin.inc';
$menu = array('menu_name' => 'primary-links');
print drupal_get_form('menu_overview_form', $menu);
?>
о чудо, оно заработало!
Нюанс оказался в том, что инклуды надо инклудить
p.s.
раз уж дело сформулировал, решил отправить.
но уже не как вопрос, а как ответ.
вдруг кому-то пригодиться.
Комментарии
Лучше вместо include использовать параметры hook_menu: 'file' и 'file path'.
sin@drupal.org
а применительно к обычному php-коду в теле ноды это тоже как-то возможно?
Нет. Откуда в ноде hook_menu() взяться-то
Нет. Тогда правильнее использовать module_load_include(). Пути к файлам лучше не зашивать в код.