xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

Пример отключения 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 7
Похожие записи

Комментарии RSS

Внесу свои 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 оверхед большой будет

А для 6 подойдет?

должно

better filters меня спас )

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

обойдёт

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

  $form['parent'] = array(
    '#type' => 'fieldset',
    '#tree' => TRUE,
    '#title' => 'fieldset'
  );
 
  $form['parent']['child'] = array(
    '#type' => 'textfield',
    '#title' => 'child'
  );
, функция element_children вернет ключ только элемента parent, а до элемента child добраться таким циклом не получается, т.к. он на уровень глубже

ну рекурсия же есть

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

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании