Рейтинг:1

Как добавить языковой префикс для формы действия?

флаг ng

У нас есть многоязычный сайт, по умолчанию "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">
Рейтинг:0
флаг ng

Нашел решение, которое работает для меня. Эта форма выше является модальной формой, отображаемой как Iframe. Итак, в моем файле .module. Мне пришлось настроить сам атрибут действия:

/**
 * Реализует hook_preprocess_HOOK().
 */
функция freitag_layout_visibility_control_preprocess_form(&$variables) {      
  if (isset($variables['attributes']['id']) && $variables['attributes']['id'] === 'layout-builder-configure-visibility') {
    $langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
    $variables['атрибуты']['действие'] = '/' . $лангкод . $variables['атрибуты']['действие'];
  }
}

Не самое красивое решение, но оно работает.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.