Всем привет!
Можно ли передать параметры в функцию проверки (validate)?
<?php
'#validate' => array('validate_func'),
?>
Пример:
Есть несколько кнопок, обработка данных для которых отличается в зависимости от
их номера. В качестве функции проверки у всех кнопок я указываю my_validate и
хочу передать в неё информацию о нажимаемой кнопке, например её идентификатор.
Комментарии
передайте идентификатор с помощью нового элемента в форме с type => value
Не совсем понял, не мог бы рассказать подробнее...
Вот тут нашёл, что form_state содержит в себе массив [clicked_button], который в свою
очередь атрибут:
[#parents] => Array
(
[0] => submit3
)
Если нет предусмотренных Drupal способов передачи параметров в функцию проверки, то
придётся пользоваться этим способом, хотя на мой взгляд способ не лучший...
<?php
function xxx_form() {
...
$form['button_id'] = array('#type' => 'value', '#value' => 666);
...
}
function
xxx_form_validate($form, &$form_state) {if ($form_state['values']['button_id'] == 666) {
drupal_set_message('Нажата кнопка с id 666');
}
}
?>
почему?
Но ведь тогда получается, что кнопка пропадает.
И значение
<?php
$form_state['values']['button_id'] == 666
?>
будет верно при нажатии любой другой кнопки.
А с атрибутом #parant что-то не понятно. В документации написано что это массив предков.
Но там 2-е переменные:
(
[0] => submit3
)
[#array_parents] => Array
(
[0] => image3
[1] => submit3
)
Просто нет уверенности, то [#parents][0] всегда будет именем элемента...
вместо 666 нужно прописать номер кнопки:
Я так и не понял...
Вот моя форма. 3-и кнопки. Одна функция проверки, которая в зависимости от нажатой кнопки
делает соответствующее действие.
<?php function sol_art_form( $node, $form_state, $op)
$form['first'] = array(
{
'#type' => 'fieldset',
'#title' => t('title'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
);
$form['first']['submit1'] = array(
'#type' => 'submit',
'#value' => t('Просмотр'),
'#validate' => array('val_func'),
);
$form['second'] = array(
'#type' => 'fieldset',
'#title' => t('title'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
);
$form['second']['submit2'] = array(
'#type' => 'submit',
'#value' => t('Просмотр'),
'#validate' => array('val_func'),
);
$form['third'] = array(
'#type' => 'fieldset',
'#title' => t('title'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
);
$form['third']['submit3'] = array(
'#type' => 'submit',
'#value' => t('Просмотр'),
'#validate' => array('val_func'),
);
return $form;
}
function
val_func($form, &$form_state){
switch($form_state['clicked_button']['#parents'][0]) {
case 'submit1':
{
$i = 1;
break;
}
case 'submit2':
{
$i = 2;
break;
}
case 'submit3':
{
$i = 3;
break;
}
}
} ?>
Если я напишу
<?php
'#type' => 'value',
'#value' => 666
?>
то кнопки пропадают, что в принципе вполне логично....
При этом $form_state будет содержать все 3-и значения
$form_state['values']['first']['submit1'] == 111
$form_state['values']['second']['submit2'] == 222
$form_state['values']['thirs']['submit3'] == 333
Объясните пожалуйста...
ЗЫ. $form_state['clicked_button']['#parents'][0] почему-то всегда равно "submit3"... так и не понял почему...
<?php
function val_func($form, &$form_state)
{
...
'#value' => 'Просмотр 1',
...
'#value' => 'Просмотр 2',
...
'#value' => 'Просмотр 3',
...
}
function
val_func($form, &$form_state){
switch($form_state['values']['op']) {
case 'Просмотр 1':
{
$i = 1;
break;
}
case 'Просмотр 2':
{
$i = 2;
break;
}
case 'Просмотр 3':
{
$i = 3;
break;
}
}
}
?>
Спасибо! Осталось только придумать как сделать чтобы все кнопки назывались "Просмотр"...