Error message

User warning: The following theme is missing from the file system: responsive_green. For information about how to fix this, see the documentation page. in _drupal_trigger_error_with_delayed_logging() (line 1143 of /var/www/moscovie.com/includes/bootstrap.inc).

Drupal как фреймворк(создание сайта с нуля) Часть 4

Доработаем форму регистрации.
Добавим нестандартную капчу для запрета ботам регистрации на сайте.

Для описания элемента в модуле надо имплементировать хук hook_element_info(), в котором надо вернуть массив, ключом которого будет будующий тип элемента, и параметры, которые он может принимать.

Здесь описан элемент формы так, как его надо будет добавлять в форму.
Возможные значения по умолчанию:

  1. #input: Булевая переменная. Определяет, несёт ли элемент в себе какие-то данные (даже если он скрыт).
  2. #process: Массив функций, которые будут обрабатывать элемент формы. Должен принимать переменные $element, $form_state и $complete_form.
  3. #after_build: Массив функций, которые будут запущены после того, как элемент будет построен. Принимает переменные $element и $form_state.
  4. #validate: Массив функций, которые будут валидировать форму, в которой описан элемент, при его сабмите. Принимаются переменные $form и $form_state.
  5. #element_validate: Массив функций, которые будут валидировать элемент при сабмите. Принимаются переменные $element и $form_state.
  6. #pre_render: Массив функций, которые должны быть выполнены перед началом рендера элемента. Функции получают переменные $element и $form_state.
  7. #post_render: Массив функций, которые должны быть выполнены после окончания рендера элемента. Функции получают переменные $element и $form_state.
  8. #submit: Массив функций, который выполняются при сабмите формы. Функции принимают переменные $form и $form_state.
  9. #title_display: Строка, которая отображает как заголовок должен быть отображён.

/**
* Implements hook_element_info().
*/
function mymodule_element_info() {
$types['transfer_slider'] = array(
'#input' => TRUE,
'#process' => array('transfer_slider_process'),
'#element_validate' => array('transfer_slider_validate'),
'#left' => t('Min'),
'#right' => t('Max'),
'#theme' => array('transfer_slider'),
'#left_value' => 0,
'#right_value' => 100,
'#size' => 5,
'#theme_wrappers' => array('form_element'),

);
return $types;
}

Теперь описываем основные элементы формы
function transfer_slider_process($element) {

// Create tree element , for save value child elements
$element['#tree'] = TRUE;

// For slider we need two input fields - the left and the right value slider.

// Create left field input
$element['left'] = array(
'#type' => 'textfield',
'#field_prefix' => $element['#left'],
'#default_value' => $element['#left_value'],
'#element_validate' => array('jslider_form_api_validate_integer'),
'#size' => $element['#size'],
);

// Create right field input
$element['right'] = array(
'#type' => 'textfield',
'#field_suffix' => $element['#right'],
'#default_value' => $element['#right_value'],
'#element_validate' => array('jslider_form_api_validate_integer'),
'#size' => $element['#size'],
);

return $element;
}

Определим функцию проверки всей формы
function transfer_slider_validate($element, &$form_state) {
if (($element['#value']['left'] == $element['#value']['right'])) {
drupal_set_message('Test passed');
}
}

Определим функцию проверки отдельного элемента

function jslider_form_api_validate_integer($element, &$form_state) {
if (!ctype_digit($element['#value'])) {
form_error($element, t('The value should be a valid integer number'));
}
}

Добавим функцию темы
/**
* Implements hook_theme().
*/
function mymodule_theme(&$existing, &$type, &$theme, &$path) {
$data['transfer_slider'] = array(
'render element' => 'element',
);
return $data;
}


function theme_transfer_slider($vars) {

// Add jQuery UI Slider
drupal_add_library('system', 'ui.slider');

// Add css and js for slider form element
$path = drupal_get_path('module', 'basic_form_login');
drupal_add_js($path . '/js/jsslider.js');
drupal_add_css($path . '/css/jsslider.css');
}

Добавим наш элемент формы к форме входа
/**
* Implements hook_form_alter().
*/
function mymodule_form_user_login_alter(&$form, &$form_state, $form_id){

$form['slider'] = array(
'#type' => 'transfer_slider',
'#left_value' => 0,
'#right_value' => 200,
'#left' => t('Min'),
'#right' => t('Max'),
'#size' => 4,
'#description' => t('Please pass the test for intelligence.
The minimum and the maximum value should be equal.'),
);
$form['#validate'][] = 'slider_validate';

}

Определим функцию проверки
function slider_validate($form){

if($form['slider']['left']['#value'] != $form['slider']['right']['#value']){

form_set_error('title', t('Invalid test! Error'));

}
}

Категория: 
The code has been tested and works

Add new comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.