---
title: 'Анонсы и Markdown в OctoberCMS'
url: 'https://graker.ru/news/2017/03/13/octobercms-teasers-vs-markdown'
language: ru
type: post
author: 'Роман Грачев'
published: '2017-03-13T10:15:00+03:00'
updated: '2017-03-13T10:18:57+03:00'
categories:
  - OctoberCMS
  - Программирование
---

# Анонсы и Markdown в OctoberCMS

Как я уже писал раньше, в OctoberCMS из коробки работает фильтр [Markdown](https://ru.wikipedia.org/wiki/Markdown), который можно применять практически везде. В плагине [Blog](https://octobercms.com/plugin/rainlab-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](https://github.com/graker/blogarchive).
