Решил воткнуть Hierarchical Select в блок. Написал свой модуль taxonomy_combo_select. Он создаёт блоки для словарей таксономии.
После выбора иерархии и нажатия на кнопку Search происходит переход на страницу выбранного термина.
НО! После сабмита формы все контролы Hierarchical Select опять пустые Я ожидал, что поля будут заполнены ранее выбранными значениями. Что делаю не так?
/**
* 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;
}
Комментарии
проверь что путь taxonomy/term/$tid, потом по arg(2) вытащи и положи в default_value в форме.
Извините, я новичёк. В каком месте проверять путь? Что значит по "по arg(2) вытащи"?
Если Вы про путь тут
drupal_goto('taxonomy/term/'.get_last_selected_term($form));
}
то всё корректно. Путь правильный.
Дело в том, что если вставить
$form_state['values']['taxonomy_term']
вfunction taxonomy_combo_select_form_submit($form, &$form_state)
, то мы увидим ранее заданные значения.я не про то. просто после вашего гото, друпал перейдет на страницу таксономии. А вам остается по текущему пути достать (arg) этот тид и положить в форму:
'#default_value' => $найденныйtid
Спасибо, понял. Но это не работает для Hierarchical Select
У него default_value - это массив значений его options. Из адреса я получу только $tid. Это ничего не даёт.
Я в PHP новичёк. Может есnь ещё какие варианты временного хранения массива значений? Глобалные переменные, классы?
Делаю так:
variable_set('options', $form_state['values']['taxonomy_term']);
drupal_goto('taxonomy/term/'.get_last_selected_term($form));
}
...
'#default_value' => variable_get('options', 1)
всё работает. Но это не вариант, т.к. переменная кладётся в базу, а значит доступна всем.
Ура! Решил!
Храню временный массив в $_SESSION
$_SESSION['options'] = $form_state['values']['taxonomy_term'];
drupal_goto('taxonomy/term/'.get_last_selected_term($form));
}
...
'#default_value' => $_SESSION['options'];
Очень удобно, данные сохраняются для каждого пользователя отдельно.
ну судя по документации он должен был его "съест".