Как фильтровать поля ссылок на сущности на основе языка?


На сайте Drupal 8 у меня есть тип содержимого узла "страница", который ссылается на пользовательский тип сущности с использованием встроенной формы сущности. "Страница" также содержит поле "абзацы", которое используется в модуле "Абзацы".

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

  1. У меня есть существующий узел "страница" как на английском, так и на немецком языках, содержащий ссылки на сущности и абзацы.
  2. На английском узле я добавляю новый абзац и новую ссылку на сущность и сохраните узел.
  3. При просмотре узла на английском языке я вижу добавленный контент.
  4. При просмотре узла на немецком языке я также вижу новое содержимое, которое на английском языке.

Я не хочу, чтобы произошло число 4. То есть я не хочу, чтобы новая непереведенная сущность и абзац были видны на немецком переводе узла. Поля ссылки на сущность и абзац не заданы как переводимые, но целевые сущности переводимы. Из того, что я понимаю, это означает, что вновь созданная сущность будет на английском языке, то же самое относится и к абзацу.

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

Но я не уверен, как фильтровать поля. Есть ли какой-нибудь подходящий крючок, который можно использовать? Или я делаю это неправильно?

Author: kiamlaluno, 2016-03-15

1 answers

Логика, определяющая, должны ли отображаться сущности, находится в \Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceFormatterBase::getEntitiesToView()

Как вы можете видеть, там проверяется перевод, но API напрямую не поддерживает пропуск чего-либо, крючки позади этого позволяют только контролировать применимые резервные языки и их порядок.

Возможно, вы можете использовать доступ к сущностям, который проверяется после этого. Реализуйте hook_paragraph_access(), для операции просмотра проверьте, есть ли у абзаца перевод на текущем языке содержимого, и если нет, запретите доступ. То же самое должно работать и для вашей другой ссылки на сущность, это то же самое, просто реализуйте hook_ENTITY_TYPE_access() и для этого.

Если это не сработает, вы можете написать свой собственный плагин форматирования полей и переопределить этот метод.

 4
Author: Berdir, 2016-03-15 20:57:58