Получить TV в сниппете

Фильтры phx, позволяют манипулировать значением тега, прямо внутри шаблона. Оригинальная документация.

Ну зачем они нужны?
грязное танго с phx

Все довольно просто, модификаторы phx значительно облегчают жизнь разработчику сайта, например есть сайт и необходимо только на главной странице показывать слайдер, ну или любой зыбучий крутилко-банер. В шаблоне сайта достаточно прописать [[*id:is=`1`:then=`[[$slider]]`]], где 1- это id главной страницы, а $slider- чанк с html кодом слайдера. и т.д. и т.п. только глупцы, создают новый шаблон и копируют туда весь html-код страницы, ради пары строчек слайдера/банера. Но все такими не были, поэтому не отчаивайся и внедряй phx в разработку.

[[*id:is=`1`:then=`[[$slider]]`]]

Дано:
*id- выводит id текущей страницы;
:is=`1`:then=- проверяет равно ли *id == 1? и если да выводит содержимое then;
$slider- выводит чанк в котором находится верстка и вывод слайдера.

Вместо *id, использовано может быть любое другое поле, например *template- выведет текущий используемый шаблон. Или можно проверять не пусто ли TV-поле *sliderили как там его?

MORGENSHTERN ПРО МУЗ ТВ | ПОЛУЧИТЬ ТАРЕЛКУ ЗАШКВАР?


[[*slider:!empty=`[[$slider]]`]]

Нагрузка

Одно НО, нужно тщательно следить за обработкой модификаторов. Выше приведенную запись при выводе на сайт, modx считывает слева направо и выполняет все вложенные условия, не зависимо от того, верное условие или нет; будет ли выводиться на экран текущей страницы содержимое [[$slider]]— в любом случае содержимое этого чанка обработается, и даже гугл не поймет как. Поэтому, поменяем запись так:

[[$sli[[*id:is=`1`:then=`der`]]]]

В этом случае, содержимое чанка $slider, будет обработано только когда выполняется условие *id:is=`1`. Т.к. выполняется [[*id:is=`1`:then=`der`]]и если id текущей страницы равно 1, последнее что обрабатывается — [[$slider]], если id не равно 1, тогда — [[$sli]]. А если чанка $sli- нет в элементах, то и нагрузки не будет.

[[$слай[[*id:is=`1`:then=`дер`]]]] [[$[[*id:is=`1`:then=`слайдер`]]]] #идеален

Подробнее о том, как правильно установить верстку на modx revo в этой статье. Азы, рекомендую ознакомиться.

Какую запись использовать?
..за-пись, пись, псиу.
. протосы рядом.

..за-пись, пись, псиу. протосы рядом

Вариантов масса, здесь пример обработки условно-нафантазированнного слайдера. Просто комбинируй разные модификаторы под логику своей программы, и главное помни, юный падаван, их суть только в том чтобы сделать разработку проще, а не усложнять без того сложные сложности. Как правило, самый эффективный способ — самый простой, чем проще и понятней конструкция — тем легче с ней будет работать в дальнейшем. А что зерги ожидают от phx?

