Анонсы и Markdown в OctoberCMS

Как я уже писал раньше, в OctoberCMS из коробки работает фильтр Markdown, который можно применять практически везде. В плагине Blog текст каждой заметки проводится через фильтр перед сохранением, а сохраняется уже готовый html. Но при этом, по загадочным для меня причинам, excerpt (то есть анонс) заметки через фильтр Markdown не пропускается.

Из-за этого приходится либо для анонса переводить маркдаун в html вручную, либо при выводе анонса выводить его с фильтром {{ excerpt | md }}. Со вторым вариантом можно жить, но в сомнениях: ведь анонс каждого поста на странице будет обрабатываться фильтром при каждой загрузке ленты. Непорядок, надо же экономить электроэнергию-то!

Проблему можно решить аккуратно в несколько строчек кода. Раз плагин Blog не преобразует маркдаун в анонсе перед сохранением, поможем ему:

Post::extend(function (Post $model) {
  $model->bindEvent('model.beforeSave', function() use ($model) {
    $model->excerpt = Markdown::parse($model->excerpt);
  });
});

Здесь мы добавили для модели Post обработчик события model.beforeSave, которое происходит всякий раз перед созданием или обновлением заметки в блог. В обработчике мы просто пропускаем анонс через фильтр маркдауна (обратите внимание, для простоты здесь использован фасад Markdown).

Всё, теперь анонсы новых заметок будут обработаны фильтром маркдаун при сохранении. Для порядка можно еще разово обработать анонсы старых заметок. Сделать это нетрудно. Добавим новую команду artisan:

php artisan create:command AuthorName.MyPlugin MyCommand

И в теле метода fire() выполним код:

$posts = Post::where('excerpt', '<>', '')->get();
foreach ($posts as $post) {
  $post->save();
}

То есть находим все заметки, у которых задан анонс и просто пересохраняем их. При пересохранении выполнится наш обработчик события и анонс будет обработан фильтром Markdown.

Для удобства обработчик события и команда обработки старых заметок — добавлены в мой плагин BlogArchive.

Комментарии