Передача параметров при вызове функции в submit формы

Аватар пользователя alexsaab alexsaab 9 ноября 2012 в 15:16

Приветствую,

Есть форма, в ней несколько кнопок:

$form['dc_product_upload_'.$type.'_name']['upload_csv_'.$type] = array(
                '#name' => 'upload_csv_'.$type,
                '#type' => 'submit',
                '#value' => t('Upload'),
                '#weight' => 15,
                '#submit' => array('upload_csv_'.$type),
            );

Как видите вызывается функция upload_csv_.$type - если $type = tvsets , то должна выполниться функция:

upload_csv_tvsets

Как бы ей еще из формы передать несколько аргументов?

Что посоветуете?

С ув., Алексей

Комментарии

Аватар пользователя alexsaab alexsaab 10 ноября 2012 в 0:08

Опс... Привет.

Можно кинуть ссылкой?

Не представляю как это реализовать?

Как вызвать аргументы (куда их писать то)?

Зараннее спасибо!

С ув., Алексей

Аватар пользователя boatsman boatsman 10 ноября 2012 в 0:38

прописываем функцию

<?php
function upload_csv_tvsets($form, &$form_state) {

//код

}
?>

Внутри функции смотрим в $form_state['values'] - там все, что пришло из формы

Аватар пользователя alexsaab alexsaab 10 ноября 2012 в 12:59

Спасибо! Но задача немного усложнилась.

Так как у меня есть код, который генерирует поле и выдает кнопки для каждого продукта commerce:

foreach (commerce_product_types() as $type => $product_type) {
        $form['dc_product_upload_'.$type.'_name'] = array (
            '#title' => commerce_product_type_get_name($type),
            '#description' => $product_type['name'].t(' - product type for upload.'),
            '#type' => 'fieldset',
            '#collapsible' => TRUE,
            '#collapsed' => FALSE,
        );
        $form['dc_product_upload_'.$type.'_name']['dc_product_upload_'.$type.'_filename'] = array (
            '#title' => t('Filename'),
            '#description' => t('Input file url in local or remote server.'),
            '#type' => 'textfield',
            '#default_value' => variable_get('dc_product_upload_'.$type.'_filename',''),
            '#required' => FALSE,
            '#size' => 100,
        );

            $form['dc_product_upload_'.$type.'_name']['upload_csv_'.$type] = array(
                '#name' => 'upload_csv_'.$type,
                '#type' => 'submit',
                '#value' => t('Upload'),
                '#weight' => 15,
                '#submit' => array('upload_csv_'.$type),
            );
}

таким образом хочется чтобы при вызове функции 'dc_product_upload_'.$type.'_filename' не плодить лишнего кода и чтобы она была универсально, т.е. чтобы функция осталась одна, например, dc_product_upload_porduct1_filename. Но вызывались разные параметры в зависимости от нажатой кнопки.

С ув., Алексей

Аватар пользователя boatsman boatsman 10 ноября 2012 в 17:02

передаем еще одним параметром $type

что-то вроде

<?php
$form
['product_type'] = array {
'#type' => 'value',
'#value' => $type,
}
?>

делаем #submit единым для всех форм

а внутри него, в зависимости от $form_state['values']['product_type'] делаем, что нужно

UPD: не обратил внимания, что это у Вас одна большая форма, а не по отдельной форме на каждый продукт, тогда мой способ не совсем подходит, см. комменты ниже от ser_house.

Аватар пользователя ser_house ser_house 10 ноября 2012 в 16:08

Ничего не понял. Какие параметры, например? Ваши функции знают, для какого типа их вызывают. Им нужно что-то ещё?

Аватар пользователя ser_house ser_house 10 ноября 2012 в 16:41

В предположении, что Вы хотите использовать одну функцию submit:
уберите '#submit' для кнопок. Добавьте к кнопкам нужный параметр:

$form['dc_product_upload_'.$type.'_name']['upload_csv_'.$type] = array(
    '#name' => 'upload_csv_'.$type,
    '#type' => 'submit',
    '#value' => t('Upload'),
    '#weight' => 15,
    '#my_value' => $data,
    '#product_type' => $type,
);

Будет вызвана обычная form_submit, там ловите:

function my_form_submit($form, $form_state) {
  $button = $form_state['triggering_element'];
 
  ...

}

В $button будут '#name', '#my_value', '#product_type' и так далее.