Проблема в следующем, на форме есть checkboxes,форма обрабатываться при помощи мной написанной функции. вопрос, как сделать так, чтобы отмеченный пользователем checkboxes отображались отмеченными. пока после обработки формы отображается, что ничего не отмечено. по идее в variable все как полагается...помогите
Комментарии
#default_value установить правильно, как же еще.
Никто вам не скажет, что вы не так делаете, если не предъявите код.
И следом за кодом сразу приводите список опций чекбоксов и содержимое вашей "variable".
содержимое переменной в таблице variable следующее
a:1:{i:0;s:5:"price";}
код такой
function comparison_admin_settings(&$form_state) {
$types=get_types();
$form['nodecount'] = array(
'#type' => 'select',
'#title' => t('Maximum nodes to compare'),
'#options' => drupal_map_assoc(range(2, 10)),
'#default_value' => variable_get('nodecount',
2),
);
$form['nodetypes'] = array(
'#type' => 'fieldset',
'#title' => t('Node types'),
);
$form['nodetypes']['types'] = array(
'#type' => 'checkboxes',
'#title' => t('Select node types to compare'),
'#options' => $types,
'#default_value' => variable_get('types', array()),
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return $form;
}
function comparison_admin_settings_submit($form, &$form_state) {
$i=0;
$types=get_types();
$checked = array_intersect(array_keys($form_state['values']['types']), array_values($form_state['values']['types']));
$comparison_types=array();
foreach($types as $type){
if (in_array($i, $checked)&&($i!=0)){
$comparison_types[]=$type;
}
$i++;
}
$types_db=get_compare_types();
$deleted=array_diff($types_db, $comparison_types);
$inserted=array_diff($comparison_types, $types_db);
if (count($deleted)!=0){
db_query("DELETE FROM {comparison_node} WHERE type IN (".db_placeholders($deleted).")", $deleted);
}
foreach($inserted as $ins){
db_query("INSERT INTO {comparison_node} (cid, type) VALUES (%d, '%s')",NULL, $ins);
}
drupal_set_message('Configuration saves.');
}
function get_types(){
$result=db_query("SELECT type FROM {flag_types}");
$types=array();
while($type= db_fetch_object($result)){
$ar=array($type->type);
$types=array_merge($types, $ar);
}
return $types;
}
function get_compare_types(){
$result=db_query("SELECT type FROM {comparison_node}");
$types=array();
while($type=db_fetch_object($result)){
$ar=array($type->type);
$types=array_merge($types, $ar);
}
return $types;
}
И где здесь список опций чекбоксов? Вот у вас "в таблице variable" есть запись "price". Как мне понять, что такая же есть в чекбоксах? Как увидеть, что вы там задаете? Или гадать надо?
Подсказываю. Вот у вас есть код:
'#type' => 'checkboxes',
'#title' => t('Select node types to compare'),
'#options' => $types,
'#default_value' => variable_get('types', array()),
);
Не надо приводить код всего модуля. Просто напишите, чему равны
$form['nodetypes']['types']['#options'] и $form['nodetypes']['types']['#default_value'] непосредственно после исполнения этого куска кода.
Кстати, называть переменную "types" - не очень хорошая идея.
'#default_value' => variable_get('types', array());
....
сохраняем:
variable_set('types', $form_state['values']['types']);
Я про это уже автору в другой теме писал. Мне было отвечено, что все нормально сохраняется
всё, разобралась:) а почему $types плохо? можно что-то подменить ей?
Да, поэтому. Чтобы исключить совпадение имен функций и переменных таблицы variables, в друпаловских соглашениях об именовании настоятельно рекомендуется пользовательские функции и переменные начинать с имени модуля (в случае с приватными функциями - с подчеркивания и имени модуля).
Уточняю: речь не о локальной переменной $types, а о переменной 'types' из таблицы variables, с которой вы работаете через variable_get/variable_set.
понятно, пасибо! в дальнейшем учту)
тема закрыта, но graker, можно задать вам еще один вопрос? я думаю, вы сможете подсказать. есть страница с формой и кнопка, нужно чтобы по клику на кнопку отображалась таблица под формой. эта таблица генерируется из базы с учетом данный формы. как это возможно сделать?
Можно, например, сохранять данные формы при сабмите в сессии, а при обновлении страницы смотреть - если в сессии есть данные, то показывать таблицу.
Посмотрите как в стандартном модуле node сделана админка содержимого (фильтрация и вывод списка нод в админке).
а как ее добавить? таблицу? просто вывести на отдельной странице получается, а добавить к уже существующей никак..
Если у вас вся страница генерится как форма, то используйте элемент item, в него пихайте html таблицы.
спасибо!