Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll

Использование #states в hook_form_alter

Использование #states в hook_form_alter
, by

Здравствуйте. Пытаюсь решить вопрос по реализации зависимости полей в drupal 7. Из многочисленных вопросов, стало понятно что оптимально в 7ом друпале использовать #states, вместо conditional fields. Как оказалось еще одним камнем в этот модуль является проблема зависимости при использовании модуля multi_step.

В целом как работает #states, я разобрался. Но только понял как работает он при создании своей формы hook_form. Но моя задача заключается в том чтобы переделать уже готовую форму добавления материала.

hook_form_ID_FORM_alter

Использую её. Нахожу массивы через dsm($form);
Но не могу понять как правильно прописывать зависимости.

Допустим в созднаной форме это сделал так:

<?php $form['radio_type'] = array(
    
'#type' => 'radios',
    
'#options' => array(
      
'0'   => t('Появляется выпадающая группа'),
      
'1' => t('Не активно поле текст'),
      
'2'      => t('Пропадают чекбоксы'),
    ),
    
'#title' => t('Выберите действие')
  );
  
  
$form['grupa'] = array(
    
'#type' => 'fieldset',
    
'#title' => t('Группа'),
    
'#states' => array(
      
'visible' => array(
        
':input[name="radio_type"]' => array('value' => '0'),
      ),
    ),
  );
?>

 

В функции hook_from_alter (прописываю пока в template)
Пытаюсь сделать что то такое:

<?phpfunction theme_form_zavedeniya_node_form_alter(&$form, &$form_state$form_id) {
   
dpm($form); 
   
$form['body']['und']['0']['value']['#states']  = array(
  
'invisible' => array(
    
':input[name="field_sity2"]' => array('value' => '56'),
  ),
);
}
?>

 

Т.е. делаю так чтобы при выборе в поле field_sity2 (ссылка на термин) при выборе 56ого значения пропадало поле body.
В общем ничего не работает. ПРобывал по разному, ну похоже что не разу не получилось правильно. Прошу совета.

P.S. Возможно еще могли бы посоветовать что использовать для создания многошаговой формы создания материала, с зависимыми полями. И чтобы в дальнейшем чтобы редактировать материал, его можно было бы редактировать через вкладки, а не по шагам.

1 answer
votes: 1129
Answer

Попробуйте так:

<?phpfunction theme_form_zavedeniya_node_form_alter(&$form, &$form_state, $form_id) {
   dpm($form); 
   $form['body']['#states']  = array(
    'invisible' => array(
      ':input[name=field_sity2]' => array('value' => '56'),
     ),
   );
}?>

И проверьте что имя поля действительно было field_sity2, а не name[field_sity2].


Спасибо, буду пробовать. Еще такой параллельный вопрос. Если бы вам нужно было создать мультишаговую форму добавления материала, как бы Вы это реализовали?


Наверно лучше всего вот этим модулем:

https://drupal.org/project/msnf


Значит мы на верном пути. Теперь еще надо будет в этой форме зависимые поля настроить, они же тоже будут работь с этим модулем. Единственное у этого модуля проблема, редактирование материала тоже выводиться пошагово, можно это как то сделать по вкладкам? А то это совсем неудобно. Вы такое не делали?


Пробую вот так. Все равно не работает, что то уже запутался.
Добавил два поля. Одно просто текстовое. Второе список.
При выборе в списке 1ого значения текстовое поле становиться видимым.

Значения в firebug

<div class="form-item form-type-select form-item-field-vibor-und">
<label for="edit-field-vibor-und">Выбор значения </label>
<select id="edit-field-vibor-und" class="form-select" name="field_vibor[und]">
<option value="_none">- Не указано -</option>
<option value="0">Пропадает поле кафе</option>
<option value="1">Появляется поле кафе</option>
</select>
</div>

Сама функция в tempale

function corporateclean_form_tovar_node_form_alter(&$form, &$form_state, $form_id) {
   dsm($form); 
   dvm($form);
   $form['field_vibor_cafe']['#states']  = array(
'visible' => array(
'select[name=field_vibor[und]]' => array('value' => '1',),
),
);
}

Что уже не пробовал. Все равно не работает.


Все получилось. Не работало из-за ковычек 

'select[name=field_vibor[und]]'

'select[name="field_vibor[und]"]'

Но не работает в разных шагах, через модуль multistep nodeform. БЛИИИИИИН. Че делать??????


Придется шаг объеденять где выполняется зависимость, что ли. В общем ужас, уже замучался с этой проблемой.


Сначала нужно проверку сделать, что это нужный id формы:

if($form['id'] == 'form_id_nuzny'){

  // и здесь уже менять states

}


Что то я не понял. ПРоверять id формы на определенном шаге?

Зависимые поля у меня будут на разных шагах, в общем в следующем шаге зависимость через #states уже не работает.


Ну добавил я проверку. И все равно не работает на разных шагах

 

function corporateclean_form_tovar_node_form_alter(&$form, &$form_state, $form_id) {

  

   if($form['#id'] == 'tovar-node-form'){

   

   $form['field_vibor_cafe']['#states']  = array(

'visible' => array(

'select[name="field_vibor[und]"]' => array('value' => '0',),

),

);

 

};

}