Есть в Друпале такая полезная штука — редакции (которые revisions). На базе редакций работает, например, модуль Content Moderation, реализующий workflow для модерации контента с помощью состояний (черновик — опубликовано — в архив, и всё такое). Благодаря управлению состояниями через редакции, можно без труда реализовать такой сценарий:
- Пользователь добавляет статью как черновик.
- Модератор проверяет черновик и публикует статью.
- Пользователь вносит правки.
- Обновленная статья отправляется в черновики.
- Но отмодерированная ранее статья остается опубликованной, пока модератор не примет новую версию.
Возможность оставить опубликованную версию видимой достигается за счет того, что редакция материала в состоянии «опубликовано» объявляется дефолтной (revision_default). Именно её будет по умолчанию загружать Друпал для отображения, в то время как при редактировании будет загружаться последняя редакция материала.
Так вот, нам может понадобиться проверить, является ли загруженная редакция сущности дефолтной. Для этого у контентных сущностей есть метод isDefaultRevision()
. Вот только работает он иногда несколько неожиданно и может этим выклевать весь мозг. Оказывается, если вызвать этот метод, например, из hook_form_alter()
при редактировании существующего материала (node/$id/edit) — он внезапно будет возвращать FALSE
всегда. Независимо от того, дефолтную редакцию мы правим, или нет. Видимо, для редактирования Друпал заранее создает новую не-дефолтную редакцию и сущность готовит уже в этой редакции. Или типа того.
Так или иначе, поведение это совершенно контринтуитивное. Особенно учитывая, что если в этот момент запросить у сущности revision id — то вернётся как раз id дефолтной редакции (если редактируется она). Но isDefaultRevision()
все равно будет FALSE
.
Возможность выкрутиться из этой странной ситуации, тем не менее, есть — в виде метода wasDefaultRevision()
, который проверяет, была ли эта редакция дефолтной при последнем сохранении сущности. Из hook_form_alter()
этот метод отрабатывает ожидаемо — возвращая TRUE
, если редактируется дефолтная редакция, и FALSE
— если последняя не-дефолтная. Такие дела.