Николай Ланец
19 июля 2013 г., 15:02

Разработка сайтов на MODX Revolution + phpTemplates + modxSmarty

Так как все больше программистов пытаются взять на вооружение объявленную технологию, и методика боле менее обкаталась и приняла четкие очертания, пишу пошаговую инструкцию как и с чего начать.
Весь процесс я заснял и выкладываю в виде подробного часового ролика. Но кому лень смотреть, или формат не удобный/скучный, расписываю здесь пошаговую инструкцию.
1. Устанавливаем чистую MODX Revolution.
2. Добавляем новый источник пакетов. Как минимум пакет modxSite не лежит в официальном репозитории modx.com, по этому его предстоит скачать с https://rest.modxstore.ru/extras/.
?
3. Устанавливаем пакеты:
  • Ace
  • modxSDK
  • modxSmarty
  • shopModx (из него нам понадобятся только процессоры для выборки документов)
  • phpTemplates
  • Console
  • getPage
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 минут. Вторая часть ролика может и очень нудная, но там есть неплохие примеры по использованию всего этого дела. И не стесняйтесь, задавайте вопросы.
Добрый день.
У меня на MAC OS в firefox (в других браузерах не смотрел) в SDK обнаружился такой косяк, не хочет работать пробел, то есть SDK не реагирует никак на эту кнопку. Если копировать пробел в редактируемый файл, то копируется 4 пробела. И не реагирует на теги, то есть, открывающиеся и закрывающиеся теги проставляю самостоятельно.
Спасибо.
Алишер, привет!
Предпредыдущий топик буквально: modxclub.ru/blog/voprosy-spetsyalistov/146.html
В тексте поставщик modxSite указан в домене com, а на картинке ru. У меня после добавления ни с одного из них перечня доступных пакетов не видно. По прежнему только modx.com.
Еще бы не помешало указать разделы на modx.com в которых нужные пакеты лежат (хотя бы в скобках за названием пакета), а то поиск в менеджере пакетов толком не работает.
Судя по вашему комментарию у вас стоит Revo 2.1.5 А ничего, что уже 2.2.8 актуальная версия? Не пробовали откатываться еще на более раннюю версию, к примеру 2.0.8 (тогда еще даже поддержка многих Эво-функций была). Все современные пакеты работают с версии, начиная 2.2.0, для вашего движка просто нет доступных пакетов.
Тогда имеет смысл хотя бы указывать требования к версии Modx, на которую все это ставится. Обновление не всегда полезно. Особенно для Opensource софта.
Тогда имеет смысл хотя бы указывать требования к версии Modx, на которую все это ставится.
Имеет смысл не искать виновных кругом, а начинать сомневаться в своих знаниях. На modx.com во всех пакетах указана минимальная поддерживаемая версия MODX.
?
Обновление не всегда полезно. Особенно для Opensource софта.
Чел, ты жгешь напалмом! Будь то опенсурс, или коммерческий продукт — понятное дело, что всегда обновление надо тестировать. Но обновляться надо всегда. Элементарно, твой сайт сейчас вскрыть можно как делать нефиг, так как до версии 2.2.7 все версии имеют критические уязвимости. Ты сидишь на древней системе, забыв что такое обновления, а сейчас ходишь и учишь кругом всех кто и как должен специально тебя предупреждать, что пакеты не рассчитаны на версии MODX, разработанные ПОЧТИ ДВА ГОДА НАЗАД.
>>Важно создать плагин на событие OnHandlerRequest, но с рангом очередности выше плагина modxSmarty. Это чтобы в Smarty-шаблонах переменная $template_url формировала путь к папке публичной части шаблона.
У меня тут траблы, выдает ошибку. Я создал плагин, обозвал его, как попало, установил галкой OnHandlerRequest в параметрах и нарвался на мат со стороны движка.
Спасибо.
Но ты ему в итоге изменил ранг? Сделал, чтобы он после основного модуля вызывался?
НЕ сделал, я не нашел, где это делается.
Нашел в «Системных событиях», у 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
В событиях плагина. ?
Так надо-то наоборот. Сначала $modx->smarty должен появиться (это основной модуль), и только потом уже свое что-то вытворяешь.
Я подумал, что приоритет 0, выше, чем у 1.
Можно было поиграться, поменять местами.
И, еще в школе по информатике учили: не ставь индексы по порядку (0,1,2,3), оставляй место для маневров (пиши хотя бы 0, 10, 20, 30, чтобы при необходимость можно было 15 вставить и т.п., а не переставлять все элементы).
У меня в школе информатика была немного другой :) Можно было, но страшно :)
Коль, а не напишешь или подскажешь, ка иметь на сайте несколько шаблонов для разного типа страниц, я к тебе приставал с таким вопросом помнится, но, все же… :)
По поводу той давней истории с подменой шаблона через TV-параметры страницы — не подскажу, ибо изврат это. А для разного типа страниц заводятся разные шаблоны и назначаются они стандартными средствами MODX-а.
Да, но я не совсем понял, как правильно сделать это со smarty.
Я в топике все подробно расписывал. php-контроллер используй всегда один, а в параметрах шаблона указывай параметр tpl=название шаблона.
Пересмотри внимательно видео. Можешь вот с этого момента: www.youtube.com/watch?feature=player_embedded&v=MBFaR1NXn8o&t=482 (хотя лучше с самого начала и до конца).
Ага, спасибо, у меня в голове еще не сложилась правильная картинка.
Похвастаюсь, что я накопал. Как укорить работу парсера modx revo? Ответ очарователен. modxclub.ru/blog/sandbox/175.html
Ага, уже повесил на главную.
Ага, спасибо. Считаю это действительно полезной находкой и закрывает лихорадку с тормозным парсером на некоторое время.
Но я все равно буду modxSmarty использовать :)))
Так и я использую. На новом проекте. А на старом… там сами черти испугаются ужаса и кашмара. А эта штука, под названием PHP 5.4.17, вжих, и решила половину проблемы с кривым кодом сразу!
Конечно это не отменяет пересмотра кода, но это уже встало на второй план.
Повторюсь, а новый я делаю с учетом твоих решений, хотя это и путает меня пока, но знания — дело наживное.
А на старом… там сами черти испугаются ужаса и кашмара.
Так делается просто: устанавливается phpTemplates+modxSmarty, берется старый шаблон, сохраняется в виде Smarty-шаблона (так же со всеми чанками и т.п.), и в этом уже шаблоне начинаешь все кешируемые сниппеты переводить на {snippet name=...}, а все чанки на {chunk name=...}. А в случае с чанками еще и по возможности полностью код из чанка на его замену (я про это писал почему так). И все. Уже за счет этого как правило нагрузка падает как минимум в два раза. А если еще и общие блоки закешируешь, так вообще сервер отдыхать будет. Вот и все. За пару часов можно серьезно снизить нагрузку на сайт.
А вот это написано плотно, просто и ценно, что достойно отдельного топика.
Теперь ведь сервер простаивать будет, аж жалко 8-)
?
Да я в общих чертах все это описывал. Но может на досуге еще напишу подробный топик как это делается.
черт… хотел smarty попробовать! А репозиторий лежит чтоли?
я вообщето про него и писал… вчера недоступен был! Щас все ОК!
Ну вполне может быть, что были перебои (к сожалению на modxcloud такое бывает). (шепну на ухо: скоро не digitalocean перееду).
P.S. Кстати, большинство моих пакетов и в официальном репозитории лежат.
Ноколай, добрый вечер. Столкнулся с проблемой: при использовании процессора getdata (из shopmodx) указываю getPage=1, все выводится, но почему-то вызов
$this->modx->runSnippet('getPage@getPage', ...
не затягивает набор параметров getPage. Что может быть? Набор такой я создал.
Еще я заметил, что если установить phptemplates.non-cached=false, то навигация не отрабатывается (при нажатии на номер страницы формируется адрес ?page=..., но контент выводится как для первой страницы), даже если в вызове процессора стоит nocache. Так и должно быть?
Набор создал, а сниппет завязал? ?
И точно никакой буквы не перепутал? Этот механизм довольно простой и обычно никаких проблем не возникает, только что кеш после каждого сохранения как правило приходится очищать.
А, и еще, у тебя процессор-то надстроенный? В нем прописан вызов 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-а этого в себе не несет. Там же минимализм :-)
Так это само собой. Как у тебя будет отрабатываться навигация, если у тебя Смарти-шаблон не отрабатывается каждый раз? В данном же случае MODX сразу отдает кеш страницы, а там процессор не вызывается. Создай блок-шаблон с вызовом процессора, выыводом элементов, постраничности и т.п. (чисто динамика), затем создай сниппет, пропиши там вызов этого блок-шаблона return $modx->smarty->fetch($tpl); и вставь в шаблон его обычным MODX-овым некешируемым сниппетом [[!mySnippet]]. Тогда у тебя страница будет закеширована, но этот сниппет всегда будет отрабатываться, и постраничность будет работать.
Разобрался. Я наборы параметров создавал чисто под процессоры, без привязки к элементам. Сейчас привязал, и заработало. Блин, все очень просто, но столько нюансов… Спасибо
Потихоньку осваиваю… Для начала воспроизвел пример отсюда Правильно ли я понимаю, что, в самом простом варианте, использование modxSmarty сводится к замене тэгов MODX блоками Smarty? Верно ли, что, при этом, необязательно использовать modxSite?
Правильно ли я понимаю, что, в самом простом варианте, использование modxSmarty сводится к замене тэгов MODX блоками Smarty?
В общих чертах да. modxSmarty обеспечивает несколько задач: 1. Собственно, подключение Smarty, инициализацию конфигов (папки кеша и компилляции и т.п.). 2. Несколько плагинов, которые позволяют взаимодействовать с MODX более тесно (доступ к объекту $modx, вызов чанков, сниппетов, процессоров и т.п.). 3. Очистка кеша Smarty при очистке кеша сайта через меню в админке (Сайт -> обновить сайт). Ну и собственно все.
Верно ли, что, при этом, необязательно использовать modxSite?
Верно. Просто modxSite как бы задает формат для разработки (создает нужные папки, несет несколько конфигов), в то время как modxSmarty — это абсолютно независимый пакет и не диктует условия где помещать свои папки шаблонов и в том духе.
Большое спасибо! Я почему спросил? Напрашивается небольшой проект, я хотел, для тренировки, его реализовать на этой технологии. Высокой нагрузки там не предвидится, поэтому есть возможность к делу постепенно подойти, в процессе от простого к сложному.
Так для типового проекта можно просто взять нашу сборку для визиток. Там же уже все настроено. Просто шаблон меняйте и мелочи правьте.
Спасибо! Наверное так и буду поступать в будущем, надеюсь. А пока попробую сам, с нуля.
ОК. Просто конечно же хорошо знать всю основу. Но не плохо посмотреть как оно уже используется, изучить, и может придумать более эффективное применение.
А вот еще пара вопросов. 1. В каких директориях порекомендуете хранить шаблоны smarty и статичные ресурсы (чанки, шаблоны)? 2. Где можно посмотреть документацию по modxSmarty, которая демонстрировалась в примере? Там примеры, как в тэгах Smarty вызывать чанки, шаблоны и др…
1. В каких директориях порекомендуете хранить шаблоны smarty и статичные ресурсы (чанки, шаблоны)?
От чанков советую отказываться в принципе, тем более статических. А для шаблонов (если речь о статических php-шаблонах) — ставьте modxSite, там создается источник файлов Controllers. Вот там им и место (обычно Ему, так как на все хватает одного общего php-контроллера).
2. Где можно посмотреть документацию по modxSmarty, которая демонстрировалась в примере? Там примеры, как в тэгах Smarty вызывать чанки, шаблоны и др…
Очень подробный топик на эту тему: modxclub.ru/blog/dokumentatsiya-dlya-spetsialistov/147.html С видюшкой.
А так смотрите все топики то тегу modxSmarty.
Доброго времени суток! Не получается загрузить modxSite, или я ошибаюсь? Пожалуйста, проверьте.
Доброе утро! Нет, modxSite качается. Его правда не видно в числе первых 10-ти пакетов, но поиск по пакетам работает.
Спасибо, все получилось. У Вас в тексте инструкции указано rest.modxstore.COM/extras/, при этом на скриншоте rest.modxstore.RU/extras/ Может, это зеркало или редирект, но первый вариант выдал у меня ошибку, а второй — рабочий.
Ага, косяк. Поправил. Спасибо!
Доброго времени суток! Пара вопросов. 1. Никак не могу понять в чем принципиальное отличие процессора от сниппета? 2. Отказ от чанков обеспечивается возможностью наследовать шаблоны? То есть, теперь код чанков нужно писать прямо в .tpl-никах, при необходимости переопределяя в дочерних шаблонах? 3. Правильно ли я понимаю, что верстку/дизайн/код вообще в БД хранить не следует?
Доброе!
1. Никак не могу понять в чем принципиальное отличие процессора от сниппета?
Видимо вам следует углубиться в ООП. Если не знаете разницы между функцией и классом, то сложно будет понять в чем разница между сниппетом и процессором.
2. Отказ от чанков обеспечивается возможностью наследовать шаблоны? То есть, теперь код чанков нужно писать прямо в .tpl-никах, при необходимости переопределяя в дочерних шаблонах?
Это уже как вам удобнее. Чанки — это часть системы шаблонизации MODX-а. tpl-ники — это часть шаблонизации Smarty. Это два отдельных инструмента. Какой выбирать — это уже вам решать.
3. Правильно ли я понимаю, что верстку/дизайн/код вообще в БД хранить не следует?
Опять-таки — это ваше дело. На самом деле здесь вопрос не где оно хранится, а каков принцип работы этого. Со своим modxSDK я бы и чанки-сниппеты мог редактировать как статические файлы (все же в админке работаю). Но Смарти не работает с чанками из БД. К тому же Смарти работает с шаблонами именно как с файлами, и ищет их на основе указываемых путей, а чанки MODX ищет просто по их имени.
Добрый день! Есть несколько вопросов. Сайт — 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>
Спасибо!
Здравствуйте. Пришлите доступы в личку. Скорее всего проблема в том, что у вас страница или блок кешируемый. Для постраничности требуется некешируемый вызов (getPage так работает).
С сайтом разобрались. Просто кешируемый участок был, и getPage не вызывался при повторном заходе на страницу.
2. Пытался добавить модификатор default — безрезультатно.
Тоже в общих чертах разобрались. Скорее всего дело в синтаксисе. К примеру, вот так работает:
{$modx->resource->longtitle|default:$modx->resource->pagetitle}
Отличная среда. Одно пожелание: неплохо было бы где-нить в среде modxsdk выводить путь к файлу, а то когда открываешь несколько файлов из разных каталогов, но с одинаковыми именами, поначалу путаешься.
Да, есть такое дело. Думаю, в новой версии сделаем.
Доброго времени суток! Сейчас делаю сайт с применением phpTempates+ModxSmarty и с процессорами вместо сниппетов. Все замечательно! Очень быстро! Достаточно удобно и легко. Ну а теперь вопрос чайника, помогите плиз — у меня есть доп параметр в ресурсе, допустим count(количество), применяю для выборки процессоры, наследованые от getdata (из modxshop), как делать фильтры по tv — разобрался (через $c->innerJoin), как сделать сортировку по указанному полю никак не могу понять, можете привести простой пример для getdata процессора сортировки по определеному tv?
Просто в initialize() добавьте:
$this->setDefaultProperties(array( "sort" => "tvtablealias.value", "dir" => "ASC", ));
$this->setDefaultProperties(array( 'sort' => 'price.value', 'dir' => 'ASC', 'showhidden' => false, 'showunpublished' => false, да, так делал — выдает пустой результат, если делаю также по полю основному полю документа, все нормально, по дополнительному (по любому — никак)
Давайте на гистхаб весь код процессора. И скорее всего вы просто price не в методе prepareQueryBeforeCount() добавляете.
Но у вас таблица с алиасом price в принципе там не добавлена. Она же просто так из воздуха в запросе не появится. Вот смотрите пример: github.com/Fi1osof/ShopModxBox/blob/17791a616ccb43245dfdac5f6defb81a2c90b815/core/components/modxsite/processors/web/catalog/products/getdata.class.php#L35 То есть в prepareQueryBeforeCount() вам уже надо добавить те таблицы, по которым будет идти поиск и/или сортировка.
да фильтр я именно так и делал, а как сортировку сделать по определеному дополнительному полю немного не понимаю. В родительском процессоре 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; }
Спасибо за помощь, все получилось, с методами разобрался.
я почему то и думал что база присоединена и можно просто указывать sort
Да, там присоединяется таблица, но это одна таблица с алиасом TemplateVarResources, и соотношение один-ко-многим. То есть у вас получится в итоге строк «кол-во записей в site_content» * «кол-во записей в site_template_var_resources». Это общие данные и именно по ним сортировать не стоит, так как потом это в цикле набивается в конечный массив и вам там сортировка никак не гарантируется. Вы же хотите сортировать по конкретному TV-параметру. Соответственно надо приджоинить эту таблицу с указанием id TV-шки и сортировать конкретно по нему. В общем, здесь у вас поз знания SQL-я четкое понимание вряд ли выйдет.
Добрый день. Делал по вашей видео инструкции. выскакивает ошибка на этапе создания проекта object_err_save. С правами вроде всё хорошо
что то пробел на работает в modxsdk у кого такое было?
В настройках бэкэнда уберите компрессию JS-а. У нас там небольшая бага, которую пока не пофиксили.
Создание какого именно объекта?
да есть спасибо а еще вопрос как шрифт увеличить в редакторе а то глаза так вилезуть)
Есть вопрос
есть вызов wayfinder
пишу его в {snippet name=Wayfinder params="&startId=`0`&level=`1` &outerTpl=`outerTpl`&rowTpl=`rowTpl`&hereClass=`activeItem`"} а вот как заменить чанки outerTpl и rowTpl чтоб тут же в smarty и прописать а не в чанки ссылаться хотя на выходе оно выводить все в html но думаю это не правильно
Вот этого с ходу не подскажу. Наверняка это делается в конфигурации самой библиотеки Ace (только не MODX-компонент Ace, а та библиотека, которая вместе modxSDK заливается. Смотрите ее в manager/components/modxsdk/).
В случае с Wayfinder-ом — никак. Он на чанки рассчитан (может конечно и с файлами, но это все равно не будет Smarty-шаблонизация). Здесь только если использовать процессор для формирования меню. Про него я писал здесь: modxclub.ru/blog/modx-club-portfolio/153.html (см. 2. Замена Wayfinder)
очень полезно) спасибо
ну как я понимаю главное чтоб на выходе был html для скорости работы сайта — в кеш он и подает даже если там чанки в параметрах стоят я смотрел
Можно в вызов сниппета передать параметр parse, к примеру {snippet name=Wayfinder params=$params parse=true} Тогда полностью весь код Wayfinder-а вместе с чанками шаблонов будет отработан MODX-парсером еще на уровне Smarty, и дальше будет выдан чистый HTML. Если менюшка кешируемая, то можно смело так делать. Код плагина.
спасибо за ответ отличный пример
Добрый день! есть такой вызов снипетта {snippet name=getProducts params="&parents=`$item.id`&tpl=`menuRowTpl2`&useSmarty=`true`&where=`['template': 3]`" parse=true}
так вот как правильно записать этот параметр &where=`['template': 3]`
???
Добрый!
так вот как правильно записать этот параметр &where=`['template': 3]`
Вообще это уже надо смотреть документацию getProducts, но насколько я знаю, там в where надо передавать JSON-строку, то есть в чистом виде массив-условие мы не можем передать, а у вас тут судя по всему невалидный JSON. У вас именованный массив, а в JSON-е — это обязательно объект. То есть надо пробовать или {"template":3} или [{"template":3}] (второе вероятней всего).
«» json не одобрит. Только "", только хардкор.
Есть простое решение: ctrl +.
Все верно. Я и писал с кавычками. Это меня jevix подставил… Заменил на сущности.
Это слишком жестко))
А что, я когда далеко от ноута сижу, то в 125% выставляю увеличение и ок.
Но тогда все в 125% переходит… Хотя да, иногда я тоже этим пользуюсь.
не один из вариантов не подошол(
Придется вам глубже копать. Там явно JSON-строка идет. Вклинивайтесь в компонент и смотрите какой он там конечный SQL формирует. Есть маленькая вероятность, что не правильно формируется запрос (не однозначно задан template). Попробуйте указать [{"modResource.template":3}]
спасибо буду рыть)
Уточнение по данному вопросу: оказывается, надо было сделать так, чтобы искал сразу по нескольким шаблонам. В таком случае надо просто передать массив шаблонов, к примеру: {"template:in":[3,4,8]} еще был вопрос, как исключить шаблоны. Тогда или {"template:not in":[3,4,8]} (если массив), или {"template:!=":3} (если исключаем один).
а для smarty вызова снипета тогда как записать это?
Так все то же самое. {snippet name=getProducts params='&parents=`$item.id`&tpl=`menuRowTpl2`&useSmarty=`true`&where=`{"template:in":[3,4,8]}`' parse=true}
спасибо огромное)
И вот так можно:
{assign var=params value=[ "parents" => $item.id, "tpl" => "menuRowTpl2", "useSmarty" => true, "where" => '{"template:in":[3,4,8]}' ]} {snippet name=getProducts params=$params parse=true}
Да этот вариант лучше! Советую всем иммено его использовать
Доброго времени суток, Хорошие видеоролики. понял что дефолтовый MODX движек просто использовать нельзя, слишком большая нагрузка в случае роста посетителей. в связи с этим не могу состыковать в понятии smarty и сам modx, здесь 3 вида синтаксиса, сразу скажу что я так сказать новичек, но не то чтобы новичек учусь быстро достаточно, все-же возникают трудности с непониманием некоторых принципов. Есть огромное желание разобраться в WEB-програминге в данный момент усилия ариентированы на MODX(+Исключительно Smarty), т.к он как мне показалось не самый пафосный движек)))ненужного в нем мало. Проблема состоит в том что я немогу найти документации по таким фишкам как — вызов функций, атрибуты и т.д в MODX+Smarty, а по отдельности туториалы не стыкуются, в этой связке используются внутриние функции и классы — разобрать горы кода, чтобы понять где и откуда берется, кажется нереальным или как минимум не самым лучшим, чтото мне подсказывает что есть вариант более легкий)))) что-бы я сам тут не запутался и нишел не по тому пути и в итоге с ума не сошел -у меня созревает вопрос, что мне народ посоветует? Мат часть учить -это и так ясно, но мне нужно поконкретней где и какую инфу копать. Заранее благодарю.
Доброй!
Проблема состоит в том что я немогу найти документации по таким фишкам как — вызов функций, атрибуты и т.д в MODX+Smarty
Самое главное что надо освоить — php. Тогда и понимание будет, так как Smarty — это по сути php-шаблонизатор. И в связке MODX+Smarty, Smarty как был отдельным независимым шаблонизатором, так им и остается, документацию по Smarty смотрите на оффсайте. В modxSmarty только несколько наших функций-плагинов для более тесной интеграцией с MODX (хотя ввиду того, что в шаблонах доступен объект $modx вместе со всем его API, возможно бОльшая часть этих плагинов будет удалена в дальнейшем). Смотрите внимательней видео и изучайте API MODX (оффдокументация http://rtfm.modx.com/revolution/2.x/).
Теперь то понятно куда копать, возможно глупый вопрос задам, про удаление плагинов — я так понимаю в дальнейшем чтобы вызвать опеределенный сниппет, чанк и т.п. нужно будет обращаться непосредственно к $modx->обьект($имя) из смарти шаблонов?, тоесть можно и сейчас подобным образом делать?.. Спасибо ссылки полезные, пойду инфу вникать, потом опять попробую штурмовать MODX.
я так понимаю в дальнейшем чтобы вызвать опеределенный сниппет, чанк и т.п. нужно будет обращаться непосредственно к $modx->обьект($имя) из смарти шаблонов?
Сравним: {chunk name=«Chunkname» params=«foo=`foo`»} против {$modx->getChunk(«Chunkname», [«foo» => «foo»])}
Разница не большая, но зато минус один подгружаемый файл-функция. Хотя вот так уже не запишешь: {$modx->getChunk(«Chunkname», «foo=`foo`»)}
Но это еще так, предварительно, так что может про запас их и оставим, все равно они подгружаются только тогда, когда в шаблоне прописаны теги. А сами стараться будем через $modx работать.
Копаясь по просторам интернета, и в дерикториях ядра, так и не понел по каким запросам можно обращаться в $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
Слишком рано для меня я буквально 3 дня в теме программирования, не имея даже сферы образования, базы информатики(разве вскольз), совершенно зеленый.И вы сразу ставите в курс дела.;) Вобщем очень полезная информация, Получить обучение от профессионалов узнать так сказать всё из первых уст) Хороший пинок к действиям))благодаря вам нашел: MODX Revolution объекты, Объектная модель MODx Revo API. Статья для понимания.Буду благодарен если изучу движек, всему свое время).
Ваше право выбирать.
Скажите пож-та, в чем может быть проблема? Я собственно не программист, и куда надо смотреть не понимаю. Не работает постраничная навигация и все, на Вашем же шаблоне дефолтовом, его не изменял. Все настройки перепроверил — все нормально. Кеш MODX уже полностью в настройках отключил — результата нет. Версии php менял. Сам HTML код из файла tpl выводится. Все что должно быть на месте [[+page.nav]] в исходном коде пусто.
1. Повторюсь: данная сборка требует знания в области веб-программирования. 2. [[+page.nav]] просто так не работает. Надо чтобы выполнился сниппет getPage, который и формирует данные для постраничности. Для этого просто в вызываемый процессор выборки товаров или документов надо передавать параметр getPage=>true. Вот еще наш специалист написал Smarty-плагин для постраничности: modxclub.ru/blog/dokumentatsiya-dlya-spetsialistov/268.html Тоже можете попробовать взять на вооружение.
Всего-то навсего нужно API внимательно изучить, чтобы знать как что вызывать и что вообще можно вызвать, а далее уже прикручиваем все что вздумается, MODX очень гибкий и вместе с тем отличная площадка для разработчиков. Тут даже думать интересно становиться) До разраба мне конечно дaлеко, да и не за этим я здесь, просто захотел себе да и знакомым сайт создать, будучи даже и близко не шаря в программировании. Считаю что у ModX хорошее будующее)
Всего-то навсего нужно API внимательно изучить, чтобы знать как что вызывать и что вообще можно вызвать, а далее уже прикручиваем все что вздумается
Все так! С учетом того, что в Smarty-шаблонах нам полностью доступен объект $modx, делать там можно все, что угодно.
До разраба мне конечно дaлеко, да и не за этим я здесь, просто захотел себе да и знакомым сайт создать, будучи даже и близко не шаря в программировании.
А вот это уже чуть сложнее. Дело в том, что наши технологии как раз больше рассчитаны на программистов, и требуют хоть каких-то навыков в программировании.
Вчера просидел до 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 ], ...
{assign var=params value=[ "parents" => 4, "tpl" => "productSmarty", "useSmarty" => true, "where" => '{"template:in":[5]}' ]} {snippet name=getProducts params=$params parse=true}
так тоже выводит только первый уровень, и не работает depth. Почему так? почему не где не написано, это же важный момент, почему везде примеры которые выводят один первый уровень…
Почему то он выводит только первый уровень вложенности, а мне надо все 3 уровня которые вложены в id 4…
Вам здесь не только знание php требуется, но еще и знание SQL. Если вы указываете parent=>4, это уже получается $where[«parent»] = $parent; (см. код). Плюс к этому вы еще указываете 'template' => 5.
В итоге у вас получается
'where' => [ 'parent' => 4, 'template' => 5 ],
То есть в вашу выборку могут попасть только те документы, которые являются непосредственно дочерними для документа с id 4, а так же у которых шаблон 5. К этому еще не забываем про автоматически добавленные условия Опубликован, Не удален, Не скрыт из меню.
Резюмирую: если вы явно указываете раздел, то будут получены документы только этого раздела.
А если вы хотите получить все документы во всех вложенных разделах, то эта задача весьма не простая, и требует правильной организации каталога, чтобы можно было попроще это выполнить. Есть два пути: 1. Все целевые документы должны иметь какой-то уникальный признак, который бы позволил сделать выборку без учета вложенности. К примеру, иметь какой-то свой особенный шаблон или типа того. 2. Если не сделано как в первом пункте, то придется выполнять перебор всех необходимых уровней и выбирать оттуда нужные документы. В качестве примера можете изучить процессор, который получает товары из определенного раздела. Он сначала перебором делает выборку всех дочерних разделов, а потом получает конечную выборку товаров, для которых указанные разделы являются родительскими.
Здравствуйте! прошу прощения — снова глупый вопрос. Несколько раз пересмотрел ролики, так и не понятно про расширение шаблона почему оно не работает. Создаю в корне left.tpl c текстовым содержимом в div:
<div> sssssss </div>
или так:
{block name=left} <div> sssssss </div> {/block}
вызываю в layout.tpl:
{block name=left} {field name=left} {/block}
Ни какой реакции. Что делается не правильно?
Что делается не правильно?
Все делается неправильно :) Если вы хотите в шаблоне подгрузить другой шаблон-файл, то это делается через include, то есть в вашем случае {include file=«left.tpl»} Тогда будет пудгружен именно файл. А блоки — это не шаблоны-файлы, это части шаблонов, и они будут иметь смысл только при расширении шаблонов и наличии их в расширяемом шаблоне. То есть, у вас есть старший шаблон layout.tpl и расширяющий его grid.tpl (в котором сразу в начале шаблона прописано {extends file=«layout.tpl»}). Вот если у вас в layout.tpl прописан блок какой-нибудь, например {block name=left}{/block}, вот тогда в grid.tpl его можно будет переопределить. Нельзя переопределить блок, которого нет в родительском.
А на будущее: читайте документацию по самому Smarty, ее много и она толковая. Мы от себя в Smarty ничего лишнего не добавляем, то есть все работает стандартно.
Прошу расмотреть обновление класса modSiteWebResourcesGetdataProcessor в сборке modxsite в репозитории, зачем городить новый пакет изза того что можно использовать этот, обновите пакет modxsite в репозитории пожалуйста.
summary теперь чиститься от изображений (summaryClearImages) collapseParent - возможность выборки всех всех документов в разделе минуя вложенность ну и самое ради чего это все , это конечно же изображения, изображения которые были добавленны в контент тоже полезны поэтому я сделал так что мы можем просто взять и получить все или несколько ссылок по пути images (bool) находит и включает в вывод найденные изображения imagesLimit(integer) устанавлеваемый лимит imagesCutBase(bool) режет домен и протокол в ссылках если есть
Outputs: $result.object.images - индексный массив ссылок изображений $result.object.img - первое найденное ссылок изображение
новое помечено /*NEW*/ комментарием
Вот такие вещи не надо писать комментариями. Это надо отдельным топиком и там уже обсуждать, будет ли востребован новый функционал или нет. Но за предложение в любом случае спасибо!
я давно собирался поделиться этим, раньше видимо вы в разработке были , немог писать здесь, но щас вижу вернулись за что вам спасибо, незачто , я замучился копировать из одной Modx в другую код процессора((, Николай удали код в моем посте пожалуйста , я немогу привыкнуть что тут нормально код не выложить ((
видимо вы в разработке были
Да, мы затеяли переписать сайт с MODX+Livestreet на чистый MODX, но пришел крупный заказ, который на три с лишним месяца нас занял по полной. Сейчас вот подосвободились и я планирую очень плотно сидеть с нашим сайтом и развивать его. К сожалению прям сразу вот так не включим код в пакет modxSite. Это действительно со всех сторон надо изучать. У меня тоже много всяких наработок по ходовой скапливается, но их приходится многократно обкатывать, прежде чем включить, чтобы убедиться что они нужны на большинстве проектов. А то так все будет разрастаться, что будет у нагружать и в изучении усложнять, а процент использования будет низким.
ну по поводу изображений в процессоре , так я скажу вещь хорошая , заместо TV , использовать изображения из контента, в любом листинге полезно для вывода превьюхи или мини галарей
Изображения из контента? ИМХО - злое зло. Во-первых, загрязняет содержимое content. Во-вторых, дополнительная нагрузка на выборках. Это как минимум. То есть если картинки нужны именно как часть контента - то пусть там они и будут, но завязывать это на процессоры? Не айс. Пусть это будет чистым контентом.
у вас в листинге топиков , TV параметр?
подмешивание картинок в контент зло, тогда когда контент предполагаеться использовать исключительно текстом, допустим в MODX вообще modDocument расчитан на публикацию статьи ,это следует из того что для контента у нас tinyMCE выделен, которым дано вставлять изображения в контент , вот. а процессор нагружается только регуляркой на вырезание или получение тегов img с их ссылками , там 2 метода добавленно около 10 строки кода, ведь эти изображения не структуризованы в БД. Конечно каждому свое , раньше я использовал TV параметр изображения и вставлял в шаблон getTVValue('tvname'), а с дополнением в процессоре , могу не заморачиваться с TV а просто добавляя в контент img c помощью tinyMCE, процессор получит все или несколько ссылкок и добавит массив в результирующий набор, при этом я вывожу уже не 1 изображение как можно сделать с помощью TV, а даже несколько, это зависит от количества img добавленных в контент или от параметра(imageLimit), а так когда в контент не добавляются изображения то естестественно такое не понадобится.
Хотите присвоить много картинок документу - используйте Migx или любой другой способ, вплоть до написание собственного модуля. Тогда у вас будет нормальное управление картинками. А загрязнять что-то чтобы потом очищать (вставлять в контент и оттуда потом выдергивать) - это не есть хорошо. Если у вас в контенте картинки должны выводиться ровно там, где и вставлены (то есть без лишних преобразований), то ОК, почему и в контент это не вставлять? В общем, сорри, но данный код не будет добавлен в процессор. Использовать будете его вы (или еще кто-то, кому такой метод кажется нормальным), а нам он глаз будет постоянно мозолить.
кстати collapseParent параметр , решает вопрос который задал proxies выше, про уровни вложенности продукта.
согласен что по сравнению с компонентами галерей , это вообще нахрен не годится. чет я притупил , есть же специальные компоненты)))
По моему опыту - не всегда. getChildIds() полностью основывается на кеш-карте ресурсов. А как известно - рост кеша - одна из болезней MODX-а. Так вот, приходилось сталкиваться с проектами, на которых очень много ресурсов. К примеру http://bumparfum.webtm.ru - 150 000 документов. MODX просто не сможет при сбросе кеша перебрать из базы данных все документы и нафигачить их в кеш (в карту ресурсов). Подробно про это я писал еще в 2011-ом году http://community.modx-cms.ru/blog/1744.html. С тех пор особо ничего не поменялось. Поэтому, приходится на крупных проектах полностью отключать карту сайта (для этого используется патч cacheOptimizer). Без карты ресурсов getChildIds() бессилен. Плюс к этому getChildIds() не позволяет использовать дополнительные условия поиска, к примеру только папки, или с таким-то шаблоном. В итоге у вас будет 3 дочерние категории, в которых будет несколько десятков тысяч товаров, и в id:in будет добавлен массив из нескольких тысяч элементов. Сервер расплачется...
Здравствуйте! А если я хочу вывести ресурсы только первого уровня, что мне надо сделать?
{assign var=params value=[ "level" => "1", "where" => [ "parent:IN" => [152, 153] ] ]} Категории тут {processor action="web/getdata" ns="modxsite" params=$params assign=result}
не работает...
И еще, если у меня ресурсы modSymLink типа, то они не тоже почему-то не выводятся... Помогите, пожалуйста!
1. "level" => "1" - это вообще в наших процессорах не учитывается, это ни на что не повлияет. 2. "parent:IN" => [152, 153] - вот это будет влиять только на выборку тех документов, которые непосредственно лежат в разделах 152 и 153, уровни ниже не учитываются. Конечный xPDO-запрос будет в процессоре сформирован именно с условие where => ["parent:IN" => [152, 153]]. 3.
И еще, если у меня ресурсы modSymLink типа, то они не тоже почему-то не выводятся...
Если это опубликованные и не скрытые ресурсы в указанных разделах, они должны быть получены и выведены, так как это те же самые записи в той же таблице ресурсов, и отличий прямых у них нет, только при рендеринге документов.
Да, я уже разобрался, простите.
У меня еще один вопрос, может быть не сюда пишу. В shopModx если я создаю символическую ссылку на товар, то на странице-ссылке все рушится, не подставляются некоторые параметры. Захожу в layout.tpl карточки товара и не вижу, какой процессор отвечает за его вывод. Подскажите пожалуйста, где мне найти этот процессор и что туда подставить, чтобы ресурс-ссылка заработала. Может быть кто-то до меня уже задавал этот вопрос?
Процессор нашел! А вот что там изменить, чтобы ресурсы-ссылки работали?
1. Это уже оффтоп, сюда действительно не надо это писать, в следующий раз создавайте отдельный топик. 2. То, что вы создали ресурс в виде символической ссылки, не сделало этот ресурс оригинальным, ID-шник сменился, и это не является оригинальным документом-товаром. И вообще, для того, чтобы использовать симлинки, сначала изучите метод MODx::sendForward(). Это очень коварный (и на мой взгляд очень далекий от идеалов) метод. Получая объект документа, на который ссылается эта символическая ссылка, происходит замещение полей полученного ресурса, но с некоторыми исключениями. К примеру, ID документа замещается (на текущий ID документа-ссылки), но вот контент документа, на который она ссылается, остается, и class_key, и еще некоторые поля. Таким образом у нас получается документ-гибрид, у которого class_key целевого документа, а id родной. И даже чтобы понять, что это симлинк на самом деле, а не конечный документ, нужно получить оригинальный объект документа и там уже проверить его class_key, и если это симлинк, то получить id из контента этой ссылки и подставить его в запрос товара. Смотрите изменения в шаблоне товара. В общем, это такая темная тема, что я вам советую не связываться с симлинками никогда.
Спасибо! Все заработало! А с какими проблемами я могу столкнуться? Пытаюсь сделать такую структуру:
  • Тип услуги
  • Услуга-1
  • Услуга-2
  • фио, который предоставляет услугу
  • Услуга-1
  • фио2, который предоставляет услугу
  • Услуга-2
То есть одна единица товара в двух категориях получается. Хотел сначала создать tv "Тип услуги" и делать по нему фильтрацию, но потом подумал, что ссылками будет логичнее и проще.
Во-первых, прекращаем все это обсуждать здесь, это оффтоп. Хотите что-то свое обсуждать - пишите топик. Во-вторых, через TV-шки - правильней, ИМХО. Про вероятные проблемы не буду рассуждать.
А это уже сами копайте, раз в такие дебри лезете :)
Как отписаться от рассылки о новых постах?
О новых постах (топиках) рассылки никакой нет, пока не будет реализована нормальная система настроек уведомлений. Сейчас же рассылаются уведомления о новых комментариях тем, кто участвовал в конкретном топике (вы вот в этом топике тоже участвовали в общении). Чтобы вам письма больше не докучали, я заблокировал ваш аккаунт. Кому тоже письма надоедают, не стесняйтесь, пишите в саппорт, заблокирую.
Привет, сначала хотелось бы сказать спасибо за прекрасное видео, да и вообще за раскрытие секретов разработки. Однако, обнаружилась у меня некоторая проблема, а именно не запускается modxsdk. Вообще. Устанавливается, попадает во вкладку приложения, но при переходе просто белый экран. Пробовал на timewebе и на локалке, везде одинаково. Страницу перезагружал, кэш чистил, компрессию js выключал. Белый экран и всё. Пользовать старую версию или можно будет на актуальной как-то это запустить?
Добрый день. Пожалуйста! modxSDK пока не адаптирован под MODX-2.3. Ставьте на MODX-2.2+
Как-то можно оказать помощь в адаптации, кроме финансовой?)
Вот гит-проект: https://github.com/Fi1osof/modxSDK Ставьте на MODX-2.3.1, пробуйте фиксить. Если пофиксите, шлите пуллреквест.
На моменте создания проекта
Может не все таблицы были созданы. Попробуйте переустановить пакет modxSDK.
К сожалению не помогло, результат тот же
Пришлите доступ в админку на n.lanets@modxclub.ru, вечером гляну что и как, отпишусь.
Здравствуйте. Столкнулся с такой ситуацией: Делаю выборку процессором с параметрами 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 (могу ошибаться). Но я не понимаю как это написать в шаблоне. Подскажите
Выполнять надо именно resources/getdata-процессор, а не просто getdata-процессор. В нем прописано преобразование путей для ТВшки image. Если у вас ТВшка не image, переименуйте ее. Если нет возможности переименовать, значит допишите логику в своем переопределяющем процессоре. Так же следует учитывать какой именно медиасурс установлен для ТВшки. В крайнем случае можно в шаблоне использовать сниппет getSourcePath (Если у вас сборка ShopModxBox, он должен там быть).
Постраничный вывод (Пргинация) в 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}
Smarty-плагин pagination давно уже не используется. Для этого есть специальный шаблон common/pagination/pagination.tpl. Присваиваете результат выполнения процессора переменной $result и инклюдите этот шаблон, и всё. Если у вас результат процессора набивается в другую переменную, то передаете ее в инклюд пагинатора переменной, типа result=$processor_result. Пример вызова.
Добрый день, Николай! Не могу понять, как создать отдельный шаблон для записи. Видео смотрел раз 10 полностью. Контроллер беру base.php. Прописываю параметры шаблону. Взгляните на скрин. Что я делаю не так? yadi.sk/i/p5DPHJELhFNyH
Я уже дал вам ответ выше.
За подсказку спасибо! Но ругается: 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
Все, разобрался. Не в ту папку положил… Спасибо!
Пожалуйста. Внимательней смотрите видео, а лучше читайте код.
object_err_save при создании проекта. выше уже кто-то жаловался. есть решение?
Это общее сообщение MODX-а. Смотрите MODX-логи при сохранении какого именно объекта какая-именно ошибка возникает.
Доброй ночи. Подскажите, данные модули будут работать на 2.4.2?
Да, будут. Но phpTemplates уже малоактуален, просто потому что шаблонизация и кеширование в MODX улучшились. Сейчас достаточно просто modxSmarty использовать, а в шаблонах писать [[smarty?tpl=`some.tpl`]]
В шаблонах написал [[smarty?tpl='index.tpl`]] Fatal error: Uncaught --> Smarty: Unable to load template file ''index.tpl'' < — thrown in…
пробовал так В шаблонах написал [[smarty?tpl='tpl/index.tpl`]]
'tpl/index.tpl`
первая кавычка ' вместо `
tpl/index.tpl
если из коробки, то так правильно, index.tpl лежть в папке tpl
так тоже не хочет
Fatal error: Uncaught --> Smarty: Unable to load template file ''tpl/index.tpl'' < — thrown in
код: [[smarty?tpl='tpl/index.tpl']]
Кеш чистил
Такое чувство что пути не правильные… хотя работало все с phpTemplates…
спасибо)) часа 2 потерял из-за этих ковычек
Еще имеется такой вопрос. прошу помощи… Имеется 2 шаблона и два ресурса. выводятся разные tpl открываю сайт — оба ресурса показывают одно и тоже. хотя в тпл изменяется [[*pagetitle]]
разобрался))) просто показывалась страница 404 (она же с id=1) я вызывал страницу без .html ))) в типах содержимого убрал .html — теперь все ГУД))
Вопрос по кешированию. Чем отличается обычное кеширование от смарти-кеширования? и если в шаблоне нету галки кешировать, а глобальное-смарт-кеширование включено, то кеширования не будет?
просто показывалась страница 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 В админке это выглядит так.
На этот вопрос лучше Николай ответит.
ну я файлик кеша проверял вроде как понял что глобальная настройка смарткеширования просто переключает между кешем модх и смарт. ну и сам кеш заисит от того стоит ли в самом шаблоне кеш или нет. осталось выяснить чем отличаются методы кеширования.в 2.5 модх подлатали может теперь нету смысла ставить смарти кеш?
спасибо за ответы! чувствуется что сайт жив) Спасибо)) я новичек в модх, смотрел видосы, но щас многое уже устарело, не планируете новых видео ??? кстати base.php уже можно не использвать. в шаблоне вызывается сразу [[smarty?tpl=`some.tpl`]] Ну и отпадает небходиость ставить phpTemplates
Насколько я знаю, у MODX свой механизм, который отслеживает встроенные шаблоны и теги MODX (чанки, сниппеты и т.п). У smarty — свой, который следит за файлами tpl. Вряд ли там простое переключение. Я в кэширование сильно не углублялся, того, что знаю, меня пока устраивает :)
в шаблоне вызывается сразу [[smarty?tpl=`some.tpl`]]
Это я знаю. Но тут, во-первых, это дело привычки, во-вторых, я периодически делаю шаблоны со своим php-контроллером. Ну и, наконец, я начинаю новый сайт с установки shopmodxbox, даже если это и не магазин. Там много полезных плюшек, да и пакеты нужные установлены и настроено много нужного. Сильно сокращает время :)
По поводу видео — есть кое-какие планы, но пока не скажу, когда получится это сделать.
щас многое уже устарело
Да, новых плюшек нету, но однозначно они очень полезны, так как позволяют гораздо быстрее понять принципы работы с пакетами. А новое — можно, зная базу, и по исходникам разобраться.
Прошу еще помощи. стоит 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?
ты как время проверял? там тег есть [^t^] картинки есть? может, найти чего не может? профайлером в браузере смотрел?
ну и как вариант — отключить плагины и сравнить время. 1с — это ОЧЕНЬ много.
Блин, туплю, ночь не спал :) начни с отключения плагинов.
1) вывод делал тегами да. в том числе и [^t^] 2) страница абсолютно пустая (картинок нет) только вывод времени и пару параметров — заголовок, id, анонс 3) отключил все плагины — тоже самое. чуть больше 1с
залил на хостинг. все в порядке… как настроить openserver нормально? и почему при апач2.4+php7 не ищет пакеты и файлы не редактирует?
почему при апач2.4+php7
про это не знаю. может, не все компоненты нормально php7 поддерживают? имхо, не стоит с новинками заморачиваться. надо делать на том, что на хостинге стоит :)
как настроить openserver нормально?
не знаю. я ставил в своё время — всё нормально было. Но уже года два как поставил себе virtualbox+ubuntu — и не парюсь. и nodejs+gulp, и другие вкусности, т больше похоже на хостинг, работает шустро и стабильно.
Приветствую! Прощу помощи! Поставил 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; }
Что делать? Куда копать?
Добрый день!
Не знаю, отправилось вам мое письмо в ответ или нет, тут интернет вообще не тот… Я писал, что вам надо удалить пакет modxSmarty, так как modLivestreet использует Smarty из самого ядра MODX-а, скорее всего как раз здесь и возникает повторное объявление класса.
А вообще modLivestreet давно уже не поддерживается, его давно сменил modSociety, но в интеграции он сложный, пока я не запилил более дружелюбный релиз.
Подскажите, как запустит смарти с shopkeeper и tagManager 2?
Вывод товаров сделал, по примеру выше, но, при обработке фильтра, выходит массив с документами и не подгружает шаблон :-(
Я пробовал так, взял запуск через {snippet name=tmCatalog} вроде работает, пришлось прописать чанк для этого. Но, в чанках не работает конкструкция {field name=blabla} как тогда заставить сие работать?
в чанках {field name...} и не будет работать, поскольку это тег Smarty. Насколько я помню, shopkeeper позволяет указывать tpl-файлы вместо чанков. Но это лучше уточнить на сайте разработчика shopkeeper
Чтобы в чанках работали конструкции типа {field name=blabla}, посмотрите в сторону fenom. Они со смарти вполне уживаются вместе. Но работу не могу гарантировать, так как моменты выполнения у смарти и фенома разные. То есть может заработать, а может и нет.
Помогите пожалуйста разобраться вот с этим:
{snippet name="pdoMenu" params='
&where=`[{"TVjanre.value:LIKE":"%[[*id]]%"}]`
'}
как правильно записать условие что бы его не обрабатывал парсер Smarty ?

{literal} {snippet name="pdoMenu" params=' &where=`[{"TVjanre.value:LIKE":"%[[*id]]%"}]` '} {/literal}

нет. сниппет мне нужен. проблема тут &where=`[{"TVjanre.value:LIKE":"%[[*id]]%"}]` - не выполняется условие, smarty обрабатывает
Это уже на modx.pro надо спрашивать, это их сниппет
&where=`[{"TVjanre.value:LIKE":"%[[*id]]%"}]`
попробуйте так:
&where=`[{ "TVjanre.value:LIKE":"%[[*id]]%"}]`
(пробел после открывающеё фигурной скобки)
или

{snippet name="pdoMenu" params=[ where=>["TVjanre.value:LIKE" => "%{$modx->resource->id}%"] ]}

Я обычно параметры передаю как массив, это экономит время на вызове MODX-парсера
Спасибо за подсказку. Столкнулся тут ещё с одной бедой ).
Если прописываю так, то выводит ресурсы которые надо:
'where' => '[{"TVjanre.value:LIKE":"%1089%"}]',
НО если вот так, то нечего не показывает:
'where' => '[{"TVjanre.value:LIKE":"%[[*id]]%"}]',

хотя в отладке и в первом и во втором случае одно и тоже ( http://prntscr.com/hnfk65 )
Даже не знаю как у яндекса спросить в таком случае )
Яндекс ничего не знает. У гугла спрашивать надо. А лучше просто статьи здесь перечитать, тут много всего интересного и полезного написано. Учите базовый синтаксис MODX и вопросы кеширования.
[[!pdoMenu &where=`[{"TVjanre.value:LIKE":"%{$modx->resource->id}%"}]`]]
Или
{snippet name="pdoMenu" params=' &where=`[{"TVjanre.value:LIKE":"%{$modx->resource->id}%"}]` '}


Такого ещё нигде не видел и не делал, НО как ужасный вариант )
{assign var=v value='[{"TVjanre.value:LIKE":"%'}
{assign var=vv value=$modx->resource->id}
{assign var=vvv value='%"}]'}
{assign var=vvvv value="`$v``$vv``$vvv`"}
'where' => {$vvvv},
у меня только так заработало
У вас буквально получилась строка 'where' => '[{"TVjanre.value:LIKE":"%{$modx->resource->id}%"}]'. То же самое, что я вам выше и написал. Вы, видимо, еще не очень понимаете принципы конкатенации и не понимаете, что эту строку и собрали из сформированных переменных.
Невозможно установить пакеты, пишет ошибка. "Невозможно установить пакет с подписью: modxsmarty-1.0.3-beta" и так же с пакетом phptemplates-1.5.2-beta. Проект загнулся?
MODX Revolution 2.7.2-pl
@EMAKASS, хотя проект и не развивается, но во всяком случае не похоронен.
Сам попробовал сейчас на modhost на последней версии MODX установить, все устанавливается http://joxi.ru/DmBJ1RaCzaOJjm
Вероятней всего проблема где-то на вашей стороне (может нет прав на запись файлов или типа того). Посмотрите логи, хотя при установке пакетов MODX практически ничего внятного в логи не записывает, к сожалению.

@ Fi1osof да действительно, извиняюсь, что-то на моей стороне, права выставляю но ничего не меняется.
Нашел причину в пути к ядру в таблице modx_workspace, поменял на новый путь и всё ок

Добавить комментарий