<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xml:base="https://graker.ru/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>OctoberCMS</title>
    <link>https://graker.ru/</link>
    <description>RSS домовой страницы</description>
    <language>ru</language>
    
    <item>
  <title>Починил архив</title>
  <link>https://graker.ru/news/2025/06/07/archive-fixed</link>
  <description>&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;Недавно &lt;a href=&quot;/news/2025/05/31/comments-disabled&quot;&gt;отключил&lt;/a&gt; на сайте комментарии, а сегодня вдруг взял и починил архив. Как говорится, где-то убыло, где-то прибыло.&lt;/p&gt;
&lt;p&gt;Архив ломался когда-то давно в ходе обновлений OctoberCMS, но я тогда почти ничего не писал, и просто его отключил. А сегодня посмотрел, и решил что так больше нельзя. И починил. Оказалось, просто изменился способ получения параметров из url, который в плагине был сделан по-другому. В общем, быстренько поправил, заодно сделал нормальный локализованный вывод названий месяцев, и залил. Найти архив можно под лентой постов, вот например &lt;a href=&quot;/news/2025&quot;&gt;за 2025-й год&lt;/a&gt;. Если сравнить с предыдущими годами, моя графомания пережила ремиссию и снова требует крови. &lt;/p&gt;
&lt;p&gt;Также можно смотреть архив по категориям (ссылка под лентой постов в каждой категории). А сам плагин BlogArchive для OctoberCMS можно по-прежнему найти на гитхабе: &lt;a href=&quot;https://github.com/graker/blogarchive&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/graker/blogarchive&lt;/a&gt;, обновления я в него добавил.&lt;/p&gt;&lt;/div&gt;
</description>
  <pubDate>Sat, 07 Jun 2025 08:50:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">2108 at https://graker.ru</guid>
    </item>
<item>
  <title>Встречайте Winter CMS</title>
  <link>https://graker.ru/news/2021/04/26/hello-winter-cms</link>
  <description>&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;blockquote&gt;
&lt;h4&gt;Rebirth as Winter CMS&lt;/h4&gt;
&lt;p&gt;As a result of these dramatic structural changes of the project that we rely upon to run our businesses, former October CMS maintainers Luke Towers, Ben Thomson and Marc Jauvin wish to announce the formation of the &lt;a href=&quot;https://github.com/wintercms&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Winter CMS&lt;/a&gt; project, a community-driven fork of October CMS with a dedication to speed, security, stability, and simplicity. Along with Jack Wilkinson, we aim to continue to deliver a professional and feature-rich platform that you can rely upon for your websites and applications; as well as engage with the community and become a more community-driven project overall.&lt;/p&gt;
&lt;p&gt;Winter CMS is a fork of October CMS as of v1.1.2 / v1.0.472, any of your October projects can be &lt;a href=&quot;https://github.com/wintercms/winter/issues/5#issuecomment-797607263&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;seamlessly migrated to use Winter&lt;/a&gt; instead as long as they are using a version of October prior to the dramatic changes recently introduced by the original founders.&lt;/p&gt;
&lt;p&gt;For more information on the exact events that led to the decision to fork, you can view &lt;a href=&quot;https://github.com/wintercms/winter/issues/5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;our announcement on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Видимо, надо помигрировать. Название только какое-то безыскусное. Винтар ЦМС. Можно было бы назвать например Bleak Midwinter CMS, было бы гораздо круче.&lt;/p&gt;&lt;/div&gt;
</description>
  <pubDate>Mon, 26 Apr 2021 10:05:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">2052 at https://graker.ru</guid>
    </item>
<item>
  <title>OctoberCMS станет платным</title>
  <link>https://graker.ru/news/2021/04/13/octobercms-paid-platform</link>
  <description>&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;blockquote&gt;
&lt;p&gt;This means that as a business, the October CMS platform, its features, and processes now focus primarily on the needs of our professional customers. To this end, we have been working hard on a new release for over a year now, and it is ready to go.&lt;/p&gt;
&lt;p&gt;We believe you will be pleasantly surprised by the new features and streamlined back end to October CMS to increase both its capability and ease of use.&lt;/p&gt;
&lt;p&gt;However, we will also be moving to a new business model to ensure the continuity and sustainability of October CMS. October CMS will become a proprietary product and the licensing model is to be changed. Under these changes, October CMS will no longer be a free platform.&lt;/p&gt;
&lt;p&gt;We believe that these changes are necessary in the interests of providing the timely and effective support expected of our professional users.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://octobercms.com/blog/post/october-cms-moves-become-paid-platform&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;October CMS Moves to Become a Paid Platform&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;$9 в год за лицензию на один сайт, $150 в год за лицензию на произвольное количество сайтов. Если не обновляться, можно не платить.&lt;/p&gt;
&lt;p&gt;Наверное, надо свои два плагинчика тоже платными сделать, раз пошла такая пьянка.&lt;/p&gt;&lt;/div&gt;
</description>
  <pubDate>Tue, 13 Apr 2021 14:15:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">2051 at https://graker.ru</guid>
    </item>
<item>
  <title>Локализация в OctoberCMS</title>
  <link>https://graker.ru/news/2019/05/05/octobercms-localization</link>
  <description>&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;На днях совершил над собой титаническое усилие и добавил-таки своему &lt;a href=&quot;https://netspark.ru&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Netspark.ru&lt;/a&gt; английскую версию. Учитывая, что это по сути одностраничник (ну, плюс 404 и «Сайт на обслуживании») — можно было бы тупо скопировать и поменять текстики на английские. Тем более английскую версию поставил на &lt;a href=&quot;https://netspark.pro&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;другой домен&lt;/a&gt;. Но все же чтобы фронт-энд был одинаковый в обеих версиях — мало ли там, добавить чего, поменять — решил использовать возможности &lt;a href=&quot;https://octobercms.com/docs/plugin/localization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;локализации&lt;/a&gt;. О чем и расскажу немного.&lt;/p&gt;
