Изменение класса в оболочке div элемента формы


Есть ли способ добавить или изменить класс в оболочку формы (div) с помощью api формы?

Или это просто делается с помощью функции темы?

Если да, то какая функция темы используется для изменения этого?

 12
Author: Oswald, 2011-09-13

9 answers

Вы можете переопределить theme_form_element() обычно, если вы хотите изменить тематику глобально. Если вы заинтересованы в изменении только одного конкретного элемента формы, то я знаю несколько вариантов.

  1. Вы можете зарегистрировать новую функцию темы для конкретного типа интересующего вас элемента формы (например, текстовое поле). Затем вы создаете эту функцию темы (на основе оригинала, например. theme_textfield()) но это не вызывает theme('form_element', ...) в конце (вы могли бы либо справиться с обоими оболочка и элемент в одной функции темы, или вы можете создать отдельную функцию темы оболочки и использовать ее). Наконец, вы добавляете свойство #theme к определенному элементу формы, и этот элемент получит вашу пользовательскую тематику.

  2. Вы можете создать файл шаблона с именем form_element.tpl.php, который просто имеет поведение по умолчанию theme_form_element(), а затем использовать hook_preprocess_form_element() для добавления предложения шаблона. Затем вы создаете новый шаблон, соответствующий предложению. Вы часто слышите, как люди упоминают об этом шаблоны немного медленнее, чем функции, и для такого часто используемого вызова темы я могу представить, что люди отказываются использовать шаблон. Однако я сам никогда не делал никаких измерений для этого. Кроме того, вам необходимо иметь достаточный контекст на этапе предварительной обработки, чтобы иметь возможность сделать предложение.

 5
Author: Andy, 2012-02-01 13:46:50

Я знаю, что это очень старая тема, но я учусь изменять элементы формы и добавлять классы. Я собрался сделать пользовательский модуль:

function yourtheme_custom_form_alter(&$form, &$form_state, $form_id) {
 case'webform_number_whatever':
   _yourtheme_form_add_wrapper($form['submitted']['yourfieldhere'], array('form-field-some-style', 'not-label', 'whatever-other-styles-you-want'));
 break;
}

function _yourtheme_form_add_wrapper(&$element, $classes = array(), $type = array('form-item', 'form-type-textfield'), $removeTitle = FALSE){
  $element['#prefix'] = '<div class="' . implode(" ", $classes) . '"><div class="' . implode(" ", $type) . '">';
  $element['#suffix'] = '</div></div>';
}
 4
Author: tdm, 2014-01-24 21:48:22

Чтобы изменить "оболочку", вам нужно переопределить form_element. В основном все элементы формы отображаются с помощью темы form_element theme_form_element($element,$value); (файл form.inc)

Поэтому, чтобы изменить способ отображения элементов формы, вы просто копируете эту функцию в свой template.php папку и переименуйте ее в: phptemplate_form_element($element,$value)

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

  1. Копировать theme_form_element($element,$value); из form.inc
  2. Вставьте его в (вашу тему) template.php
  3. переименуйте его в: phptemplate_form_element($element,$value)
  4. очистить весь кэш тем
  5. внесите любые изменения, которые вы хотите, и они будут использованы.
 3
Author: Andre, 2015-12-12 08:40:20

Вы можете использовать свойство wrapper_attributes.

$form['example'] = [
  '#type' => 'textfield',
  '#title' => $this->t('Example'),
  '#wrapper_attributes' => ['class' => ['wrapper-class']],
];
 3
Author: ya.teck, 2020-01-11 15:27:57

Важно отметить, что theme_form_element изменит только div прямой родительской оболочки, и это может не быть целевой целью для CSS-эффектов.

[Хотя это и не программно, если кто-то просто хочет применить класс к верхней оболочке поля узла (это оболочка, оболочка, оболочка), я полагаю, можно использовать модуль "Группа полей", выбрав "Управление полями" для определенного типа контента и выбрав "Добавить новую группу" в качестве простого DIV. Затем метку можно удалить и назначить нужные классы дополнительная обертка (но теперь у нас еще больше оберток) - с неограниченной вложенностью]

 0
Author: user24737, 2014-06-24 15:30:46

Вы могли бы использовать

'#prefix' => '<div class="new_class">', '#suffix' => '</div>'

И это обернет его вокруг

 0
Author: Alex, 2015-09-07 23:44:50

Сделайте атрибуты оболочки настраиваемыми!

Создайте свою собственную функцию темы элемента формы в своей теме... sites/all/themes/MY_THEME/theme/form-element.theme.inc

function my_theme_form_element($variables) {
  $element = &$variables['element'];

  $attributes = isset($element['#my_theme_wrapper_attributes']) ?
    $element['#my_theme_wrapper_attributes'] : array();

  ...

  $output = '<div' . drupal_attributes($attributes) . '>' . "\n";

  ...
}

Тогда вы можете делать такие вещи, как это...

function my_module_form_alter(&$form, &$form_state, $form_id) {
  $form['account']['mail']['#my_theme_wrapper_attributes']['class'][] = 'form-field--inline';
}
 0
Author: doublejosh, 2016-03-30 20:44:04

Бывают случаи, когда ни #prefix/#suffix, ни #attributes => array('class') не дают желаемых результатов. Мой конкретный случай - добавление класса в div-оболочку ajax вокруг элемента managed_file. #prefix/#suffix создает новый контейнер и #attributes/'class' изменяет класс внутреннего элемента, а не самого внешнего.

Обычный самый внешний div - это просто

<div id="edit-doc1--XX-ajax-wrapper">

, на который трудно ориентироваться в CSS. Я могу нацелиться на [id^="edit-doc"] или [id$="-ajax-wrapper"], но оба они нацелены не только на те элементы, которые я хотел.

В решение, которое я придумал, состоит в том, чтобы добавить #process элемент в форму и вручную манипулируйте кодом элемента. Вот атрибут #process, добавленный в объявление элемента формы:

$form['doc1'] = array(
  '#type' => 'managed_file',
  '#process' => array('mymodule_managed_file_process'),
);

И вот функция mymodule_managed_file_process():

function mymodule_managed_file_process($element, &$form_state, $form) {

  // Call the original function to perform its processing.
  $element = file_managed_file_process($element, $form_state, $form);

  // Add our own class for theming.
  $element['#prefix'] = str_replace(
    'id=',
    'class="managed-file-wrapper" id=',
    $element['#prefix']
  );

  return $element;
}

Полагаться на подстановку строк не очень удобно, поэтому используйте str_replace на свой страх и риск. Этот код, однако, действительно изменяет самый внешний DIV, чтобы добавить необходимый класс:

<div class="managed-file-wrapper" id="edit-doc1--XX-ajax-wrapper">
 0
Author: Joseph Cheek, 2016-07-08 16:55:44
<?php
    $form['#attributes'] = array('class' => 'your-class-name');
?> 

Вы можете использовать описанный выше способ добавления класса в элемент формы.

 -2
Author: Fero, 2011-09-14 10:21:44