Хочу обработать If -ом нажатие кнопки submit на форме редактирования

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

Аватар пользователя Dino127 Dino127 24 июня 2014 в 10:08

Есть материал equip. В нем несколько полей - ссылки на таксометрию. На странице редактирования сразу выводится термин Type (sell|rent) в листбоксе. А дальше на этой же форме выводятся несколько полей материала (представленных чекбоксами). Проблема в том, что ОДНО поле нужно чекать когда выбираешь Sell, а второе - когда выбираешь Rent. Динамически изменить форму наверное невозможно, да и Бог с ней - выбрал Sell - не заполняешь какое-то поле, это ладно. Но оно выведется в ноде! а его не надо показывать. Вот как ифнуть? если типа стоит Sell, то поле characRent не выводить? А если Rent - то поле characSell не выводить... и самое главное - где обработать? по сабмиту формы? может в темплейте? может в своем модуле?
Буду очень благодарен за решение.

Комментарии

Аватар пользователя meles meles 27 июня 2014 в 12:37

Изменить динамически форму без перезагрузки страници можно, вот копай сюда: https://www.drupal.org/node/752056
Селектор формы которым у тебя является Type (sell|rent) вынеси за пределы формы!
Для этого тебе надо сделать кастомизацию ноды,
в template.php добавляешь:

function MyTHEME_theme() {
$items = array();
$items['FORM_ID'] = array(
'render element' => 'form',
'path' => drupal_get_path('theme', 'MyTHEME') . '/templates',
'template' => 'node--equip--edit'
);
return $items;
}
где MyTHEME - название темы
FORM_ID - машинное имя формы (у тебя скорее всего это equip_node_form)

Далее берешь node.tpl.php копируешь и переименовываешь на node--equip--edit.tpl.php, теперь эта нода будет выводить у тебя для материала equip при редактировании.
(НЕ ЗАБЫВАЕМ ЧИСТИТЬ КЕШЬ)

Аватар пользователя Dirst Dirst 30 июня 2014 в 14:33

meles, А если стоит админская тема для редактирования материала, придется лезть в дефолтные темы и там копаться? Даже если мы переопределим шаблон, толку от этого никакого не будет, форма строится до вывода в шаблон и альтеровать ее в шаблоне не выйдет, или о чем речь, не совсем понял?

На это есть два варианта решения, один простой, но не очень правильный, второй посложнее но по феньшую.
1. Сделай form_alter у формы редактирования материала. И желательно в модуле, если делать в template.php а у тебя в редактировании настроена админская тема, то работать не будет. Прицепи javaScript к форме с помощью свойства #attached. Напиши скрипт, который по событию смены селект меняет видимость чекбоксов.

2. Также делаешь альтер формы редактирования. Но здесь уже придется менять сам элемент select, добавлять к нему ajax обработку и выводить чекбоксы по этой обработке.

Немного подробнее о работе с формами http://web-develance.ru/category/drupal/programmirovanie/sozdanie-strani...

Аватар пользователя Dino127 Dino127 30 июня 2014 в 13:51

спасибо за время и описание. Я до 3 в командировке, 3 с утра начну работу по этой форме. Ajax обработку я не прицеплю, не смогу. А вот 2 варианта выше (без админ темы и не по феншую - буду пробовать). если б кто еще объяснил как скрипт по #attach цеплять к форме.
На самом деле - задача более простая - уже при выводе формы редактирования, фактически по кнопке Отправить- делать обработку - если Rent - то не показывать те чекбоксы, если наоборот - то те. У меня проблемы с доступом к конкретным полям материала, может ткнете - где про это почитать, чтобы вас по пустякам не морочить? друпал 7... или дайте кусочек кода - как по if СКРЫТЬ ПРОИЗВОЛЬНЫЙ ЧЕКБОКС, как поле терминов таксометрии... (в готовой ноде на сайте)

Аватар пользователя Dirst Dirst 30 июня 2014 в 14:48

Все поля формы и поля материала можно вывести с помощью функции dsm() она идет в комплекте с модулем Devel.
#attached это свойство, туда можно добавить js файл
http://drupal.stackexchange.com/questions/70015/adding-css-and-js-to-for...

Аватар пользователя meles meles 2 июля 2014 в 16:39

"Dimychka" wrote:
meles, А если стоит админская тема для редактирования материала, придется лезть в дефолтные темы и там копаться? Даже если мы переопределим шаблон, толку от этого никакого не будет, форма строится до вывода в шаблон и альтеровать ее в шаблоне не выйдет, или о чем речь, не совсем понял?

Да в админской теме это не выйдет, но ведь форму можно изменить в самом файле шаблона, а потом вывести её через
print drupal_render_children($form);
Речь сейчас не об этом.

Аватар пользователя Dirst Dirst 3 июля 2014 в 6:00

Если рендер массив имеется ввиду изменять прямо в tpl.php файлах, то это не лучшее решение.

Dino127, мне тут еще подсказали как вариант свойство #states для скрытия ненужных элементов в зависимости от состояния другого.

Аватар пользователя Dino127 Dino127 3 июля 2014 в 16:44

так, мужики - огромное спасибо по ликбезу! особенно по свойствам #attached, #states. Изучил и обязательно применю на практике. За альтер формы для вывода первоначально RENT или SALE - тоже благодарю, хоть и юзаю админтему, но поначалу показалось интересно ) Походу разобрался с print drupal_render_children($form);
Но решил несколько иначе, когда изучал #attached, столкнулся с модулем conditional_fields. Он вероятно и наводит грамотный феншуй ). Установил - настроил зависимость показа одного поля от другого, и ... все заработало. Больше с обертками возился... то рендер не выводил поле, то вспомнил, что забыл исключить его из контента, то отображение не настроил. Но все поборол и при создании/отображении сейчас работает как надо.
Dimychka и meles благодарю за поддержку! Done!