[[$sli[[*id:is=`1`:then=`der`]]?-вывод слайдера]] [[$[[*id:is=`1`:then=`слайдер`]]?- вывод слайдера #идеален]]

Эта запись лучше, если в чанке $слайдер- идет дополнительная обработка сниппетом, например обрезается изображение, или генерируется какой-то контент.

Как получить Сниппет в выдаче Яндекса KOCHETOFF.ru

Если содержимое $slider- например обычный html-код, без использования сниппетов, то вполне подойдет:

[[*id:is=`1`:then=`[[$slider]]`]] [[*id:is=`1`:then=`[[$слайдер]]`?- слайдер все еще тут]]

В следующих таблицах перечислены некоторые модификаторы, которые могут быть использованы для любого тега MODx Revolution.

Модификаторы условия

МодификаторОписаниеПример
if,input if- задает дополнительное условие
input- добавляет в тег обратываемые данные
[[+phx:input=`/assets/img/wow.gif`]]- добавляем в тег phx входное значение, следующим модификатором, например, можно обработать изображение.
Или [[+phx:input=`/assets/img/wow.gif`:contains=`wow.gif`:then=`da`:else=`net`]]проверить есть ли в пути определенная последовательность символов.

Модификаторы строки

МодификаторОписаниеПример
cat Добавляет к тегу строку. [[+num:cat=` раз`]], выведет к примеру «10 раз».
lcase, lowercase, strtolower Переведет значение тега в нижний регистр, аналогично функции php strtolower. [[*pagetitle:lcase]]
ucase, uppercase, strtoupper Переведет текст в верхний регистр, аналогично функции php strtoupper. [[*pagetitle:ucase]]
ucwords Переведет каждую первую букву, каждого слова в верхний регистр, аналогично функции php ucwords. [[*pagetitle:ucwords]]
ucfirst Переведет только первую букву строки в верхний регистр, аналогично функции php ucfirst. [[*pagetitle:ucfirst]]
htmlent, htmlentities Преобразует все символы в соответствющие HTML сущности (для тех символов, для которых HTML сущности существуют), аналогично функции php htmlentities. Использует текущие настройки системы «modx_charset» с флагом «ENT_QUOTES». [[*pagetitle:htmlentities]]
esc,escape Экранирует разные «плохие символы», так же экранирует [, ]и `. [[*content:esc]]
strip Заменяет все переносы строк, табуляции и множественные пробелы с на один пробел. [[*content:strip]]
stripString Вырезает из строки заданную строку. [[*pagetitle:stripString=`вц`]]
replace Обычная замена. [[*pagetitle:replace=`вц==конфетка`]]
striptags, stripTags,notags,strip_tags Вырезает все теги, кроме разрешенных, аналогично функции php strip_tags [[*longtitle:strip_tags=`
Еще по теме:  Как отключить vpn на Смарт ТВ

Создаем свой модификатор

Модификаторы создаются, в точности как сниппеты. Тоесть по сути любой сниппет можно использовать в качестве модификатора, другой вопрос, вернет ли он то что нужно?)) например: [[*id:мой модификатор=`тест`]]

ПараметрЗначениеПример чо выйдет
input Значение тега выйдет значение тега [[*id]]
options Значение модификатора «тест»
token Тип тега *
name Наименование тега id
tag Вернет запись тега [[*id:мой модификатор=`тест`]]

К примеру, создадим тестовый сниппет «мой модификатор», и почекаем что вылезает:

создадим тестовый сниппет мой модификатор modx revo

‘; $test .= $options.»; $test .= $token.»; $test .= $name.»; $modx->log(1,’$tag: ‘. $tag); # это будет выводится в журнал ошибок # напрямую в шаблон выводить не советую иначе подвиснет сайт return $test;

Цепочки модификаторов

Хорошим примером построения цепочки будет отформатировать строку даты в другой формат, например, так:

[[+mydate:strtotime:date=`%Y-%m-%d`]]

Прямой доступ к таблице «modx_user_attributes» в базе данных с использованием выходных модификаторов вместо сниппета можно осуществить просто путем использования модификатора userinfo. Выбрать соответствующий столбец из таблицы и указать его в качестве свойства выходного модификатора, например, так:

Внутренний ключ пользователя: [[!+modx.user.id:userinfo=`internalKey`]]
Логин: [[!+modx.user.id:userinfo=`username`]]
Полное имя: [[!+modx.user.id:userinfo=`fullname`]]
Роль: [[!+modx.user.id:userinfo=`role`]]
E-mail: [[!+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`]]
Zip код: [[!+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]]. Он позволяет НЕ кэшироватьсодержимое вывода. Почему нужно не кешировать? Представим это так: на сайте 5 пользователей. Первый пользователь зашел на страницу с вызовом:

Добро пожаловать, [[!+modx.user.id:userinfo=`username`]]!

По задумке на этой странице, выводится приветственное сообщение пользователю. Так вот, если результат будет кешироваться, то при первом входе на эту страницу — сохранится имя пользователя который только что зашел — и всем остальным будет показываться не их имя, а имя того пользователя который вошел на эту страницу первым. Чтобы этого избежать — просто не кэшируем этот тэг, с помощью восклицательного знака перед вызовом [[!+modx.

P.s.: Не забываем отключать кэширование тегов, повсеместно! Чтобы это сделать — нужно ОСВОБОЖДАТЬСЯ от восклицательных знаков ( !). Результаты большинства сниппетов вплоне себе могут отрабатывать из кэша.

Альтернатива — Fenom
более привычный шаблонизатр

Для истинных ценителей шаблонизаторов с элементами php кода, в modx revo с помощью набора пакета PdoTools, интегрируется шаблонизатор Fenom. Содержимое документации.

24 мая 2012, 12:34

Консультации платные!
Хочешь получить профессиональнуюпомощь?
стоимость ответа на вопрос от 2 000тыс. руб.

* На указанный email будет выставлен счет, после оплаты — ответ на вопрос
Материал оказался полезным?
У меня тут рандомнаяоплата обучения,
а ты желаешь взнести свой вклад?
* Сумма произвольна
Хочешь быстрее усвоить материал?
Оплатисвое обучение
и по благовению вселенной у тебя все получится!
* Сумма произвольна

# Уважаемые бойцы с кодом! # Лень отвечать на комментарии.
Комментарии ( 225 )
Юра 28 апреля 2014, 01:44 # ↓ 0 —>

Здравствуйте увж автор!
Мучаю голову 2ой день.
Сайт на рево + шопкипер + куча всего, допилок и подпилок.
Задача стоит такая, типов товара много, в корзине к каждому нужно выводить только те tv к которым он относится, и те которые заполнены, для этого сделал такую конструкцию, к примеру:

[[+fason:!empty:then=`Силуэт:[[+fason]];`:else=` `]]

Т.е. если tv fason не пусто ты вывести силуэт и значение, а если пусто но ниче не надо.
Вот что я делаю не так?

gaserge.ru 28 апреля 2014, 09:29 # ↑ ↓ 0 —>

у notempty, нет параметров then и else, сразу вывод:
[[+fason:!empty=`Силуэт:[[+fason]];`]]

Еще по теме:  Скайнет каналы ТВ список всех

ну и если страницы кешируются, то отключать кеш у плейсхолдера
[[!+fason:!empty=`Силуэт:[[!+fason]];`]]

snov 03 мая 2014, 20:10 # ↓ 0 —>

Отличное имя картинки в примере про if, input.

ЗЫ Поздно заметил, что и в остальных тоже норм имена

TITAN-UZ 28 августа 2014, 13:56 # ↓ 0 —>

Башка не работает помогите выводом тв

Есть 2 tv: Home, Away Тип список.

Если в Away указан value-1 то надо показать Home если в away не value-1 то надо показать away

gaserge.ru 28 августа 2014, 14:06 # ↑ ↓ +1 —>

[[*Away:is=`value-1`:then=`[[*Home]]`:else=`[[*Away]]`]]
Павел 29 августа 2014, 11:43 # ↓ 0 —>

Подскажите пожалуйста, задача следующая:
Если в tv пусто то ни чего не выводим, если в tv что то есть то выводим чанк old_price, у меня почему то выводится значение tv, но не чанк целиком

[[*old_price:!empty = `Старая цена:[[$oldprice]];`]]

Старая цена: [[*old_price]] Руб.

Наталья 03 сентября 2014, 17:21 # ↓ 0 —>

Добрый день!
Подскажите, пожалуйста, как можно реализовать следующее. Каталог с фильтрацией tagManager2.

Вывод товаров у меня производится на странице каталога, то есть товары не разбиты по подкатегориям, в дереве ресурсов идут одним полотном. Навигация производится с помощью фильтрации. То есть изначально выводятся все-все-все товары, а потом в зависимости от установленных галочек отсеиваются нужные.

Проблема в следующем. Как убрать изначальный вывод всех-всех-всех товаров? А они бы начинали выводиться уже по установке фильтров. Это необходимо для того, чтобы изначально при переходе на страницу «каталог» там отображалась другая информация (слайдеры с хитами продаж и распродажей), а когда пользователь устанавливает нужные флажки, эти слайдеры меняются на отсортированные товары.

Пробовала с помощью модификаторов задать такое условие: [[[[*id]]:is=`catalog/`:then=`[[$banner_cat]][[$carusel_tovara]]`:else=`[[$vyvod_tovarov]]`]]
Не срабатывает.

Подскажите, пожалуйста, как быть.

gaserge.ru 03 сентября 2014, 19:04 # ↑ ↓ 0 —>

Дело в том, что конструкция [[[[*id]]]] — всегда будет возвращать только ссылку на текущую страницу, типа как «catalog/», вне зависимости от того какие параметры в адресной строке еще есть.

Ознакомился со компонентом tagManager2,
и заметил что при фильтрации он похоже всегда добавляет переменную $_GET[‘page’]
думаю отсюда нужно и плясать.

Попробуйте сделать следующим образом: создать сниппет type, с кодом:

if( isset( $_GET[‘page’] ) ) < return ‘tovar’; >else
и вывести в шаблоне его, вот так:

[[$vyvod_[[!type]]]]
соответственно в чанках:
vyvod_tovar — выводим товары
vyvod_banner — выводим банеры
Наталья 03 сентября 2014, 20:43 # ↓ 0 —>

Спасибо большое за совет! Вы навели меня на хорошую идею, как это сделать. Я именно искала такую «вещь», которая меняется при применении фильтрации и, к которой можно было бы привязать проверку. Таким образом можно решить проблему, но выход, к сожалению, не идеален.

Предложенный Вами вариант (немного модифицированный, так как $_GET[‘page’] не всегда появляется все же, но вместо нее можно использовать другую переменную или задать специально свою) работает только в простом виде фильтрации. Если же использовать Ajax-фильтрацию, то страница не обновляется и наша проверка, соответственно, не производится. Как в этом случае можно поступить? В Аяксе я не разбираюсь ничуть, даже мыслей нет, где это можно прописать.

gaserge.ru 03 сентября 2014, 21:06 # ↑ ↓ 0 —>
TITAN-UZ 12 сентября 2014, 17:59 # ↓ 0 —>

Как использовать несколько модификаторов надо сделать разные title для новостей по категориям

[[*id:is=`[[++site_start]]`:then=`[[++site_name:htmlent]]`:else=`[[*pagetitle]] / [[++site_name]]`]]

Источник: gaserge.ru

Картинка в списке элементов коллекции Collection

Сегодня я оставлю заметку о том, как вывести изображение для каждой записи

Я применял 2 способа.
Первый — это когда изображение у нас хранится в TV-параметре. Например, у нас есть новость и картинка для нее хранится в отдельном TV.
Второй — когда нужно вывести первое изображении из галереи ms2Gallery. Например, у нас имеется раздел Галерея или Портфолио.

В первом случае все просто.
Добавляем столбец таким образом

где
preview — TV параметр содержащий изображение
render_preview — сниппет со следующим содержимым:

$img = str_replace(‘//’, ‘/’, ‘/’.$img); return ‘‘;

Еще по теме:  Как включить салют ТВ

Когда в список Collection нужно вывести первое изображение из ms2Gallery, то я поступаю так:
Добавляю в Виды коллекций столбец из существующего поля.

На изображении это description. Это не важно, главное чтобы он не был задействован.
В поле «Сниппет-рендер» указываем «maket_preview».
Содержимое данного сниппета ниже:

runSnippet(‘ms2Gallery’, [ ‘tpl’=>’tpl.collection.image’, ‘resources’=>$scriptProperties[‘row’][‘id’], ‘limit’=>’1’, ]); return $img;

чанк «tpl.collection.image» имеет следующее содержимое

где,
medium — название одной из заготовок в Источниках файлов

Источник: modxguru.ru

«Разрабатываем социальную сеть на MODx Revolution»

Для начала давайте разберемся с пользователями, дадим им возможность писать статьи, например, или добавлять свои события.

Регистрация пользователей

Для регистрации мы будем использовать сниппет Login .

[[!Register? usergroups=`Users` activationResourceId=`11` validate=`email:email:required`]]

О самом сниппете написано уже много, покажу, что делает наш хук addUser:

Сниппет addUser

Сниппет addUser

Сниппет addResource

Сниппет addResource

// Создаем ресурс $newResource = $modx->newObject(‘modResource’); // Заполняем нужные значения $newResource->set(‘pagetitle’,$pagetitle); $newResource->set(‘longtitle’,$longtitle); $newResource->set(‘description’,$description); $newResource->set(‘introtext’,$introtext); $newResource->set(‘content’,$content); $newResource->set(‘menutitle’,$menutitle); $newResource->set(‘template’,$template); $newResource->set(‘isfolder’,$isfolder); $newResource->set(‘hidemenu’,$hidemenu); $newResource->set(‘parent’,$parent); $newResource->set(‘published’,$published); $newResource->set(‘alias’,$parent.date(‘YmdHis’)); if ($published) $newResource->set(‘publishedon’,$publishedon); // Сохраняем ресурс if ($newResource->save()) < $id = $newResource->get(‘id’); $newResource->set(‘alias’,$prefix.$id); $newResource->save(); // Очищаем кеш, чтобы изменения были видны сразу $modx->cacheManager->refresh(); return $id; > return false;
Сниппет tv

Сниппет tv

newQuery(‘modTemplateVarResource’); $q->select(array(‘value’, ‘tmplvarid’, ‘contentid’))->where(array(‘tmplvarid’=>$options, ‘contentid’=>$input)); $r = $modx->getObject(‘modTemplateVarResource’, $q); return $r->value; > else < // либо устанавливаем значение TV if (!$id) if (!$tv) $tv = $_POST[‘tv’]; if (!$value) $value = $_POST[‘value’]; if ($value == ‘ ‘) $value = »; if ($modx->getObject(‘modTemplateVarResource’, array(‘contentid’ => $id, ‘tmplvarid’ => $tv))) < $tvar = $modx->getObject(‘modTemplateVarResource’, array(‘contentid’ => $id, ‘tmplvarid’ => $tv)); > else < $tvar = $modx->newObject(‘modTemplateVarResource’); $tvar->set(‘contentid’, $id); $tvar->set(‘tmplvarid’, $tv); > $tvar->set(‘value’, $value); $tvar->save(); >

После того, как пользователь подтвердил свой e-mail, направляем его на страничку редактирования информации о себе:

[[!FormIt? successMessage=`Изменения сохранены`]] [[$editPage]]

Соответственно, сниппет editUserPage
Сниппет editUserPage

Сниппет editUserPage

user->getOne(‘Profile’)->get(‘website’); $name = $_POST[‘name’]; if ($name == ») $name = ‘ ‘; // И вносим изменения на страницу if ($modx->runSnippet(‘editResource’,array(‘resId’ => $id, ‘pagetitle’ => $name, ‘longtitle’ => $name, ‘menutitle’ => $name, ‘hidemenu’ => ‘show’))) < foreach ($_POST as $key =>$value) < switch ($key) < case ‘com_address’: $tv = 2; break; case ‘com_egrul’: $tv = 5; break; case ‘com_email’: $tv = 9; break; case ‘com_federate’: $tv = 4; break; case ‘com_head’: $tv = 10; break; case ‘com_inn’: $tv = 6; break; case ‘com_kpp’: $tv = 7; break; case ‘com_phone’: $tv = 3; break; case ‘com_regon’: $tv = 8; break; default: $tv = 0; break; >if (!$value) $value = ‘ ‘; if ($tv) $modx->runSnippet(‘tv’, array(‘id’ => $id, ‘tv’ => $tv, ‘value’ => $value)); > // Очищаем кеш, чтобы изменения были видны сразу $modx->cacheManager->refresh(); return true; >

Создаем статьи или события пользователя

Пусть у нас пользователи могут добавлять на свою страничку предстоящие и прошедшие события:

[[!FormIt? successMessage=`Изменения сохранены` getOne(‘Profile’)->get(‘website’); $name = $_POST[‘name’]; $date = explode(‘.’,$_POST[‘event_date’]); $publishedon = $date[2].»-«.$date[1].»-«.$date[0].» 10:00:00″; $introtext = $_POST[‘description’]; if ($id = $modx->runSnippet(‘addResource’,array(‘pagetitle’ => $name, ‘longtitle’ => $name, ‘introtext’ => $introtext, ‘menutitle’ => $name, ‘published’ => 1, ‘publishedon’ => $publishedon, ‘parent’ => $parent, ‘template’ => 4, ‘isfolder’ => 1))) < // Заполняем любые параметры события, которые нам нужны foreach ($_POST as $key =>$value) < switch ($key) < case ‘event_address’: $tv = 14; break; case ‘event_type’: $tv = 12; break; case ‘event_org’: $tv = 34; break; case ‘event_peoples’: $tv = 24; break; default: $tv = 0; break; >if (!$value) $value = ‘ ‘; if ($tv) $modx->runSnippet(‘tv’, array(‘id’ => $id, ‘tv’ => $tv, ‘value’ => $value)); > $modx->cacheManager->refresh(); // Переадресовываем на просмотр события $url = «/companies/id».$parent.»/event».$id; header(‘location: ‘.$url); exit; return true; >

В итоге

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

Что я планирую с этим делать

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

Дата публикации: 2012-08-01

Источник: www.echats.ru

Оцените статью
Добавить комментарий