Fi1osof 19 июля 2013 12 173
Так как все больше программистов пытаются взять на вооружение объявленную технологию, и методика боле менее обкаталась и приняла четкие очертания, пишу пошаговую инструкцию как и с чего начать.

Весь процесс я заснял и выкладываю в виде подробного часового ролика. Но кому лень смотреть, или формат не удобный/скучный, расписываю здесь пошаговую инструкцию.



1. Устанавливаем чистую MODX Revolution.

2. Добавляем новый источник пакетов.
Как минимум пакет modxSite не лежит в официальном репозитории modx.com, по этому его предстоит скачать с rest.modxstore.ru/extras/.



3. Устанавливаем пакеты:
  • Ace
  • modxSDK
  • modxSite (из rest.modxstore.ru/extras/)
  • modxSmarty
  • shopModx (из него нам понадобятся только процессоры для выборки документов)
  • phpTemplates
  • Console
  • getPage

Здесь есть момент: я пока не выпустил новый пакет с фиксом, чтобы Ace воспринимал файлы .tpl как HTML-файлы, поэтому после установки modxSDK необходимо добавить одну строчку в JS-файл в перечислении типов файлов.
case 'tpl':






4. Создаем базовый контроллер.
Для этого создаем статический MODX-шаблон. Файл шаблона должен иметь расширение .php (к примеру, base.php) и запишем в шаблон следующий код:
<?php
// Получаем свойства текущего MODX-шаблона
$properties = $modx->resource->getOne('Template')->getProperties();
// Если в настройках шаблона не указано название файла-шаблона,
// то используем по умолчанию index.tpl
if(!empty($properties['tpl'])){
    $tpl = $properties['tpl'];
}
else{
    $tpl = 'index.tpl';
}
// Если документ не кешируемый, то отключаем кеширование Smarty
// (кеширование Smarty включается/выключается в настройках modxSmarty. По умолчанию отключено).
if ($modx->resource->cacheable != '1') {
    $modx->smarty->caching = false;
}
// Отрабатываем Smarty-шаблон и возвращаем результат
return $modx->smarty->fetch("tpl/{$tpl}");


Таким образом мы получим универсальный контроллер, и в дальнейшем на большинство шаблонов его будет вполне достаточно. И если вам надо создать новый MODX-шаблон просто с целью привязать новые TV-параметры, вы также указываете этот статический файл base.php в качестве источника кода для шаблона, и ничего дополнительно делать не придется. А если надо будет и отображение изменить (конечный шаблон), то просто в свойствах MODX-шаблона указываете новую настройку tpl сназванием файла-шаблона. (Если здесь не понятно, лучше посмотреть видео).

По поводу кеширования MODX-шаблонов: если у шаблона нет настройки phptemplates.non-cached=true, то при повторном заходе на страницу шаблон не будет опять обрабатываться, а просто будет отдаваться код из кеша страницы. Если надо отключить кеширование шаблона, то просто в шаблоне создаем такую настройку, и устанавливаем в true. А иначе придется после каждого изменения в коде шаблона сбрасывать кеш сайта (то есть это как правило надо на время программинга или отладки).



Важно создать плагин на событие OnHandlerRequest, но с рангом очередности выше плагина modxSmarty. Это чтобы в Smarty-шаблонах переменная $template_url формировала путь к папке публичной части шаблона.
<?php
switch($modx->event->name){
    case 'OnHandleRequest':
        if($modx->context->key == 'mgr'){
            return;    
        }
        //URL к файлам шаблона (css, js, images etc.)
        $modx->smarty->assign('template_url',
            $modx->getOption('modxSite.template_url').$modx->getOption('modxSmarty.template').'/');
        break; 
}


Код вызова процессора через консоль (может использоваться в сниппетах и плагинах):
<?php
print '<pre>';
$modx->setLogLevel(3);
$namespace = 'shopmodx';
if(!$response = $modx->runProcessor('web/getdata', 
array(
    // Параметры
), array(
    'processors_path'   => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/',        
))){
    print "Не удалось выполнить процессор";    
    return;
}
print_r($response->getResponse());


Код общего процессора для выборки документов с условиями, расширяющего базовый процессор из shopModx-а.
<?php

require_once MODX_CORE_PATH .'components/shopmodx/processors/web/getdata.class.php';

class modWebGetdataProcessor extends ShopmodxWebGetDataProcessor{
    
    public function initialize(){
        
        $this->setDefaultProperties(array(
            'sort'              => "{$this->classKey}.menuindex",
            'dir'               => 'ASC',
            'showhidden'        => false,
            'showunpublished'   => false,
            'getPage'           => false,
            'limit'             => 10,
            'page'              => !empty($_REQUEST['page']) ? (int)$_REQUEST['page'] : 0
        ));
        
        
        if($page = $this->getProperty('page') AND $page > 1 AND $limit = $this->getProperty('limit', 0)){
            $this->setProperty('start', ($page-1) * $limit);
        }
        
        return parent::initialize();
    }
    
    public function prepareQueryBeforeCount(xPDOQuery $c) {
        $c = parent::prepareQueryBeforeCount($c);
        
        $where = array(
            'deleted'   => false,
        );
        
        if(!$this->getProperty('showhidden', false)){
            $where['hidemenu'] = 0;
        }
        
        if(!$this->getProperty('showunpublished', false)){
            $where['published'] = 1;
        }
        
        $c->where($where);
        
        return $c;
    }
    
    
    public function outputArray(array $array, $count = false) {
        if($this->getProperty('getPage') AND $limit = $this->getProperty('limit')){
            $this->modx->setPlaceholder('total', $count);
            $this->modx->runSnippet('getPage@getPage', array(
                'limit' => $limit,
            ));
        }
        return parent::outputArray($array, $count);
    }
}

return  'modWebGetdataProcessor';


P.S. Здесь очень сложно расписать все, так что кому интересно, все-таки сделайте усилие и посмотрите видеоролик. Там основное рассказано и показано в первые 30 минут. Вторая часть ролика может и очень нудная, но там есть неплохие примеры по использованию всего этого дела.
И не стесняйтесь, задавайте вопросы.
173 комментария
a
alone-elvi 28 июля 2013г в 15:25 #
Добрый день.

У меня на MAC OS в firefox (в других браузерах не смотрел) в SDK обнаружился такой косяк, не хочет работать пробел, то есть SDK не реагирует никак на эту кнопку. Если копировать пробел в редактируемый файл, то копируется 4 пробела. И не реагирует на теги, то есть, открывающиеся и закрывающиеся теги проставляю самостоятельно.

Спасибо.
Fi1osof1
Fi1osof 28 июля 2013г в 15:34 #
Алишер, привет!

Предпредыдущий топик буквально: modxclub.ru/blog/voprosy-spetsyalistov/146.html
a
alone-elvi 28 июля 2013г в 15:52 #
ОЙ :)
e
e_v_medvedev 02 августа 2013г в 14:23 #
В тексте поставщик modxSite указан в домене com, а на картинке ru. У меня после добавления ни с одного из них перечня доступных пакетов не видно. По прежнему только modx.com.

Еще бы не помешало указать разделы на modx.com в которых нужные пакеты лежат (хотя бы в скобках за названием пакета), а то поиск в менеджере пакетов толком не работает.
Fi1osof1
Fi1osof 02 августа 2013г в 14:44 #
Судя по вашему комментарию у вас стоит Revo 2.1.5
А ничего, что уже 2.2.8 актуальная версия? Не пробовали откатываться еще на более раннюю версию, к примеру 2.0.8 (тогда еще даже поддержка многих Эво-функций была). Все современные пакеты работают с версии, начиная 2.2.0, для вашего движка просто нет доступных пакетов.
e
e_v_medvedev 02 августа 2013г в 14:59 #
Тогда имеет смысл хотя бы указывать требования к версии Modx, на которую все это ставится. Обновление не всегда полезно. Особенно для Opensource софта.
Fi1osof1
Fi1osof 02 августа 2013г в 15:08 #
Тогда имеет смысл хотя бы указывать требования к версии Modx, на которую все это ставится.
Имеет смысл не искать виновных кругом, а начинать сомневаться в своих знаниях. На modx.com во всех пакетах указана минимальная поддерживаемая версия MODX.



Обновление не всегда полезно. Особенно для Opensource софта.
Чел, ты жгешь напалмом! Будь то опенсурс, или коммерческий продукт — понятное дело, что всегда обновление надо тестировать. Но обновляться надо всегда. Элементарно, твой сайт сейчас вскрыть можно как делать нефиг, так как до версии 2.2.7 все версии имеют критические уязвимости. Ты сидишь на древней системе, забыв что такое обновления, а сейчас ходишь и учишь кругом всех кто и как должен специально тебя предупреждать, что пакеты не рассчитаны на версии MODX, разработанные ПОЧТИ ДВА ГОДА НАЗАД.
a
alone-elvi 03 августа 2013г в 21:12 #
>>Важно создать плагин на событие OnHandlerRequest, но с рангом очередности выше плагина modxSmarty. Это чтобы в Smarty-шаблонах переменная $template_url формировала путь к папке публичной части шаблона.

У меня тут траблы, выдает ошибку. Я создал плагин, обозвал его, как попало, установил галкой OnHandlerRequest в параметрах и нарвался на мат со стороны движка.

Спасибо.
Fi1osof1
Fi1osof 03 августа 2013г в 21:24 #
Но ты ему в итоге изменил ранг? Сделал, чтобы он после основного модуля вызывался?
a
alone-elvi 03 августа 2013г в 22:07 #
НЕ сделал, я не нашел, где это делается.
a
alone-elvi 03 августа 2013г в 22:12 #
Нашел в «Системных событиях», у Modxsmarty установил в 1, у своего плагина, 0.

