Плагины в Lasto's Abductor

Lasto's Abductor, Похититель буковок Lasto's Abductor, Похититель буковок

Плагины в Lasto's Abductor

В настройках движка есть раздел плагинов, причём там присутствуют сразу две формы для их добавления. Смысл вот в чём.

Поскольку архитектура движка подразумевает активное использование шаблонов, каждый из которых сначала применяется к контенту или отдельной его части, и только потом всё это разом отдаётся в поток вывода (в браузер серфера), то уже скомпонованный контент может существовать как минимум в двух ипостасях:

  1. Контент сам по себе, "голый".
  2. Контент в шаблоне дизайна.

Соответственно, у нас могут быть задачи, для которых достаточно работы только с контентом. Например, в дистрибутив скрипта уже внесён плагин оборудования формы редактирования поста всякими кнопочками подстановки тегов. Он как-то модифицирует тело страничек, не затрагивая сам дизайн. Посему и прописан в первую форму раздела настроек "Плагины".

С другой стороны, нам может понадобиться плагин, который будет модифицировать не только контент, но и сам шаблон дизайна. Давайте в учебных целях сходу выдумаем какую-нибудь задачу, и доблестно её решим.

Например, классическое: Гугл Аналитикс предложил вебмастеру порадовать все страницы своего сайта, которые он желает отслеживать, таким кодом:

<script type="text/javascript">
 
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-xxxxxxxx-1']);
  _gaq.push(['_trackPageview']);
 
  (function() {
    var ga=document.createElement('script');
    ga.type='text/javascript';
    ga.async=true;
    ga.src=('https:'==document.location.protocol ? 
       'https://ssl':
       'http://www')+'.google-analytics.com/ga.js';
    var s=document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(ga,s);
  })();
 
</script>

Естественно, вебмастер может взять шаблон дизайна ./data/tpl/default/design.php и дописать выданный ему ДжаваСкрипт код прямо в шаблон дизайна. Так?

Так. Но будет ли это правильным?

Давайте вспомним, что у вебмастера есть админка, с разнообразными URL-ами внутри, которые совершенно незачем показывать Гуглу. И тупо ставить код сбора аналитики прямо в шаблон дизайна неправильно. Его надо активировать, только когда сайт посещается серфером, то есть при отключенной авторизации в админке. А активность админа, и все посещаемые им URL-ы фиксировать вообще не следует.

Стало быть, без плагина, модифицирующего шаблон сайта при выполнении каких-то условий, всё-таки не обойтись.

Теперь можно сформулировать и задачу, решаемую плагином. Пусть он для не авторизованного пользователя (серфера) прицепляет перед завершающим </HTML> тегом документа код Гугл Аналитикса.

В виде PHP кода это можно написать по сути дела одним оператором:

<?php /* Выше этой строки в файле ничего не должно быть */
 
   if (false==$_s['admin']) $content=str_replace("\n</html>","
<script type='text/javascript'>
 
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-xxxxxxxx-1']);
  _gaq.push(['_trackPageview']);
 
  (function() {
    var ga=document.createElement('script');
    ga.type='text/javascript';
    ga.async=true;
    ga.src=('https:'==document.location.protocol ? 
       'https://ssl':
       'http://www')+'.google-analytics.com/ga.js';
    var s=document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(ga,s);
  })();
 
</script>\n</html>",
   $content);
 
/* Ниже этой строки в файле ничего не должно быть. */ ?>

Файл можно обозвать plugin_google_analitics.php и разместить в папке плагинов:

Корневая папка скрипта
data
plugins

Сам плагин прописывается во второй форме раздела настроек админки Плагины:

plugin_google_analitics=

Понятно, что таким образом можно сделать с потоком вывода всё, чего вообще возможно добиться силами PHP. Надо лишь знать этот язык, и помнить, что для обоих типов плагинов контент содержится в одноимённой переменной - $content

Другой подход.

Если не ограничиваться только одним счётчиком, и абстрагироваться от конкретного тега разметки, к которому привязывается плагин, то в общем случае решаемая в данном документе задача может быть реализована проще:

<?php /* Выше этой строки в файле ничего не должно быть */
 
   $counter=<<<counter
 
   Тут любой HTML код.
   Например, десяток счётчиков на JavaScript.
 
counter;
 
   if (false==$_s['admin']) $content=str_replace(
      '<!--counter-->',
      $counter,
   $content);
 
/* Ниже этой строки в файле ничего не должно быть. */ ?>

Теперь осталось в нужном месте файла дизайна design.php вставить HTML комментарий

<!--counter-->

и сформировать плагин, в точности так, как рассматривалось выше. Он выведет счётчики (или иной функционал, обеспечиваемый Вашим HTML кодом) в нужное место странички (вместо комментария) для неавторизованного пользователя.

Другой способ подключения плагинов, через HTML код.

Обратите внимание, что подключение плагинов через раздел админки носит как бы обязательный характер - плагин активируется и когда он нужен, и когда абсолютно бесполезен (в документах сайта, с тем плагином не работающих). В случае использования большого количества плагинов, особенно ресурсоёмких, в итоге получится неповоротливый ВордПресс, пожирающий память сверх всякой меры. А ВордПресс - это зло.

Чтобы не делать из лёгкого движка монстра, предусмотрен альтернативный метод подключения плагинов. В HTML код той страницы, где требуется применение редко используемого плагина, включается обычный HTML комментарий. Который и активирует в рамках документа нужный плагин.

Пример.

Допустим, в статье "Парсер яндекс-каталога" потребовалось продемонстрировать некий PHP код. Чтобы его как-то оформить достойным образом, явно не помешает какой-нибудь плагин подсветки кода.

Если сам плагин лежит в виде файла plugin_geshi.php в папке ./data/plugins/, и его надо применить к шаблону сайта с контентом, то мы не заносим соответствующую запись во вторую форму странички настроек плагинов админки (как это сказано в начале сего документа), а просто вставляем в код статьи силами редактора простую запись, в любое место кода статьи:

<!-- plugin_after:plugin_geshi -->

Если бы плагин применялся только к контенту документа, не затрагивая шаблон сайта, то запись была бы такая:

<!-- plugin_before:plugin_gеshi -->

Число подобных записей на один документ ничем не лимитируется.

Альтернативный метод подключения плагинов через PHP код.

Если документ, требующий подключения плагина, не является статьёй, а представляет собой PHP скрипт на движке встроенной CMS (например, как данная страничка, которую Вы сейчас читаете), то могут быть употреблены такого вида записи в том месте файла, где PHP инструкции понимаются:

# Применение плагина только к контенту текущего документа:
   $_s['plugins']['before']['plugin_geshi']='';
 
# Применение плагина к контенту текущего документа и к шаблону сайта:
   $_s['plugins']['after']['plugin_geshi']='';