В продолжение темы работы с xPDO. Я уже довольно долго не использую стандартные сниппеты [[galAlbum]], [[galItem]] и т.п. Блин, реально все заморочено. А кастомный вывод какой-то сделать — это вообще высший пилотаж. Но компонент Gallery использую очень активно, чисто для управления галереями в админке, а вывод галерей пишу сам. Вот сегодня сделал очередную галерейку и хочу показать листинг сниппет. Итак, сниппет: <?php $output = '';
// Получаем все элементы $q = $modx->newQuery('galItem'); $q->join('galAlbumItem', 'AlbumItems'); $q->where(array( 'AlbumItems.album' => $album, )); if(!$items = $modx->getCollection('galItem', $q)){ return; }
// Регистрируем скрипты
$assets_url = $modx->getOption('assets_url', null);
$modx->regClientCSS("{$assets_url}js/lib/colorbox/style/1/colorbox.css");
$modx->regClientStartupScript("{$assets_url}js/lib/colorbox/jquery.colorbox-min.js");
$modx->regClientStartupScript("<script type="text/javascript">
$(document).ready(function(){
//Examples of how to assign the ColorBox event to elements
$('.gallery').colorbox({
rel:'gallery'
,'current': ''
});
});
</script>", true);
// Проходим по каждому элементу и набиваем в шаблоны $x = 0; $inRow = 3; $rowClass = "row flow"; $itemClass = "columns four";
$rowOutput = '';
foreach($items as $item){
$x++;
// print_r($item->toArray());
$item = $modx->getChunk('SiteGalleryItemTpl', array(
'class' => $itemClass,
'title' => $item->get('name'),
'src' => $item->get('absoluteImage'),
));
$rowOutput .= $item;
if($x == $inRow){
$output .= $modx->getChunk('SiteGalleryRowTpl', array(
'class' => $rowClass,
'wrapper' => $rowOutput,
));
$x = 0;
$rowOutput = '';
}
}
return $output;
Чанк SiteGalleryRowTpl
<code><div class="[[+class]]">[[+wrapper]]</div> Чанк SiteGalleryItemTpl <div class="galItem [[+class]]"> <div class="title"><span>[[+title]]</span></div> <a href="[[+src]]" class="gallery" title="[[+title]]"> <img src="/assets/components/site_gallery/connector.php?action=web/image/gallery/small&src=[[+src]]"/> </a>
</div> Как видно, для кастомной галереи не нужно писать много кода.Все понятно. Блин, хотелось бы все же с процессорами разобраться. По-моему, mgr/item/getlist в gallery меньше кода гоняет
Так кто мешает? Говорю же — перегрузи метод outputArray() и все.
вот что получилось: <?php require_once(MODX_CORE_PATH.'components/gallery/processors/mgr/item/getlist.class.php');
class modSiteGalleryProcessor extends GalleryItemGetListProcessor{
public function outputArray(array $array, $count = false){ return array( 'success' => true, 'message' => $this->getMessage(), 'count' => count($array), 'total' => $count, 'object' => $array, ); } } return 'modSiteGalleryProcessor'; вызываю из консоли <?php $response = $modx->runProcessor('gallery/getlist', array( 'album' => 1, ), array( 'processors_path' => $modx->getOption('core_path') . 'site/processors/' )); print_r($response->response); ничего не выдает, только Loading крутится. Что-то я еще не сделал?
И еще: 'processors_path' => $modx->getOption('core_path'). 'site/processors/' А что это ты из core_path процессор пытаешься дернуть? У тебя по идее как минимум в core_path. components должно лежать. Пути в общем проверь.
Точно, исправил — заработало.
да просто в core положил папку site, где все процессоры и шаблоны. Не люблю слишком длинные пути.
А все-таки, что экономичнее на твой взгляд — getCollection или все-таки процессор? я так понял, процессор превьюшки генерит (у него возвращаются их адреса)? Они-то как раз и не нужны.
Крайне неудачное решение. Используй MODX_CORE_PATH .'components/site/processors/' и все. А экономия с путями тебе сразу несколько минусов дает:
Резонно. Так и поступлю.
что кономичнее на твой взгляд — getCollection или все-таки процессор? Ты путаешь довольно разные вещи. getCollection — это конкретный метод xPDO для получения массива объектов. При этом это не только запросы к базе данных, но и набивка результатов в конечные объекты. Чтобы это лучше понимать, прочитай эти статьи: modxclub.ru/blog/200.html modxclub.ru/blog/166.html А процессор — это процессор. И в нем логика может быть какая угодно. Так вот, классический modObjectGetlistprocessor использует в том числе и метод xPDO::getCollection(). Просто помимо этого он имеет ряд методов для проверки прав, формирования запроса, подсчета общего числа элементов, обработки вывода и т.п. Конечно же он по определению тяжелее, чем просто getCollection(). Но если брать те же getlist-процессоры из shopModx-а, то там не используется метод getCollection, а используется чистое PDO/xPDO. Те процессоры в итоге легче гораздо. Но в случае с Gallery работать с объектами конечно же лучше как минимум по двум причинам:
Ясно. Так и поступлю. Спасибо.
Ну, примерно так: <?php /**
function smarty_function_galAlbum($params, & $smarty) { if(!isset($params['album']) OR !$album = $params['album']){return;}
$output = '';
if(!$rowTpl = $params['rowTpl']){
$output = array();
}
if(!empty($params['assign'])){
$assign = (string)$params['assign'];
}
$modx = & $smarty->modx;
// Получаем все элементы
$q = $modx->newQuery('galItem');
$q->join('galAlbumItem', 'AlbumItems');
$q->where(array(
'AlbumItems.album' => $album,
));
if($items=$modx->getCollection('galItem', $q)){
foreach($items as $item){
$item = array(
'name' =>$item->get('name'),
'description' =>$item->get('description'),
// 'filename' =>$item->get('filename'), // 'mediatype' =>$item->get('mediatype'), // 'url' =>$item->get('url'), 'relativeImage' => $item->get('relativeImage'), // 'thumbnail' =>$item->get('thumbnail'), // 'image' =>$item->get('image'), // 'absoluteImage' =>$item->get('absoluteImage'), // 'filesize' =>$item->get('filesize'), // 'image_path' =>$item->get('image_path'), ); if($rowTpl){ $smarty->assign('item',$item); $output.=$smarty->fetch($rowTpl); } else{ $output[]=$item; } } } return !empty($assign) ? $smarty->assign($assign, $output) : $output; }
Пожалуйста.
Да, подобные решения очень нужны. Планирую выпустить серьезно обновленную сборку, в котором будет больше готовых модулей на процессорах+Smarty, включая менюшку на процессорах и т.п. Но вот оформлению в виде Smarty-плагинов предпочитаю именно процессоры. Есть ряд причин:
согласен. В принципе, я вчера и процессор испытал — все удобно. И полностью согласен с тобой в плане процессоров. Просто я пока во всем этом новичок, все интересно, да и опыта набираюсь потихоньку.
Не, поиграться и попробовать различные способы — это и полезно, и интересно. Всяко поддерживаю.
Здравствуйте, использую ваш код, ссылка /assets/components/gallery/connector.php?action=web/image/gallery/small&src=/assets/gallery/1/2.jpg"/> выдает сообщение {«success»:false,«message»:"\u0414\u043e\u0441\u0442\u0443\u043f \u0437\u0430\u043a\u0440\u044b\u0442.",«total»:0,«data»:[],«object»:{«code»:401}}. Как это можно исправить?
Здравствуйте. 1. Смотрите коннектор вызываемый. Там в паблике без проверки прав будет работать только для действия web/phpthumb. 2. В помощь: modxclub.ru/blog/voprosy-spetsyalistov/136.html