Получаю:

Fatal error: Call to a member function assign() on a non-object in /home/u358292/to-l.ru/www/core/cache/includes/elements/modplugin/8.include.cache.php on line 13

Catchable fatal error: Argument 1 passed to xPDOObject::load() must be an instance of xPDO, instance of modX given in /home/u358292/to-l.ru/www/core/xpdo/om/xpdoobject.class.php on line 404
Fi1osof1
Fi1osof 03 августа 2013г в 22:12 #
Так надо-то наоборот. Сначала $modx->smarty должен появиться (это основной модуль), и только потом уже свое что-то вытворяешь.
a
alone-elvi 03 августа 2013г в 22:14 #
Я подумал, что приоритет 0, выше, чем у 1.
Fi1osof1
Fi1osof 03 августа 2013г в 22:24 #
Можно было поиграться, поменять местами.
Fi1osof1
Fi1osof 03 августа 2013г в 22:26 #
И, еще в школе по информатике учили: не ставь индексы по порядку (0,1,2,3), оставляй место для маневров (пиши хотя бы 0, 10, 20, 30, чтобы при необходимость можно было 15 вставить и т.п., а не переставлять все элементы).
a
alone-elvi 03 августа 2013г в 22:33 #
У меня в школе информатика была немного другой :)
Можно было, но страшно :)
Fi1osof1
Fi1osof 03 августа 2013г в 22:12 #
В событиях плагина.
a
alone-elvi 03 августа 2013г в 22:42 #
Коль, а не напишешь или подскажешь, ка иметь на сайте несколько шаблонов для разного типа страниц, я к тебе приставал с таким вопросом помнится, но, все же… :)
Fi1osof1
Fi1osof 03 августа 2013г в 23:08 #
По поводу той давней истории с подменой шаблона через TV-параметры страницы — не подскажу, ибо изврат это.
А для разного типа страниц заводятся разные шаблоны и назначаются они стандартными средствами MODX-а.
a
alone-elvi 03 августа 2013г в 23:55 #
Да, но я не совсем понял, как правильно сделать это со smarty.
Fi1osof1
Fi1osof 04 августа 2013г в 00:42 #
Я в топике все подробно расписывал. php-контроллер используй всегда один, а в параметрах шаблона указывай параметр tpl=название шаблона.
a
almaks 14 июня 2015г в 22:27 #
Добрый день, Николай! Не могу понять, как создать отдельный шаблон для записи. Видео смотрел раз 10 полностью. Контроллер беру base.php. Прописываю параметры шаблону. Взгляните на скрин. Что я делаю не так? yadi.sk/i/p5DPHJELhFNyH
Fi1osof1
Fi1osof 14 июня 2015г в 22:33 #
a
almaks 14 июня 2015г в 22:46 #
То есть скрин тут joxi.ru/p277lwJcbGkX27
Fi1osof1
Fi1osof 14 июня 2015г в 22:48 #
Я уже дал вам ответ выше.
a
almaks 14 июня 2015г в 23:10 #
За подсказку спасибо! Но ругается: Fatal error: Uncaught --> Smarty: Unable to load template file 'tpl/single.tpl' < — thrown in /home/......../www/core/components/modxsmarty/external/smarty/libs/sysplugins/smarty_internal_template.php on line 212
a
almaks 14 июня 2015г в 23:13 #
Все, разобрался. Не в ту папку положил… Спасибо!
Fi1osof1
Fi1osof 14 июня 2015г в 23:16 #
Пожалуйста. Внимательней смотрите видео, а лучше читайте код.
Fi1osof1
Fi1osof 04 августа 2013г в 00:44 #
Пересмотри внимательно видео.
Можешь вот с этого момента: www.youtube.com/watch?feature=player_embedded&v=MBFaR1NXn8o&t=482 (хотя лучше с самого начала и до конца).
a
alone-elvi 04 августа 2013г в 00:59 #
Ага, спасибо, у меня в голове еще не сложилась правильная картинка.
den991
den99 05 августа 2013г в 18:55 #
Похвастаюсь, что я накопал. Как укорить работу парсера modx revo? Ответ очарователен.
modxclub.ru/blog/sandbox/175.html
Fi1osof1
Fi1osof 05 августа 2013г в 19:24 #
Ага, уже повесил на главную.
den991
den99 05 августа 2013г в 19:40 #
Ага, спасибо. Считаю это действительно полезной находкой и закрывает лихорадку с тормозным парсером на некоторое время.
Fi1osof1
Fi1osof 05 августа 2013г в 20:15 #
Но я все равно буду modxSmarty использовать :)))
den991
den99 05 августа 2013г в 20:26 #
Так и я использую. На новом проекте. А на старом… там сами черти испугаются ужаса и кашмара.
А эта штука, под названием PHP 5.4.17, вжих, и решила половину проблемы с кривым кодом сразу!

Конечно это не отменяет пересмотра кода, но это уже встало на второй план.

Повторюсь, а новый я делаю с учетом твоих решений, хотя это и путает меня пока, но знания — дело наживное.
Fi1osof1
Fi1osof 05 августа 2013г в 21:05 #
А на старом… там сами черти испугаются ужаса и кашмара.
Так делается просто: устанавливается phpTemplates+modxSmarty, берется старый шаблон, сохраняется в виде Smarty-шаблона (так же со всеми чанками и т.п.), и в этом уже шаблоне начинаешь все кешируемые сниппеты переводить на {snippet name=...}, а все чанки на {chunk name=...}. А в случае с чанками еще и по возможности полностью код из чанка на его замену (я про это писал почему так). И все. Уже за счет этого как правило нагрузка падает как минимум в два раза. А если еще и общие блоки закешируешь, так вообще сервер отдыхать будет.
Вот и все. За пару часов можно серьезно снизить нагрузку на сайт.
den991
den99 06 августа 2013г в 00:40 #
А вот это написано плотно, просто и ценно, что достойно отдельного топика.

Теперь ведь сервер простаивать будет, аж жалко 8-)

Fi1osof1
Fi1osof 06 августа 2013г в 02:35 #
Да я в общих чертах все это описывал. Но может на досуге еще напишу подробный топик как это делается.
den991
den99 06 августа 2013г в 08:08 #
vgrish1
vgrish 17 августа 2013г в 20:21 #
черт… хотел smarty попробовать! А репозиторий лежит чтоли?
Fi1osof1
Fi1osof 18 августа 2013г в 04:30 #
Так качай с моего. rest.modxstore.ru/extras/
vgrish1
vgrish 18 августа 2013г в 08:49 #
я вообщето про него и писал… вчера недоступен был! Щас все ОК!
Fi1osof1
Fi1osof 18 августа 2013г в 08:52 #
Ну вполне может быть, что были перебои (к сожалению на modxcloud такое бывает). (шепну на ухо: скоро не digitalocean перееду).

P.S. Кстати, большинство моих пакетов и в официальном репозитории лежат.
Tramp13571
Tramp1357 22 августа 2013г в 00:25 #
Ноколай, добрый вечер. Столкнулся с проблемой: при использовании процессора getdata (из shopmodx) указываю getPage=1, все выводится, но почему-то вызов
$this->modx->runSnippet('getPage@getPage', ...

не затягивает набор параметров getPage. Что может быть? Набор такой я создал.
Fi1osof1
Fi1osof 22 августа 2013г в 09:12 #
Набор создал, а сниппет завязал?


И точно никакой буквы не перепутал? Этот механизм довольно простой и обычно никаких проблем не возникает, только что кеш после каждого сохранения как правило приходится очищать.
Tramp13571
Tramp1357 22 августа 2013г в 09:29 #
Разобрался. Я наборы параметров создавал чисто под процессоры, без привязки к элементам. Сейчас привязал, и заработало. Блин, все очень просто, но столько нюансов…
Спасибо
Fi1osof1
Fi1osof 22 августа 2013г в 09:31 #
Не за что
Fi1osof1
Fi1osof 22 августа 2013г в 09:15 #
А, и еще, у тебя процессор-то надстроенный? В нем прописан вызов getPage-а?
В статье я коды приводил.
if($page = $this->getProperty('page') AND $page > 1 AND $limit = $this->getProperty('limit', 0)){
            $this->setProperty('start', ($page-1) * $limit);
        }


if($this->getProperty('getPage') AND $limit = $this->getProperty('limit')){
            $this->modx->setPlaceholder('total', $count);
            $this->modx->runSnippet('getPage@getPage', array(
                'limit' => $limit,
            ));
        }


А сам процессор из shopModx-а этого в себе не несет. Там же минимализм :-)
Tramp13571
Tramp1357 22 августа 2013г в 00:46 #
Еще я заметил, что если установить phptemplates.non-cached=false, то навигация не отрабатывается (при нажатии на номер страницы формируется адрес ?page=..., но контент выводится как для первой страницы), даже если в вызове процессора стоит nocache. Так и должно быть?
Fi1osof1
Fi1osof 22 августа 2013г в 09:19 #
Так это само собой. Как у тебя будет отрабатываться навигация, если у тебя Смарти-шаблон не отрабатывается каждый раз? В данном же случае MODX сразу отдает кеш страницы, а там процессор не вызывается. Создай блок-шаблон с вызовом процессора, выыводом элементов, постраничности и т.п. (чисто динамика), затем создай сниппет, пропиши там вызов этого блок-шаблона return $modx->smarty->fetch($tpl); и вставь в шаблон его обычным MODX-овым некешируемым сниппетом [[!mySnippet]]. Тогда у тебя страница будет закеширована, но этот сниппет всегда будет отрабатываться, и постраничность будет работать.
Tramp13571
Tramp1357 22 августа 2013г в 09:25 #
Понял, спасибо
Fi1osof1
Fi1osof 22 августа 2013г в 09:31 #
Не за что
sharpey1
sharpey 25 сентября 2013г в 20:49 #
Потихоньку осваиваю…
Для начала воспроизвел пример отсюда
Правильно ли я понимаю, что, в самом простом варианте, использование modxSmarty сводится к замене тэгов MODX блоками Smarty?
Верно ли, что, при этом, необязательно использовать modxSite?
Fi1osof1
Fi1osof 25 сентября 2013г в 20:57 #
Правильно ли я понимаю, что, в самом простом варианте, использование modxSmarty сводится к замене тэгов MODX блоками Smarty?
В общих чертах да. modxSmarty обеспечивает несколько задач:
1. Собственно, подключение Smarty, инициализацию конфигов (папки кеша и компилляции и т.п.).
2. Несколько плагинов, которые позволяют взаимодействовать с MODX более тесно (доступ к объекту $modx, вызов чанков, сниппетов, процессоров и т.п.).
3. Очистка кеша Smarty при очистке кеша сайта через меню в админке (Сайт -> обновить сайт).
Ну и собственно все.

