Чи є спосіб додати або змінити клас у обгортку форми (діви) за допомогою форми api?
Або це тільки що зроблено з функцією теми?
Якщо так, то яка функція теми використовується для зміни цього?
Чи є спосіб додати або змінити клас у обгортку форми (діви) за допомогою форми api?
Або це тільки що зроблено з функцією теми?
Якщо так, то яка функція теми використовується для зміни цього?
Відповіді:
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. В основному всі елементи форми отримують тему theme_form_element($element,$value);
form_element (файл form.inc)
Отже, щоб змінити спосіб відображення елементів форми, ви просто скопіюйте цю функцію у папку template.php та перейменуйте її на: phptemplate_form_element($element,$value)
тепер ви можете внести будь-які зміни, і вони будуть використовуватися замість оригінальної функції
theme_form_element($element,$value);
з form.incphptemplate_form_element($element,$value)
Ви можете використовувати властивість wrapper_attributes .
$form['example'] = [
'#type' => 'textfield',
'#title' => $this->t('Example'),
'#wrapper_attributes' => ['class' => ['wrapper-class']],
];
Важливо, що тема_form_element змінює лише прямий батьківський обгортковий розділ, і це може не бути цільовим завданням для CSS-ефектів.
[Хоча це не програмно, якщо потрібно просто застосувати клас до верхньої обгортки поля вузла (це обгортка, обгортка, обгортка), я можу припустити використання модуля "Група полів", вибравши "Керувати полями" для конкретного типу вмісту та виберіть "Додати нову групу" як простий 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')
дають бажаних результатів. Мій конкретний випадок - додавання класу до розділу ajax-обгортки навколо елемента Managed_file. #prefix/#suffix
створює новий контейнер і #attributes/'class'
змінює клас внутрішнього елемента, а не зовнішнього.
Нормальний зовнішній дів - просто
<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');
?>
Ви можете скористатися описаним вище способом для додавання класу до елемента форми.