PC Magazine/RE - Журнал PC Magazine/RE №11/2009. Страница 35

    ),

  );

}

Затем модифицируем массив $form["example_text_field"], который создается в функции test_form, добавив в него параметр #theme:

$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',

);

Теперь мы можем объявить функцию theme_example_text_field_theme_function и задать в ней любой HTML-код для отображения выбранного элемента:

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;

}

Как и с любой другой функцией темизации, ее содержимое можно вынести во внешний шаблон.

Ну а теперь осталось научиться модифицировать из внешнего модуля существующую форму. Для решения этой задачи нужно воспользоваться одним из двух хуков: или hook_form_alter, через который проходят массивы всех обрабатываемых форм и в котором каждый массив можно отредактировать, или hook_form_form_id_alter, где form_id должен быть заменен на идентификатор нужной формы. Через этот хук проходит только выбранная форма. На вход оба этих хука получают массив формы (в нашем примере это массив, который генерируется функцией test_form), и в этот массив могут быть добавлены или из него могут быть удалены любые параметры: #theme, #prefix, #suffix, #submit, #validate и другие.

Для примера добавим к форме контейнер, который может содержать в себе несколько полей. Переместим в него два поля и сменим заголовок одного из них:

function название_модуля_form_test_form_alter(&$form,

    &$form_state) {

  $form["example_text_field"]["#title"] = "New title";

  $form["example_add_field"] = array(

    '#type' => 'fieldset',

    '#title' => 'new fieldset',

    '#collapsible' => TRUE,

    '#collapsed' => FALSE,

    '#weight' => 0,

  );

  foreach ($form as $name => $element) {

    if($element["#type"] == "select" || $element["#type"] ==

        "textfield") {

      $form["example_add_field"][$name] = $element;

      unset($form[$name]);

    }

  }

  $form["submit"]["#weight"] = 5;

}

Вот и все. В этой статье я рассказал об основных принципах темизации Drupal, более подробную информацию вы можете найти в документации.

Новости. С 15 по 15

Компьютеры

Компания Dell (www.dell.ru) объявила о выпуске пяти игровых систем под маркой Alienware. Модель Alienware M15x – «самый мощный игровой ноутбук во Вселенной» – выполнен в оригинальном дизайне Alienware, оснащен мобильным процессором Core i7 и графическим процессором NVIDIA GeForce GTX 260M. Ориентировочная цена – 84 990 руб. Alienware Aurora и Aurora ALX – мощные настольные системы форм-фактора MicroATX с процессорами Intel Core i7 (включая модификации Extreme Edition, разогнанные до 3,6 ГГц). Цена в базовой конфигурации – 79 990 руб. Системы Alienware Area-51 и Area-51 ALX разработаны для геймеров-экстремалов и энтузиастов, оснащаются процессорами Intel Core i7, графическими адаптерами с NVIDIA GeForce GTX 295, ОЗУ емкостью до 12 Гбайт. В корпусах предусматриваются шесть легко доступных «бескабельных» отсеков для жестких дисков и возможность организации массивов RAID 0, RAID 1 и RAID 10.

Ноутбуки

Компания ASUS (www.asus.ru) заверяет, что длительное использование аккумуляторной батареи, изготовленной независимым партнером в 2007 г., может представлять опасность лишь в редких случаях. Чтобы гарантировать пользователям своей продукции безопасную работу, компания по своей инициативе объявляет о программе бесплатной замены всех дефектных батарей. Эта программа применяется исключительно к батареям, изготовленным в 2007 г. независимым производителем и входящим в комплект поставки ноутбуков ASUS PRO52 и X51. Батареи, попавшие в список, приведенный в данной программе, будут заменены всем пользователям ноутбуков, независимо от наличия гарантии на ноутбук или батарею на момент обращения в сервисный центр.

Проекты

Компания Cognitive Technologies (www.cognitive.ru) объявила о начале опытной эксплуатации системы массового ввода документов Cognitive Forms в компании «Натали Турс». Цель проекта – автоматизация обработки анкет в ходе исследования мнений потребителей о качестве предоставляемых услуг. Главная особенность системы, внедряемой в «Натали Турс», – ее континентальная распределенность: 20 станций сканирования планируется установить в 11 странах. С их помощью анкеты, собранные гидами во время следования туристов в аэропорт, будут переводиться в электронный вид и отправляться в центральный офис компании.

Читайте в следующих номерах

Подарки: Советы Деду Морозу

Инфраструктура: Корпоративные ИТ уходят в облака

Сводный тест: Тестирование системных плат

Операционные системы: Встречаем Windows 7

PC Magazine/RE: http://pcmag.ru/

Примечания

1

Здесь и далее цены указаны для справки.