Верно ли, что, при этом, необязательно использовать modxSite?
Верно. Просто modxSite как бы задает формат для разработки (создает нужные папки, несет несколько конфигов), в то время как modxSmarty — это абсолютно независимый пакет и не диктует условия где помещать свои папки шаблонов и в том духе.
sharpey1
sharpey 25 сентября 2013г в 21:02 #
Большое спасибо!
Я почему спросил? Напрашивается небольшой проект, я хотел, для тренировки, его реализовать на этой технологии. Высокой нагрузки там не предвидится, поэтому есть возможность к делу постепенно подойти, в процессе от простого к сложному.
Fi1osof1
Fi1osof 25 сентября 2013г в 21:42 #
Так для типового проекта можно просто взять нашу сборку для визиток. Там же уже все настроено. Просто шаблон меняйте и мелочи правьте.
sharpey1
sharpey 26 сентября 2013г в 20:49 #
Спасибо!
Наверное так и буду поступать в будущем, надеюсь. А пока попробую сам, с нуля.
Fi1osof1
Fi1osof 26 сентября 2013г в 20:51 #
ОК. Просто конечно же хорошо знать всю основу. Но не плохо посмотреть как оно уже используется, изучить, и может придумать более эффективное применение.
sharpey1
sharpey 26 сентября 2013г в 22:51 #
А вот еще пара вопросов.
1. В каких директориях порекомендуете хранить шаблоны smarty и статичные ресурсы (чанки, шаблоны)?
2. Где можно посмотреть документацию по modxSmarty, которая демонстрировалась в примере? Там примеры, как в тэгах Smarty вызывать чанки, шаблоны и др…
Fi1osof1
Fi1osof 26 сентября 2013г в 23:18 #
1. В каких директориях порекомендуете хранить шаблоны smarty и статичные ресурсы (чанки, шаблоны)?
От чанков советую отказываться в принципе, тем более статических.
А для шаблонов (если речь о статических php-шаблонах) — ставьте modxSite, там создается источник файлов Controllers. Вот там им и место (обычно Ему, так как на все хватает одного общего php-контроллера).

2. Где можно посмотреть документацию по modxSmarty, которая демонстрировалась в примере? Там примеры, как в тэгах Smarty вызывать чанки, шаблоны и др…
Очень подробный топик на эту тему: modxclub.ru/blog/dokumentatsiya-dlya-spetsialistov/147.html
С видюшкой.

А так смотрите все топики то тегу modxSmarty.
sharpey1
sharpey 30 сентября 2013г в 22:02 #
Доброго времени суток!
Не получается загрузить modxSite, или я ошибаюсь?
Пожалуйста, проверьте.
Fi1osof1
Fi1osof 01 октября 2013г в 07:12 #
Доброе утро!
Нет, modxSite качается. Его правда не видно в числе первых 10-ти пакетов, но поиск по пакетам работает.
sharpey1
sharpey 02 октября 2013г в 06:52 #
Спасибо, все получилось. У Вас в тексте инструкции указано rest.modxstore.COM/extras/, при этом на скриншоте rest.modxstore.RU/extras/
Может, это зеркало или редирект, но первый вариант выдал у меня ошибку, а второй — рабочий.
Fi1osof1
Fi1osof 02 октября 2013г в 09:08 #
Ага, косяк. Поправил. Спасибо!
sharpey1
sharpey 14 октября 2013г в 05:49 #
Доброго времени суток!
Пара вопросов.
1. Никак не могу понять в чем принципиальное отличие процессора от сниппета?
2. Отказ от чанков обеспечивается возможностью наследовать шаблоны? То есть, теперь код чанков нужно писать прямо в .tpl-никах, при необходимости переопределяя в дочерних шаблонах?
3. Правильно ли я понимаю, что верстку/дизайн/код вообще в БД хранить не следует?
Fi1osof1
Fi1osof 14 октября 2013г в 06:51 #
Доброе!
1. Никак не могу понять в чем принципиальное отличие процессора от сниппета?
Видимо вам следует углубиться в ООП. Если не знаете разницы между функцией и классом, то сложно будет понять в чем разница между сниппетом и процессором.

2. Отказ от чанков обеспечивается возможностью наследовать шаблоны? То есть, теперь код чанков нужно писать прямо в .tpl-никах, при необходимости переопределяя в дочерних шаблонах?
Это уже как вам удобнее. Чанки — это часть системы шаблонизации MODX-а. tpl-ники — это часть шаблонизации Smarty. Это два отдельных инструмента. Какой выбирать — это уже вам решать.

3. Правильно ли я понимаю, что верстку/дизайн/код вообще в БД хранить не следует?
Опять-таки — это ваше дело. На самом деле здесь вопрос не где оно хранится, а каков принцип работы этого. Со своим modxSDK я бы и чанки-сниппеты мог редактировать как статические файлы (все же в админке работаю). Но Смарти не работает с чанками из БД. К тому же Смарти работает с шаблонами именно как с файлами, и ищет их на основе указываемых путей, а чанки MODX ищет просто по их имени.
r
ret1984 19 октября 2013г в 11:44 #
Добрый день!
Есть несколько вопросов.
Сайт — 333806.tehotdel.web.hosting-test.net/goods/avtoklyuchi/
1. Пропадает постраничная навигация.
2. Пытался добавить модификатор default — безрезультатно.
<code>
<?php
function smarty_modifier_default($string, $default = '') 
{ 
    if (!isset($string) || $string === '') 
        return $default; 
    else 
        return $string; 
}
?>
</code>
Спасибо!
Fi1osof1
Fi1osof 19 октября 2013г в 18:59 #
Здравствуйте.
Пришлите доступы в личку. Скорее всего проблема в том, что у вас страница или блок кешируемый. Для постраничности требуется некешируемый вызов (getPage так работает).
Fi1osof1
Fi1osof 20 октября 2013г в 01:55 #
С сайтом разобрались. Просто кешируемый участок был, и getPage не вызывался при повторном заходе на страницу.

