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

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

Аватар пользователя lionman lionman 17 октября 2013 в 11:30

Здравствуйте. Пытаюсь решить вопрос по реализации зависимости полей в 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. Возможно еще могли бы посоветовать что использовать для создания многошаговой формы создания материала, с зависимыми полями. И чтобы в дальнейшем чтобы редактировать материал, его можно было бы редактировать через вкладки, а не по шагам.

Комментарии

Аватар пользователя drupby drupby 19 октября 2013 в 12:51

ну если у тебя филдсет и так видимый , а ты его пытаешься при выборе радиобаттона сделать еще раз видимым - где логика?

Аватар пользователя lionman lionman 17 октября 2013 в 14:31

В примере кода с модулем, он появляется при выборе пункта Появляется выпадающая группа
Вопрос вообще не в этом же. Это просто примеры.

А нужен ответ на это

«В функции 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.
В общем ничего не работает. ПРобывал по разному, ну похоже что не разу не получилось правильно. Прошу совета.»

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

Аватар пользователя lionman lionman 18 октября 2013 в 15:50

Уважаемые. Подскажите. Я думаю кто то уже такое делал. Не получается у меня сделать зависимость в hook_form_alter

Аватар пользователя lionman lionman 23 октября 2013 в 8:39

Все проблему решил сам. Методом проб и ошибок) Кому надо вот конечный вариант реализации #states через hook_form_alter

Добавил два поля. Одно просто текстовое. Второе список(select).
При выборе в списке 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>

Нам нужно знать именно параметр name у select'a, у нас он name="field_vibor[und]"

Прописывал для проверки данный хук в template.php

<?phpfunction НАЗВАНИЕ ТЕМЫ_form_tovar_node_form_alter(&$form, &$form_state, $form_id) {
   
   $form['field_vibor_cafe']['#states']  = array( //Добавляем текстовому полю параметр #states
'visible' => array(
'select[name="field_vibor[und]"]' => array('value' => '0',),//при значении поля field_vibor равного 0-ому, текстовое поля становиться видимым
),
);
}?>

В общем все РАБОТАЕТ.

Одна только проблема. Для создания материала я использую модуль Multistep node form

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