Змініть клас на оболонці з елементами форми


11

Чи є спосіб додати або змінити клас у обгортку форми (діви) за допомогою форми api?

Або це тільки що зроблено з функцією теми?

Якщо так, то яка функція теми використовується для зміни цього?


Я впевнений, що це тематична функція. Яку тематичну функцію використовувати - це питання. :)
akalata

Ах, ти прав там.
chrisjlee

Я думаю, ви також можете скористатися клавішею #attribute, щоб визначити клас
Міка А.

@Mika A. Це стосується лише тегу <input>, який я хотів би змінити клас обгортки (a <div>).
chrisjlee

Відповіді:


5

theme_form_element()Якщо ви хочете змінити тематику в усьому світі, ви можете нормально змінити їх. Якщо вам цікаво змінити лише один конкретний елемент форми, я знаю пару варіантів.

  1. Ви можете зареєструвати нову функцію теми для конкретного типу елемента форми, який вас цікавить (наприклад, текстове поле). Потім ви створюєте цю функцію теми (на основі оригіналу, напр. theme_textfield()), Але вона не викликає theme('form_element', ...)наприкінці (ви можете або обробляти оболонку, і елемент в одній функції теми, або ви можете зробити окрему тему функції обгортки і використовувати це). Нарешті ви додаєте #themeвластивість до певного елемента форми, і цей елемент отримає ваші власні теми.

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


Чи можете ви навести приклад?
chrisjlee

@ ChrisJ.Lee Ви хочете змінити обгортку для всіх елементів або лише одного конкретного?
Енді

лише один.
chrisjlee

@chrisjlee Я оновив відповідь.
Енді

4

Я знаю, що це дуже стара тема, але я вчився змінювати елементи форми та додавати класи. Я взяв участь у створенні спеціального модуля:

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>';
}

Це хороше альтернативне рішення - не додайте клас до загортаючого div, просто загорнувши обгортковий div у свій власний div, і ви можете застосовувати будь-які класи, які ви хочете.
Фелікс Єва

3

Щоб змінити "обгортку", вам потрібно перезаписати form_element. В основному всі елементи форми отримують тему theme_form_element($element,$value);form_element (файл 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. вносити всі потрібні зміни, і вони будуть використані.

1

Ви можете використовувати властивість wrapper_attributes .

$form['example'] = [
  '#type' => 'textfield',
  '#title' => $this->t('Example'),
  '#wrapper_attributes' => ['class' => ['wrapper-class']],
];

Ця відповідь мені допомогла, але зауважте, що вона стосується спеціально для Drupal 8.x та пізніших версій.
Буде Мартін

0

Важливо, що тема_form_element змінює лише прямий батьківський обгортковий розділ, і це може не бути цільовим завданням для CSS-ефектів.

[Хоча це не програмно, якщо потрібно просто застосувати клас до верхньої обгортки поля вузла (це обгортка, обгортка, обгортка), я можу припустити використання модуля "Група полів", вибравши "Керувати полями" для конкретного типу вмісту та виберіть "Додати нову групу" як простий DIV. Потім мітку можна видалити, а бажані класи присвоїти додатковій обгортці (але зараз у нас є ще більше обгортки) - з необмеженим вкладом]


0

Ви можете використовувати

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

і це оберне його


0

Зробіть атрибути обгортки налаштованими!

Створіть у своїй темі власну функцію теми-елемента ... 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

Бувають випадки, коли ні, #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">

-1
<?php
    $form['#attributes'] = array('class' => 'your-class-name');
?> 

Ви можете скористатися описаним вище способом для додавання класу до елемента форми.


6
Як би ви змінили клас діва? Вищевказаний код змінює клас тегу <input />.
chrisjlee

1
Ця відповідь неправильна для конкретного питання, яке тут задають.
doublejosh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.