У меня на одном из интернет-магазинов галерея фотографий товара сделана с помощью компонента MIGx. Сделано удобно, поддерживается мультизагрузка фотографий, для каждого товара автоматически создается папочка по номеру его ID под фотки.
Выводятся фотографии с помощью сниппета getImageList. Все здорово, работает за исключением тех случаев, когда фотографии к товару не загружены. В таком случае просто ничего не выводится и с этим можно смириться, если верстка страницы при этом не ломается. Либо поправить верстку, чтобы не ломалась.
Но мне присра захотелось, чтобы при отсутствии фотографий выдавалась заглушка nofoto.jpg. И сразу скажу, привычных темплейтов для вывода при отсутствии результата выборки сниппета getImageList не предусмотрено. В русскоязычном интернете я тоже не нашел решения. Пришлось обратиться к буржунету.
Там нашлось решение, от разработчика этого компонента Bruno17, основаное на phx (который в REVO идет «из коробки», и всю логику шаблонов удобно делать с помощью него) такое:
Сайт на CMS MODX за 45 минут
Источник: xn--80ajr5b.com
Modx получить значение tv по id
- Блог
- 5 способов определить сайт мошенников
- Shopkeeper3 проблема с Яндекс.Кассой
- Проблема с наборами параметров в MODX REVO 2.4.0
- Mozilla Firefox 51.0.1 и Firebug
- О фильме Логан
- Применение для Яндекс.Диска
- Как отследить майнер на компютере
- MODX REVO
- Расширения MODX REVO
- AdvSearch
- AdvSearchForm
- AdvSearchForm.tpl
- AdvSearch.tpl
- AdvSearch.extractTpl
- AdvSearch.containerTpl
- Advsearch.paging1Tpl
- Advsearch.paging0Tpl
- Archivist
- tpl
- tpl
- Создание блога
- Заполнители Articles
- Список статей
- addEventListener
- checkForLocks
- checkSession
- getAuthenticatedUser
- getCacheManager
- getChildIds
- getChunk
- getConfig
- getContext
- getEventMap
- getLoginUserID
- getLoginUserName
- getParser
- getPlaceholder
- getRegisteredClientScripts
- getRegisteredClientStartupScripts
- getRequest
- getResponse
- getService
- getSessionState
- getTree
- getUser
- getVersionData
- handleRequest
- hasPermission
- initialize
- invokeEvent
- lexicon
- makeUrl
- parseChunk
- regClientCSS
- regClientHTMLBlock
- regClientScript
- regClientStartupScript
- removeAllEventListener
- removeEventListener
- runProcessor
- runSnippet
- sendError
- sendErrorPage
- sendForward
- sendRedirect
- setDebug
- setPlaceholder
- setPlaceholders
- switchContext
- toPlaceholder
- toPlaceholders
- unsetPlaceholder
- unsetPlaceholder
- unsetPlaceholders
- xPDO::addPackage
- xPDO::commit
- xPDO::connect
- xPDO::beginTransaction
- xPDO::fromJSON
- xPDO::getCollection
- xPDO::getCollectionGraph
- xPDO::getObject
- xPDO::newQuery
- xPDO::getObjectGraph
- xPDO::getOption
- xPDO::getTableName
- xPDO::loadClass
- xPDO::log
- xPDO::newObject
- xPDO::newQuery
- xPDO::query
- xPDO::setDebug
- xPDO::setLogLevel
- xPDO::setLogTarget
- xPDO::setOption
- xPDO::toJSON
- xPDOCacheManager::copyFile
- xPDOCacheManager::copyTree
- xPDOCacheManager::delete
- xPDOCacheManager::deleteTree
- xPDOCacheManager::endsWith
- xPDOCacheManager::escapeSingleQuotes
- xPDOCacheManager::get
- Получаем детей в мультиселект по id родителя с учетом контекста
- Как сгенерировать свою Schema.xml
- Как получить колличество ресурсов
- Редирект на https для MODX REVO
- Достаем id instagram
- MIGX формуляр (beta)
- Get Users List
Получаем детей в мультиселект по id родителя с учетом контекста
- Главная
- Документация
- Наброски
- Получаем детей в мультиселект по id родителя с учетом контекста
Создаем сниппет NewSnippet, сниппет использует BabelTranslation:
16 MODX Revolution Вывод новостей на сайте
resource->get(‘context_key’); $parentGall = $modx->runSnippet(‘BabelTranslation’,array( ‘showUnpublished’ => ‘1’, ‘resourceId’ => 9, ‘contextKey’ => $context_key )); $array_ids = $modx->getChildIds($parentGall,1,array(‘context’ => $context_key)); $str = ‘Empty==||’; foreach($array_ids as $val)< $doc = $modx->getObject(‘modResource’, $val); $str .= $doc->get(‘pagetitle’).’==’.$val.’||’; > $str = substr($str, 0, -2); return $str;
Источник: devpastet.ru
Фильтры-модификаторы PHx в Modx revo — примеры использования
Фильтры PHx (Placeholders Xtended) добавляют новые возможности для отображения плейсхолдеров, тегов MODx (включая TV параметры) и теги настроек сайта. Фильтры модификаторы phx позволяют манипулировать значением тегов, непосредственно внутри шаблона.
Все довольно просто, модификаторы phx значительно облегчают жизнь разработчику сайта. Например есть сайт и необходимо только на главной странице показывать слайдер, ну или любой другой банер. В шаблоне сайта достаточно прописать
[[*id:is=`1`:then=`[[$slider]]`]]
где 1 — это id главной страницы, а $slider — чанк с html кодом слайдера. и т.д. и т.п. Только чайники создают новый шаблон и копируют туда весь html-код страницы, ради пары строчек слайдера/банера. Но не печальтесь, все мы такими были, поэтому просвещайтесь и пользуйтесь в будущем фильтрами модификаторами phx.
[[*id:is=`1`:then=`[[$slider]]`]]
— выводит id текущей страницы;
:is=`1`:then= — проверяет равно ли *id == 1
и если ДА, то выводит содержимое then;
[[$slider]]
— выводит чанк в котором находится верстка и вывод слайдера.
использовано может быть любое другое поле, например
[[*template]]
— выведет текущий используемый шаблон. Или можно проверять не пусто ли TV-поле
[[*slider]]
или как там его?
Примеры использования PHx фильтра в MODx
Пример 1:
Хорошим тоном считается когда клик по логотипу компании отправляет на главную страницу сайта. Но ссылка должна быть неактивна, если пользователь находится как раз на главной.
Т.к. в MODX чаще всего вы используете шаблоны страниц, в данном случае вам бы потребовалось создать два шаблона.
Один для главной без ссылки:
Второй для внутренних страниц со ссылкой:
Это неудобно. С помощью PHx модификатора is (равенство) вы можете сделать так:
[[*id:is=`1`:then=` `:else=` `]]
Если id страницы равен 1, вернуть логотип без ссылки, а если id не равен 1, вернуть логотип со ссылкой. Тем самым вы избавляетесь от создания двух практически идентичных шаблонов и обходитесь одним, но с модификатором вывода.
Пример 2:
Нам требуется вывести разные названия страницы в зависимости от шаблона.
[[*template:is=`1`:or:is=`2`:then=`[[*pagetitle]]`:else=`[[*longtitle]]`]]
Если шаблон страницы равен 1 или равен 2, вернуть
[[*pagetitle]]
иначе вернуть
[[*longtitle]]
Как видите, можно использовать несколько модификаторов в одной цепочке. Хотя, правильнее было бы написать так:
[[[[*template:is=`1`:or:is=`2`:then=`*pagetitle`:else=`*longtitle`]]]]
В следующих таблицах перечислены некоторые модификаторы PHx, которые могут быть использованы для любого тега MODx Revolution.
Модификаторы условия
[[+phx:input=`/assets/img/photo.gif`]]
— добавляем в тег phx входное значение, следующим модификатором, например, можно обработать изображение.
Или
[[+phx:input=`/assets/img/photo.gif`:contains=`photo.gif`:then=`da`:else=`net`]]
проверить есть ли в пути определенная последовательность символов.
[[*id:is=`1`:and:if=`[[*id]]`:ne=`2`:then=`da`:else=`net`]]
[[*id:is=`1`:or:if=`[[*id]]`:is=`2`:then=`da`:else=`net`]]
— если id-ресурса = 1 или = 2, выводим «da», или же «net».
[[*id:is=`1`:and:if=`[[*id]]`:ne=`2`:then=`da`:else=`net`]]
[[*id:is=`1`:then=`da`:else=`net`]]
[[*id:ne=`1`:then=`da`:else=`net`]]
[[*id:ge=`1`:then=`da`:else=`net`]]
[[*id:gt=`1`:then=`da`:else=`net`]]
[[*id:el=`10`:then=`da`:else=`net`]]
[[*id:lt=`10`:then=`da`:else=`net`]]
[[+author:contains=`Сэ́мюэл Кле́менс`:then=`Марк Твен`]]
[[+author:containsnot=`Сэ́мюэл Кле́менс`:then=`Кто-нибудь еще`]]
[[*id:is=`10`:hide]]
[[*id:is=`10`:show]]
[[*id:is=`10`:then=`ept`]]
[[*id:is=`10`:then=`ept`:else=`nooo`]]
[[+controls]]
[[+controls:select=`0=ВЫКЛ2=ХЗ`:else=`Ошибка`]]
[[+controls]]
[[*template:in=`3,4`:then=`[[$myChank]]`:else=`пробел`]]
[[*template]]
(текущий шаблон) — равен «3» или «4», значит выводим
[[$myChank]]
Модификаторы строки
[[+num:cat=` раз`]]
[[*pagetitle:lcase]]
[[*pagetitle:ucase]]
[[*pagetitle:ucwords]]
[[*pagetitle:ucfirst]]
[[*pagetitle:htmlentities]]
[, ] и `
[[*content:esc]]
[[*content:strip]]
[[*pagetitle:stripString=`писька`]]
[[*pagetitle:replace=`писька==конфетка`]]
[[*longtitle:strip_tags=«]]
[[*longtitle:strlen]]
[[*longtitle:reverse]]
[[*pagetitle:wordwrap=`10`]]
[[*pagetitle:limit=`10`]]
[[*pagetitle:ellipsis=`10`]]
[[+showThis:tag]]
[[+num:incr]]
[[+num:add=`97`]]
[[+num:decr]]
[[+num:decr=`97`]]
[[+num:mpy]]
[[+num:mpy=`5`]]
[[+num:div]]
[[+num:div=`5`]]
[[+num:mod]]
[[+num:mod=`5`]]
[[*pagetitle:empty=`Пусто`]]
[[*pagetitle:!empty=`Не пусто!`]]
[[*pagetitle:nl2br]]
[[*pagetitle:nl2br]]
[[+birthyear:date=`%Y`]]
[[*createdon:strtotime]]
[[*createdon:fuzzydate]]
[[*createdon:ago]]
[[+password:md5]]
[[*pagetitle:cdata]]
[[+modx.user.id:userinfo=`username`]]
[[+modx.user.id:isloggedin]]
[[+modx.user.id:isnotloggedin]]
[[+number:toPlaceholder=`итого`]]
помещает содержимое
[[+number]]
в плейсхолдер
[[+итого]]
Можно усложнять запись добавляя в левую часть выражения любые другие модификаторы:
[[+number:is=`10`:then=`ровно 10`:else=`точно не 10!`:toPlaceholder=`итого`]]
[[+number]]
= 10, тогда выводим в плейсхолдер
[[+итого]]
[[+cssTV:cssToHead]]
[[+htmlTV:htmlToHead ]]
перед закрывающим тегом , регистрирует значение тега
[[+htmlTV]]
modX.regClientHTMLBlock
[[+htmlTV:htmlToBottom]]
перед закрывающим тегом регистрирует значение тега
[[+htmlTV]]
modX.regClientStartupScript
[[+jsTV:jsToHead]]
modX.regClientScript
[[+jsTV:jsToBottom]]
[[+stringi:urldecode]]
[[!+modx.user.id:userinfo=`internalKey`]]
[[!+modx.user.id:userinfo=`username`]]
Полное имя:
[[!+modx.user.id:userinfo=`fullname`]]
[[!+modx.user.id:userinfo=`role`]]
[[!+modx.user.id:userinfo=`email`]]
[[!+modx.user.id:userinfo=`phone`]]
Мобильный телефон:
[[!+modx.user.id:userinfo=`mobilephone`]]
[[!+modx.user.id:userinfo=`fax`]]
День рождения:
[[!+modx.user.id:userinfo=`dob`:date=`%Y-%m-%d`]]
[[!+modx.user.id:userinfo=`gender`]]
[[!+modx.user.id:userinfo=`country`]]
[[!+modx.user.id:userinfo=`state`]]
[[!+modx.user.id:userinfo=`zip`]]
[[!+modx.user.id:userinfo=`photo`]]
Комментарий:
[[!+modx.user.id:userinfo=`comment`]]
Дата последнего входа:
[[!+modx.user.id:userinfo=`lastlogin`:date=`%Y-%m-%d`]]
Количество входов:
[[!+modx.user.id:userinfo=`logincount`]]
[[!+modx.user.id]]
возвращает ID вошедшего в систему пользователя. Вы, конечно, можете заменить, его на
[[*createdby]]
или другое поле ресурса или любой плейсхолдер, который возвращает числовое представление ID пользователя.
Обратите внимание, что ID пользователя и его логин уже доступны по умолчанию в MODX, так что вам не нужно использовать модификатор User Info:
[[!+modx.user.id]]
— Выведет ID пользователя
[[!+modx.user.username]]
— Выведет логин пользователя
Особое внимание обращаем на восклицательный знак !
[[!+modx.user.id]]
Он позволяет НЕ кэшировать содержимое вывода. Лучше всего эти плейсхолдеры вызывать некешируемыми, чтобы избежать неожиданных результатов. Почему нужно не кешировать.
Представим это так: на сайте 5 пользователей. Первый пользователь зашел на страницу с вызовом:
Добро пожаловать, [[!+modx.user.id:userinfo=`username`]]!
По задумке на этой странице, выводится приветственное сообщение пользователю. Так вот, если результат будет кешироваться, то при первом входе на эту страницу — сохранится имя пользователя который только что зашел — и всем остальным будет показываться не их имя, а имя того пользователя который вошел на эту страницу первым. Чтобы этого избежать — просто не кэшируем этот тэг, с помощью восклицательного знака перед вызовом !+modx.
Также фильтры можно использовать несколькими способами (что уменьшает время их выполнения)
Используем модификатор:
[[+title:lcase]]
[[+something:notempty=`Hello[[+name]]`]]
Используем сниппет:
[[lcase? subject=`something` subject=`title` subject=`something` meter=`Hello [[+name]]`]]
P.S: Не забываем включить кэширование тегов, где нужно. Чтобы это сделать — нужно ИЗБАВЛЯТЬСЯ от восклицательных знаков (!). Результаты большинства сниппетов вплоне себе могут работать из кэша.
Источник: seo-studio.pro