Темизация форм в Drupal 8

Главные вкладки

Аватар пользователя Artalek Artalek 19 февраля 2020 в 10:12

Здравствуйте, я создал форму, и хочу заняться ее темизацией, создал файл ss.theme, и прописал там так:


<?php

function  ss_theme() {
    return [
        
'page--contact--form-about' => [
            
'variables' => [
                
'items' => null
            
],
            
'template' => 'form-about'
        
]
    ];
}
?>

Но страница возвращает "The website encountered an unexpected error. Please try again later."

Подскажите, может я не правильно указал id формы

Лучший ответ

Аватар пользователя ivnish ivnish 20 февраля 2020 в 16:18
2

В идеале, конечно, научиться пользоваться отладчиком xdebug. Но попробуем старые дедовские способы отладки. Установите модуль devel. Включите его и его субмодуль Devel Kint. Затем в вашем hook_form_alter напишите

ksm($form);

или

kint($form);

Если сайт не упадет от нехватки памяти, то вы сможете изучить ваш массив формы и найти там нужный элемент который хотите изменить изменить. Останется только написать код как вы это делали с кнопкой предпросмотр

Возможно потребуется сброс кэша друпала

Комментарии

Аватар пользователя ivnish ivnish 19 февраля 2020 в 10:16

Смотрите журнал друпала после ошибки, он напишет что именно вы сделали не так

А twig debug включали? Может ядро само предлагает такой шаблон использовать и нет необходимости его прописывать вручную?

Аватар пользователя Artalek Artalek 19 февраля 2020 в 10:46

Вот что за ошибка:

RuntimeException: Failed to start the session because headers have already been sent by "W:\domains\ss\themes\ss\ss.theme" at line 1. в Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage->start() (строка 145 из W:\domains\ss\vendor\symfony\http-foundation\Session\Storage\NativeSessionStorage.php)
#0 W:\domains\ss\core\lib\Drupal\Core\Session\SessionManager.php(164): Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage->start()
#1 W:\domains\ss\core\lib\Drupal\Core\Session\SessionManager.php(118): Drupal\Core\Session\SessionManager->startNow()
#2 W:\domains\ss\vendor\symfony\http-foundation\Session\Session.php(57): Drupal\Core\Session\SessionManager->start()
#3 W:\domains\ss\core\modules\big_pipe\src\Render\BigPipe.php(240): Symfony\Component\HttpFoundation\Session\Session->start()
#4 W:\domains\ss\core\modules\big_pipe\src\Render\BigPipe.php(295): Drupal\big_pipe\Render\BigPipe->performPreSendTasks()
#5 W:\domains\ss\core\modules\big_pipe\src\Render\BigPipeResponse.php(112): Drupal\big_pipe\Render\BigPipe->sendContent(Object(Drupal\big_pipe\Render\BigPipeResponse))
#6 W:\domains\ss\vendor\symfony\http-foundation\Response.php(374): Drupal\big_pipe\Render\BigPipeResponse->sendContent()
#7 W:\domains\ss\index.php(20): Symfony\Component\HttpFoundation\Response->send()
#8 {main}
Аватар пользователя Artalek Artalek 19 февраля 2020 в 12:32

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

<form{{ attributes }}>
  <header>
    {{ form.element1 }}
    {{ form.element2 }}
  </header>
  {{ form.without('element1', 'element2') }}
</form>

и пусто

Аватар пользователя Artalek Artalek 19 февраля 2020 в 15:44

нашел, вот как прописано в базовом шаблоне:

{#
/**
 * @file
 * Theme override for a 'form' element.
 *
 * Available variables
 * - attributes: A list of HTML attributes for the wrapper element.
 * - children: The child elements of the form.
 *
 * @see template_preprocess_form()
 */

#}
<form{{ attributes }}>
  {{ children }}
</form>

я прописал у себя в файле page--contact--form-about.html.twig так :

<form{{ attributes }}>
  {{ children }}
</form>

Но он не выводит ничего

Аватар пользователя Artalek Artalek 20 февраля 2020 в 13:23

а можно ли как-нибудь в hook_form_alter изменить текст кнопки submit? сейчаст там "Отправить сообщение", а мне нужно просто "Отправить"

Аватар пользователя Artalek Artalek 20 февраля 2020 в 13:44

Не подскажите как? я только смог найти как убрать кнопку "Предпросмотр":

<?php
$form
['actions']['preview']['#access'] = FALSE;
?>

А то найти не смог

Аватар пользователя ivnish ivnish 20 февраля 2020 в 16:18
2

В идеале, конечно, научиться пользоваться отладчиком xdebug. Но попробуем старые дедовские способы отладки. Установите модуль devel. Включите его и его субмодуль Devel Kint. Затем в вашем hook_form_alter напишите

ksm($form);

или

kint($form);

Если сайт не упадет от нехватки памяти, то вы сможете изучить ваш массив формы и найти там нужный элемент который хотите изменить изменить. Останется только написать код как вы это делали с кнопкой предпросмотр

Возможно потребуется сброс кэша друпала