&lt;p&gt;Локализация в OctoberCMS — примерно такая же, как в Laravel. Есть файлы с локализацией, например &lt;code&gt;lang.php&lt;/code&gt;, из них возвращаются массивы, примерно так:&lt;/p&gt;&lt;/div&gt;
&lt;pre data-component-id=&quot;grakerru:code-block&quot; class=&quot;code-block language-none&quot;&gt;&lt;code class=&quot;language-none&quot;&gt;return [
    &amp;#039;messages&amp;#039; =&amp;gt; [
        &amp;#039;my_message&amp;#039; =&amp;gt; &amp;#039;Hello world&amp;#039;,
    ],
];&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;После чего используется фильтр &lt;code&gt;trans&lt;/code&gt; в твиге, где обращение к строке происходит как &lt;code&gt;author.pluginname::lang.messages.mymessage&lt;/code&gt;. Author и pluginname — это имя автора и плагина, чтобы было ясно, откуда брать строки. Соответственно, файлы локализации должны жить в плагинах.&lt;/p&gt;
&lt;p&gt;Это нормально, если проект не совсем примитивный и в нём есть кастомный плагин для всяких там дополнений и расширений. Но в рассматриваемом случае проект совсем примитивный и кастомных плагинов в нём нет, соответственно, хранить переводные строки негде. В таком случае нужно использовать плагин &lt;a href=&quot;https://octobercms.com/plugin/rainlab-translate&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Translate&lt;/a&gt;. Если он установлен, хранить переводы можно прямо в &lt;code&gt;theme.yaml&lt;/code&gt; используемой фронт-энд-темы. Заинклудить отдельный ямл с переводами тоже можно, да.&lt;/p&gt;
&lt;p&gt;В файле строки будут храниться вот так:&lt;/p&gt;&lt;/div&gt;
&lt;pre data-component-id=&quot;grakerru:code-block&quot; class=&quot;code-block language-none&quot;&gt;&lt;code class=&quot;language-none&quot;&gt;translate:
    en:
        nav.portfolio: &amp;#039;Our works&amp;#039;
        nav.services: &amp;#039;Services&amp;#039;
    ru:
        nav.portfolio: &amp;#039;Наши работы&amp;#039;
        nav.services: &amp;#039;Услуги&amp;#039;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;А обращаться к строчкам во фронт-энде можно с помощью фильтра твига &lt;code&gt;_&lt;/code&gt;, вот так:&lt;/p&gt;&lt;/div&gt;
