Плагин - защита от забывчивости

Плагин - защита от забывчивости - Liber.pro - личный сайт Алексея Либера Картинка  1

Сегодня произошел случай — пытался я запустить DocLister с выводом из внешней таблицы, а он все никак не хотел толком запускаться… Я уже всю документацию перелопатил, а оказалось все банально — у меня он просто был не установлен)

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

Здесь представленные запчасти для Evo, но можно легко переделать и под рево. Необходимость такого плагина не сильна и высока, но если включить в собственную сборку иногда может спасти несколько нервных клеток)

Да и как пример написания плагинов для начинающих будет полезен…

События: OnChunkFormPrerender,OnDocFormPrerender,OnTempFormPrerender

Код плагина:

//<?php
	/**
		* GetElements
		*
		* Element quick view when you edit
		*
		* @category    plugin
		* @version     0.1
		* @license     http://www.gnu.org/copyleft/gpl.html GNU Public License (GPL)
		* @package     modx
		* @author      Alexey Liber (bd87@bk.ru)
		* @internal    @events OnChunkFormPrerender,OnDocFormPrerender,OnTempFormPrerender
		* @internal    @modx_category Manager and Admin
		* @internal    @installset base
		* @internal    @disabled 1
	*/
	
	global $modx;
	$e = &$modx->Event;
	
	if (($e->name=='OnChunkFormPrerender') or ($e->name=='OnDocFormPrerender') or ($e->name=='OnTempFormPrerender'))
	{
		
		$out='';
		// Выбираем содержимое текущего элемента
		if (($e->name=='OnChunkFormPrerender'))
		{
			$table = $modx->getFullTableName('site_htmlsnippets');
			$txt = $modx->db->getValue("select `snippet` from $table where `id`=".$id);
		}
		if ($e->name=='OnDocFormPrerender')
		{
			$table = $modx->getFullTableName('site_content');
			$txt = $modx->db->getValue("select `content` from $table where `id`=".$id);	
		}
		if ($e->name=='OnTempFormPrerender')
		{
			$table = $modx->getFullTableName('site_templates');
			$txt = $modx->db->getValue("select `content` from $table where `id`=".$id);		
		}
		
		// Приводим сниппеты к единному знаменателю
		$txt = str_replace(']]', ']]', $txt);	
		$txt = str_replace('[[', '[[', $txt);
		
		//Вычленяем сниппеты используемые на странице
		if (strpos($txt, '[[') > -1) 
		{
			$matches= array ();
			preg_match_all('~[[(.*?)]]~s', $txt, $matches);
			$snippets=array();
			foreach ($matches[1] as $snip)
			{
				$snipName = explode('?',$snip);
				$snippets[] = $snipName[0]; 
			}
			// Оставляем только уникальные
			$snippets = array_unique($snippets);
			$notRegistred = array();
			$tblSnip = $modx->getFullTableName('site_snippets');
			
			// Проверяем наличие в базе
			foreach($snippets as $s)
			{
				if (!$modx->db->getValue('select count(*) from '.$tblSnip.' where `name`="'.$s.'"')) $notRegistred[]=$s;
			}
		
			if (count($notRegistred))
			{				
				echo "alert(\"На странице используются незарегестрированные сниппеты - ".implode(',', $notRegistred)."\");";
			}
			
		}
	}
[[if? &is=`9:in:9,91` &then=`[[prevnextPage]]`]] [[if? &is=`9:in:9,91` &then=`@TPL:comments`]]
[[if? &is=`133:is:1` &then=` `]] [[if? &is=`133:is:196` &then=` `]]