Как отключить поле сск? [решено]

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

Аватар пользователя fairwind fairwind 10 января 2009 в 19:55

Нужно сделать поле ССК отключенным, "серым". За это отвечает свойство элемента формы 'disabled'.
С forms api я только начал разбираться. Попытался использовать hook_form_alter, но с полями сск этот фокус не проходит. По ссылке я вопрос оставил, но может кто из наших разбирался с вопросом?

Комментарии

Аватар пользователя fairwind fairwind 11 января 2009 в 9:54

Решено, благодаря ответу в указанном посте:
<?php
function my_form_alter(&$form, $form_state, $form_id) {
if (isset($form['type']) && isset($form['#node']) && $form['type']['#value'] .'_node_form' == $form_id) {
$form['#after_build'][] = 'my_form_process';
}
}
function my_form_process($form, &$form_state) {
my_fix_disabled($form['field_myfiled']);
return $form;
}
function my_fix_disabled(&$elements) {
foreach (element_children($elements) as $key) {
if (isset($elements[$key]) && $elements[$key]) {
// Recurse through all children elements.
my_fix_disabled($elements[$key]);
}
}
if (!isset($elements['#attributes'])) {
$elements['#attributes'] = array();
}
$elements['#attributes']['disabled'] = 'disabled';
}
?>

When after_build handler is invoked, the code in FAPI that deals with $elements['#disabled'] has already been processed (_form_builder_handle_input_element executes() is executed before #after_build handlers are processed, see form_builder() ), so now you need to generate the $element['#attributes']['disabled'] = 'disabled' for the corresponding theme function of the element.

Или по-русски:
Когда вызывается хендлер after_build, код FAPI, обрабатывающий атрибут 'disabled', уже выполнен (вызовы в _form_builder_handle_input_element делаются до обработки #after_build, см. see form_builder() ), поэтому нужно создать $element['#attributes']['disabled'] = 'disabled' для соответствующей функции темизации элемента.

Аватар пользователя cosmos cosmos 9 ноября 2012 в 16:12

дополню еще от себя
для того чтобы значения disabled полей не обнулялись после сохранениия формы
нужно им проставить первоначальные значения.
Для этого вешаем свой валидатор в самое начало:

<?php
fucntion hook_form_alter
(){
$form['#validate'] = array_merge(array('mymodule_form_validate'),$form['#validate']);
}

?>

в фунции перехватываем disabled пустые поля и присваиваем им первоначальные значения

<?php function mymodule_form_validate($form, &$form_state) {
    
    
//set values to disabled fields
       
$arr $form['taxonomy'][7]['#default_value']; 
       
//поле таксономии
       
$form_state['values']['taxonomy'][7] = array_combine($arr,$arr);
       
$form_state['clicked_button']['#post']['taxonomy'][7] = $arr;
  
//чекбокс простое поле
       
$form_state['values']['field_links'][0]['value'] = 1;
       
$form_state['clicked_button']['#post']['field_links']['value']=1;  
?>
Аватар пользователя cosmos cosmos 9 ноября 2012 в 21:18

надо прибавить то что отписал fairwind
и мой код.

PS
хотя я без особых проблем прописал атрибут "disabled" в hook_form_alter может можно обойтись и без кода от fairwind