Добрый день!
Хочу поделиться с вами особенностью вывода множества форм на базе CMS Drupal.
Столкнулся я с этой проблемой при разработке интернет-магазина для %N-company%.
Основные задачи:
— На одной странице вывести n-ое количество форм, с уникальным id
— Обрабатывать эти формы одной функцией-обработчиком(т.е не писать для каждой формы свою функцию)
— Формы содержат в себе некие переменные, которые так же записываются в БД при submit'e формы(эти переменные имеют уникальное значение для каждой формы)
Решение:
Как известно, форма на базе CMS Drupal формируется довольно просто, с помощью нескольких функций:
//Строим простую форму из textarea и кнопки(+ 1, переменная для внутреннего пользования)
function _my_form(&$form_state,$fd1) {
$form = array();
$form['mytext'] = array(
'#type' => 'textarea',
'#title' => t(«Enter something»),
);
$form['#fd1'] = $fd1;
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
);
return $form;
}
//и собственно вызов нашей формы с помощью drupal_get_form
foreach ($fds as $fd1) {
$output .= drupal_get_form('_my_form',$fd1);
}
//…
return $output;
Однако, данный код работать не будет, так как все формы будут иметь одинаковый form_ID и при сохранении любой формы Drupal будет считать, что сохраняется самая первая. Поэтому наша переменная $fd1 всегда будет принимать значение, указанное при создании первой формы на странице. Значит, нужно сделать, чтобы, с одной стороны, у всех форм при создании был разный ID, а с другой — чтобы создавались и обрабатывались они одной функцией.
Поможет нам в этом хук hook_forms. Он назначит всем нашим формам уникальный id. Выглядит он примерно так:
function mymodule_forms($form_id,$args) {
$forms = array();
if (strpos($form_id,'_my_form') === 0) {
$forms[$form_id] = array(
'callback' => '_my_form',
'callback arguments' => $args,
);
}
return $forms;
}
Но поскольку формы у нас стали с разными ID, Друпал при сохранении формы будет искать разные функции-обработчики. Нам нужно указать единый валидатор и обработчик при создании формы. Так же нам нужно будет немного изменить генерацию данных на странице. Итого будет выглядеть примерно так:
function _my_form(&$form_state,$fd1) {
$form = array();
$form['mytext'] = array(
'#type' => 'textarea',
'#title' => t(«Enter something»),
);
$form['#fd1'] = $fd1;
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
);
$form['#submit'] = array('_my_form_submit');
$form['#validate'] = array('_my_form_validate');
return $form;
}
//..$fd1 естественно уникальный
foreach ($fds as $fd1) {
$output .= drupal_get_form('_my_form'.$fd1,$fd1);
}
//…
return $output;
При использовании данных функций с хуком mymodule_forms у нас получится несколько форм на одной странице с уникальным ID и уникальным значением $fd1, которое можно использовать в обработчике по собственному усмотрению (тем более, что $fd1 может быть не единственным передаваемым аргументом, их можно сделать гораздо больше).
Спасибо за внимание!
Хочу поделиться с вами особенностью вывода множества форм на базе CMS Drupal.
Столкнулся я с этой проблемой при разработке интернет-магазина для %N-company%.
Основные задачи:
— На одной странице вывести n-ое количество форм, с уникальным id
— Обрабатывать эти формы одной функцией-обработчиком(т.е не писать для каждой формы свою функцию)
— Формы содержат в себе некие переменные, которые так же записываются в БД при submit'e формы(эти переменные имеют уникальное значение для каждой формы)
Решение:
Как известно, форма на базе CMS Drupal формируется довольно просто, с помощью нескольких функций:
//Строим простую форму из textarea и кнопки(+ 1, переменная для внутреннего пользования)
function _my_form(&$form_state,$fd1) {
$form = array();
$form['mytext'] = array(
'#type' => 'textarea',
'#title' => t(«Enter something»),
);
$form['#fd1'] = $fd1;
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
);
return $form;
}
//и собственно вызов нашей формы с помощью drupal_get_form
foreach ($fds as $fd1) {
$output .= drupal_get_form('_my_form',$fd1);
}
//…
return $output;
Однако, данный код работать не будет, так как все формы будут иметь одинаковый form_ID и при сохранении любой формы Drupal будет считать, что сохраняется самая первая. Поэтому наша переменная $fd1 всегда будет принимать значение, указанное при создании первой формы на странице. Значит, нужно сделать, чтобы, с одной стороны, у всех форм при создании был разный ID, а с другой — чтобы создавались и обрабатывались они одной функцией.
Поможет нам в этом хук hook_forms. Он назначит всем нашим формам уникальный id. Выглядит он примерно так:
function mymodule_forms($form_id,$args) {
$forms = array();
if (strpos($form_id,'_my_form') === 0) {
$forms[$form_id] = array(
'callback' => '_my_form',
'callback arguments' => $args,
);
}
return $forms;
}
Но поскольку формы у нас стали с разными ID, Друпал при сохранении формы будет искать разные функции-обработчики. Нам нужно указать единый валидатор и обработчик при создании формы. Так же нам нужно будет немного изменить генерацию данных на странице. Итого будет выглядеть примерно так:
function _my_form(&$form_state,$fd1) {
$form = array();
$form['mytext'] = array(
'#type' => 'textarea',
'#title' => t(«Enter something»),
);
$form['#fd1'] = $fd1;
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
);
$form['#submit'] = array('_my_form_submit');
$form['#validate'] = array('_my_form_validate');
return $form;
}
//..$fd1 естественно уникальный
foreach ($fds as $fd1) {
$output .= drupal_get_form('_my_form'.$fd1,$fd1);
}
//…
return $output;
При использовании данных функций с хуком mymodule_forms у нас получится несколько форм на одной странице с уникальным ID и уникальным значением $fd1, которое можно использовать в обработчике по собственному усмотрению (тем более, что $fd1 может быть не единственным передаваемым аргументом, их можно сделать гораздо больше).
Спасибо за внимание!