ertttert
Books-CMS.clan.su

Вывод формы параметров пользователю

В модуле аннотирования администратору предоставлена возможность указать, какие типы нод должны поддерживать аннотирование (см. рис. 2.1). Рассмотрим этот механизм. Когда администратору сайта потребуется изменить параметры модуля аннотирования, нужно будет вывести форму, в которой администратор сможет выбрать необходимые параметры. В нашем пункте меню обратный вызов страницы указывает на функцию drupal_get_form(), а аргументы страницы являются массивом, содержащим annotate_admin_settings. Это означает, что при заходе на страницу http://example.com/?q=admin/config/annotate/settings будет выполнен вызов drupal_get_form('annotate_admin_settings'), который и указывает Drupal создать форму, определенную функцией annotate_admin_settings(). Рассмотрим функцию, определяющую форму — она определяет флажок для типов нод (см. рис. 2.1) и добавляет два дополнительных параметра. Эта функция находится в каталоге sites/all/modules/custom/annotate/annotate.admin.inc:

/**
* Создатель формы. Настройка аннотаций.
*
* @ingroup forms
* @see system_settings_form().
*/
function annotate_admin_settings() {
 // Получение массива типов нод с внутренними именами в качестве ключей
 // и "дружественными именами" в качестве значений. Например:
 // array('page' => 'Basic Page', 'article' => 'Articles')
 $types = node_type_get_types();
 foreach ($types as $node_type) {
 $options[$node_type->type] = $node_type->name;
 }
 $form['annotate_node_types'] = array(
 '#type' => 'checkboxes',
 '#title' => t('Users may annotate these content types'),
 // Пользователи могут аннотировать эти типы контента
 '#options' => $options,
 '#default_value' => variable_get('annotate_node_types', array('page')),
 '#description' => t('A text field will be available on these content types to make user-specific notes.'),
 // У этих типов контента пользователю будет доступно
 // текстовое поле для внесения личных примечаний.
 );
 $form['annotate_deletion'] = array(
 '#type' => 'radios',
 '#title' => t('Annotations will be deleted'),
 // Аннотации будут удалены
 '#description' => t('Select a method for deleting annotations.'),
 // Выберите метод для удаления аннотаций
 '#options' => array(
 t('Never'), // Никогда
 t('Randomly'), // Случайным образом
 t('After 30 days') // Спустя 30 дней
 ),
 '#default_value' => variable_get('annotate_deletion', 0)
 // По умолчанию Never
 );
 $form['annotate_limit_per_node'] = array(
 '#type' => 'textfield',
 '#title' => t('Annotations per node'),
 // Аннотаций в ноде
 '#description' => t('Enter the maximum number of annotations allowed per node (0 for no limit).'),
 // Введите максимальное количество аннотаций, допустимое для ноды
 // (0 — неограниченное).
 '#default_value' => variable_get('annotate_limit_per_node', 1),
 '#size' => 3
 );
 return system_settings_form($form, TRUE);
}

Здесь добавлен переключатель для указания, когда следует удалять аннотации, и текстовое поле для ввода количества аннотаций, разрешенных для ноды (реализация этих усовершенствований оставлена в качестве самостоятельного упражнения). Вместо управления обработкой нашей формы выполняется вызов system_settings_form(), который указывает системному модулю добавить на форму несколько кнопок и взять на себя управление проверкой и отправкой введенных данных. Внешний вид формы с параметрами показан на рис. 2.5.

Проверка параметров, введенных пользователем

Если функция system_settings_form() выполняет за нас сохранение значений из формы, то каким образом проверить, является ли текст, введенный в поле Annotations per node (Аннотаций на ноду), действительно числом? Для этого достаточно добавить проверку, является ли значение числовым, в существующую функцию проверки (annotate_admin_settings_validate($form, $form_state)) в файле sites/all/modules/custom/annotate/annotate.admin.inc и использовать ее для генерации ошибки, если что-то не подойдет:
$limit = $form_state['values']['annotate_limit_per_node'];
if (!is_numeric($limit)) {
form_set_error('annotate_limit_per_node', t('Please enter a number.'));
}
...
Когда впоследствии Drupal обрабатывает форму, она выполняет для проверки данных обратный вызов annotate_admin_settings_validate(). Если определено, что введенное значение неверно, генерируется ошибка, связанная с соответствующим полем, и это отображается на экране в виде предупреждения и выделения поля с ошибкой. А как Drupal узнает, что нужно вызывать нашу функцию? Для этого мы назвали ее специальным образом: имя функции_определения_формы (annotate_admin_settings) с добавлением _validate. Полная информация о том, как Drupal определяет вызываемую функцию проверки формы, приведена в главе 10.
Всего комментариев: 0
Имя *:
Email *:
Код *:


Бесплатный конструктор сайтов - uCoz