Возник следующий вопрос. Я создаю форму, например:
<?php
$form['blabla'] = array(
'#type' => 'checkboxes',
'#options' => array(
'a' => 'blabla1',
'b' => 'blabla2',
),
'#default_value' => variable_get('blabla',''),
);
?>
потом возвращаю её через<?php system_settings_form($form); ?>
но variable_get('blabla','') мне возвращает такой массив:
<?php
array(
'a' => 'a',
'b' => 'b'
)
?>
Короче, значение ключа теряется. А мне оно надо. Вопрос - как вернуть потерянное значение?
Комментарии
Наверное не ключей все же а значений ? Если ключ не нужен (a,b) то можно так
'#options' => drupal_map_assoc(array('blabla1','blabla2')),
...
тогда ключ будет равен значению и ничего не потеряется
Я рассматривал этот вариант. Проблема в том, что у меня значение - это ссылка. И в качестве ключа её пхп не воспринимает
Ну тогда как вариант хранить options отдельно, что нибудь типа
<?php function _get_myoptions($key = '') {
$a = array('a' = > 'blabla1','b' = > 'blabla2');
if (empty($key)) {
return $a;
}
else {
return $a[$key];
}
}
для формы
....
'#options' => _get_myoptions(),
...
а если надо получить значение по ключу, то соответственно
$my_blabla = '';
$key = variable_get('blabla','')
if(!empty($key)) {
$my_blabla = _get_myoptions($key);
}
?>
Это понятно Просто у меня получение значения ключа - операция не ахти быстрая, она делает несколько запросов к базе, бегает по массивам и прочее) Поэтому я и не хотел повторять её при необходимости получить значение ключа. Но, видимо, выхода нет. Спасибо за помощь, olk
Можно сделать так:
в функции генерации формы вычисляются ключи, записываются в форму например:
$form['#blablavars'] = array(ассоциативный массив сгенеренный медленной функцией);
$form['blabla'] = array(
'#type' => 'checkboxes',
'#options' => array(
'a' => 'blabla1',
'b' => 'blabla2',
),
'#default_value' => variable_get('blabla',''),
);
?>
ну а дальше имея массив ключей забираем массив из формы
<?php $vars = $form['#blablavars'] ?>
и по ключам получаем нужные значения.
правда тут тоже будет двойной вызов =\ форма кэшируется со второго обращения (http://drupal.org/node/650016)
но возможно этого получиться избежать, принудительно вызвав form_set_cache
PS#3 у меня вроде работает. нужно в конструкторе формы просто прописать $form['#cache'] = true; и form_set_cache будет вызвана автоматически.
О! Идея супер, спасибо. Действительно, проще сначала закешировать а потом достать оттуда требуемые данные. Именно так и поступлю