Изменения шаблонов через функции тем.

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

Аватар пользователя Balor Balor 1 апреля 2015 в 15:52

Здравствуйте уважаемое сообщество! Я тока не давно начал изучать 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() функции, которая должна быть обязательно добавлено в конец функции, так как оно позаботится о любых дополнительных элементах добавленных другими модулями. Но она этого не делает. Подскажите пожалуйста в чём тут ошибка, и на сколько вообще корректен данный пример?