Как вывести все TV modx

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

Начну с простого, как вывести какую-то информацию в зависимости от текущего id документа, например 12. Для этого надо воспользоваться PHx или его аналогом в MODX Revolution, в зависимости от версии CMS/CMF.

# код для Evolution [*id:is=`12`:then=`Вывод какой-то информации`*] # код для Revolution [[*id:is=`12`:then=`Вывод какой-то информации`]]

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

# код для Evolution [*isfolder:is=`0`:then=`[[PrevJumpNext]]`*] # код для Revolution [[*isfolder:isnot=`1`: then=`[[pdoNeighbors]]`]]

Здесь все просто. Мы проверяем, является ли данный документ контейнером, ведь родительский документ всегда будет контейнером, и если не является, то показываем сниппет выводящий соседние документы.

MODX tv (дополнительные поля / переменные)

А еще проверяемые параметры можно группировать, например:

# код для Evolution [*parent:is=`0`:or:is=`8`:then=`Вывод какой-то информации`*] # код для Revolution [[*parent:is=`0`:or:is=`8`:then=`Вывод какой-то информации`]]

, здесь информация будет показываться только в тех документах, родителями которых является документ с id 0, т.е. корневой документ, и документ с id 8.

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

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

pdoResources — параметры и вызов из другого сниппета

Сниппет pdoResources – самый гибкий, мощный и универсальный инструмент из набора pdoTools.

Создан, как замена getResources, но имеет важные отличия — работает быстрее, лишен его недостатков и оснащен таким набором дополнительных параметров, который практически не ограничивает возможности выборки ресурсов разных классов из базы данных по любым полям и TV.

Официальное описание находится здесь. В рамках данной заметки мы рассмотрим несколько примеров его использования.

Отладочная информация

Для начала — упомянем параметр showLog, который может оказаться весьма полезным при отладке вызова сниппета, когда что-то выводится не так, как задумывалось. Вызов сниппета стандартный для MODX Revo:

