Здравствуйте уважаемое сообщество! Я тока не давно начал изучать Drupal, а точней функции темизации Drupal. И вот в одной из книг наткнулся на такой вот пример:
<?php
/**
* реализация hook_theme().
*/
function mytheme_theme(){
return array(
//Определяем ID формы как хук темы.
'contact_site_form'=>array(
//Указываем, что 'form' - это элемент визуализации
'render element'=>'form'),
);
}
/**
* Реализует theme_contact_site_form().
*/
function mytheme_contact_site_form($variables){
// Скрываем поле subject. Оно не требуется.
hide($variables['form']['subject']);
// Меняем метки текстовых полей "name" и "mail".
$variables['form']['name']['#title'] = t('Name');
$variables['form']['mail']['#title'] = t('E-mail');
// Создаем переменную output.
$output = '<div class="something">';
$output .= '<p class="note">'. t("We'd love hear from you. Expect to hear back from
us in 1-2 business days.") .'</p>';
$output .= render($variables['form']['name']);
$output .= render($variables['form']['mail']);
$output .= '</div>';
// Обязательно включите визуализированную версию
// остальных элементов формы.
$output .= drupal_render_children($variables['form']);
// Возвращаем переменную output,
return $output;
}
?>
Вооружившийся этими знаниями, я попробовал изменить форму поиска, вот так:
<?php
function mytheme_theme(){
return array(
'search_block_form'=>array(
'render element'=>'form'),
);
}
?>
Тут у меня возник первый вопрос? Зачем регистрировать идентификатор формы в качестве хука темы, в моём файле template.php, если это уже сделано в модуле? Всё работает и без этого.
<?php
function mytheme_search_block_form($variables){
$output .= "<fieldset>";
$output .= "<legend>Форма поиска</legend>";
$output .= render($variables['form']['search_block_form']);
$output .= render($variables['form']['actions']);
$output .= "</fieldset>";
$output .= drupal_render_children($variables['form']);
return $output;
}
?>
А тут возникла другая проблема, функция drupal_render_children() которая как указано в книге, должна добавить скрытые элементы, даже в случаи если функция render() вызывается для каждого элемента формы. Но почему то она этого не делает, и форма не работает. Форма будет работать если к переменой $output, явно добавить эти самые скрытые поля к примеру так:
<?php
$output .= render($variables['form']['form_id']);
$output .= render($variables['form']['form_build_id']);
?>
Тут и кроется второй вопрос. Назначение этой самой drupal_render_children() функции, которая должна быть обязательно добавлено в конец функции, так как оно позаботится о любых дополнительных элементах добавленных другими модулями. Но она этого не делает. Подскажите пожалуйста в чём тут ошибка, и на сколько вообще корректен данный пример?