Drupal → Как обойти все элементы формы

06.10.2011

Пример отключения Wysiwyg редактора для всех полей типа text_format в форме создания/редактирования материала типа page:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_page_node_form_alter(&$form) {
  mymodule_disable_wysiwyg_recursive($form);
}

/**
 * Disable wysiwyg in all fields
 */
function mymodule_disable_wysiwyg_recursive(&$form) {
  foreach (element_children($form) as $element) {
    if (isset($form[$element]['#type']) && $form[$element]['#type'] == 'text_format') {
      $form[$element]['#wysiwyg'] = FALSE;
    }
    else {
      mymodule_disable_wysiwyg_recursive($form[$element]);
    }
  }
}

В Drupal 8 функция element_children() переименована в \Drupal\Core\Render\Element::children().

Написанное актуально для
Drupal 7
Похожие записи

Комментарии

Внесу свои 5 копеек.
У меня ключа #wysiwyg не нашлось. Может, я не тот модуль использую.
Зато у меня есть в #pre_render колбек wysiwyg_pre_render_text_format(), который нужно «удалить».
Кстати, ещё один вариант реализации — воспользоваться стандартной рекурсией задав #process или #after_build в hook_element_info_alter :)

Спасибо за блог, xandeadx!

По поводу #wysiwyg — поняла, когда заглянула в тот же wysiwyg_pre_render_text_format() :)

у hook_element_info_alter оверхед большой будет

Гость
20.12.2012, 12:54

Такой подход не обойдет все элементы формы, если они имеют вложенную струткуру.. Как быть в такой ситуации?

Гость
20.12.2012, 13:17

не сразу заметил, что реализация для 7ки, но в 6ке, если есть вложенные элементы формы, например,

  $form['parent'] = array(
    '#type' => 'fieldset',
    '#tree' => TRUE,
    '#title' => 'fieldset'
  );

  $form['parent']['child'] = array(
    '#type' => 'textfield',
    '#title' => 'child'
  );

, функция element_children вернет ключ только элемента parent, а до элемента child добраться таким циклом не получается, т.к. он на уровень глубже

Гость
20.12.2012, 13:26

конечно есть) просто это достаточно стандартный подход к структурам формы, думал есть что-нибудь в функционале ядра, для обхода элементов такой структуры... ок, напишем тогда.

Добавить комментарий