2. Пытался добавить модификатор default — безрезультатно.
Тоже в общих чертах разобрались. Скорее всего дело в синтаксисе. К примеру, вот так работает:
{$modx->resource->longtitle|default:$modx->resource->pagetitle}
r
ret1984 20 октября 2013г в 02:29 #
Спасибо!
Fi1osof1
Fi1osof 20 октября 2013г в 02:32 #
Пожалуйста
Tramp13571
Tramp1357 30 октября 2013г в 12:07 #
Отличная среда.
Одно пожелание: неплохо было бы где-нить в среде modxsdk выводить путь к файлу, а то когда открываешь несколько файлов из разных каталогов, но с одинаковыми именами, поначалу путаешься.
Fi1osof1
Fi1osof 30 октября 2013г в 15:26 #
Да, есть такое дело. Думаю, в новой версии сделаем.
w
web-ramos 16 ноября 2013г в 22:25 #
Доброго времени суток!
Сейчас делаю сайт с применением phpTempates+ModxSmarty и с процессорами вместо сниппетов. Все замечательно! Очень быстро! Достаточно удобно и легко.
Ну а теперь вопрос чайника, помогите плиз — у меня есть доп параметр в ресурсе, допустим count(количество), применяю для выборки процессоры, наследованые от getdata (из modxshop), как делать фильтры по tv — разобрался (через $c->innerJoin), как сделать сортировку по указанному полю никак не могу понять, можете привести простой пример для getdata процессора сортировки по определеному tv?
Fi1osof1
Fi1osof 17 ноября 2013г в 20:07 #
Просто в initialize() добавьте:
$this->setDefaultProperties(array(
    "sort"   => "tvtablealias.value",
    "dir"    => "ASC",
));
w
web-ramos 17 ноября 2013г в 20:24 #
$this->setDefaultProperties(array(
'sort' => 'price.value',
'dir' => 'ASC',
'showhidden' => false,
'showunpublished' => false,
да, так делал — выдает пустой результат, если делаю также по полю основному полю документа, все нормально, по дополнительному (по любому
— никак)
Fi1osof1
Fi1osof 17 ноября 2013г в 20:51 #
Давайте на гистхаб весь код процессора. И скорее всего вы просто price не в методе prepareQueryBeforeCount() добавляете.
w
web-ramos 17 ноября 2013г в 21:44 #
Fi1osof1
Fi1osof 18 ноября 2013г в 09:47 #
Но у вас таблица с алиасом price в принципе там не добавлена. Она же просто так из воздуха в запросе не появится. Вот смотрите пример: github.com/Fi1osof/ShopModxBox/blob/17791a616ccb43245dfdac5f6defb81a2c90b815/core/components/modxsite/processors/web/catalog/products/getdata.class.php#L35
То есть в prepareQueryBeforeCount() вам уже надо добавить те таблицы, по которым будет идти поиск и/или сортировка.
w
web-ramos 18 ноября 2013г в 15:26 #
да фильтр я именно так и делал, а как сортировку сделать по определеному дополнительному полю немного не понимаю. В родительском процессоре ShopmodxWebGetDataProcessor уже идет присоединение базы с доп параметрами, правда в другом методе я почему то и думал что база присоединена и можно просто указывать sort

protected function setSelection(xPDOQuery $c) {
$c = parent::setSelection($c);
if($this->getProperty('includeTVs')){
$c->leftJoin('modTemplateVarResource', 'TemplateVarResources');
$c->leftJoin('modTemplateVar', 'tv', «tv.id=TemplateVarResources.tmplvarid»);
$c->select(array(
«tv.id as tv_id»,
'tv.name as tv_name',
«TemplateVarResources.id as tv_value_id»,
«TemplateVarResources.value as tv_value»,
));
}
return $c;
}
Fi1osof1
Fi1osof 20 ноября 2013г в 13:30 #
я почему то и думал что база присоединена и можно просто указывать sort
Да, там присоединяется таблица, но это одна таблица с алиасом TemplateVarResources, и соотношение один-ко-многим. То есть у вас получится в итоге строк «кол-во записей в site_content» * «кол-во записей в site_template_var_resources». Это общие данные и именно по ним сортировать не стоит, так как потом это в цикле набивается в конечный массив и вам там сортировка никак не гарантируется.
Вы же хотите сортировать по конкретному TV-параметру. Соответственно надо приджоинить эту таблицу с указанием id TV-шки и сортировать конкретно по нему.
В общем, здесь у вас поз знания SQL-я четкое понимание вряд ли выйдет.
w
web-ramos 19 ноября 2013г в 00:55 #
Спасибо за помощь, все получилось, с методами разобрался.
Fi1osof1
Fi1osof 20 ноября 2013г в 13:30 #
Пожалуйста.
y
yanos 24 ноября 2013г в 12:59 #
Добрый день. Делал по вашей видео инструкции.
выскакивает ошибка на этапе создания проекта object_err_save. С правами вроде всё хорошо
Fi1osof1
Fi1osof 24 ноября 2013г в 18:11 #
Создание какого именно объекта?
Y
Yuriy86 19 ноября 2014г в 00:39 #
На моменте создания проекта

Fi1osof1
Fi1osof 19 ноября 2014г в 18:27 #
Может не все таблицы были созданы. Попробуйте переустановить пакет modxSDK.
Y
Yuriy86 19 ноября 2014г в 19:04 #
К сожалению не помогло, результат тот же
Fi1osof1
Fi1osof 19 ноября 2014г в 19:29 #
Пришлите доступ в админку на n.lanets@modxclub.ru, вечером гляну что и как, отпишусь.
n
nirfrost 24 ноября 2013г в 17:37 #
что то пробел на работает в modxsdk
у кого такое было?
Fi1osof1
Fi1osof 24 ноября 2013г в 18:10 #
В настройках бэкэнда уберите компрессию JS-а. У нас там небольшая бага, которую пока не пофиксили.
n
nirfrost 24 ноября 2013г в 18:20 #
да есть спасибо
а еще вопрос как шрифт увеличить в редакторе а то глаза так вилезуть)
Fi1osof1
Fi1osof 24 ноября 2013г в 20:20 #
Вот этого с ходу не подскажу. Наверняка это делается в конфигурации самой библиотеки Ace (только не MODX-компонент Ace, а та библиотека, которая вместе modxSDK заливается. Смотрите ее в manager/components/modxsdk/).
proxyfabio1
proxyfabio 16 декабря 2013г в 19:51 #
Есть простое решение: ctrl +.
Fi1osof1
Fi1osof 16 декабря 2013г в 19:57 #
Это слишком жестко))
proxyfabio1
proxyfabio 16 декабря 2013г в 20:01 #
А что, я когда далеко от ноута сижу, то в 125% выставляю увеличение и ок.
Fi1osof1
Fi1osof 16 декабря 2013г в 20:05 #
Но тогда все в 125% переходит… Хотя да, иногда я тоже этим пользуюсь.
n
nirfrost 24 ноября 2013г в 18:50 #
Есть вопрос

есть вызов wayfinder

пишу его в {snippet name=Wayfinder params="&startId=`0`&level=`1` &outerTpl=`outerTpl`&rowTpl=`rowTpl`&hereClass=`activeItem`"}
а вот как заменить чанки outerTpl и rowTpl
чтоб тут же в smarty и прописать а не в чанки ссылаться хотя на выходе оно выводить все в html но думаю это не правильно
Fi1osof1
Fi1osof 24 ноября 2013г в 20:23 #
В случае с Wayfinder-ом — никак. Он на чанки рассчитан (может конечно и с файлами, но это все равно не будет Smarty-шаблонизация).
Здесь только если использовать процессор для формирования меню. Про него я писал здесь: modxclub.ru/blog/modx-club-portfolio/153.html (см. 2. Замена Wayfinder)
n
nirfrost 24 ноября 2013г в 20:39 #
очень полезно) спасибо
Fi1osof1
Fi1osof 24 ноября 2013г в 23:24 #
Пожалуйста.
n
nirfrost 24 ноября 2013г в 20:47 #
ну как я понимаю главное чтоб на выходе был html для скорости работы сайта — в кеш он и подает даже если там чанки в параметрах стоят я смотрел
Fi1osof1
Fi1osof 24 ноября 2013г в 23:27 #
Можно в вызов сниппета передать параметр parse, к примеру {snippet name=Wayfinder params=$params parse=true}
Тогда полностью весь код Wayfinder-а вместе с чанками шаблонов будет отработан MODX-парсером еще на уровне Smarty, и дальше будет выдан чистый HTML. Если менюшка кешируемая, то можно смело так делать.
Код плагина.
n
nirfrost 25 ноября 2013г в 16:16 #
спасибо за ответ
отличный пример
Fi1osof1
Fi1osof 25 ноября 2013г в 19:20 #
Пожалуйста
n
nirfrost 16 декабря 2013г в 14:43 #
Добрый день!
есть такой вызов снипетта {snippet name=getProducts params="&parents=`$item.id`&tpl=`menuRowTpl2`&useSmarty=`true`&where=`['template': 3]`" parse=true}

так вот как правильно записать этот параметр &where=`['template': 3]`

???
Fi1osof1
Fi1osof 16 декабря 2013г в 19:19 #
Добрый!
так вот как правильно записать этот параметр &where=`['template': 3]`
Вообще это уже надо смотреть документацию getProducts, но насколько я знаю, там в where надо передавать JSON-строку, то есть в чистом виде массив-условие мы не можем передать, а у вас тут судя по всему невалидный JSON. У вас именованный массив, а в JSON-е — это обязательно объект. То есть надо пробовать или {"template":3} или [{"template":3}] (второе вероятней всего).
proxyfabio1
proxyfabio 16 декабря 2013г в 19:47 #
«» json не одобрит. Только "", только хардкор.
Fi1osof1
Fi1osof 16 декабря 2013г в 19:56 #
Все верно. Я и писал с кавычками. Это меня jevix подставил… Заменил на сущности.
n
nirfrost 16 декабря 2013г в 20:19 #
не один из вариантов не подошол(
Fi1osof1
Fi1osof 16 декабря 2013г в 21:51 #
Придется вам глубже копать. Там явно JSON-строка идет.
Вклинивайтесь в компонент и смотрите какой он там конечный SQL формирует.
Есть маленькая вероятность, что не правильно формируется запрос (не однозначно задан template). Попробуйте указать [{"modResource.template":3}]
n
nirfrost 16 декабря 2013г в 22:04 #
спасибо буду рыть)
Fi1osof1
Fi1osof 16 декабря 2013г в 22:30 #
пожалуйста.
Fi1osof1
Fi1osof 23 декабря 2013г в 14:50 #
Уточнение по данному вопросу: оказывается, надо было сделать так, чтобы искал сразу по нескольким шаблонам. В таком случае надо просто передать массив шаблонов, к примеру: {"template:in":[3,4,8]}
еще был вопрос, как исключить шаблоны. Тогда или {"template:not in":[3,4,8]} (если массив), или {"template:!=":3} (если исключаем один).
n
nirfrost 23 декабря 2013г в 14:59 #
а для smarty вызова снипета тогда как записать это?
Fi1osof1
Fi1osof 23 декабря 2013г в 15:03 #
Так все то же самое.
{snippet name=getProducts params='&parents=`$item.id`&tpl=`menuRowTpl2`&useSmarty=`true`&where=`{"template:in":[3,4,8]}`' parse=true}
n
nirfrost 23 декабря 2013г в 15:04 #
спасибо огромное)
Fi1osof1
Fi1osof 23 декабря 2013г в 15:08 #
Пожалуйста!
Fi1osof1
Fi1osof 23 декабря 2013г в 15:08 #
И вот так можно:
{assign var=params value=[
    "parents"   => $item.id,
    "tpl"       => "menuRowTpl2",
    "useSmarty" => true,
    "where"     => '{"template:in":[3,4,8]}'
]}

