Тема контактної форми


11

Я хотів би надати тему контактної форми в Drupal 8. Я хотів би розмістити знаки навколо елементів форми (використовуючи завантажувальний інструмент).

Я також хочу покласти деякі класи на певні елементи (кнопка подання, сама форма).


2
Я пропоную більш детально описати свою проблему та сказати, що ви вже намагалися. Це покаже певну ініціативу та допоможе іншим дати кращу відповідь.
Арам Бояджян

Відповіді:


16

Відкрийте свій файл YOURTHEMENAME.theme та додайте наступний код:

function YOURTHEMENAME_form_contact_message_feedback_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {

  // Name
  $form['name']['#prefix'] = '<div class="row"><div class="col-md-6"><div class="form-group">';
  $form['name']['#suffix'] = '</div>';
  $form['name']['#attributes']['placeholder'][] = $form['name']['#title'].'*';
  $form['name']['#attributes']['class'][] = 'form-control';
  unset($form['name']['#title']);

  // Mail
  $form['mail']['#prefix'] = '<div class="form-group">';
  $form['mail']['#suffix'] = '</div>';
  $form['mail']['#attributes']['placeholder'][] = $form['mail']['#title'].'*';
  $form['mail']['#attributes']['class'][] = 'form-control';
  unset($form['mail']['#title']);


  // Subject
  $form['subject']['widget'][0]['value']['#attributes']['class'][] = 'form-control';
  $form['subject']['widget'][0]['value']['#attributes']['placeholder'][] = $form['subject']['widget'][0]['#title'].'*';
  $form['subject']['widget'][0]['#title'] = '';
  unset($form['subject']['widget'][0]['value']['#title']);
  $form['subject']['widget'][0]['#prefix'] = '<div class="form-group">';
  $form['subject']['widget'][0]['#suffix'] = '</div></div>';

  // Message
  $form['message']['widget'][0]['value']['#attributes']['class'][] = 'form-control';
  $form['message']['widget'][0]['value']['#attributes']['placeholder'][] = $form['message']['widget'][0]['#title'].'*';
  $form['message']['widget'][0]['#title'] = '';
  unset($form['message']['widget'][0]['value']['#title']);
  $form['message']['widget'][0]['#prefix'] = '<div class="col-md-6"><div class="form-group">';
  $form['message']['widget'][0]['#suffix'] = '</div></div></div>';

  // Submit
  $form['actions']['#prefix'] = '<div class="clearfix">';
  $form['actions']['#suffix'] = '</div>';
  $form['actions']['submit']['#attributes']['class'][] = 'btn';
  $form['actions']['submit']['#attributes']['class'][] = 'btn-success';
  $form['actions']['submit']['#attributes']['class'][] = 'pull-right';

}

І ось ваш результат: введіть тут опис зображення

Не забудьте очистити кеші;)


1
Якщо моя тема названа "abc", а моя форма названа "Зв'язатися з нами", що я називаю функцією?
Даніель Девхерст

3
{topicname} _form_contact_message_ {formname} _form_alter
Йохан Хаєст

Це так приголомшливо !!!
ipwa

20

Ви можете просто тематизувати кожну форму, як ви хочете. Мені не подобається метод @rpayanm, тому що це важко підтримувати і важко читати, з великими формами це не так, просто одна обгортка і проста структура.

Кожна форма, що намагається використовувати тему, дорівнює їх назві машини. Ви можете знайти це ім'я шаблону $form['#theme']лише за допомогою alter, воно завжди (або в більшості випадків) збігається з назвою машини id id форми. Що вам потрібно зробити, це зареєструвати шаблон для нього. Вам потрібно реалізувати hook_theme(). Ви можете написати це в CUSTOMMODULE.module або в THEMENAME.theme. Тематичний ключ повинен бути таким же, як і в $form['#theme'], тому його автоматично використовувати, інакше вам потрібно додати новий за допомогою форми alter.

/**
 * Implements hook_theme().
 */
function MODULENAME_theme($existing, $type, $theme, $path) {
  return [
    'FORM_ID_THEME' => [
      'template' => 'custom-form-template-name',
      'render element' => 'form',
    ]
  ];
}

Drupal pass $ form змінна з формою.

Потім ви повинні створити custom-form-template-name.html.twig(з назвою вашого шаблону з moll_theme ()).

Мінімальний шаблон є

{{ form }}

Ви також можете надрукувати кожне поле з потрібної форми

{{ form.field_name }}

Тут ви можете робити все, що завгодно, з розміткою.

Ви також можете передавати додаткові дані до шаблону, реалізуючи template_preprocess_TEMPALTENAME

function template_preprocess_FORM_ID_THEME(&$variables) {
  $variables['example'] = 'This is added via preprocess';
}

А потім використовувати в шаблоні

{{ example }}
<div class="first-field">
  {{ form.first_field }}
</div>

<div class="second-field">
  {{ form.second_field }}
</div>

<div class="buttons">
  {{ form.submit }}
  {{ form.preview }}
</div>
{#
Don't forget to add printing form special info at the end.
Without this data form will not working propertly.
#}
{{ form.form_build_id }}
{{ form.form_token }}
{{ form.form_id }}

Я думаю, що цей метод є більш надійним, чистим та потужним.

Ps вибачте за мою англійську, сподіваюся, що хтось відредагує та виправить мої помилки :)

Приклад складної форми з використанням цього методу.

введіть тут опис зображення


2
Зверніть увагу , що для мене, у мене була зміна {{ form.submit }}в{{ form.actions.submit }}
mikeDOTexe

@Niklan: Я дотримувався вище того самого коду для моєї форми власного пакета сутностей. Якщо я використовую {{ form }}, він друкує всю форму. Але якщо я використовую конкретне поле, наприклад {{ form.my_field }}, нічого не відображається. Будь-яка ідея, як ми можемо відображати кожне поле форми спеціальної сукупності об'єктів?
калідасан

@kalidasan спробуйте надрукувати кожне поле без друку {{ form }}. Я пропоную після друку {{ form }}всі форми форми позначати як '#rendered' => TRUEі не будуть надані незабаром. Якщо ви не хочете використовувати цей метод форми тематизації, ви повинні надрукувати кожне поле окремо. У drupal_render_children()Drupal 8 його немає, якщо ви не написали його самостійно. Так чи інакше це призведе до дублікатів, тому спробуйте надрукувати кожне поле вручну.
Ніклан

@Niklan: Я не використовував {{ form }} & {{ form.my_field }}разом. Спочатку спробував лише {{ form }}, тут я можу побачити всю форму. Потім вилучають {{ form }}із шаблону, потім намагаються для кожного поля форми окремо, як це {{ form.my_field }}, etc , але мазь виходить будь-якою. Нічого не відображається.
kalidasan

1
@kalidasan ви можете скасувати заголовки в template_preprocess_FORM_ID_THEME(&$variables). У цьому попередньому процесі можна додати нові змінні, змінити існуючі, включаючи елементи форми. Я ніколи цього не бачив, {{ form.field_name.widget }}і я часто тематизував форми. Схоже, це поле створене або додано стороннім модулем на замовлення? Я думаю, що це дозволено, але не правило для інших. Я рекомендую почати з гачка попередньої обробки та просто подивитися, $variables['form']що він містить всередині.
Ніклан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.