Параметры в функции валидации

Главные вкладки

Аватар пользователя Bochagov Bochagov 12 января 2011 в 14:34

Всем привет!

Можно ли передать параметры в функцию проверки (validate)?

<?php
'#validate' => array('validate_func'),
?>

Пример:
Есть несколько кнопок, обработка данных для которых отличается в зависимости от
их номера. В качестве функции проверки у всех кнопок я указываю my_validate и
хочу передать в неё информацию о нажимаемой кнопке, например её идентификатор.

Комментарии

Аватар пользователя Bochagov Bochagov 12 января 2011 в 16:32

Не совсем понял, не мог бы рассказать подробнее...

Вот тут нашёл, что form_state содержит в себе массив [clicked_button], который в свою
очередь атрибут:

[#parents] => Array
(
[0] => submit3
)

Если нет предусмотренных Drupal способов передачи параметров в функцию проверки, то
придётся пользоваться этим способом, хотя на мой взгляд способ не лучший...

Аватар пользователя xxandeadxx xxandeadxx 12 января 2011 в 16:38
<?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');
  }
}
?>

"Bochagov" wrote:
хотя на мой взгляд способ не лучший

почему?

Аватар пользователя Bochagov Bochagov 12 января 2011 в 18:00

Но ведь тогда получается, что кнопка пропадает.

И значение

<?php
$form_state
['values']['button_id'] == 666
?>

будет верно при нажатии любой другой кнопки.

А с атрибутом #parant что-то не понятно. В документации написано что это массив предков.
Но там 2-е переменные:

[#parents] => Array
                (
                    [0] => submit3
                )

            [#array_parents] => Array
                (
                    [0] => image3
                    [1] => submit3
                )

Просто нет уверенности, то [#parents][0] всегда будет именем элемента...

Аватар пользователя xxandeadxx xxandeadxx 12 января 2011 в 18:18

"Bochagov" wrote:
будет верно при нажатии любой другой кнопки.

вместо 666 нужно прописать номер кнопки:
"Bochagov" wrote:
Есть несколько кнопок, обработка данных для которых отличается в зависимости от
их номера.

Аватар пользователя Bochagov Bochagov 12 января 2011 в 18:51

Я так и не понял...

Вот моя форма. 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"... так и не понял почему...

Аватар пользователя xxandeadxx xxandeadxx 12 января 2011 в 20:05
<?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;
        }            
    }
    
}
?>