Изменение класса в оболочке div элемента формы
Есть ли способ добавить или изменить класс в оболочку формы (div) с помощью api формы?
Или это просто делается с помощью функции темы?
Если да, то какая функция темы используется для изменения этого?
9 answers
Вы можете переопределить theme_form_element()
обычно, если вы хотите изменить тематику глобально. Если вы заинтересованы в изменении только одного конкретного элемента формы, то я знаю несколько вариантов.
Вы можете зарегистрировать новую функцию темы для конкретного типа интересующего вас элемента формы (например, текстовое поле). Затем вы создаете эту функцию темы (на основе оригинала, например.
theme_textfield()
) но это не вызываетtheme('form_element', ...)
в конце (вы могли бы либо справиться с обоими оболочка и элемент в одной функции темы, или вы можете создать отдельную функцию темы оболочки и использовать ее). Наконец, вы добавляете свойство#theme
к определенному элементу формы, и этот элемент получит вашу пользовательскую тематику.Вы можете создать файл шаблона с именем
form_element.tpl.php
, который просто имеет поведение по умолчаниюtheme_form_element()
, а затем использоватьhook_preprocess_form_element()
для добавления предложения шаблона. Затем вы создаете новый шаблон, соответствующий предложению. Вы часто слышите, как люди упоминают об этом шаблоны немного медленнее, чем функции, и для такого часто используемого вызова темы я могу представить, что люди отказываются использовать шаблон. Однако я сам никогда не делал никаких измерений для этого. Кроме того, вам необходимо иметь достаточный контекст на этапе предварительной обработки, чтобы иметь возможность сделать предложение.
Я знаю, что это очень старая тема, но я учусь изменять элементы формы и добавлять классы. Я собрался сделать пользовательский модуль:
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>';
}
Чтобы изменить "оболочку", вам нужно переопределить form_element.
В основном все элементы формы отображаются с помощью темы form_element theme_form_element($element,$value);
(файл form.inc)
Поэтому, чтобы изменить способ отображения элементов формы, вы просто копируете эту функцию в свой template.php папку и переименуйте ее в: phptemplate_form_element($element,$value)
Теперь вы можете вносить любые изменения, и они будут использоваться вместо исходной функции
- Копировать
theme_form_element($element,$value);
из form.inc - Вставьте его в (вашу тему) template.php
- переименуйте его в:
phptemplate_form_element($element,$value)
- очистить весь кэш тем
- внесите любые изменения, которые вы хотите, и они будут использованы.
Вы можете использовать свойство wrapper_attributes.
$form['example'] = [
'#type' => 'textfield',
'#title' => $this->t('Example'),
'#wrapper_attributes' => ['class' => ['wrapper-class']],
];
Важно отметить, что theme_form_element изменит только div прямой родительской оболочки, и это может не быть целевой целью для CSS-эффектов.
[Хотя это и не программно, если кто-то просто хочет применить класс к верхней оболочке поля узла (это оболочка, оболочка, оболочка), я полагаю, можно использовать модуль "Группа полей", выбрав "Управление полями" для определенного типа контента и выбрав "Добавить новую группу" в качестве простого DIV. Затем метку можно удалить и назначить нужные классы дополнительная обертка (но теперь у нас еще больше оберток) - с неограниченной вложенностью]
Вы могли бы использовать
'#prefix' => '<div class="new_class">', '#suffix' => '</div>'
И это обернет его вокруг
Сделайте атрибуты оболочки настраиваемыми!
Создайте свою собственную функцию темы элемента формы в своей теме...
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';
}
Бывают случаи, когда ни #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">
<?php
$form['#attributes'] = array('class' => 'your-class-name');
?>
Вы можете использовать описанный выше способ добавления класса в элемент формы.