Значения ключей параметра #options после сохранения формы

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

Аватар пользователя SplasH SplasH 2 марта 2011 в 19:40

Возник следующий вопрос. Я создаю форму, например:

<?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'
)
?>

Короче, значение ключа теряется. А мне оно надо. Вопрос - как вернуть потерянное значение?

Комментарии

Аватар пользователя olk olk 2 марта 2011 в 20:11

Наверное не ключей все же а значений ? Если ключ не нужен (a,b) то можно так
'#options' => drupal_map_assoc(array('blabla1','blabla2')),
...
тогда ключ будет равен значению и ничего не потеряется

Аватар пользователя SplasH SplasH 2 марта 2011 в 20:29

Я рассматривал этот вариант. Проблема в том, что у меня значение - это ссылка. И в качестве ключа её пхп не воспринимает

Аватар пользователя olk olk 2 марта 2011 в 20:53

Ну тогда как вариант хранить 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);
}
?>
Аватар пользователя SplasH SplasH 2 марта 2011 в 20:57

Это понятно Smile Просто у меня получение значения ключа - операция не ахти быстрая, она делает несколько запросов к базе, бегает по массивам и прочее) Поэтому я и не хотел повторять её при необходимости получить значение ключа. Но, видимо, выхода нет. Спасибо за помощь, olk

Аватар пользователя aleks_84 aleks_84 2 марта 2011 в 22:54

Можно сделать так:
в функции генерации формы вычисляются ключи, записываются в форму например:

<?php
$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 будет вызвана автоматически.

Аватар пользователя SplasH SplasH 3 марта 2011 в 15:12

О! Идея супер, спасибо. Действительно, проще сначала закешировать а потом достать оттуда требуемые данные. Именно так и поступлю