[[!pdoResources? tpl = « .

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

Также, в таких случаях, лучше отбирать минимально необходимое число полей, используя параметр select, что позволяет увеличить скорость работы сайта.

Пример использования

Довольно часто возникает задача выборки ресурсов в сниппете без вывода на экран, например, с сохранением списка ID документов в переменную. MODX предоставляет несколько способов решения такой задачи. Обычный способ — через метод getCollection. Ссылки мы приводить не будем, поиск по данному слову выдаст все необходимое.

Все усложняется, когда нужен отбор по дополнительным полям (TV), особенно по нескольким.

Еще по теме:  Не показывает twitch TV

В этом случае также можно использовать возможности pdoResources.

Задействуем параметры returnIds и toPlaceholder. Первый задает выдачу строковой переменной со списком ID документов, разделенных запятыми, второй, помещает эту строку в плейсхолдер с заданным названием. Пример вызова:

2, ‘month’ => 1, ‘vidZ’ => 3 ); $where = $modx->toJSON($str); $modx->runSnippet(‘pdoResources’, array( ‘select’ => ‘id’, ‘returnIds’ => 1, ‘includeTVs’ => ‘vidZ,age,month’, ‘where’ => $where, ‘toPlaceholder’ => ‘idis’, )); $output = $modx->getPlaceholder(‘idis’); return $output;

Этот сниппет — простейший пример использования выборки по трем TV параметрам, когда мы ищем документы, у которых И параметр age = 2 И month = 1 И vidZ = 3.

Задаем WHERE посложнее:

$str=array( ‘age:IN’ => array (2,3,5), //совпадение с одним из нескольких значений ‘AND:month:>’ => 1, ‘AND:vidZ:=’ => 3 //использование логических операторов и операторов сравнения );

Что нам дает такая конструкция? Прямо прописываем только условие WHERE.

Присоединение таблицы переменных и выборку нужных полей берет на себя pdoResources.

Вызов в Fenom

В шаблонизаторе Fenom для выборки документов и тикетов можно, как использовать вызов pdoResources:

‘pdoResources’

либо через специальный вызов (выведем те же id документов в строку через запятые:

{var $resources = $_modx->getResources( [‘parent’ => 2, ‘published’ => 1], [‘select’ => ‘id’, ‘limit’ => 10, ‘showHidden’ => 1])} {foreach $resources as $resource> {$resource[‘id’]>, {/foreach}

  • getResources не имеет отношения к одноимённому сниппету, это один из методов класса microMODX
  • первый передаваемый аргумент [‘parent’ => 2, ‘published’ => 1] – это прямое указание where. Буквально эта запись указывает: выбор записей где И значение поля parent равно 2, И значение поля published равно 1 (опубликованный ресурс с id родителя 2)
  • второй аргумент – массив из обычных параметров сниппета pdoResources.

Еще одна функция, которая может оказаться полезной – выборка полей из любой таблицы базы данных MODX. У всех сниппетов pdoTools есть общий набор параметров.

Один из них – параметр class=`galItem` showLog=`0` select=`name,filename,description` https://my-priv.ru/blog/zametki/pdoresources-where-parametryi.html» target=»_blank»]my-priv.ru[/mask_link]

MODx Revolution: создание ресурсов и загрузка файлов из фронтенда

Добрый день, всем читателям блога WebHow! Наконец-то я нашла отличный плагин для подсветки кода в статьях, и теперь можно заняться серьезными делами. Итак, шутки в сторону, сегодня будет суровый пост для тех, кто мечтает организовать на своем MODx-сайте доску объявлений, каталог или любой другой сервис, где посетители будут сами размещать свой контент.

создание ресурсов и загрузка файлов из фронтенда

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

Я не программист, и когда мне впервые пришлось создать доску объявлений на MODx, все что я могла — поискать готовое решение. Различных вариантов сниппета, который бы позволил публиковать ресурс с фронтенда для MODx Revolution оказалось не мало.

Принцип у всех примерно один: при помощи FormIt создается страница с формой, в вызове которой прописывается имя сниппета. Для каждого типа объявлений создаются свои TV-поля, например, город, телефон, или поле для загрузки изображений. Когда пользователь отправляет форму, создается ресурс.

Еще по теме:  Веб браузер на Смарт ТВ LG как обновить

Однако, практически все сниппеты, которые мне удалось найти, были очень громоздкими: каждый TV-параметр нужно было прописывать в коде сниппета, а это меня не устраивало. Потому что для каждого вида объявлений я задумала как минимум 3 дополнительных поля, и все их прописывать в сниппет… нет, есть способ лучше и проще. Он был найден мною на англоязычной части официального форума MODx.com И если вы не очень хорошо говорите и читаете по английски или вам просто лень искать подходящий вариант из нескольких в теме, я расскажу как им пользоваться.

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

Код сниппета formit2resource

getObject(‘modResource’,array(‘id’=>$hook->getValue(‘resource_id’))); if (empty($doc))< $doc = $modx->newObject(‘modResource’); $doc->set(‘createdby’, $modx->user->get(‘id’)); > else< $doc->set(‘editedby’, $modx->user->get(‘id’)); > $allFormFields = $hook->getValues(); foreach ($allFormFields as $field=>$value) < if ($field !== ‘spam’ $field !== ‘resource_id’)< $doc->set($field, $value); > > $alias = $doc->cleanAlias($fields[‘pagetitle’]); if($modx->getCount(modResource, array(‘alias’=>$alias))!= 0) < $count = 1; $newAlias = $alias; while($modx->getCount(modResource, array(‘alias’=>$newAlias))!= 0) < $newAlias = $alias; $newAlias .= ‘-‘ . $count; $count++; >$alias = $newAlias; > $doc->set(‘alias’,$alias); $doc->set(‘template’, $template); $doc->save(); foreach ($allFormFields as $field=>$value) < if (!empty($value) $tv = $modx->getObject(‘modTemplateVar’, array (‘name’=>$field))) < /* handles checkboxes $featureInsert = array(); while (list($featureValue, $featureItem) = each($value)) < $featureInsert[count($featureInsert)] = $featureItem; >$value = implode(‘||’,$featureInsert); > $tv->setValue($doc->get(‘id’), $value); $tv->save(); > > $modx->cacheManager->refresh(); return true;
Код сниппета formit2file

user->get(‘id’); // Path from root that user specifies // create unique path for this form submission $uploadpath = ‘assets/uploads/’.$mydir.’/’; // get full path to unique folder $target_path = $modx->config[‘base_path’] . $uploadpath; // get uploaded file names: $submittedfiles = array_keys($_FILES); // loop through files foreach ($submittedfiles as $sf) < // Get Filename and make sure its good. $filename = basename( $_FILES[$sf][‘name’] ); // Get file’s extension $ext = pathinfo($filename, PATHINFO_EXTENSION); $ext = mb_strtolower($ext); // case insensitive // is the file name empty (no file uploaded) if($filename != ») < // is this the right type of file? if(in_array($ext, $ext_array)) < // clean up file name and make unique $filename = $counter . ‘.’ . $ext; $filename = str_replace(‘ ‘, ‘_’, $filename); // spaces to underscores $filename = date(«Y-m-d_G-i-s_») . $filename; // add date // create directory to move file into if it doesn’t exist mkdir($target_path, 0755, true); // is the file moved to the proper folder successfully? if(move_uploaded_file($_FILES[$sf][‘tmp_name’], $myTarget)) < // set a new placeholder with the new full path (if you need it in subsequent hooks) $myFile = $uploadpath . $filename; $hook->setValue($sf,$myFile); // set the permissions on the file if (!chmod($myTarget, 0644)) < /*some debug function*/ >> else < // File not uploaded $errorMsg = ‘There was a problem uploading the file.’; $hook->addError($sf, $errorMsg); $output = false; // generate submission error > > else < // File type not allowed $errorMsg = ‘Type of file not allowed.’; $hook->addError($sf, $errorMsg); $output = false; // generate submission error > // if no file, don’t error, but return blank > else < $hook->setValue($sf, »); > $counter = $counter + 1; > return $output;

Друзья! Не забывайте подставлять в код формы ваши TV-поля и ID ваших ресурсов. Будьте внимательны, и у вас все получится.

Вызов FormIt

Еще по теме:  Что такое фуджи ТВ

[[!FormIt? redirectTo=`ID страницы с сообщением` groups=`3` $hook->getValue(‘resource_id’))); if (empty($doc)) $doc = $modx->newObject(‘modResource’);
$doc->set(‘createdby’, $modx->user->get(‘id’));
>
else $doc->set(‘editedby’, $modx->user->get(‘id’));
> $allFormFields = $hook->getValues();
foreach ($allFormFields as $field=>$value)
< if ($field !== ‘spam’ $field !== ‘resource_id’)$doc->set($field, $value);
>
> $alias = $doc->cleanAlias($fields[‘pagetitle’]);
if($modx->getCount(modResource, array(‘alias’=>$alias))!= 0) $count = 1;
$newAlias = $alias;
while($modx->getCount(modResource, array(‘alias’=>$newAlias))!= 0) $newAlias = $alias;
$newAlias .= ‘-‘ . $count;
$count++;
>
$alias = $newAlias;
>
$doc->set(‘alias’,$alias); $doc->set(‘template’, $template);
$doc->save(); foreach ($allFormFields as $field=>$value)
if (!empty($value) $tv = $modx->getObject(‘modTemplateVar’, array (‘name’=>$field)))
/* handles checkboxes
while (list($featureValue, $featureItem) = each($value)) $featureInsert[count($featureInsert)] = $featureItem;
>
$value = implode(‘||’,$featureInsert);
>
$tv->setValue($doc->get(‘id’), $value);
$tv->save();
>
> $modx->cacheManager->refresh(); return true;

Андрей, спасибо за дополнение! Надо будет вынести ваш код в отдельный пост.
https://mikrocxema.ru Андрей
Начало кода чуток обрезало.
Cмотрите исходник, представленный Ольгой в статье.
Добавила ваш код в пост, посмотрите, все ли верно? У меня сейчас нет возможности проверить.
https://mikrocxema.ru Андрей
Ольга, да, всё верно.

Здравствуйте, у меня ничего не выводит следующий код:[[!+modx.user.id:is=’0′:then=’Для размещения объявления необходима авторизация [[!Loginza? profileFields=’username,email,fullname.photo’]]’:else='[[$form_add]]’]], т.е
[[!+modx.user.id]] работает, а вот условия вообще никак не работают, скажите пожалуйста, что не так.

Если в комментариях тот код, который вы используете на сайте, в нем ошибка — неверные кавычки. Попробуйте так: [[!+modx.user.id:is=`0`:then=`Для размещения объявления необходима авторизация [[!Loginza? profileFields=`username,email,fullname,photo`]]`:else=`[[$form_add]]`]] И, конечно, у вас должна быть установлена Loginza и создана отдельная группа пользователей. Ее id прописываем здесь
я не совсем разобрала вывод фото , код с видео (у меня монитор маленький), может какой то параметр не верный

У вас есть TV параметр img? Если да, проверьте тип ввода/вывода и доступность для шаблона.
код в комментариях срезался [[*img:notempty=«]]
Да, WP срезает код. Сейчас добавлю условие в пост.

Здравствуйте, Ольга! Спасибо огромное за видеоролик и за статью. Все получилось. Были конечно сложности, но в целом все успешно. Осталось только несколько моментов уточнить.

В вашем примере все объявления после модерации размещаются на одной странице. Как этого добиться?

Привет, Виктор! Я во время модерации сама переношу их в нужную категорию, а дальше с помощью getResources вывожу на одной странице.

Спасибо! Погуглю на тему возможностей getResources. Получается, нужно собирать все объявления в одном контейнере и как-то их выводить (только то что в теле каждой страницы объявления) в одну страницу? Если найдется время растолковать — буду признателен.

Немного вас еще подостаю, Ольга. Я частично разобрался с getResources. И теперь контейнер, где вложены все объявления обзавелся таким кодом: [[!getResources? showHidden=`1` includeTVs=`1` sortby=`<«publishedon»: «ASC»>`]] Но при просмотре этой страницы выводятся только заголовки этих объявлений. Само же тело не выводится.

Думаю из-за того, что объявление собирается на шаблоне с использованием тв-параметров. Ради эксперимента я в этот контейнер положил обычную страницу, которую набил контентом вручную. Эта страница стала отображаться в контейнере как нужно, то есть все есть. Собственно, думаю, что вопрос и так уже ясен, но уточню: как добиться вывода информации из дочерней страницы, которая собирается на шаблоне с тв-параметрами? Спасибо!

Виктор, на странице контейнера TV параметры выводятся не так, как на странице ресурса. Проверьте сниппет getResources. Замените [[*имятв]] на [[+tv.имятв]]

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

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