У нас есть многоязычный сайт, по умолчанию "en".
Иногда редакторы создают контент на другом языке, таком как «de», а затем переводят его на «en».
Моя проблема в том, что мы используем правила видимости Layout builder для блоков.
И атрибут действия формы, который отображается в качестве примера ниже.
Не имеет языкового префикса.
И поэтому заканчивается ответом 403 для каждой страницы контента, которая не создана на языке сайтов по умолчанию.
Мой вопрос: как я могу добавить языковой префикс к атрибуту действия наиболее друпалским способом?
/**
* {@inheritdoc}
*/
общедоступная функция buildForm (массив $ form, FormStateInterface $ form_state, SectionStorageInterface $ section_storage = NULL, $ delta = NULL, $ uuid = NULL) {
$this->sectionStorage = $section_storage;
$this->delta = $delta;
$this->uuid = $uuid;
// Любые условия видимости, которые уже были добавлены в блок.
$visibility_conditions_applied_to_block = $this->getCurrentComponent()->get('видимость') ?: [];
// Типы условий видимости, которые можно добавить в блок.
$conditions_available_to_block = [];
foreach ($this->conditionManager->getFilteredDefinitions('layout_builder', $this->getAvailableContexts($section_storage)) as $plugin_id => $definition) {
$conditions_available_to_block[$plugin_id] = $definition['метка'];
}
$элементы = [];
foreach ($visibility_conditions_applied_to_block as $visibility_id => $configuration) {
/** @var \Drupal\Core\Condition\ConditionInterface $условие */
$condition = $this->conditionManager->createInstance($configuration['id'], $configuration);
$ параметры = [
'атрибуты' => [
'класс' => ['использовать-ajax'],
'data-dialog-type' => 'диалоговое окно',
'data-dialog-renderer' => 'off_canvas',
'data-outside-in-edit' => ИСТИНА,
],
];
$items[$visibility_id] = [
'метка' => [
'данные' => [
'имя_условия' => [
'#type' => 'html_tag',
'#тег' => 'б',
'#value' => $condition->getPluginId(),
],
'условие_резюме' => [
'#type' => 'контейнер',
'#markup' => $условие->резюме(),
],
],
],
'редактировать' => [
'данные' => [
'#тип' => 'ссылка',
'#title' => $this->t('Редактировать'),
'#url' => Url::fromRoute('layout_builder.add_visibility', $this->getParameters($visibility_id), $options),
],
],
'удалить' => [
'данные' => [
'#тип' => 'ссылка',
'#title' => $this->t('Удалить'),
'#url' => Url::fromRoute('layout_builder.delete_visibility', $this->getParameters($visibility_id), $options),
],
],
];
}
если ($ пунктов) {
$ форма ['видимость'] = [
'#prefix' => '<div class="configured-conditions">',
'#суффикс' => '</div>',
'#theme' => 'стол',
'#rows' => $items,
'#caption' => $this->t('Настроенные условия'),
'#вес' => 10,
];
}
$ форма ['условие'] = [
'#тип' => 'выбрать',
'#title' => $this->t('Добавить условие видимости'),
'#options' => $conditions_available_to_block,
'#пустое_значение' => '',
'#вес' => 20,
];
// Определяет, следует ли применять несколько условий с помощью «и» или «или».
$ форма ['оператор'] = [
'#type' => 'радио',
'#title' => $this->t('Оператор'),
'#варианты' => [
'и' => $this->t('И'),
'или' => $this->t('Или'),
],
'#default_value' => $this->getCurrentComponent()->get('visibility_operator') ?: 'и',
// В этом поле нет необходимости, пока не будет добавлено несколько условий.
'#access' => count($items) > 0,
// Если есть два или более условий видимости, появляется это поле
// над списком существующих условий. Если есть только одна видимость
// условие, и добавляется второе, то появляется это поле
// между раскрывающимся списком «Добавить условие видимости» и отправкой
// кнопка.
'#weight' => count($items) === 1 ? 30 : 3,
];
// Это кнопка отправки, которая появляется только один раз в два или более раз
// условия присутствуют. Эта кнопка отправки появляется, чтобы пользователь мог
// обновить оператор видимости, параметр, влияющий на весь блок.
// Это отличается от кнопки/обработчика отправки по умолчанию для этой формы,
// который используется для добавления условия видимости к блоку.
$form['оператор_обновления'] = [
'#type' => 'отправить',
'#access' => count($items) > 1,
'#вес' => 5,
'#value' => $this->t('Оператор обновления'),
'#submit' => ['::updateOperator'],
];
если (счетчик($items) === 1) {
// Если условие видимости только одно, скрываем поле оператора
// пока не будет выбрано второе условие для добавления в блок.
$form['оператор']['#состояния'] = [
'невидимый' => [
'[имя="условие"]' => ['значение' => ''],
],
];
}
$form['actions']['#weight'] = 40;
$form['действия']['отправить'] = [
'#type' => 'отправить',
'#value' => $this->t('Добавить условие'),
// Кнопка «Отправить» видна только в том случае, если выбрано условие.
'#состояния' => [
'невидимый' => [
'[имя="условие"]' => ['значение' => ''],
],
],
];
$form['#attributes']['data-layout-builder-target-highlight-id'] = $this->blockUpdateHighlightId($this->uuid);
если ($this->isAjax()) {
$form['actions']['submit']['#ajax']['callback'] = '::ajaxSubmit';
$form['actions']['submit']['#ajax']['event'] = 'click';
$form['update_operator']['#ajax']['callback'] = '::ajaxSubmit';
$form['update_operator']['#ajax']['event'] = 'щелчок';
}
вернуть $ форму;
}
Пример не будет работать:
<form class="layout-builder-configure-visibility" data-layout-builder-target-highlight-id="28411f7a-940c-44a5-bf49-43ca6dfa3acd" data-drupal-selector="layout-builder-configure-visibility" action="/layout_builder/visibility/block/overrides/node.220/1/28411f7a-940c-44a5-bf49-43ca6dfa3acd/user_role?destination=/layout_builder_iframe_modal/redirect" method="post" id="layout-builder-configure-visibility" accept-charset="UTF-8">
Пример работы:
<form class="layout-builder-configure-visibility" data-layout-builder-target-highlight-id="28411f7a-940c-44a5-bf49-43ca6dfa3acd" data-drupal-selector="layout-builder-configure-visibility" action="/de/layout_builder/visibility/block/overrides/node.220/1/28411f7a-940c-44a5-bf49-43ca6dfa3acd/user_role?destination=/layout_builder_iframe_modal/redirect" method="post" id="layout-builder-configure-visibility" accept-charset="UTF-8">