Skip to content

Instantly share code, notes, and snippets.

@vgrish
Forked from AgelxNash/plugin.LoadElement.php
Last active August 29, 2015 14:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vgrish/3bfd5d4ea6ce489aa492 to your computer and use it in GitHub Desktop.
Save vgrish/3bfd5d4ea6ce489aa492 to your computer and use it in GitHub Desktop.
<?php
if (!defined('MODX_BASE_PATH')) { die('HACK???'); }
/**
* LoadElement
*
* Загрузка чанков и сниппетов из файлов
*
* @license GNU General Public License (GPL), http://www.gnu.org/copyleft/gpl.html
* @author Agel_Nash <modx@agel-nash.ru>
* @version 0.3
* @internal @events OnWebPageInit, OnManagerPageInit, OnPageNotFound
* @internal @properties &extChunk=Расширения чанков (<i>через запятую</i>);input;txt,html &extSnippet=Расширения сниппетов (<i>через запятую</i>);input;php &pathElement=Папка с элементами (<i>относительно корня сайта</i>);input;assets/element/
*/
class LoadElement{
public static $pathElement = 'assets/element/';
/**
* Валидация типа элементов
*
* @param string $element тип элементов
* @return bool
*/
protected static function validate($element){
return is_dir(self::getPath($element));
}
/**
* Путь к папке с элементами
*
* @param string $element тип элементов
* @return string
*/
protected static function getPath($element){
return MODX_BASE_PATH . self::$pathElement . $element.'/';
}
/**
* Получение имени метода в котором описаны правила загрузки элементов
*
* @param string $element тип элементов
* @return string
*/
protected static function getMethodName($element){
return 'get'.ucfirst($element);
}
/**
* Правила загрузки сниппетов
*
* @param DocumentParser $modx
* @param SplFileInfo $item обнаруженый элемент
* @return bool статус загрузки элемента
*/
protected static function getSnippet(DocumentParser $modx, SplFileInfo $item){
$snippetName = $item->getBasename('.'.self::getExtension($item->getPathname()));
$path = str_replace(self::getPath('snippet'), '', $item->getPath().'/');
if(!empty($path)){
$snippetName = str_replace("/", "\\", $path) . $snippetName;
}
$modx->snippetCache[$snippetName] = "return require '".$item->getRealPath()."';";
$modx->snippetCache[$snippetName . "Props"] = array();
return true;
}
protected static function getChunk(DocumentParser $modx, SplFileInfo $item){
$chunkName = $item->getBasename('.'.self::getExtension($item->getPathname()));
$path = str_replace(self::getPath('chunk'), '', $item->getPath().'/');
if(!empty($path)){
$chunkName = str_replace("/", "\\", $path) . $chunkName;
}
$modx->chunkCache[$chunkName] = file_get_contents($item->getRealPath());
return true;
}
/**
* Запуск задачи по созданию элементов
*
* @param DocumentParser $modx
* @param string $element
* @param array $ext
* @return bool
*/
public static function run(DocumentParser $modx, $element, array $ext = array()){
if( ! self::validate($element) ) return false;
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(
self::getPath($element)
), RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $item) {
/**
* @var SplFileInfo $item
*/
if($item->isFile() && $item->isReadable() && (empty($ext) || in_array(self::getExtension($item->getPathname()), $ext))){
$name = self::getMethodName($element);
self::$name($modx, $item);
}
}
return true;
}
public static function getExtension($file){
return pathinfo($file, PATHINFO_EXTENSION);
}
}
LoadElement::$pathElement = (!empty($pathElement) && is_scalar($pathElement)) ? $pathElement : LoadElement::$pathElement;
$extSnippet = (!empty($extSnippet) && is_scalar($extSnippet)) ? $extSnippet : 'txt,html';
$extSnippet = array_map('trim', explode(",", $extSnippet));
LoadElement::run($modx, 'snippet', $extSnippet);
$extChunk = (!empty($extChunk) && is_scalar($extChunk)) ? $extChunk : 'txt,html';
$extChunk = array_map('trim', explode(",", $extChunk));
LoadElement::run($modx, 'chunk', $extChunk);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment