Drupal формуляр с персонализирани аргументи, създаден два пъти

Опитвам се да предам аргументи на формуляр, извикан от "durpal_get_form", във функция PHP, извикана в AJAX от JS скрипт.

Така че направих нещо подобно:

// Load form
$form = drupal_get_form("_bto_ajax_submenu_organize_form", array(
    'territories' => $territories, 
    'accommodations' => $accommodations, 
    'activities' => $activities,
    'language' => $language,
));

Факт е, че моята форма е изградена два пъти. За първи път получих аргументите си с техните стойности, но вторият път всички те са равни на "NULL"... Така че в моята функция за изпращане на формуляра не мога да ги върна. Опитах се да ги сложа в $form_storage, в скрити полета... Нищо не работи.

Някакви идеи ?

РЕДАКТИРАНЕ: ето моят код. Има някои части, които може да не разберете, но поне ще получите глобален поглед върху проблема.

Формулярът и подаването:

/**
 * Organize form 
 */
function _bto_ajax_submenu_organize_form($form, &$form_state, $args)
{
  $form['place'] = array(
    '#prefix' => '<div class="left">',
    '#title' => t('Where do you want to go ?', array(), array('langcode' => $args['language'])),
    '#type' => 'select',
    '#options' => _bto_ajax_submenu_organize_form_get_territories($args['territories'], $args['language']),
  );

  $form['activity'] = array(
    '#title' => t('What do you want to do ?', array(), array('langcode' => $args['language'])),
    '#type' => 'select',
    '#options' => _bto_ajax_submenu_organize_form_get_activities($args['activities'], $args['language']),
    '#suffix' => '</div>'
  );

  $form['accommodation'] = array(
    '#prefix' => '<div class="right">',
    '#title' => t('Where do you want to lodge ?', array(), array('langcode' => $args['language'])),
    '#type' => 'select',
    '#options' => _bto_ajax_submenu_organize_form_get_accommodations($args['accommodations'], $args['language']),
    '#suffix' => '</div>'
  );

  if ($form_state['build_info']['args'][0]['language'] != NULL) {
    switch ($args['language']) {
      case 'fr':
        $form['test'] = array(
          '#type' => 'hidden',
          '#value' => 'fr',
        );
        break;

      case 'en':
        $form['test'] = array(
          '#type' => 'hidden',
          '#value' => 'en',
        );
        break;

      case 'de':
        $form['test'] = array(
          '#type' => 'hidden',
          '#value' => 'de',
        );
        break;

      default:
        $form['test'] = array(
          '#type' => 'hidden',
          '#value' => 'fr',
        );
        break;
    }
  }

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t("Let's go !", array(), array('langcode' => $args['language'])),
  );

  return $form;
}


/**
 * Organize form submit
 */
function _bto_ajax_submenu_organize_form_submit($form, &$form_state)
{
  dsm($form_state['build_info']['args']);
  $values = $form_state['values'];
  $storage = $form_state['storage'];
  $query = array();
  dsm($values);

  // Territory
  if ($values['place'] != 0)
    $query['place'] = $values['place'];

  // Activity
  if ($values['activity'] != 0)
    $query['filter'] = $values['activity'];

  // Hébergements
  if ($values['accommodation'] != 0)
    $query['filter2'] = $values['accommodation'];

  $url = get_node_path('109', $storage['lang']);
  $url = str_replace('fr/', '', $url);
  $url = str_replace('en/', '', $url);
  $url = str_replace('de/', '', $url);
  drupal_goto($url, array('query' => $query));
}

Менюто на куката:

/**
 * Hook menu
 * @return array $items     Contient les items du menu
 */
function bto_menu()
{
    $items = array();
    $items['ajax/%'] = array(
        'access callback' => true,
        'page arguments' => array(1),
        'page callback' => '_bto_ajax',
        'type' => MENU_CALLBACK,
    );
    //...
    return $items;
}

И извикването на формуляра:

/**
 * Callback ajax route
 * @param  $request 
 */
function _bto_ajax($request) 
{
    extract($_POST);
    switch ($request) {
        // ...             
        case 'menu-principal-organiser':
            $output = _bto_ajax_submenu_load_organize($vars);
            break;        
    }

    print  $output;
}


/**
 * Organize your trip
 */
function _bto_ajax_submenu_load_organize($vars) 
{
    $vars = json_decode($vars);
    $territories = $vars->territories;
    $accommodations = $vars->accommodations;
    $activities = $vars->activities;
    $language = $vars->language;

    // Load form
    $form = drupal_get_form("_bto_ajax_submenu_organize_form", array(
        'territories' => $territories, 
        'accommodations' => $accommodations, 
        'activities' => $activities,
        'language' => $language,
    ));

    // Load packaged offers
    // ...

    // Load template
    $output = theme('submenu-organize', array(
        'form' => drupal_render($form),
        'packaged_offers' => $packaged_offers,
        'language' => $language,
    ));

    return $output;
}

person Alarid    schedule 08.07.2014    source източник


Отговори (1)


Уверете се, че Drupal.attachBehaviors() се извиква от вашето обратно извикване на AJAX. Вижте API на Drupal 7 JavaScript за повече подробности.

person Anurag    schedule 08.07.2014
comment
Не съм сигурен, че разбирам това... Наистина, имам Drupal.attachBehaviors(), с вътре моя $.ajax Jquery, който извиква моята функция с drupal_get_form вътре. не е ли правилно - person Alarid; 09.07.2014
comment
мисля, че това трябва да ви помогне growingventuresolutions.com/blog/. Също така можете ли да поставите пълния си код на формуляр с функцията Hook_menu. - person Anurag; 09.07.2014
comment
Добавих моя код в публикацията. А за вашата връзка вече се опитах да използвам хранилището на form_state, но без успех - person Alarid; 09.07.2014