-
-
Save AgelxNash/9239062 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.2 | |
* @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())); | |
$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())); | |
$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); |
Вряд ли, потому как даже:
class LoadElement{
}
способствует выводу белого экрана.
Не знаю зачем плагину событие OnPageNotFound
, но убрав его всё становится как надо, правда лишь в версии 0.2.
@AgelxNash
L62
$modx->snippetCache[$snippetName . "Props"] = array();
В новых реализациях modx, snippet properties, только как строка и больше не проверяется на пустоту.
modxcms/evolution@e0ffb3e#commitcomment-17488835
I had to replace all '/'
by DIRECTORY_SEPARATOR
for windows-compatibilty.
Евгений, скажи, в начале каждого сниппета нужно указывать:
if ( !defined('MODX_BASE_PATH') ) die('HACK???');
я правильно понимаю? На сколько было бы критично пренебречь этим правилом?
Это еще работает?
@AntonFix Да, работает. Обновил код который работает еще и с версии 1.4.4
@atomoc Есть ситуации, когда можно принебречь. Но если не в даваться в подробности, то лучше не стоит.
@Deesen See the new version
Не работает, в отличие от 0.2 версии. У меня возникла идея обновить до 0.3 из-за отображения пустого экрана на неопубликованных ресурсах, вместо ошибки 404, строки:
должны это исправить?