Читать «Журнал PC Magazine/RE №11/2009» онлайн - страница 99
PC Magazine/RE
function theme_example_text_field_theme_function($element) {
$class = "";
if(isset($element["#needs_validation"])) {
$class = " error";
}
$output = '<div id="' . $element["#id"] . '"
class="form-item"><input id="edit-example-text-field"
class="form-text' . $class . '" name="' . $element["#name"]
. '"></div>';
return $output;
}
Кроме того, эту функцию можно переопределить, не изменяя кода модуля. Для этого в файле template.php, который находится в папке с текущей темой оформления, нужно создать копию этой функции, заменив в ней префикс theme на имя текущей темы.
Если в реализации hook_theme использовать параметр template, например, так:
function название_модуля_theme() {
return array(
'example_text_field_theme_function' => array(
'arguments' => array('form' => NULL),
'template' => 'example-text-field',
),
);
}
то HTML-код, ответственный за отображение элемента Web-страницы в браузере, можно будет задавать не в исходном тексте функции темизации, а в отдельном файле-шаблоне с соответствующим именем; в нашем примере это example-text-field.tpl.php. Такой подход удобен, если с сайтом должны работать дизайнеры, не имеющие опыта Web-программирования.
Если же возникла необходимость изменить внешний вид всей формы, а не только отдельных ее элементов, нужно проделать то же самое: указать значение параметра #theme формы, объявить в hook_theme функцию темизации и, наконец, реализовать ее. Давайте внесем необходимые изменения в наш код. Функция hook_theme будет выглядеть следующим образом:
function название_модуля_theme() {
return array(
'test_form_theme_function' => array(
'arguments' => array('form' => NULL),
),
'example_text_field_theme_function' => array(
'arguments' => array('form' => NULL),
),
);
}
Исходный текст обновленной функции test_form приводится в листинге 6.
Листинг 6
function test_form($form_state) {
$form['#theme'] = 'test_form_theme_function';
$form["example_text_field"] = array(
'#type' => 'textfield',
'#title' => 'Example text field',
'#description' => 'Text must contain more then
3 symbols',
'#theme' => 'example_text_field_theme_function',//*/
);
$options = array(
0 => 'zero',
1 => 'one',
2 => 'two',
);
$form["example_select"] = array(
'#type' => 'select',
'#title' => 'Example select list',
'#options' => $options,
'#description' => t('You can select only value "one"
in this form'),
);
$form["submit"] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
$form["#validate"] = array('test_validate_first',
'test_validate_second');
$form["#submit"] = array('test_submit_first',
'test_submit_second');
return $form;
}
Также нам потребуется и сама функция темизации формы. Определим ее:
function theme_test_form_theme_function($form) {
$output = "Some additional text";
// Выводим некоторые элменты отдельно с дополнительным
// форматированием
$output .= '<div style="background-color: #ccc; padding:
3px;">';
$output .= drupal_render($form['example_text_field']);
$output .= "</div>";
// Выводим остальные элементы, которые не были выведены
// ранее
$output .= drupal_render($form);
return $output;
}