Читать «Журнал 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;

}