(РЕШЕНО) темизация VBO-формы

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

Аватар пользователя so-lo74 so-lo74 25 ноября 2012 в 22:29

Всем привет.

Drupal 7.16, Views 3

N-е число часов пытаюсь решить простую задачу:
При отображении View c VBO перед таблицей по умолчанию выводится филдсет с набором доступных операций.
Необходимо реализовать более логичное, imho, а не дефолтное его отображение и поведение, т.е. если
не выбран ни один row, либо отключать кнопку «выполнить», либо хотя бы держать его (филдсет) изначально в свернутом состоянии.
Пытаюсь «достучаться» до элемента формы через hook_form_FORM_ID_alter, id-формы вытаскиваю из кода страницы, и всё бы хорошо..., но в при выводе debug($form) или dsm, искомого филдсета не наблюдается, т.е. «видно» всё, кроме филдсета с select.
Правда, есть одно сомнение в правильности выбранного хука — форма выводится как блок (?), по-крайней мере в коде (и страницы, и в отладчике) '#form_id' => 'views_form_user_materials_supervisor_block'.
Как же всё-таки добраться до этого элемента формы (филдсет)?
Или подобное вообще решается иначе?

Заранее спасибо )

Комментарии

Аватар пользователя so-lo74 so-lo74 28 ноября 2012 в 1:06

Сами спрашиваем — сами отвечаем )
Проблема оказалась известной (некоторым тоже показался данный филдсет нелогичным):

В каком-то смысле, можно считать это особенностью VBO-модуля.

Рецепт (может кому-нибудь пригодится):
1. Задать вес своему модулю больший, чем VBO, например, 1 (для установки очередности обработки хуков)
2. В своей реализации хука hook_form_alter или hook_form_FORM_ID_alter проверять шаг, на котором находится форма и реализовывать свой функционал вот здесь:

<?php
yourmodule_form_FORM_ID_alter
(&$form, &$form_state$form_id) { 
  ...
  if (
$form_state['step'] == 'views_form_views_form') {
// ваш код
  
}
}
?>

Пресловутый филдсет просто сворачивается:
$form['select']['#collapsed']=true;

либо гасится
$form['select']['#access']=false;

заодно можно убрать и это:
unset($form['select_all_markup']);

В финальной версии реализовано управление видимостью филдсета с выбором VBO-actions через
состояния #state, программно назначаемые кнопкам-переключателям или с использованием ajax, но первое кажется проще.

P.S. аналогичная картина наблюдается при необходимости альтерации форм exposed фильтров, например, BEF с выводом их через popUp модуль. Рецепт борьбы — тот же, что и в случае с VBO