{snippet name=getProducts params=$params parse=true}
n
nirfrost 23 декабря 2013г в 15:19 #
Да этот вариант лучше! Советую всем иммено его использовать
K
Kutuz27 07 января 2014г в 23:43 #
Доброго времени суток, Хорошие видеоролики. понял что дефолтовый MODX движек просто использовать нельзя, слишком большая нагрузка в случае роста посетителей. в связи с этим не могу состыковать в понятии smarty и сам modx, здесь 3 вида синтаксиса, сразу скажу что я так сказать новичек, но не то чтобы новичек учусь быстро достаточно, все-же возникают трудности с непониманием некоторых принципов. Есть огромное желание разобраться в WEB-програминге в данный момент усилия ариентированы на MODX(+Исключительно Smarty), т.к он как мне показалось не самый пафосный движек)))ненужного в нем мало.
Проблема состоит в том что я немогу найти документации по таким фишкам как — вызов функций, атрибуты и т.д в MODX+Smarty, а по отдельности туториалы не стыкуются, в этой связке используются внутриние функции и классы — разобрать горы кода, чтобы понять где и откуда берется, кажется нереальным или как минимум не самым лучшим, чтото мне подсказывает что есть вариант более легкий))))
что-бы я сам тут не запутался и нишел не по тому пути и в итоге с ума не сошел -у меня созревает вопрос, что мне народ посоветует? Мат часть учить -это и так ясно, но мне нужно поконкретней где и какую инфу копать.
Заранее благодарю.
Fi1osof1
Fi1osof 08 января 2014г в 01:20 #
Доброй!

Проблема состоит в том что я немогу найти документации по таким фишкам как — вызов функций, атрибуты и т.д в MODX+Smarty
Самое главное что надо освоить — php. Тогда и понимание будет, так как Smarty — это по сути php-шаблонизатор. И в связке MODX+Smarty, Smarty как был отдельным независимым шаблонизатором, так им и остается, документацию по Smarty смотрите на оффсайте. В modxSmarty только несколько наших функций-плагинов для более тесной интеграцией с MODX (хотя ввиду того, что в шаблонах доступен объект $modx вместе со всем его API, возможно бОльшая часть этих плагинов будет удалена в дальнейшем). Смотрите внимательней видео и изучайте API MODX (оффдокументация http://rtfm.modx.com/revolution/2.x/).
K
Kutuz27 08 января 2014г в 15:29 #
Теперь то понятно куда копать, возможно глупый вопрос задам, про удаление плагинов — я так понимаю в дальнейшем чтобы вызвать опеределенный сниппет, чанк и т.п. нужно будет обращаться непосредственно к $modx->обьект($имя) из смарти шаблонов?, тоесть можно и сейчас подобным образом делать?.. Спасибо ссылки полезные, пойду инфу вникать, потом опять попробую штурмовать MODX.
Fi1osof1
Fi1osof 08 января 2014г в 21:29 #
я так понимаю в дальнейшем чтобы вызвать опеределенный сниппет, чанк и т.п. нужно будет обращаться непосредственно к $modx->обьект($имя) из смарти шаблонов?

Сравним:
{chunk name=«Chunkname» params=«foo=`foo`»} против
{$modx->getChunk(«Chunkname», [«foo» => «foo»])}

Разница не большая, но зато минус один подгружаемый файл-функция. Хотя вот так уже не запишешь: {$modx->getChunk(«Chunkname», «foo=`foo`»)}

Но это еще так, предварительно, так что может про запас их и оставим, все равно они подгружаются только тогда, когда в шаблоне прописаны теги. А сами стараться будем через $modx работать.
K
Kutuz27 09 января 2014г в 20:18 #
Копаясь по просторам интернета, и в дерикториях ядра, так и не понел по каким запросам можно обращаться в $modx->?, все на чем мои проделки заканчиваються это те запросы которые промелькали в видео, но ведь то что на видео это скорей всего не предел, хочеться видеть всё своими глазами чтобы можно было самому уже в свободное плаванье отправиться и модифицировать.где-то же всетаки записано какие запросы и в каком виде, именно сам API MODX нужен а там и смарти поймется самособой если будет нужно)
в MODXSDK не нашел поиск, копировал код в кодлобстер и там искал параметры)))))
ковыряясь в xPDO и modX классах, задумал ламерский вопрос))
вот допустим
$this->getOption('parser_class_path', null, '') скопировал просто для примера.
сам метод getOption() находиться в классе xpdo, там даже 2 одноименныйх метода почемуто, но это не втему, неясно откуда береться 'parser_class_path' и всё что вызывает getOption() например 'site_start', 'site_name', Где-то это записано, а вот где) вопрос на котором весь процесс разработки(если так можно сказать в моем случае=) ) заходит в тупик.)
PS. Чую мои уши будут гореть:D
Fi1osof1
Fi1osof 09 января 2014г в 20:40 #
Могу только одно сказать: modxclub.ru/obuchenie-modx-revolution.html
K
Kutuz27 09 января 2014г в 21:41 #
Слишком рано для меня я буквально 3 дня в теме программирования, не имея даже сферы образования, базы информатики(разве вскольз), совершенно зеленый.И вы сразу ставите в курс дела.;)
Вобщем очень полезная информация, Получить обучение от профессионалов узнать так сказать всё из первых уст)
Хороший пинок к действиям))благодаря вам нашел: MODX Revolution объекты, Объектная модель MODx Revo API. Статья для понимания.Буду благодарен если изучу движек, всему свое время).
Fi1osof1
Fi1osof 09 января 2014г в 22:53 #
Ваше право выбирать.
D
DzirT 11 января 2014г в 12:43 #
Скажите пож-та, в чем может быть проблема? Я собственно не программист, и куда надо смотреть не понимаю. Не работает постраничная навигация и все, на Вашем же шаблоне дефолтовом, его не изменял. Все настройки перепроверил — все нормально. Кеш MODX уже полностью в настройках отключил — результата нет. Версии php менял. Сам HTML код из файла tpl выводится. Все что должно быть на месте [[+page.nav]] в исходном коде пусто.
Fi1osof1
Fi1osof 11 января 2014г в 18:49 #
1. Повторюсь: данная сборка требует знания в области веб-программирования.
2. [[+page.nav]] просто так не работает. Надо чтобы выполнился сниппет getPage, который и формирует данные для постраничности. Для этого просто в вызываемый процессор выборки товаров или документов надо передавать параметр getPage=>true.
Вот еще наш специалист написал Smarty-плагин для постраничности: modxclub.ru/blog/dokumentatsiya-dlya-spetsialistov/268.html
Тоже можете попробовать взять на вооружение.
K
Kutuz27 24 января 2014г в 14:02 #
Всего-то навсего нужно API внимательно изучить, чтобы знать как что вызывать и что вообще можно вызвать, а далее уже прикручиваем все что вздумается, MODX очень гибкий и вместе с тем отличная площадка для разработчиков. Тут даже думать интересно становиться) До разраба мне конечно дaлеко, да и не за этим я здесь, просто захотел себе да и знакомым сайт создать, будучи даже и близко не шаря в программировании.
Считаю что у ModX хорошее будующее)
Fi1osof1
Fi1osof 25 января 2014г в 09:53 #
Всего-то навсего нужно API внимательно изучить, чтобы знать как что вызывать и что вообще можно вызвать, а далее уже прикручиваем все что вздумается
Все так! С учетом того, что в Smarty-шаблонах нам полностью доступен объект $modx, делать там можно все, что угодно.

До разраба мне конечно дaлеко, да и не за этим я здесь, просто захотел себе да и знакомым сайт создать, будучи даже и близко не шаря в программировании.
А вот это уже чуть сложнее. Дело в том, что наши технологии как раз больше рассчитаны на программистов, и требуют хоть каких-то навыков в программировании.
proxies1
proxies 02 марта 2014г в 13:27 #
Вчера просидел до 5 утра, так и не разобрался, к сожалению с php я пока на Вы… подскажите пожалуйста, вот:


$this->setDefaultProperties(array(
    'parent'    => 4,
    'limit'     => 200,
));
В каталоге 3 уровня вложенности, есть ресурсы с isfolder=1,templates=3 есть isfolder=0,templates=5.
Задача вывести все ресурсы isfolder=0,templates=5
Почему то он выводит только первый уровень вложенности, а мне надо все 3 уровня которые вложены в id 4… так вообще выдает ошибку

...
'parent'    => 4,
'where' => [
     'template' => 5
],
...
Fi1osof1
Fi1osof 02 марта 2014г в 17:09 #
Почему то он выводит только первый уровень вложенности, а мне надо все 3 уровня которые вложены в id 4…
Вам здесь не только знание php требуется, но еще и знание SQL. Если вы указываете parent=>4, это уже получается $where[«parent»] = $parent; (см. код).
Плюс к этому вы еще указываете 'template' => 5.

В итоге у вас получается

'where' => [
    'parent'    => 4,
    'template' => 5
],

То есть в вашу выборку могут попасть только те документы, которые являются непосредственно дочерними для документа с id 4, а так же у которых шаблон 5. К этому еще не забываем про автоматически добавленные условия Опубликован, Не удален, Не скрыт из меню.

Резюмирую: если вы явно указываете раздел, то будут получены документы только этого раздела.