&lt;pre data-component-id=&quot;grakerru:code-block&quot; class=&quot;code-block language-none&quot;&gt;&lt;code class=&quot;language-none&quot;&gt;{{ &amp;#039;nav.portfolio&amp;#039;|_ }}&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;То есть даже неймспейс никакой соблюдать не надо.&lt;/p&gt;
&lt;p&gt;В фильтр перевода можно передавать параметры для подстановки:&lt;/p&gt;&lt;/div&gt;
&lt;pre data-component-id=&quot;grakerru:code-block&quot; class=&quot;code-block language-none&quot;&gt;&lt;code class=&quot;language-none&quot;&gt;{{ &amp;#039;There are :works works in portfolio&amp;#039;|_({works: 1000}) }}&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;Естественно, строчку &lt;code&gt;There are :works works in portfolio&lt;/code&gt; тоже можно положить в ямл и заменить дескриптором.&lt;/p&gt;
&lt;p&gt;Помимо фильтра перевода &lt;code&gt;_&lt;/code&gt;, есть и фильтр &lt;code&gt;__&lt;/code&gt;, вызывающий &lt;code&gt;transchoice()&lt;/code&gt; и &lt;a href=&quot;/news/2018/01/21/octobercms-pluralize&quot;&gt;помогающий в правильном склонении множественных чисел&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Чтобы строки из yaml-файла попали в систему, нужно их сначала обнаружить плагином Translate. Для этого со страницы переводов нужно запустить сканирование сообщений и затем почистить кэш.&lt;/p&gt;&lt;/div&gt;
&lt;figure data-component-id=&quot;grakerru:figure&quot; class=&quot;figure figure--center figure--medium&quot;&gt;
      &lt;a href=&quot;/sites/default/files/media/oc-translations.png&quot; data-lightbox=&quot;node-2011&quot;&gt;
    &lt;img loading=&quot;lazy&quot; srcset=&quot;/sites/default/files/styles/content_medium/public/media/oc-translations.png.webp?itok=deDZqfB1 850w, /sites/default/files/styles/content_medium_2x/public/media/oc-translations.png.webp?itok=JxEt0Urz 1600w&quot; sizes=&quot;(min-width: 1200px) 850px, (min-width: 768px) 75vw, calc(100vw - 30px)&quot; width=&quot;850&quot; height=&quot;404&quot; src=&quot;/sites/default/files/styles/content_medium/public/media/oc-translations.png.webp?itok=deDZqfB1&quot; alt=&quot;oc-translations&quot; /&gt;



&lt;/a&gt;
    &lt;/figure&gt;
&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;К слову, если пользоваться плагином Translate, хранить строки в yaml-файле вообще необязательно. Если подать любую строку во фронт-энде на фильтр перевода, она может быть отсканирована и переведена через админку плагина. Примерно как функция &lt;code&gt;t()&lt;/code&gt; в Друпале — засунул в неё что-нибудь, и это что-нибудь стало можно перевести. Но что еще интересно, в отличие от Друпала, где системный язык всегда английский и мы переводим с него, в OctoberCMS с плагином Translate дефолтный язык — действительно дефолтный. То есть мы можем сделать сайт на русском, сделать русский дефолтным, и переводить строки с русского на французский, или китайский, вообще без какого-либо упоминания английского.&lt;/p&gt;
&lt;p&gt;Что еще можно сказать. Как видно из скриншота выше, плагин позволяет экспортировать переводы в и импортировать из csv-файлов (аналогично &lt;a href=&quot;/news/2016/06/21/import_iz_csv_v_octobercms&quot;&gt;импорту-экспорту моделей&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Напоследок приведу пример определения текущей локали в системе. Я просто добавил обработчик &lt;code&gt;onStart()&lt;/code&gt; в лейаут, и страницам, использующим этот лейаут, стали доступны переменные switchLocaleName, switchLocaleFlag и switchLocaleLink.&lt;/p&gt;&lt;/div&gt;
&lt;pre data-component-id=&quot;grakerru:code-block&quot; class=&quot;code-block language-none&quot;&gt;&lt;code class=&quot;language-none&quot;&gt;use RainLab\Translate\Classes\Translator;
protected $translator;

function onStart() {
    $this-&amp;gt;translator = Translator::instance();
    $switchLocale = ($this-&amp;gt;translator-&amp;gt;getLocale() == &amp;#039;ru&amp;#039;) ? &amp;#039;en&amp;#039; : &amp;#039;ru&amp;#039;;
    $this[&amp;#039;switchLocaleName&amp;#039;] = ($switchLocale == &amp;#039;ru&amp;#039;) ? &amp;#039;Русская версия&amp;#039; : &amp;#039;English version&amp;#039;;
    $this[&amp;#039;switchLocaleFlag&amp;#039;] = &amp;#039;assets/img/flags/&amp;#039; . $switchLocale . &amp;#039;.svg&amp;#039;;
    $this[&amp;#039;switchLocaleLink&amp;#039;] = ($switchLocale == &amp;#039;ru&amp;#039;) ? &amp;#039;https://netspark.ru&amp;#039; : &amp;#039;https://netspark.pro&amp;#039;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;Лично мне это пригодилось, чтобы построить свой переключатель языков, который направляет на другой домен, вместо изменения языка в URL.&lt;/p&gt;&lt;/div&gt;
</description>
  <pubDate>Sat, 04 May 2019 22:30:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">2011 at https://graker.ru</guid>
    </item>
<item>
  <title>Турагентство AlayTravel</title>
  <link>https://graker.ru/news/2018/02/26/alaytravel-agency</link>
  <description>&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;Мой верный соратник по всем поездкам и по совместительству супруга Настя на днях запилила турагентство AlayTravel. С бронированием туров по всему миру, чаем, печеньками и бесконечной заботой о туристах.&lt;/p&gt;
&lt;p&gt;А я, соответственно, запилил на OctoberCMS для турагентства сайтик. Делать такие сайты на OctoberCMS — одно удовольствие, тем более по такому приятному поводу. Приглашаю всех заходить и подбирать себе отпуск. Онлайн-поиск и подбор туров с актуальными ценами к сайту уже прикручен. Тем, кто сам сможет до 8 марта подобрать себе тур — сообразим скидку.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;a href=&quot;https://alaytravel.ru&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Срочно забронировать тур на AlayTravel.ru&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
</description>
  <pubDate>Mon, 26 Feb 2018 08:14:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">1960 at https://graker.ru</guid>
    </item>
<item>
  <title>Кнопка Load More на AJAX в OctoberCMS</title>
  <link>https://graker.ru/news/2018/02/01/load-more-button-ajax-octobercms</link>
  <description>&lt;p&gt;Работу с AJAX в OctoberCMS я уже раньше немного затрагивал, но &lt;a href=&quot;/news/2017/07/04/octobercms-ajax-popup-widget&quot;&gt;для бэк-энда&lt;/a&gt;. А теперь можно затронуть и фронт. В этой заметке мы сделаем кнопочку Load More, чтобы подгружала без перезагрузки страницы новые посты блога (из плагина RainLab.Blog). &lt;/p&gt;
&lt;p&gt;На первый взгляд может показаться, что для этого нужно влезть в компонент Posts этого плагина, но на самом деле — вовсе не нужно. Дело в том, что раньше из документации можно было подумать, что обработчики AJAX-событий нужно описывать только в классе контроллера (если в бэк-энде), или компонента (если во фронте). И поэтому не очень было понятно, как быть, когда ты хочешь получить красивый ajax-пейджер для блога. То ли лезть в код чужого плагина, что влечет проблемы с обновлениями. То ли писать свой собственный компонент, из которого грузить компонент Posts программно. Что ведет к сомнениям в том, надо ли вообще такой негибкой CMS пользоваться.&lt;/p&gt;</description>
  <pubDate>Thu, 01 Feb 2018 07:31:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">1951 at https://graker.ru</guid>
    </item>
<item>
  <title>Генерация тестового контента в OctoberCMS</title>
  <link>https://graker.ru/news/2018/01/25/octobercms-fake-content-generation</link>
  <description>&lt;p&gt;Что мне всегда отдельно нравилось в Ларавеле — так это как там организована генерация тестовых материалов. Для этого используется мега-библиотека &lt;a href=&quot;https://github.com/fzaninotto/Faker&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Faker&lt;/a&gt;, которая умеет практически всё, что может понадобиться при разработке. Годится как для автоматизированных тестов, так и для заполнения БД тестовыми данными.&lt;/p&gt;
&lt;p&gt;В самом Ларавеле можно описать для моделей классы-factory и генерировать данные по ним, это описано &lt;a href=&quot;https://laravel.com/docs/5.5/seeding&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;в документации&lt;/a&gt;. В OctoberCMS про фабрики &lt;a href=&quot;http://octobercms.com/docs/database/structure#seeder-structure&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;документация&lt;/a&gt; ничего не говорит, но можно обойтись и без них.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;TL;DR: Далее несколько примеров генерации тестовых данных с помощью библиотеки Faker в OctoberCMS&lt;/em&gt;&lt;/p&gt;</description>
  <pubDate>Thu, 25 Jan 2018 08:35:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">1949 at https://graker.ru</guid>
    </item>
<item>
  <title>Множественные числа в OctoberCMS</title>
  <link>https://graker.ru/news/2018/01/21/octobercms-pluralize</link>
  <description>&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;Вообще говоря, локализация интерфейса в OctoberCMS такая же как в Laravel. Есть файлы типа &lt;code&gt;lang.php&lt;/code&gt;, разложенные по директориям, соответствующим языку, в них есть строки, их можно переводить. Неудобство лично для меня лишь в одном — когда нужно куда-то вставить локализованный текст, не видно самого текста, только идентификатор строки. В остальном, на мой взгляд, система эта несколько удобнее перевода интерфейса в Друпале.&lt;/p&gt;
&lt;p&gt;Даже если поддерживать сайт или интерфейс на нескольких языках не нужно, с переводами можно столкнуться, например, при плюрализации, то есть склонении в зависимости от значения числа. Потому что в 2018 году уже как-то стыдно делать сайт, на котором написано «1 предложений», «22 предложений» и т.д. Надо склонять.&lt;/p&gt;
&lt;p&gt;В Ларавеле это делается тривиально, для английского языка в &lt;code&gt;lang.php&lt;/code&gt; пишем например:&lt;/p&gt;&lt;/div&gt;
&lt;pre data-component-id=&quot;grakerru:code-block&quot; class=&quot;code-block language-none&quot;&gt;&lt;code class=&quot;language-none&quot;&gt;return [
    &amp;#039;count&amp;#039; =&amp;gt; [
        &amp;#039;offers&amp;#039; =&amp;gt; &amp;#039;offer|offers&amp;#039;,
    ],
];&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;Тогда при вызове &lt;code&gt;trans_choice(&#039;lang.count.offers&#039;, 10);&lt;/code&gt; выведется слово offers, а при &lt;code&gt;trans_choice(&#039;lang.count.offers&#039;, 1);&lt;/code&gt; — offer.&lt;/p&gt;
&lt;p&gt;И для перевода на русский достаточно добавить в соответствующий &lt;code&gt;lang.php&lt;/code&gt; перевод:&lt;/p&gt;&lt;/div&gt;
&lt;pre data-component-id=&quot;grakerru:code-block&quot; class=&quot;code-block language-none&quot;&gt;&lt;code class=&quot;language-none&quot;&gt;return [
    &amp;#039;count&amp;#039; =&amp;gt; [
        &amp;#039;offers&amp;#039; =&amp;gt; &amp;#039;предложение|предложения|предложений&amp;#039;,
    ],
];&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;И больше ничего делать не нужно, правильное склонение выберет библиотечная функция в соответствии с формулой для выбранного языка локали.&lt;/p&gt;
&lt;p&gt;Но в OctoberCMS есть нюанс. Дело в том, что Ларавел поддерживает единую директорию &lt;code&gt;lang&lt;/code&gt; для локализации всего проекта, поэтому туда можно складывать любые строки и обращаться тоже можно к любым строкам. А в Октябре у каждого плагина своя директория переводов, у ядра — своя директория переводов, а у используемой темы её и вовсе нет.&lt;/p&gt;
&lt;p&gt;Из-за этого, в первый раз столкнувшись с задачей, можно немного смутиться — а как же  сделать плюрализацию для строки, которую я просто в теме вывожу. &lt;a href=&quot;http://octobercms.com/docs/plugin/localization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Документация&lt;/a&gt; пока об этом ничего не говорит. А строчка:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: For translating front-end content, there are plugins that can be used for this purpose.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;и вовсе может навести на мысль, что для перевода строк в теме (каковая и есть фронт-энд) нужно какие-то плагины ставить (нужно, но только для контента, то есть моделей из БД).&lt;/p&gt;
&lt;p&gt;На самом деле для обращения к строкам локализации из темы, то есть из шаблонов Twig, есть фильтры. Для обычного перевода — фильтр &lt;code&gt;trans&lt;/code&gt;, а для плюрализации — &lt;code&gt;transchoice&lt;/code&gt;. Его и нужно применить, чтобы получить склоняемое количество предложений:&lt;/p&gt;&lt;/div&gt;
&lt;pre data-component-id=&quot;grakerru:code-block&quot; class=&quot;code-block language-none&quot;&gt;&lt;code class=&quot;language-none&quot;&gt;{{ &amp;quot;graker.touristic::lang.count.offers&amp;quot;|transchoice(quantity) }}&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;&lt;code&gt;graker.touristic&lt;/code&gt; здесь — это обращение к плагину &lt;code&gt;Touristic&lt;/code&gt; за авторством &lt;code&gt;Graker&lt;/code&gt;: к сожалению, поскольку у темы нет своего файла локализаций, необходимые строки придется разместить в каком-нибудь плагине.&lt;/p&gt;&lt;/div&gt;
</description>
  <pubDate>Sun, 21 Jan 2018 12:53:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">1947 at https://graker.ru</guid>
    </item>
<item>
  <title>Обновления до Laravel 5.5</title>
  <link>https://graker.ru/news/2017/09/05/laravel-5-5-upgrade</link>
  <description>&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;Поскольку Laravel 5.5 (который, кстати, LTS) уже неделю как вышел, стал обновляться. Проекту, который &lt;a href=&quot;/news/2017/07/21/updating-laravel&quot;&gt;недавно обновлял&lt;/a&gt; с 5.1 до 5.4, повезло: достаточно было поменять версии в &lt;code&gt;composer.json&lt;/code&gt; — и всё обновилось и заработало без проблем и все тесты прошли. Подправить пришлось лишь пару методов в тестах — там просто вместо строк кое-где стали числа возвращаться.&lt;/p&gt;
&lt;p&gt;А поскольку авторы OctoberCMS &lt;a href=&quot;/news/2017/07/30/octobercms-update&quot;&gt;обещали&lt;/a&gt;, что апгрейд до 5.5 выйдет примерно одновременно с самим 5.5 — стал обновлять домовую страницу. Тут вышло чуть-чуть сложнее. Встроенный механизм обновления обновлять ничего кроме плагинов не стал, потребовалось взять из &lt;a href=&quot;https://github.com/octobercms/october&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;гитхаба&lt;/a&gt; новый &lt;code&gt;composer.json&lt;/code&gt; и тогда уже обновляться через &lt;code&gt;composer update&lt;/code&gt; и последующий &lt;code&gt;php artisan october:up&lt;/code&gt;, который запустит все новые миграции.&lt;/p&gt;
&lt;p&gt;После обновления также нужно заменить значение параметра &lt;code&gt;cipher&lt;/code&gt; в &lt;code&gt;config/app.php&lt;/code&gt; на &lt;code&gt;&#039;AES-256-CBC&#039;&lt;/code&gt;. Просто перегенерация ключа &lt;code&gt;php artisan key:generate&lt;/code&gt; тут не сработает, потому что по умолчанию в October не используется файл &lt;code&gt;.env&lt;/code&gt;, а используются файлы в &lt;code&gt;config&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Проблемка после обновления возникла одна — перестали сортироваться категории в соответствующем компоненте плагина Blog. Придется немножко &lt;a href=&quot;https://github.com/rainlab/blog-plugin/issues/338&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;покопаться&lt;/a&gt;. Учитывая, что обновление было аж с Laravel 5.0, одна маленькая проблема — отличный результат. Видно, что авторы основательно над апгрейдом поработали.&lt;/p&gt;
&lt;p&gt;Ну и теперь у меня на сервере есть PHP 7, поскольку для Laravel с версии 5.5 он обязателен. Тоже полезно.&lt;/p&gt;&lt;/div&gt;
</description>
  <pubDate>Tue, 05 Sep 2017 20:20:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">1918 at https://graker.ru</guid>
    </item>
<item>
  <title>Будущее обновление OctoberCMS</title>
  <link>https://graker.ru/news/2017/07/30/octobercms-update</link>
  <description>&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;Как известно — скоро, уже вот-вот, совсем чуть-чуть осталось — выйдет Laravel 5.5. Но помимо того, что это само по себе хорошо, давно и вовсю идет работа по обновлению &lt;a href=&quot;https://octobercms.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OctoberCMS&lt;/a&gt;, тоже до использования Laravel 5.5. Для October это наверное даже важнее: сейчас-то там под капотом вообще Laravel 5.0, так что обновление будет очень кстати.&lt;/p&gt;
&lt;p&gt;В данный момент приобщиться к версии на 5.5 уже можно из &lt;a href=&quot;https://github.com/octobercms/october&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;репозитория&lt;/a&gt;, ветка develop. Я попробовал и могу сообщить: &lt;a href=&quot;https://octobercms.com/plugin/graker-photoalbums&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PhotoAlbums&lt;/a&gt; и &lt;a href=&quot;https://octobercms.com/plugin/graker-mapmarkers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MapMarkers&lt;/a&gt; в новой версии работают нормально, проблем не выявлено. Можно сказать, к обновлению готов.&lt;/p&gt;&lt;/div&gt;
</description>
  <pubDate>Sun, 30 Jul 2017 13:45:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">1913 at https://graker.ru</guid>
    </item>
<item>
  <title>OctoberCMS: виджет с ajax-диалогом</title>
  <link>https://graker.ru/news/2017/07/04/octobercms-ajax-popup-widget</link>
  <description>&lt;p&gt;Рассмотрим вставку виджета внутрь сторонней бэкэнд-формы и обращение к вставленному виджету из JS для подгрузки контента. На этом примере мы узнаем:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;что такое виджет в OctoberCMS, зачем он и как его сделать;&lt;/li&gt;
&lt;li&gt;как прикрепить виджет к контроллеру, определенному в другом плагине;&lt;/li&gt;
&lt;li&gt;как пользоваться ajax-фреймворком в OctoberCMS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Виджет для бэк-энда OctoberCMS — это то же самое, что компонент для фронт-энда. То есть это отдельный блок логики и представления, который можно &lt;strike&gt;пихать где попало&lt;/strike&gt; повторно использовать. Вообще, виджеты бывают трёх видов: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Form Widget&lt;/em&gt;, то есть для использования в формах, для манипуляции данными моделей,&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Report Widget&lt;/em&gt; для вывода полезных данных на панель управления в бэк-энде,&lt;/li&gt;
&lt;li&gt;и просто &lt;em&gt;Widget&lt;/em&gt; — для использования в любом контроллере бэк-энда. Например, Media Manager, красивый диалог для вставки медиа-файлов в текст, реализован в OctoberCMS как виджет.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В данной заметке мы будем делать ajax-диалог (который потом превратится в диалог выбора фотографий и вставки специального маркдаун-кода выбранной фотографии в текст).&lt;/p&gt;</description>
  <pubDate>Tue, 04 Jul 2017 08:20:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">1901 at https://graker.ru</guid>
    </item>
<item>
  <title>MapMarkers, плагин с гугл-картой для OctoberCMS</title>
  <link>https://graker.ru/news/2017/05/17/mapmarkers-octobercms-plugin</link>
  <description>&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;В маркетплейсе OctoberCMS появился еще один мой плагин — &lt;a href=&quot;https://octobercms.com/plugin/graker-mapmarkers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MapMarkers&lt;/a&gt;. Плагин предназначен для показа на карте нескольких маркеров (например, списка офисов). Маркеры можно создавать, указывать им широту-долготу, задавать при необходимости картинку, и выводить как на карте, так и списком. При клике по маркеру на карте появляется поп-ап, содержимым которого тоже можно управлять.&lt;/p&gt;
&lt;p&gt;Также можно опционально аттачить к маркерам ссылки на блог-посты из плагина &lt;a href=&quot;https://octobercms.com/plugin/rainlab-blog&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Blog&lt;/a&gt; и фотоальбомы из моего &lt;a href=&quot;https://octobercms.com/plugin/graker-photoalbums&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PhotoAlbums&lt;/a&gt;. С помощью этой фичи сделана страница «&lt;a href=&quot;/travel&quot;&gt;Путешествия&lt;/a&gt;».&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://octobercms.com/plugin/graker-mapmarkers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Страница плагина MapMarkers в маркетплейсе&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
</description>
  <pubDate>Wed, 17 May 2017 15:25:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">1894 at https://graker.ru</guid>
    </item>
<item>
  <title>PhotoAlbums, фотоальбомы для OctoberCMS</title>
  <link>https://graker.ru/news/2017/05/09/photoalbums-octobercms-plugin</link>
  <description>&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;Когда переделывал домовую страницу под OctoberCMS, написал плагин для управления фотокарточками. После шестого Друпала хотелось сделать более удобно, чтоб с мультиаплоадом, опциональными заголовками и вставкой фотокарточек в посты по id. В целом можно сказать — получилось. Управлять &lt;a href=&quot;/galleries&quot;&gt;фотокарточками&lt;/a&gt; стало гораздо удобнее, чем раньше (хотя есть еще что улучшить).&lt;/p&gt;
&lt;p&gt;Плагин изначально был доступен на гитхабе, а на днях отправил заявку, чтобы добавить его в &lt;a href=&quot;https://octobercms.com/plugins&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;маркетплейс&lt;/a&gt; плагинов. Сегодня эту заявку одобрили, так что теперь я официально автор плагина для OctoberCMS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://octobercms.com/plugin/graker-photoalbums&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Страница плагина PhotoAlbums в маркетплейсе&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
</description>
  <pubDate>Tue, 09 May 2017 10:05:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">1890 at https://graker.ru</guid>
    </item>
<item>
  <title>OctoberCMS и сортировка моделей</title>
  <link>https://graker.ru/news/2017/05/04/octobercms-sorting-models</link>
  <description>&lt;p&gt;Есть в OctoberCMS такая полезная штука — бихевиор для ручной сортировки моделей. Например, чтобы перетаскиванием отсортировать категории по значимости (и вложенности). Использовать его для своих моделей — очень просто, вот &lt;a href=&quot;https://octobercms.com/docs/backend/reorder&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;страничка в документации&lt;/a&gt;. Подключаем бихевиор к классу-контроллеру, заполняем конфиг, а в модели используем трейт &lt;code&gt;Sortable&lt;/code&gt; (или &lt;code&gt;NestedTree&lt;/code&gt;). А что такое бихевиор, можно тоже &lt;a href=&quot;https://octobercms.com/docs/services/behaviors&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;прочитать в доках&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Но проблема в том, что из коробки можно заставить этот бихевиор работать только на одном уровне. Вот есть все экземпляры модели одного класса — можно их отсортировать. А мне нужно сделать интерфейс для сортировки фотографий, принадлежащих альбомам. То есть отсортировать только фотокарточки внутри отдельно взятого альбома, без всех остальных.&lt;/p&gt;
&lt;p&gt;Бихевиор &lt;code&gt;ReorderController&lt;/code&gt; для этого использовать не получится, придется строить сортировку вручную. Однако если покопаться, как устроен &lt;code&gt;ReorderController&lt;/code&gt;, его шаблоны и трейт &lt;code&gt;Sortable&lt;/code&gt;, можно сделать свою сортировку по аналогии и даже не дублировать какую-то часть кода. Об этом и поговорим.&lt;/p&gt;</description>
  <pubDate>Thu, 04 May 2017 19:30:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">1887 at https://graker.ru</guid>
    </item>
<item>
  <title>Новые типы столбцов в списках OctoberCMS</title>
  <link>https://graker.ru/news/2017/05/02/octobercms-custom-list-columns</link>
  <description>&lt;p&gt;В плагинах OctoberCMS обычно мы имеем дело с моделями. Допустим, есть у нас вот такой список моделей как на картинке. Это список моделей &lt;code&gt;Photo&lt;/code&gt;, принадлежащих одной модели &lt;code&gt;Album&lt;/code&gt;. Сделать такой список легко — пара строчек в контроллере и он создастся автоматически.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/sites/default/files/media/misc-images/october_columns_1.png&quot; class=&quot;magnific&quot;&gt;&lt;img src=&quot;/sites/default/files/media/misc-images/cropped-images/october_columns_1-0-0-0-0-1493676644.png&quot; alt class=&quot;img-responsive center-block&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Как можно заметить, список в данном случае не сильно удобный: у многих фотокарточек нет названия. Через это вообще невозможно понять, где какая фотография находится. В общем, хотелось бы, чтобы в таблице были картинки. Ну и заодно чтоб можно было отметить ту картинку, которая выбрана обложкой альбома.&lt;/p&gt;
&lt;p&gt;Список столбцов задается (по умолчанию) в файле &lt;code&gt;columns.yaml&lt;/code&gt; для отображаемой модели. Туда можно добавлять новые столбцы, но их набор &lt;a href=&quot;http://octobercms.com/docs/backend/lists#column-types&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;довольно ограничен&lt;/a&gt;. Зато, как &lt;a href=&quot;http://octobercms.com/docs/backend/lists#custom-column-types&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;написано&lt;/a&gt; на этой же странице документации, можно добавлять свои типы столбцов. И сейчас мы рассмотрим эту возможность, чуть-чуть подробнее, чем в доках.&lt;/p&gt;</description>
  <pubDate>Tue, 02 May 2017 08:30:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">1886 at https://graker.ru</guid>
    </item>
<item>
  <title>Тест компонента в OctoberCMS</title>
  <link>https://graker.ru/news/2017/04/20/octobercms-component-testing</link>
  <description>&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;В принципе, тесты в OctoberCMS устроены примерно так же, как и в Laravel. Но поскольку это CMS и у нее есть плагины — к ним можно писать отдельные тесты. Правда, документация по этому вопросу &lt;a href=&quot;https://octobercms.com/docs/help/unit-testing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;довольно лаконична&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Вот, есть, например, в плагине &lt;a href=&quot;https://octobercms.com/docs/plugin/components&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;компонент&lt;/a&gt; и на него нужно написать тесты. Чтобы это сделать, нам понадобится экземпляр класса компонента, но как его создать? Просто оператором &lt;code&gt;new&lt;/code&gt; не получается. В общем, решение нашлось (не сразу) в дебрях тестов самого октября, привожу, вдруг кто еще искать будет:&lt;/p&gt;&lt;/div&gt;
&lt;pre data-component-id=&quot;grakerru:code-block&quot; class=&quot;code-block language-none&quot;&gt;&lt;code class=&quot;language-none&quot;&gt;$theme = Theme::load(&amp;#039;test&amp;#039;);
$page = Page::load($theme, &amp;#039;index.htm&amp;#039;);
$layout = Layout::load($theme, &amp;#039;content.htm&amp;#039;);
$controller = new Controller($theme);
$parser = new CodeParser($page);
$pageObj = $parser-&amp;gt;source($page, $layout, $controller);
$manager = ComponentManager::instance();
$component = $manager-&amp;gt;makeComponent(&amp;#039;myComponent&amp;#039;, $pageObj);&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;То есть, оказывается, нужна особая магия в виде создания сущностей из «тестовой» темы и генерации компонента с их помощью. Вот бы узнать, где можно почитать об этом, помимо исходников.&lt;/p&gt;
&lt;p&gt;Кстати, третьим аргументом в &lt;code&gt;makeComponent()&lt;/code&gt; можно передать массив свойств компонента. Поможет протестировать логику, когда свойства должны отличаться от дефолтных.&lt;/p&gt;&lt;/div&gt;
</description>
  <pubDate>Thu, 20 Apr 2017 15:00:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">1884 at https://graker.ru</guid>
    </item>
<item>
  <title>Анонсы и Markdown в OctoberCMS</title>
  <link>https://graker.ru/news/2017/03/13/octobercms-teasers-vs-markdown</link>
  <description>&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;Как я уже писал раньше, в OctoberCMS из коробки работает фильтр &lt;a href=&quot;https://ru.wikipedia.org/wiki/Markdown&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Markdown&lt;/a&gt;, который можно применять практически везде. В плагине &lt;a href=&quot;https://octobercms.com/plugin/rainlab-blog&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Blog&lt;/a&gt; текст каждой заметки проводится через фильтр перед сохранением, а сохраняется уже готовый html. Но при этом, по загадочным для меня причинам, &lt;em&gt;excerpt&lt;/em&gt; (то есть анонс) заметки через фильтр Markdown не пропускается.&lt;/p&gt;
&lt;p&gt;Из-за этого приходится либо для анонса переводить маркдаун в html вручную, либо при выводе анонса выводить его с фильтром &lt;code&gt;{{ excerpt | md }}&lt;/code&gt;. Со вторым вариантом можно жить, но в сомнениях: ведь анонс каждого поста на странице будет обрабатываться фильтром при каждой загрузке ленты. Непорядок, надо же экономить электроэнергию-то!&lt;/p&gt;
&lt;p&gt;Проблему можно решить аккуратно в несколько строчек кода. Раз плагин Blog не преобразует маркдаун в анонсе перед сохранением, поможем ему:&lt;/p&gt;&lt;/div&gt;
&lt;pre data-component-id=&quot;grakerru:code-block&quot; class=&quot;code-block language-none&quot;&gt;&lt;code class=&quot;language-none&quot;&gt;Post::extend(function (Post $model) {
  $model-&amp;gt;bindEvent(&amp;#039;model.beforeSave&amp;#039;, function() use ($model) {
    $model-&amp;gt;excerpt = Markdown::parse($model-&amp;gt;excerpt);
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;Здесь мы добавили для модели &lt;code&gt;Post&lt;/code&gt; обработчик события &lt;code&gt;model.beforeSave&lt;/code&gt;, которое происходит всякий раз перед созданием или обновлением заметки в блог. В обработчике мы просто пропускаем анонс через фильтр маркдауна (обратите внимание, для простоты здесь использован фасад &lt;code&gt;Markdown&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Всё, теперь анонсы новых заметок будут обработаны фильтром маркдаун при сохранении. Для порядка можно еще разово обработать анонсы старых заметок. Сделать это нетрудно. Добавим новую команду artisan:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;php artisan create:command AuthorName.MyPlugin MyCommand&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;И в теле метода &lt;code&gt;fire()&lt;/code&gt; выполним код:&lt;/p&gt;&lt;/div&gt;
&lt;pre data-component-id=&quot;grakerru:code-block&quot; class=&quot;code-block language-none&quot;&gt;&lt;code class=&quot;language-none&quot;&gt;$posts = Post::where(&amp;#039;excerpt&amp;#039;, &amp;#039;&amp;lt;&amp;gt;&amp;#039;, &amp;#039;&amp;#039;)-&amp;gt;get();
foreach ($posts as $post) {
  $post-&amp;gt;save();
}&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;То есть находим все заметки, у которых задан анонс и просто пересохраняем их. При пересохранении выполнится наш обработчик события и анонс будет обработан фильтром Markdown.&lt;/p&gt;
&lt;p&gt;Для удобства обработчик события и команда обработки старых заметок — добавлены в мой плагин &lt;a href=&quot;https://github.com/graker/blogarchive&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BlogArchive&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
  <pubDate>Mon, 13 Mar 2017 07:15:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">1873 at https://graker.ru</guid>
    </item>
<item>
  <title>OctoberCMS и расширение плагинов</title>
  <link>https://graker.ru/news/2016/09/22/octobercms-extending-plugins</link>
  <description>&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;Многих интересует, а как в &lt;a href=&quot;http://octobercms.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OctoberCMS&lt;/a&gt; расширять «чужие» модели и формы. Один из авторов системы, Сэмюэл Джорджс, показывает на пальцах как:&lt;/p&gt;&lt;/div&gt;
&lt;div data-component-id=&quot;grakerru:video&quot; class=&quot;video-embed&quot;&gt;
  &lt;div class=&quot;ratio ratio-16x9&quot;&gt;
&lt;iframe src=&quot;https://player.vimeo.com/video/108040919&quot; title=&quot;OctoberCMS и расширение плагинов&quot; loading=&quot;lazy&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;Вообще, я не большой фанат скринкастов о программировании. Но как автор обращается с мультикурсорностью — любо-дорого смотреть.&lt;/p&gt;&lt;/div&gt;
</description>
  <pubDate>Thu, 22 Sep 2016 20:00:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">1841 at https://graker.ru</guid>
    </item>
<item>
  <title>OctoberCMS: расширяем фильтр Markdown</title>
  <link>https://graker.ru/news/2016/09/18/octobercms-extending-markdown-filter</link>
  <description>&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;В OctoberCMS из коробки работает фильтр &lt;a href=&quot;https://ru.wikipedia.org/wiki/Markdown&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Markdown&lt;/a&gt;, он применяется почти везде и, к тому же, его можно легко применять к любому тексту вручную. И, что важно, фильтр автоматически применяется к записям плагина &lt;a href=&quot;https://octobercms.com/plugin/rainlab-blog&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Blog&lt;/a&gt; перед сохранением готового к выводу html. &lt;/p&gt;
&lt;p&gt;Если мы хотим применить к проходящему через Markdown тексту какие-то свои фильтры, можно прицепиться к событию &lt;code&gt;markdown.parse&lt;/code&gt;. Это событие генерируется сразу после парсинга входящего текста самим фильтром. Подключимся к нему в методе &lt;code&gt;boot()&lt;/code&gt; нашего плагина:&lt;/p&gt;&lt;/div&gt;
&lt;pre data-component-id=&quot;grakerru:code-block&quot; class=&quot;code-block language-none&quot;&gt;&lt;code class=&quot;language-none&quot;&gt;public function boot() {
  Event::listen(&amp;#039;markdown.parse&amp;#039;, &amp;#039;Author\PluginName\Classes\MarkdownExtender@parse&amp;#039;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;Теперь при каждом применении фильтра Markdown будет вызываться метод &lt;code&gt;parse()&lt;/code&gt; класса &lt;code&gt;MarkdownExtender&lt;/code&gt;, который должен находиться в &lt;code&gt;author/pluginname/classes/MarkdownExtender.php&lt;/code&gt;. Код класса:&lt;/p&gt;&lt;/div&gt;
&lt;pre data-component-id=&quot;grakerru:code-block&quot; class=&quot;code-block language-none&quot;&gt;&lt;code class=&quot;language-none&quot;&gt;namespace Author\PluginName\Classes;

class MarkdownExtender {

  public function parse($text, $data) {
    // в $text находится оригинальный текст
    // а в $data-&amp;gt;text - результирующий
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;paragraph paragraph--text&quot;&gt;&lt;p&gt;Производим все нужные манипуляции с текстом в &lt;code&gt;$data-&amp;gt;text&lt;/code&gt; и сохраняем результат обратно, сверяясь с оригиналом в &lt;code&gt;$text&lt;/code&gt; при необходимости. Вот и всё.&lt;/p&gt;&lt;/div&gt;
</description>
  <pubDate>Sun, 18 Sep 2016 12:45:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">1838 at https://graker.ru</guid>
    </item>
<item>
  <title>Плагин Blog Archive</title>
  <link>https://graker.ru/news/2016/08/31/blogarchive-plugin</link>
  <description>&lt;p&gt;В процессе миграции домовой страницы с Drupal 6 на OctoberCMS, написал несколько плагинов. Первым из них стал плагин &lt;a href=&quot;https://github.com/graker/blogarchive&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BlogArchive&lt;/a&gt; и в этой заметке я немного о нем расскажу.&lt;/p&gt;
&lt;p&gt;Изначально плагин я написал, чтобы сделать &lt;a href=&quot;/news/2016&quot;&gt;архив постов по месяцам&lt;/a&gt;, примерно как было на старом сайте, только лучше. Архив реализован через компонент &lt;code&gt;blogArchive&lt;/code&gt;, он работает, можно пользоваться. Компонент даже умеет количество комментариев из Disqus подгружать (если Disqus включен).&lt;/p&gt;</description>
  <pubDate>Wed, 31 Aug 2016 08:25:00 +0000</pubDate>
    <dc:creator>graker</dc:creator>
    <guid isPermaLink="false">1831 at https://graker.ru</guid>
    </item>

  </channel>
</rss>
