Search
Write a publication
Pull to refresh

Вывод множества форм с помощью API Drupal

Добрый день!
Хочу поделиться с вами особенностью вывода множества форм на базе 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 может быть не единственным передаваемым аргументом, их можно сделать гораздо больше).
Спасибо за внимание!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.