А если вы хотите получить все документы во всех вложенных разделах, то эта задача весьма не простая, и требует правильной организации каталога, чтобы можно было попроще это выполнить. Есть два пути:
1. Все целевые документы должны иметь какой-то уникальный признак, который бы позволил сделать выборку без учета вложенности. К примеру, иметь какой-то свой особенный шаблон или типа того.
2. Если не сделано как в первом пункте, то придется выполнять перебор всех необходимых уровней и выбирать оттуда нужные документы. В качестве примера можете изучить процессор, который получает товары из определенного раздела. Он сначала перебором делает выборку всех дочерних разделов, а потом получает конечную выборку товаров, для которых указанные разделы являются родительскими.
proxies1
proxies 02 марта 2014г в 15:32 #

{assign var=params value=[
    "parents"   => 4,
    "tpl"       => "productSmarty",
    "useSmarty" => true,
    "where"     => '{"template:in":[5]}'
]}
{snippet name=getProducts params=$params parse=true}

так тоже выводит только первый уровень, и не работает depth.
Почему так? почему не где не написано, это же важный момент, почему везде примеры которые выводят один первый уровень…
Fi1osof1
Fi1osof 02 марта 2014г в 17:10 #
Ответил подробно выше.
D
DzirT 19 марта 2014г в 18:19 #
Здравствуйте! прошу прощения — снова глупый вопрос. Несколько раз пересмотрел ролики, так и не понятно про расширение шаблона почему оно не работает.
Создаю в корне left.tpl c текстовым содержимом в div:
<div>
sssssss
</div>

или так:
{block name=left}
<div>
sssssss
</div>
{/block}


вызываю в layout.tpl:
{block name=left}
       {field name=left}
 {/block}


Ни какой реакции. Что делается не правильно?
Fi1osof1
Fi1osof 20 марта 2014г в 13:08 #
Что делается не правильно?
Все делается неправильно :)
Если вы хотите в шаблоне подгрузить другой шаблон-файл, то это делается через include, то есть в вашем случае {include file=«left.tpl»}
Тогда будет пудгружен именно файл.
А блоки — это не шаблоны-файлы, это части шаблонов, и они будут иметь смысл только при расширении шаблонов и наличии их в расширяемом шаблоне. То есть, у вас есть старший шаблон layout.tpl и расширяющий его grid.tpl (в котором сразу в начале шаблона прописано {extends file=«layout.tpl»}). Вот если у вас в layout.tpl прописан блок какой-нибудь, например {block name=left}{/block}, вот тогда в grid.tpl его можно будет переопределить. Нельзя переопределить блок, которого нет в родительском.

А на будущее: читайте документацию по самому Smarty, ее много и она толковая. Мы от себя в Smarty ничего лишнего не добавляем, то есть все работает стандартно.
K
Kutuz27 26 августа 2014г в 17:03 #
Прошу расмотреть обновление класса modSiteWebResourcesGetdataProcessor в сборке modxsite в репозитории, зачем городить новый пакет изза того что можно использовать этот, обновите пакет modxsite в репозитории пожалуйста.

summary теперь чиститься от изображений (summaryClearImages)
collapseParent - возможность выборки всех всех документов в разделе минуя вложенность
ну и самое ради чего это все , это конечно же изображения, изображения которые были добавленны в контент тоже полезны поэтому я сделал так что мы можем просто взять и получить все или несколько ссылок по пути
images (bool) находит и включает в вывод найденные изображения
imagesLimit(integer) устанавлеваемый лимит
imagesCutBase(bool) режет домен и протокол в ссылках если есть

Outputs:
$result.object.images - индексный массив ссылок изображений
$result.object.img - первое найденное ссылок изображение

новое помечено /*NEW*/ комментарием

Fi1osof1
Fi1osof 26 августа 2014г в 17:14 #
Вот такие вещи не надо писать комментариями. Это надо отдельным топиком и там уже обсуждать, будет ли востребован новый функционал или нет.
Но за предложение в любом случае спасибо!
K
Kutuz27 26 августа 2014г в 17:28 #
я давно собирался поделиться этим, раньше видимо вы в разработке были , немог писать здесь, но щас вижу вернулись за что вам спасибо,
незачто , я замучился копировать из одной Modx в другую код процессора((, Николай удали код в моем посте пожалуйста , я немогу привыкнуть что тут нормально код не выложить ((
Fi1osof1
Fi1osof 26 августа 2014г в 17:43 #
видимо вы в разработке были

Да, мы затеяли переписать сайт с MODX+Livestreet на чистый MODX, но пришел крупный заказ, который на три с лишним месяца нас занял по полной. Сейчас вот подосвободились и я планирую очень плотно сидеть с нашим сайтом и развивать его.
К сожалению прям сразу вот так не включим код в пакет modxSite. Это действительно со всех сторон надо изучать. У меня тоже много всяких наработок по ходовой скапливается, но их приходится многократно обкатывать, прежде чем включить, чтобы убедиться что они нужны на большинстве проектов. А то так все будет разрастаться, что будет у нагружать и в изучении усложнять, а процент использования будет низким.
K
Kutuz27 26 августа 2014г в 17:59 #
ну по поводу изображений в процессоре , так я скажу вещь хорошая , заместо TV , использовать изображения из контента, в любом листинге полезно для вывода превьюхи или мини галарей
Fi1osof1
Fi1osof 26 августа 2014г в 18:04 #
Изображения из контента? ИМХО - злое зло. Во-первых, загрязняет содержимое content. Во-вторых, дополнительная нагрузка на выборках. Это как минимум. То есть если картинки нужны именно как часть контента - то пусть там они и будут, но завязывать это на процессоры? Не айс. Пусть это будет чистым контентом.
K
Kutuz27 26 августа 2014г в 18:16 #
у вас в листинге топиков , TV параметр?
Fi1osof1
Fi1osof 27 августа 2014г в 07:06 #
То есть?
K
Kutuz27 27 августа 2014г в 07:30 #
подмешивание картинок в контент зло, тогда когда контент предполагаеться использовать исключительно текстом, допустим в MODX вообще modDocument расчитан на публикацию статьи ,это следует из того что для контента у нас tinyMCE выделен, которым дано вставлять изображения в контент , вот.
а процессор нагружается только регуляркой на вырезание или получение тегов img с их ссылками , там 2 метода добавленно около 10 строки кода, ведь эти изображения не структуризованы в БД.
Конечно каждому свое , раньше я использовал TV параметр изображения и вставлял в шаблон getTVValue('tvname'), а с дополнением в процессоре , могу не заморачиваться с TV а просто добавляя в контент img c помощью tinyMCE, процессор получит все или несколько ссылкок и добавит массив в результирующий набор, при этом я вывожу уже не 1 изображение как можно сделать с помощью TV, а даже несколько, это зависит от количества img добавленных в контент или от параметра(imageLimit),
а так когда в контент не добавляются изображения то естестественно такое не понадобится.
Fi1osof1
Fi1osof 27 августа 2014г в 07:36 #
Хотите присвоить много картинок документу - используйте Migx или любой другой способ, вплоть до написание собственного модуля. Тогда у вас будет нормальное управление картинками. А загрязнять что-то чтобы потом очищать (вставлять в контент и оттуда потом выдергивать) - это не есть хорошо. Если у вас в контенте картинки должны выводиться ровно там, где и вставлены (то есть без лишних преобразований), то ОК, почему и в контент это не вставлять?
В общем, сорри, но данный код не будет добавлен в процессор. Использовать будете его вы (или еще кто-то, кому такой метод кажется нормальным), а нам он глаз будет постоянно мозолить.
K
Kutuz27 27 августа 2014г в 07:42 #
согласен что по сравнению с компонентами галерей , это вообще нахрен не годится. чет я притупил , есть же специальные компоненты)))
K
Kutuz27 27 августа 2014г в 07:38 #
кстати collapseParent параметр , решает вопрос который задал proxies выше, про уровни вложенности продукта.
Fi1osof1
Fi1osof 27 августа 2014г в 08:25 #
По моему опыту - не всегда. getChildIds() полностью основывается на кеш-карте ресурсов. А как известно - рост кеша - одна из болезней MODX-а. Так вот, приходилось сталкиваться с проектами, на которых очень много ресурсов. К примеру http://bumparfum.webtm.ru - 150 000 документов. MODX просто не сможет при сбросе кеша перебрать из базы данных все документы и нафигачить их в кеш (в карту ресурсов). Подробно про это я писал еще в 2011-ом году http://community.modx-cms.ru/blog/1744.html. С тех пор особо ничего не поменялось.
Поэтому, приходится на крупных проектах полностью отключать карту сайта (для этого используется патч cacheOptimizer). Без карты ресурсов getChildIds() бессилен.
Плюс к этому getChildIds() не позволяет использовать дополнительные условия поиска, к примеру только папки, или с таким-то шаблоном. В итоге у вас будет 3 дочерние категории, в которых будет несколько десятков тысяч товаров, и в id:in будет добавлен массив из нескольких тысяч элементов. Сервер расплачется...
n
nekto 22 сентября 2014г в 21:22 #
Здравствуйте!
А если я хочу вывести ресурсы только первого уровня, что мне надо сделать?
{assign var=params value=[

"level" => "1",

"where" => [
"parent:IN" => [152, 153]

]
]}

Категории тут

{processor action="web/getdata" ns="modxsite" params=$params assign=result}

не работает...

И еще, если у меня ресурсы modSymLink типа, то они не тоже почему-то не выводятся...
Помогите, пожалуйста!
Fi1osof1
Fi1osof 22 сентября 2014г в 21:42 #
1. "level" => "1" - это вообще в наших процессорах не учитывается, это ни на что не повлияет.
2. "parent:IN" => [152, 153] - вот это будет влиять только на выборку тех документов, которые непосредственно лежат в разделах 152 и 153, уровни ниже не учитываются. Конечный xPDO-запрос будет в процессоре сформирован именно с условие where => ["parent:IN" => [152, 153]].
3.
И еще, если у меня ресурсы modSymLink типа, то они не тоже почему-то не выводятся...

Если это опубликованные и не скрытые ресурсы в указанных разделах, они должны быть получены и выведены, так как это те же самые записи в той же таблице ресурсов, и отличий прямых у них нет, только при рендеринге документов.
n
nekto 22 сентября 2014г в 21:57 #
Да, я уже разобрался, простите.
Fi1osof1
Fi1osof 22 сентября 2014г в 22:21 #
Ничего страшного.
n
nekto 22 сентября 2014г в 22:39 #
У меня еще один вопрос, может быть не сюда пишу.
В shopModx если я создаю символическую ссылку на товар, то на странице-ссылке все рушится, не подставляются некоторые параметры. Захожу в layout.tpl карточки товара и не вижу, какой процессор отвечает за его вывод.
Подскажите пожалуйста, где мне найти этот процессор и что туда подставить, чтобы ресурс-ссылка заработала.
Может быть кто-то до меня уже задавал этот вопрос?
Fi1osof1
Fi1osof 22 сентября 2014г в 23:42 #
1. Это уже оффтоп, сюда действительно не надо это писать, в следующий раз создавайте отдельный топик.
2. То, что вы создали ресурс в виде символической ссылки, не сделало этот ресурс оригинальным, ID-шник сменился, и это не является оригинальным документом-товаром. И вообще, для того, чтобы использовать симлинки, сначала изучите метод MODx::sendForward(). Это очень коварный (и на мой взгляд очень далекий от идеалов) метод. Получая объект документа, на который ссылается эта символическая ссылка, происходит замещение полей полученного ресурса, но с некоторыми исключениями. К примеру, ID документа замещается (на текущий ID документа-ссылки), но вот контент документа, на который она ссылается, остается, и class_key, и еще некоторые поля. Таким образом у нас получается документ-гибрид, у которого class_key целевого документа, а id родной. И даже чтобы понять, что это симлинк на самом деле, а не конечный документ, нужно получить оригинальный объект документа и там уже проверить его class_key, и если это симлинк, то получить id из контента этой ссылки и подставить его в запрос товара.
Смотрите изменения в шаблоне товара. В общем, это такая темная тема, что я вам советую не связываться с симлинками никогда.
n
nekto 23 сентября 2014г в 00:48 #
Спасибо! Все заработало! А с какими проблемами я могу столкнуться?
Пытаюсь сделать такую структуру:
  • Тип услуги

    • Услуга-1

    • Услуга-2

  • фио, который предоставляет услугу

    • Услуга-1

  • фио2, который предоставляет услугу

    • Услуга-2

То есть одна единица товара в двух категориях получается. Хотел сначала создать tv "Тип услуги" и делать по нему фильтрацию, но потом подумал, что ссылками будет логичнее и проще.
Fi1osof1
Fi1osof 23 сентября 2014г в 15:50 #
Во-первых, прекращаем все это обсуждать здесь, это оффтоп. Хотите что-то свое обсуждать - пишите топик.
Во-вторых, через TV-шки - правильней, ИМХО. Про вероятные проблемы не буду рассуждать.
n
nekto 22 сентября 2014г в 23:16 #
Процессор нашел! А вот что там изменить, чтобы ресурсы-ссылки работали?
Fi1osof1
Fi1osof 23 сентября 2014г в 15:51 #
А это уже сами копайте, раз в такие дебри лезете :)
e
e_v_medvedev 23 сентября 2014г в 16:55 #
Как отписаться от рассылки о новых постах?
Fi1osof1
Fi1osof 23 сентября 2014г в 17:00 #
О новых постах (топиках) рассылки никакой нет, пока не будет реализована нормальная система настроек уведомлений. Сейчас же рассылаются уведомления о новых комментариях тем, кто участвовал в конкретном топике (вы вот в этом топике тоже участвовали в общении).
Чтобы вам письма больше не докучали, я заблокировал ваш аккаунт.
Кому тоже письма надоедают, не стесняйтесь, пишите в саппорт, заблокирую.
Н
Николай Лобанов 18 октября 2014г в 03:28 #
Привет, сначала хотелось бы сказать спасибо за прекрасное видео, да и вообще за раскрытие секретов разработки.
Однако, обнаружилась у меня некоторая проблема, а именно не запускается modxsdk. Вообще. Устанавливается, попадает во вкладку приложения, но при переходе просто белый экран.
Пробовал на timewebе и на локалке, везде одинаково.
Страницу перезагружал, кэш чистил, компрессию js выключал.
Белый экран и всё.
Пользовать старую версию или можно будет на актуальной как-то это запустить?
Fi1osof1
Fi1osof 18 октября 2014г в 03:31 #
Добрый день.
Пожалуйста!
modxSDK пока не адаптирован под MODX-2.3. Ставьте на MODX-2.2+
Н
Николай Лобанов 18 октября 2014г в 03:39 #
Как-то можно оказать помощь в адаптации, кроме финансовой?)
Fi1osof1
Fi1osof 18 октября 2014г в 15:43 #
Вот гит-проект: https://github.com/Fi1osof/modxSDK
Ставьте на MODX-2.3.1, пробуйте фиксить. Если пофиксите, шлите пуллреквест.
e
elezeo 20 мая 2015г в 10:13 #
Здравствуйте. Столкнулся с такой ситуацией: Делаю выборку процессором с параметрами TVs. Все отлично выбирает и подключает. Однако в качестве TV-параметра у меня указано Изображение. Когда вывожу объект
<img src="{$object.tvs.image.value}" border="0" />

