Как фильтровать поля ссылок на сущности на основе языка?
На сайте Drupal 8 у меня есть тип содержимого узла "страница", который ссылается на пользовательский тип сущности с использованием встроенной формы сущности. "Страница" также содержит поле "абзацы", которое используется в модуле "Абзацы".
Сайт имеет несколько языков, и поэтому появляется следующий сценарий:
- У меня есть существующий узел "страница" как на английском, так и на немецком языках, содержащий ссылки на сущности и абзацы.
- На английском узле я добавляю новый абзац и новую ссылку на сущность и сохраните узел.
- При просмотре узла на английском языке я вижу добавленный контент.
- При просмотре узла на немецком языке я также вижу новое содержимое, которое на английском языке.
Я не хочу, чтобы произошло число 4. То есть я не хочу, чтобы новая непереведенная сущность и абзац были видны на немецком переводе узла. Поля ссылки на сущность и абзац не заданы как переводимые, но целевые сущности переводимы. Из того, что я понимаю, это означает, что вновь созданная сущность будет на английском языке, то же самое относится и к абзацу.
Чтобы решить эту проблему, я думаю, что смогу отфильтровать непереведенные сущности и элементы абзаца при просмотре узла, чтобы не отображался любой элемент, который не на текущем языке. Они не будут видны, пока я не отредактирую немецкий узел и не сохраню его повторно, что создаст переведенные версии сущности и элемента абзаца.
Но я не уверен, как фильтровать поля. Есть ли какой-нибудь подходящий крючок, который можно использовать? Или я делаю это неправильно?
1 answers
Логика, определяющая, должны ли отображаться сущности, находится в \Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceFormatterBase::getEntitiesToView()
Как вы можете видеть, там проверяется перевод, но API напрямую не поддерживает пропуск чего-либо, крючки позади этого позволяют только контролировать применимые резервные языки и их порядок.
Возможно, вы можете использовать доступ к сущностям, который проверяется после этого. Реализуйте hook_paragraph_access()
, для операции просмотра проверьте, есть ли у абзаца перевод на текущем языке содержимого, и если нет, запретите доступ. То же самое должно работать и для вашей другой ссылки на сущность, это то же самое, просто реализуйте hook_ENTITY_TYPE_access()
и для этого.
Если это не сработает, вы можете написать свой собственный плагин форматирования полей и переопределить этот метод.