Пишу модуль...
Создал блок с формой:
- текстовое поле
- кнопка
Обрабатываю запрос пользователя и направляю его на страницу, на которой вывожу данные (строки таблицы с информацией о товарах, которые мне возвращает сторонний сервис) на основе этого запроса - всё работает.
Теперь мне требуется к каждой строчки таблицы добавить кнопку "в корзину". Для этого создаю ещё один конструктор формы. В функции где у меня формируется страница с данными о товарах присоединяю к каждой строчке мою форму - естественно через drupal_get_form. Затем обрабатываю мой массив в .tpl шаблоне, форму рендерю прямо в шаблоне, хотя и в модуле тоже можно. Кнопка (у меня в этой форме собственно ничего больше и нет, не считая, конечно, системных и моих hidden) выводится без проблем, в коде всё есть, но когда я пытаюсь в её сабмит функции вывести хотя бы drupal_set_message(t('The form has been submitted.')); - ничего не происходит. Перерыл Интернет - ничего вразумительного. Вообще у меня должно быть много кнопок, где-то читал, что тогда у них будет одинаковый form_id и будет работать некорректно, я поэтому только одну кнопку и вывожу пока )))
Прошу любые предположения...
Комментарии
добавил в форму с одной кнопкой:
$form['#submit'] = array('#type'=> my_funk_form_sub($form, &$form_state));
в самой my_funk_form_sub написал:
drupal_set_message(t('The form has been submitted.'));
Теперь когда я отправляю форму поиска - не "проблемную" форму с одной кнопкой, то почему то, срабатывает функция my_funk_form_sub...
Я так понимаю, она должна работать только когда произойдет сабмит формы в которой на неё сослались
Готов заплатить за консультацию опытным друпалером
Код в студию, но похоже, что проблема здесь:
$form['#submit'] = array('#type'=> my_funk_form_sub($form, &$form_state));
Вы где такую конструкцию увидели?)
эту конструкцию я просто так уже от безысходности прописал - нарыл в Интернет. Код чуточку попозже (через часик ориентировочно) - нет доступа пока.
<?php function lukas_ato_theme() {
// Вывод ощибок
$theme_hooks = array(
'lukas_ato_get_rez' => array(
'template' => 'lukas-avto-to',
'variables' => array(
'keys' => NULL,
'code' => NULL,
'count' => NULL,
),
),
);
return
$theme_hooks;}
function
lukas_ato_menu() {$items['search-for'] = array(
'title' => 'Результаты поиска',
'page callback' => 'lukas_ato_get_rez',
'access callback' => true,
'type' => MENU_CALLBACK,
);
return $items;
}
function
lukas_ato_search_form($form, &$form_state) {$form['#action'] = url('search-for');
$form['keys'] = array(
'#type' => 'textfield',
'#size' => 20,
'#default_value' => 'Введите код',
'#maxlength' => 255,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Search'),
);
return $form;
}
function
lukas_ato_search_form_submit($form, &$form_state) {variable_set('lukas_ato_keys',$form_state['values']['keys']);
//debug($form_state['values']);
}
function
lukas_ato_block_info() {$blocks['lukas_ato'] = array('info' => t('Search for spare parts on site avtoto.ru'));
return $blocks;
}
function
lukas_ato_block_view($delta = '') {$block = array();
if ($delta == 'lukas_ato') {
$block['content'] = drupal_get_form('lukas_ato_search_form');
}
return $block;
}
function
lukas_ato_cart_form($form, &$form_state, $code, $manuf, $name, $price, $storage, $delivery) {$form['code'] = array(
'#type' => 'hidden',
'#value' => $code,
);
$form['manuf'] = array(
'#type' => 'hidden',
'#value' => $manuf,
);
$form['name'] = array(
'#type' => 'hidden',
'#value' => $name,
);
$form['price'] = array(
'#type' => 'hidden',
'#value' => $price,
);
$form['storage'] = array(
'#type' => 'hidden',
'#value' => $storage,
);
$form['delivery'] = array(
'#type' => 'hidden',
'#value' => $delivery,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'В корзину',
);
return $form;
}
function
lukas_ato_cart_form_submit($form, &$form_state) {dsm($form_state);
drupal_set_message(t('The form has been submitted.'));
}
function
lukas_ato_soab_rez($keys,$kross,&$count=0) {// здесь запрос к стороннему серверу - получаем массив $result['Rez']
// Обработка результата
if (isset($result['Rez']) && count($result['Rez'])>0) {
$count = count($result['Rez']);
$keys_result = $result['Rez'];
$i=0;
foreach($keys_result as $element) {
if ($i==0) {$keys_result[$i]['add_to_cart_form']= drupal_get_form('lukas_ato_cart_form',
$element['Code'],
$element['Manuf'],
$element['Name'],
$element['Price'] = ceil($element['Price']),
$element['Storage'],
$element['Delivery']
);} else {$keys_result[$i]['add_to_cart_form']='';}
$i++;
}
return $keys_result;
}
if (isset($result['Info']['Errors']) && count($result['Info']['Errors'])>0) {
return false;
}
}
function
lukas_ato_get_rez() {if (variable_get('lukas_ato_keys')) {
$keys = variable_get('lukas_ato_keys');
variable_del('lukas_ato_keys');
$variables = array(
'keys' => lukas_ato_soab_rez($keys,'off',&$count),
'code' => $keys,
'count' => $count,
);
return theme('lukas_ato_get_rez', $variables); //затем в шаблоне вывожу в foreach массив и там же рендерю форму add_to_cart_form
} else {
return '<p>Не верные параметры поиска</p>';
}
} ?>
О боже, мои глаза ... ладно ладно, я когда начинал ещё и не такое писал
Крайне вам рекомендую начать изучать coding style друпала, а также скачать и досконально изучить содержимое модуля https://drupal.org/project/examples, здесь охвачена большая часть АПИ друпала в примерах как и что использовать.
Чтоже касается вашего кода, все сабмиты работают нормально, по крайней мере у меня точно lukas_ato_cart_form не тестил, так как нету данных для аргументов, но опять же, сабмиты написаны правильно {form_id}_submit()
в том то и дело, что сабмиты написаны правильно lukas_ato_search_form - работает без проблем. Проблема как раз таки в lukas_ato_cart_form - не работает субмит у неё... Я уже голову сломал
введите аргументы вручную - любые, без разницы
Готов заплатить за консультацию опытным друпалером
нашёл проблему....
Если удаляю variable_del('lukas_ato_keys'); в lukas_ato_get_rez() - то обработчик формы lukas_ato_cart_form_submit() - начинает работать. Только не могу сообразить почему?
советую посмотреть php логи, часто из-за мелких не фатальных ошибок(при определенных настройках сервера они и выводиться то не будут) поведение алгоритма может стать неожиданным, ядро не исключение