То в src значение указан путь ОТНОСИТЕЛЬНО той файловой системы в которой было выбрано изображение
catalog/ing1.jpg

А нужно, чтобы был полный путь относительно корня сайта, т.е.
<strong>/asseys/files/</strong>catalog/ing1.jpg

Как это сделать в smarty-шаблоне?
Если не ошибаюсь в php это делается функцией $modx->makeurl (могу ошибаться).
Но я не понимаю как это написать в шаблоне.
Подскажите
Fi1osof1
Fi1osof 20 мая 2015г в 10:21 #
Выполнять надо именно resources/getdata-процессор, а не просто getdata-процессор. В нем прописано преобразование путей для ТВшки image.
Если у вас ТВшка не image, переименуйте ее. Если нет возможности переименовать, значит допишите логику в своем переопределяющем процессоре. Так же следует учитывать какой именно медиасурс установлен для ТВшки.
В крайнем случае можно в шаблоне использовать сниппет getSourcePath (Если у вас сборка ShopModxBox, он должен там быть).
e
elezeo 23 мая 2015г в 16:22 #
Постраничный вывод (Пргинация) в ModxSmarty

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

Итак. Сначала Шаблон вывода нумерованныйх страниц tpl/pagination.tpl

    {pagination resource_id=$modx->resource->id       items=$items limit=$limit current=$current_page prev_next=true        assign=pagination}   

            <div class="pagination">
            {assign var=prev value=1}

            {if $pagination.prev.id}
            <a href="{$pagination.prev.href}">предыдущая</a>
            {/if}
           
            {foreach from=$pagination.pages item=page name=pagination}                 
                {if (($page.id-$prev) > 1)}
                <span>...</span>
                {/if}
                {if $page.type == 'current'}
                <span class="current">{$page.id}</span>
                {else}
                <a href="{$page.href}">{$page.id}</a>
                {/if}
            {assign var=prev value=$page.id}    
            {/foreach} 

            {if $pagination.next.id}
            <a href="{$pagination.next.href}">следующая</a>
            {/if}
             
            </div>

Что мы передаем в пагинатор:
resource_id — ID — ресурса, на котором выводится постраничный вывод. Обязательно. По-умолчанию почему то стоит «1», поэтому если не указать, то добавляет ?page=2 к корню сайта

items — Общее количество записей для вывода. Это значение будем получать в шаблоне самой страницы. см. ниже

current — текущая страница (присваиваем в шаблоне страницы)

