Форма в блоке. Как установить default_value?

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

Аватар пользователя atLex atLex 9 июля 2009 в 0:23

Решил воткнуть Hierarchical Select в блок. Написал свой модуль taxonomy_combo_select. Он создаёт блоки для словарей таксономии.
После выбора иерархии и нажатия на кнопку Search происходит переход на страницу выбранного термина.

НО! После сабмита формы все контролы Hierarchical Select опять пустые Sad Я ожидал, что поля будут заполнены ранее выбранными значениями. Что делаю не так?

<?php
/**
 * hook_block()
 */

function taxonomy_combo_select_block($op = 'list', $delta = 0) {
  $vocabularies = taxonomy_get_vocabularies();
  switch($op) {
    case 'list':
      $blocks = array();
      foreach ($vocabularies as $vid => $vocabulary) {
        $blocks[$vid] = array(
          'info' => 'Taxonomy Combo Select ('.$vocabulary->name.')'
        );
      }
      return $blocks;
    case 'view':
      $block = array(
        'subject' => $vocabularies[$delta]->name,
        'content' => taxonomy_combo_select_block_content($delta),
      );
      return $block;
  }
}

/**
 * Creates the content with the links for a block for a specific vocabulary.
 *
 * param int $vid The vocabulary id
 * return string The content for the block.
 */

function taxonomy_combo_select_block_content($vid) {
  variable_set('taxonomy_vid', $vid);
  return drupal_get_form('taxonomy_combo_select_form');
}

/**
 * hook_form
 */

function taxonomy_combo_select_form($form_state) {
  $vid = variable_get('taxonomy_vid', 1);

  $form['taxonomy_term'] = array(
    '#type' => 'hierarchical_select',
    '#title' => t('Select the tag you wish to use.'),
    '#size' => 1,
    '#config' => array(
      'module' => 'hs_taxonomy',
      'params' => array(
        'vid' => $vid,
      ),
      'save_lineage'    => 1,
      'enforce_deepest' => 0,
      'entity_count'    => 1,
      'resizable'       => 1,
      'level_labels' => array(
        'status' => 0,
        'labels' => array(
          0 => t('Main category'),
          1 => t('Subcategory'),
          2 => t('Third level category'),
          3 => t('4th level category'),
        ),
      ),
      'dropbox' => array(
        'status'   => 0,
        'title'    => t('All selections'),
        'limit'    => 0,
        'reset_hs' => 1,
      ),
      'editability' => array(
        'status'           => 0,
        'item_types'       => array(),
        'allowed_levels'   => array(
          0 => 0,
          1 => 0,
          2 => 1,
        ),
        'allow_new_levels' => 0,
        'max_levels'       => 3,
      ),
      'animation_delay'    => 50,
      'exclusive_lineages' => array(),
      'render_flat_select' => 0,
    ),
    '#default_value' => $form_state['values']['taxonomy_term']
  );

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Search'),
  );

  return $form;
}

function taxonomy_combo_select_form_submit($form, &$form_state) {
  drupal_goto('taxonomy/term/'.get_last_selected_term($form));
}

function get_last_selected_term($form) {
  $selects = $form['taxonomy_term']['#value']['hierarchical_select']['selects'];
  $size = sizeof($selects);
  $last_term = $selects[$size-1];
  if (!is_numeric($last_term)) {
    $last_term = $selects[$size - 2];
  }
  return $last_term;
}

Комментарии

Аватар пользователя atLex atLex 9 июля 2009 в 12:00

"Nikit" wrote:
проверь что путь taxonomy/term/$tid, потом по arg(2) вытащи и положи в default_value в форме.

Извините, я новичёк. В каком месте проверять путь? Что значит по "по arg(2) вытащи"?

Если Вы про путь тут

function taxonomy_combo_select_form_submit($form, &$form_state) {
  drupal_goto('taxonomy/term/'.get_last_selected_term($form));
}

то всё корректно. Путь правильный.

Дело в том, что если вставить $form_state['values']['taxonomy_term'] в function taxonomy_combo_select_form_submit($form, &$form_state), то мы увидим ранее заданные значения.

Аватар пользователя Nikit Nikit 10 июля 2009 в 3:44

я не про то. просто после вашего гото, друпал перейдет на страницу таксономии. А вам остается по текущему пути достать (arg) этот тид и положить в форму:  '#default_value' => $найденныйtid

Аватар пользователя atLex atLex 10 июля 2009 в 12:25

Спасибо, понял. Но это не работает для Hierarchical Select Sad
У него default_value - это массив значений его options. Из адреса я получу только $tid. Это ничего не даёт.

Я в PHP новичёк. Может есnь ещё какие варианты временного хранения массива значений? Глобалные переменные, классы?

Делаю так:

function taxonomy_combo_select_form_submit($form, &$form_state) {
  variable_set('options', $form_state['values']['taxonomy_term']);

  drupal_goto('taxonomy/term/'.get_last_selected_term($form));
}

...

'#default_value' => variable_get('options', 1)

всё работает. Но это не вариант, т.к. переменная кладётся в базу, а значит доступна всем.

Аватар пользователя atLex atLex 10 июля 2009 в 12:48

Ура! Решил!
Храню временный массив в $_SESSION

function taxonomy_combo_select_form_submit($form, &$form_state) {
  $_SESSION['options'] = $form_state['values']['taxonomy_term'];
 
  drupal_goto('taxonomy/term/'.get_last_selected_term($form));
}
 
...
 
'#default_value' => $_SESSION['options'];

Очень удобно, данные сохраняются для каждого пользователя отдельно.