Студия разработки сайтов и приложений

Netspark.ru

Drupal 8 и дефолтные редакции

Есть в Друпале такая полезная штука — редакции (которые revisions). На базе редакций работает, например, модуль Content Moderation, реализующий workflow для модерации контента с помощью состояний (черновик — опубликовано — в архив, и всё такое). Благодаря управлению состояниями через редакции, можно без труда реализовать такой сценарий:

  1. Пользователь добавляет статью как черновик.
  2. Модератор проверяет черновик и публикует статью.
  3. Пользователь вносит правки.
  4. Обновленная статья отправляется в черновики.
  5. Но отмодерированная ранее статья остается опубликованной, пока модератор не примет новую версию.

Возможность оставить опубликованную версию видимой достигается за счет того, что редакция материала в состоянии «опубликовано» объявляется дефолтной (revision_default). Именно её будет по умолчанию загружать Друпал для отображения, в то время как при редактировании будет загружаться последняя редакция материала.

Так вот, нам может понадобиться проверить, является ли загруженная редакция сущности дефолтной. Для этого у контентных сущностей есть метод isDefaultRevision(). Вот только работает он иногда несколько неожиданно и может этим выклевать весь мозг. Оказывается, если вызвать этот метод, например, из hook_form_alter() при редактировании существующего материала (node/$id/edit) — он внезапно будет возвращать FALSE всегда. Независимо от того, дефолтную редакцию мы правим, или нет. Видимо, для редактирования Друпал заранее создает новую не-дефолтную редакцию и сущность готовит уже в этой редакции. Или типа того.

Так или иначе, поведение это совершенно контринтуитивное. Особенно учитывая, что если в этот момент запросить у сущности revision id — то вернётся как раз id дефолтной редакции (если редактируется она). Но isDefaultRevision() все равно будет FALSE.

Возможность выкрутиться из этой странной ситуации, тем не менее, есть — в виде метода wasDefaultRevision(), который проверяет, была ли эта редакция дефолтной при последнем сохранении сущности. Из hook_form_alter() этот метод отрабатывает ожидаемо — возвращая TRUE, если редактируется дефолтная редакция, и FALSE — если последняя не-дефолтная. Такие дела.

Комментарии