limit — количество записей на странице (По умолчанию 5, но мы присвоим свое значение также в шаблоне страницы.

Теперь сам шаблон страницы tpl/news.tpl

{extends  file="tpl/layout-white.tpl"}

{block  name=after_content}

{assign var=limit value=7}
{assign var=current_page value=$smarty.request.page|default:1}

{assign var=params value=[
    "where" => [
        "parent"    => $modx->resource->id
    ]
    ,"page"=>$current_page
    ,"limit"=>$limit
    ,"sort" =>  "publishedon"
    ,"dir" => "ASC"
    ,"includeTVs" => true
]}

{processor action="site/web/getdata" ns="modxsite" params=$params assign=result}

{assign var=items value=$result.total}
{*include file="tpl/pagination.tpl"*}

<ul id="news-list">
{foreach $result.object as $object}
       {assign var=atitle value=$object.pagetitle}
       {if     $object.longtitle}{assign var=atitle  value=$object.longtitle}{/if}
       <li>
           <h3><a href="{$object.uri}" title="{$atitle}">{$object.pagetitle}</a> </h3>
           <p>{$object.summary}</p>
           <div><small>{$object.publishedon|date_format:"%Y-%m-%d %H:%M:%S"}</small></div>
       </li>
{/foreach}
</ul>

{include file="tpl/pagination.tpl"}
{/block}


Тут в принципе интуитивно все понятно. Единственное что отмечу — это то откуда мы берем общее количество записей.
{assign var=items value=$result.total}


Fi1osof1
Fi1osof 23 мая 2015г в 20:41 #
Smarty-плагин pagination давно уже не используется. Для этого есть специальный шаблон common/pagination/pagination.tpl. Присваиваете результат выполнения процессора переменной $result и инклюдите этот шаблон, и всё. Если у вас результат процессора набивается в другую переменную, то передаете ее в инклюд пагинатора переменной, типа result=$processor_result.
Пример вызова.
s
spbpartsru 02 декабря 2015г в 15:58 #
object_err_save при создании проекта. выше уже кто-то жаловался. есть решение?
Fi1osof1
Fi1osof 02 декабря 2015г в 21:55 #
Это общее сообщение MODX-а. Смотрите MODX-логи при сохранении какого именно объекта какая-именно ошибка возникает.
m
miec-pavel 04 февраля 2016г в 01:41 #
Доброй ночи. Подскажите, данные модули будут работать на 2.4.2?
Fi1osof1
Fi1osof 04 февраля 2016г в 09:19 #
Да, будут. Но phpTemplates уже малоактуален, просто потому что шаблонизация и кеширование в MODX улучшились. Сейчас достаточно просто modxSmarty использовать, а в шаблонах писать [[smarty?tpl=`some.tpl`]]
А
Андрей Тимохин 10 мая 2016г в 10:54 #
В шаблонах написал [[smarty?tpl='index.tpl`]]
Fatal error: Uncaught --> Smarty: Unable to load template file ''index.tpl'' < — thrown in…

пробовал так В шаблонах написал [[smarty?tpl='tpl/index.tpl`]]
Tramp13571
Tramp1357 10 мая 2016г в 11:11 #
'tpl/index.tpl`

первая кавычка ' вместо `
А
Андрей Тимохин 10 мая 2016г в 11:18 #
так тоже не хочет

Fatal error: Uncaught --> Smarty: Unable to load template file ''tpl/index.tpl'' < — thrown in

код:
[[smarty?tpl='tpl/index.tpl']]

Кеш чистил

Такое чувство что пути не правильные… хотя работало все с phpTemplates…
Tramp13571
Tramp1357 10 мая 2016г в 11:14 #
tpl/index.tpl
если из коробки, то так правильно, index.tpl лежть в папке tpl
А
Андрей Тимохин 10 мая 2016г в 11:27 #
спасибо)) часа 2 потерял из-за этих ковычек
Tramp13571
Tramp1357 10 мая 2016г в 11:27 #
:)
А
Андрей Тимохин 10 мая 2016г в 11:44 #
Еще имеется такой вопрос. прошу помощи…
Имеется 2 шаблона и два ресурса. выводятся разные tpl
открываю сайт — оба ресурса показывают одно и тоже. хотя в тпл изменяется [[*pagetitle]]
А
Андрей Тимохин 10 мая 2016г в 11:59 #
разобрался))) просто показывалась страница 404 (она же с id=1)
я вызывал страницу без .html ))) в типах содержимого убрал .html — теперь все ГУД))
А
Андрей Тимохин 10 мая 2016г в 12:35 #
Вопрос по кешированию.
Чем отличается обычное кеширование от смарти-кеширования?
и если в шаблоне нету галки кешировать, а глобальное-смарт-кеширование включено, то кеширования не будет?
Tramp13571
Tramp1357 10 мая 2016г в 13:13 #
На этот вопрос лучше Николай ответит.
А
Андрей Тимохин 10 мая 2016г в 13:48 #
ну я файлик кеша проверял вроде как понял что глобальная настройка смарткеширования просто переключает между кешем модх и смарт. ну и сам кеш заисит от того стоит ли в самом шаблоне кеш или нет. осталось выяснить чем отличаются методы кеширования.в 2.5 модх подлатали может теперь нету смысла ставить смарти кеш?
Tramp13571
Tramp1357 10 мая 2016г в 13:54 #
Насколько я знаю, у MODX свой механизм, который отслеживает встроенные шаблоны и теги MODX (чанки, сниппеты и т.п). У smarty — свой, который следит за файлами tpl. Вряд ли там простое переключение.
Я в кэширование сильно не углублялся, того, что знаю, меня пока устраивает :)
Tramp13571
Tramp1357 10 мая 2016г в 13:04 #
просто показывалась страница 404 (она же с id=1)
это лучше сразу настроить.

Имеется 2 шаблона и два ресурса. выводятся разные tpl
Если посмотреть код контроллера base.php, то увидим:
if(!empty($properties['tpl'])){
    $tpl = $properties['tpl'];
}
else{
    $tpl = 'index.tpl';
}

и
return preg_replace("/[ \n\t\r]+$/sm", "\r", $modx->smarty->fetch("tpl/{$tpl}"));

т.е. если не указан параметр tpl в шаблоне, то берется index.tpl из каталога tpl
В админке это выглядит так.

А
Андрей Тимохин 10 мая 2016г в 13:52 #
спасибо за ответы! чувствуется что сайт жив) Спасибо)) я новичек в модх, смотрел видосы, но щас многое уже устарело, не планируете новых видео ???
кстати base.php уже можно не использвать. в шаблоне вызывается сразу [[smarty?tpl=`some.tpl`]] Ну и отпадает небходиость ставить phpTemplates
Tramp13571
Tramp1357 10 мая 2016г в 13:59 #
в шаблоне вызывается сразу [[smarty?tpl=`some.tpl`]]
Это я знаю. Но тут, во-первых, это дело привычки, во-вторых, я периодически делаю шаблоны со своим php-контроллером.
Ну и, наконец, я начинаю новый сайт с установки shopmodxbox, даже если это и не магазин. Там много полезных плюшек, да и пакеты нужные установлены и настроено много нужного. Сильно сокращает время :)

По поводу видео — есть кое-какие планы, но пока не скажу, когда получится это сделать.
Tramp13571
Tramp1357 10 мая 2016г в 14:02 #
щас многое уже устарело
Да, новых плюшек нету, но однозначно они очень полезны, так как позволяют гораздо быстрее понять принципы работы с пакетами. А новое — можно, зная базу, и по исходникам разобраться.
А
Андрей Тимохин 10 мая 2016г в 13:56 #
без ковычек :D
А
Андрей Тимохин 11 мая 2016г в 09:54 #
Прошу еще помощи. стоит OpenServer. apache2.2 +php5.4 (если меняю на апач2.4+php5.6 или 7.0 — пакеты не ищет и файлы не редактирует)
Ну так вот дело в секундной задержке:

Главная страница
ID страницы: 1
Анонс: анонссссс
Заголовок в меню: вменю
0.0003 s – время на запросы к базе данных
2 – запросов к базе данных
1.0827 s – время на работу PHP скриптов
1.0830 s – общее время на генерацию страницы
cache – источник содержимого (база или кэш)

если убрать MODX и залить файл index.php или же выполнить в console Modx — результат 0.08 сек:
<?php
$time = microtime(true);
for ($i = 1; $i <= 1000000; $i++) {
$x = rand();
}
echo microtime(true) — $time;

Отсюда я так понимаю дело в настройках MODX?
Tramp13571
Tramp1357 11 мая 2016г в 10:14 #
Блин, туплю, ночь не спал :)
начни с отключения плагинов.
Tramp13571
Tramp1357 11 мая 2016г в 10:12 #
ты как время проверял? там тег есть [^t^]
картинки есть? может, найти чего не может?
профайлером в браузере смотрел?

ну и как вариант — отключить плагины и сравнить время. 1с — это ОЧЕНЬ много.
А
Андрей Тимохин 11 мая 2016г в 10:25 #
1) вывод делал тегами да. в том числе и [^t^]
2) страница абсолютно пустая (картинок нет) только вывод времени и пару параметров — заголовок, id, анонс
3) отключил все плагины — тоже самое. чуть больше 1с
А
Андрей Тимохин 11 мая 2016г в 11:50 #
залил на хостинг. все в порядке… как настроить openserver нормально? и почему при апач2.4+php7 не ищет пакеты и файлы не редактирует?
Tramp13571
Tramp1357 11 мая 2016г в 11:58 #
почему при апач2.4+php7
про это не знаю. может, не все компоненты нормально php7 поддерживают? имхо, не стоит с новинками заморачиваться. надо делать на том, что на хостинге стоит :)
как настроить openserver нормально?
не знаю. я ставил в своё время — всё нормально было. Но уже года два как поставил себе virtualbox+ubuntu — и не парюсь. и nodejs+gulp, и другие вкусности, т больше похоже на хостинг, работает шустро и стабильно.

h
hagallar 20 августа 2016г в 21:22 #
Приветствую! Прощу помощи! Поставил modx revo + modlivestreet, modsmarty и прочее, настраивал как в видео уроке, но выдает вот что
Fatal error: Cannot redeclare class modxSmarty in C:\OpenServer\domains\aveevo\core\components\modlivestreet\livestreet\engine\modules\viewer\Viewer.class.php on line 23
в самом файле код 21,22.23 строка соответственно:
class modxSmarty extends Smarty{
public $modx;
}

Что делать? Куда копать?
Fi1osof1
Fi1osof 27 августа 2016г в 03:18 #
Добрый день!

Не знаю, отправилось вам мое письмо в ответ или нет, тут интернет вообще не тот… Я писал, что вам надо удалить пакет modxSmarty, так как modLivestreet использует Smarty из самого ядра MODX-а, скорее всего как раз здесь и возникает повторное объявление класса.

А вообще modLivestreet давно уже не поддерживается, его давно сменил modSociety, но в интеграции он сложный, пока я не запилил более дружелюбный релиз.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.