Не обрабатывается (сабмитится) форма

Аватар пользователя vlucas vlucas 13 марта 2014 в 15:03

Пишу модуль...

Создал блок с формой:
- текстовое поле
- кнопка

Обрабатываю запрос пользователя и направляю его на страницу, на которой вывожу данные (строки таблицы с информацией о товарах, которые мне возвращает сторонний сервис) на основе этого запроса - всё работает.

Теперь мне требуется к каждой строчки таблицы добавить кнопку "в корзину". Для этого создаю ещё один конструктор формы. В функции где у меня формируется страница с данными о товарах присоединяю к каждой строчке мою форму - естественно через drupal_get_form. Затем обрабатываю мой массив в .tpl шаблоне, форму рендерю прямо в шаблоне, хотя и в модуле тоже можно. Кнопка (у меня в этой форме собственно ничего больше и нет, не считая, конечно, системных и моих hidden) выводится без проблем, в коде всё есть, но когда я пытаюсь в её сабмит функции вывести хотя бы drupal_set_message(t('The form has been submitted.')); - ничего не происходит. Перерыл Интернет - ничего вразумительного. Вообще у меня должно быть много кнопок, где-то читал, что тогда у них будет одинаковый form_id и будет работать некорректно, я поэтому только одну кнопку и вывожу пока )))

Прошу любые предположения...

Комментарии

Аватар пользователя vlucas vlucas 13 марта 2014 в 22:09

добавил в форму с одной кнопкой:

$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...

Я так понимаю, она должна работать только когда произойдет сабмит формы в которой на неё сослались

Аватар пользователя alextdk alextdk 14 марта 2014 в 8:16

Код в студию, но похоже, что проблема здесь:

$form['#submit'] = array('#type'=> my_funk_form_sub($form, &$form_state));

Вы где такую конструкцию увидели?)

Аватар пользователя vlucas vlucas 14 марта 2014 в 8:42

эту конструкцию я просто так уже от безысходности прописал - нарыл в Интернет. Код чуточку попозже (через часик ориентировочно) - нет доступа пока.

Аватар пользователя vlucas vlucas 14 марта 2014 в 10:12
<?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>';      
  }   
}

?>
Аватар пользователя alextdk alextdk 14 марта 2014 в 12:03

О боже, мои глаза Smile ... ладно ладно, я когда начинал ещё и не такое писал Smile

Крайне вам рекомендую начать изучать coding style друпала, а также скачать и досконально изучить содержимое модуля https://drupal.org/project/examples, здесь охвачена большая часть АПИ друпала в примерах как и что использовать.

Чтоже касается вашего кода, все сабмиты работают нормально, по крайней мере у меня точно Smile lukas_ato_cart_form не тестил, так как нету данных для аргументов, но опять же, сабмиты написаны правильно {form_id}_submit()

Аватар пользователя vlucas vlucas 14 марта 2014 в 12:49

в том то и дело, что сабмиты написаны правильно lukas_ato_search_form - работает без проблем. Проблема как раз таки в lukas_ato_cart_form - не работает субмит у неё... Я уже голову сломал

Аватар пользователя vlucas vlucas 14 марта 2014 в 12:54

"lamer" wrote:
так как нету данных для аргументов

введите аргументы вручную - любые, без разницы

Аватар пользователя vlucas vlucas 15 марта 2014 в 20:16

нашёл проблему....
Если удаляю variable_del('lukas_ato_keys'); в lukas_ato_get_rez() - то обработчик формы lukas_ato_cart_form_submit() - начинает работать. Только не могу сообразить почему?

Аватар пользователя sg85 sg85 16 марта 2014 в 4:45

советую посмотреть php логи, часто из-за мелких не фатальных ошибок(при определенных настройках сервера они и выводиться то не будут) поведение алгоритма может стать неожиданным, ядро не исключение