Dmitry Rodionov · 09 февраля 2017, 22:36 Прошу прощения за некромантию, но может кому-то пригодится решение без модификации сниппета, на вышеуказанном примере, без использования leftJoin: &optionFilters=`{ "ps_target:!=":"", "ps_type:!=":"" }` &where=`[" (ps_target.value='Витрины и мебель' OR ps_target.value='Ландшафт' OR ps_target.value='Автомойки') AND (ps_type.value='Модульный' OR ps_type.value='Ландшафтный' OR ps_type.value='Карданный') "]`по сути optionFilters подключает нужные таблицы и дает не противоречащие условия, а все остальное прописывает внутри where Вопросы / msProducts. Выборка по нескольким опциям 9 0 4
Василий Столейков · 09 февраля 2017, 14:10 Логи же просто так сыпятся. Обновился — ошибки сами пропали, обычное дело, так всегда и бывает. Смешно.Зря ты так. А ведь бывает же. Например после недавнего обновления твоих компонентов перестали сыпаться некоторые ошибки. Раньше давно как-то тоже такое было и после обновления движка. Ищи, где у тебя есть INСпасибо за наводку, буду дальше искать. replace, где не передан третий параметрСпасибо, буду искать. Его у меня много везде. Возможно не ругаются следующие конструкции: {$title|replace:' ':''|replace:'Ё':'Е'|replace:' ':''} {$title|replace:\' \':\'\'|replace:\'Ё\':\'Е\'|replace:\' \':\'\'} // или в @INLINE чанкахБуду проверять. Спасибо что ответил! Новости и события / MODX 2.5.5 13 0 2
Максим Кузнецов · 08 февраля 2017, 22:45 Вы можете сделать выборку необходимых ресурсов с тв-полем через обычный pdoResources, подключив в includeTVs нужное MIGX-поле, после чего разобрать их в чанке при помощи фенома: {set $migx_array = $migx_tv_name | fromJSON} {foreach $migx_array as $migx_row} {$migx_row['название_колонки1_в_migx']}, {$migx_row['название_колонки2_в_migx']}, ... {/foreach} Вопросы / Как собрать MIGX с разных ресурсов? 4 +2 2
Максим Кузнецов · 08 февраля 2017, 15:34 1. Создаем сниппет (random_list): <?php $total = intval($total); $list = explode("||", $input); $random_items = array_rand($list, $total); $result = ''; for ($i = 1; $i <= $total; $i++) { $result .= '<li>' . $list[$random_items[$i - 1]] . '</li>'; } return $result; 2. Вызываем: <ul> [[!random_list? &input=`Значение1||2||3||десять||8` &total=`3`]] </ul> Вопросы / Как реализовать случайные li для ul? 5 +2 1
Андрей Коробков · 05 февраля 2017, 23:21 Клиенты не всегда любят платные компоненты, всегда просят альтернативу (это похоже у них какая то психологическая составляющая — за альтернативу подчас платят дороже). На последнем проекте использовал Gallery + инструкцию отсюда. В ней есть правда косяки: — при дубликате ресурса (клиенты очень любят это делать) — новый ресурс привязан к галереи оригинала — если удалена галерея ресурса, то косяк с сохранением. Исправления (приведу полный код): Плагин CreateGalleryAlbum: <?php switch ($modx->event->name) { case 'OnDocFormSave': $GalleryProcessorPath = $modx->getOption('gallery.core_path',$config,$modx->getOption('core_path').'components/gallery/').'processors/'; $options = array('processors_path'=>$GalleryProcessorPath); $galleryName = $resource->get('pagetitle'); //Получаем все TV текущего ресурса $tvs = $resource->getTemplateVars(); foreach($tvs as $tv) { //нам нужны только TV с типом galleryalbumview if ($tv->get('type')=='galleryalbumview') { $createalbum = false; $tvvalue = $tv->getValue($id); if(!empty($tvvalue)){ $resp = $modx->runProcessor('mgr/album/get',array('id'=>$tvvalue),$options); if (!$resp->isError()) { $album = $resp->getObject(); if(!empty($album)){ $album['name'] = $galleryName; $modx->runProcessor('mgr/album/update',$album,$options); }else{ $createalbum = true; } }else{ $createalbum = true; } }else{ $createalbum = true; } if ($createalbum) { $tv_prop = $tv->get('properties'); $album = array( 'name' => $galleryName, 'parent' => isset($tv_prop['galParentId']['value'])?$tv_prop['galParentId']['value']:0, 'description' => '', 'active' => 1, 'prominent' => 0 ); $resp = $modx->runProcessor('mgr/album/create',$album,$options); if (!$resp->isError()) { $album = $resp->getObject(); $tv->setValue($id,$album['id']); $tv->save(); } } } } case 'OnResourceDuplicate': if(isset($newResource) && isset($oldResource)){ $tvs = $newResource->getTemplateVars(); $new_id = $newResource->get("id"); $old_id = $oldResource->get("id"); $GalleryProcessorPath = $modx->getOption('gallery.core_path',$config,$modx->getOption('core_path').'components/gallery/').'processors/'; $options = array('processors_path'=>$GalleryProcessorPath); $pagetitle = $newResource->get('pagetitle'); $i = 1; if(preg_match("/\s[\d]+$/i", $pagetitle, $m)){ $i = intval(trim($m[0])) + 1; $pagetitle = preg_replace("/\s[\d]+$/i", " " . $i, $pagetitle); }else{ $pagetitle .= " " . $i; } $newResource->set("pagetitle", $pagetitle); $galleryName = $pagetitle; foreach($tvs as $tv) { if ($tv->get('type')=='galleryalbumview') { $new_value = $tv->getValue($new_id); $old_value = $tv->getValue($old_id); if($old_value == $new_value){ $tv_prop = $tv->get('properties'); $album = array( 'name' => $galleryName, 'parent' => isset($tv_prop['galParentId']['value'])?$tv_prop['galParentId']['value']:0, 'description' => '', 'active' => 1, 'prominent' => 0 ); $resp = $modx->runProcessor('mgr/album/create',$album,$options); if (!$resp->isError()) { $album = $resp->getObject(); $tv->setValue($new_id,$album['id']); $tv->save(); } } } } } break; } Файл core/components/gallery/elements/tv/input/galleryalbumview.class.php <?php class GalleryAlbumViewInputRender extends modTemplateVarInputRender { public function getTemplate() { if(!empty($this->tv->value)){ $options = array('processors_path'=>$this->modx->getOption('core_path').'components/gallery/'.'processors/'); if($this->modx->runProcessor('mgr/album/get',array('id'=>$this->tv->value),$options)->isError()){ $this->tv->value = ""; } } return $this->modx->getOption('gallery.core_path',null, $this->modx->getOption('core_path').'components/gallery/').'elements/tv/galleryalbumview.input.tpl'; } } return 'GalleryAlbumViewInputRender'; Вопросы / Как в MODX загрузить несколько изображений к ресур 5 0 1
Виталий Серый · 13 ноября 2016, 18:44 Код чанка написать между foreach. Например: {foreach $rows as $row} <div class="item"> <div class="title">{$row.title}</div> <div class="desc">{$row.description}</div> <div class="image"><img src="{$row.image}" alt="{$row.title}" /></div> </div> {/foreach} Вопросы / MIGX getImageList и Fenom 67 0 3
Дмитрий Меркурьев · 20 октября 2016, 14:11 А вызов slick как выглядит? Для примера вызов в одном из проектов: var $slickSlider = $('#slick-slider'); if ($slickSlider.length > 0){ $slickSlider.slick({ dots: true, speed: 300, slidesToShow: 4, slidesToScroll: 4, responsive: [ { breakpoint: 1400, settings: { slidesToShow: 3, slidesToScroll: 3 } },{ breakpoint: 1168, settings: { slidesToShow: 2, slidesToScroll: 2 } },{ breakpoint: 900, settings: { slidesToShow: 1, slidesToScroll: 1 } },{ breakpoint: 768, settings: { slidesToShow: 2, slidesToScroll: 2 } },{ breakpoint: 560, settings: { slidesToShow: 1, slidesToScroll: 1 } } ] }); } Вопросы / Проблема с каруселью на сайте 14 0 1
DocentBF · 25 июня 2016, 20:36 Можно переписать метод mSearch2.handleSort или подключить к mFilter2 cвой скрипт фронтенда или переопределить метод в другом js файле, например как-то так: if (typeof(mSearch2) !== "undefined") { mSearch2.initialized = false; mSearch2.handleSort = function() { var params = this.Hash.get(); if (params.sort) { var sorts = params.sort.split(mse2Config.values_delimeter); for (var i = 0; i < sorts.length; i++) { var tmp = sorts[i].split(mse2Config.method_delimeter); if (tmp[0] && tmp[1]) { $('#mse2_sort option[data-sort="' + tmp[0] + '"][value="' + tmp[1] + '"]').attr('selected', 'selected').trigger('change'); } } } $(document).off('click', this.options.sort_link); $(document).on('change', '#mse2_sort', function() { var selected = $(this).find('option:selected'); var sort = selected.data('sort'); sort += mse2Config.method_delimeter + selected.val(); mse2Config.sort = (sort != mse2Config.start_sort) ? sort : ''; var params = mSearch2.getFilters(); mSearch2.Hash.set(params); mSearch2.load(params); }); } mSearch2.initialize('body'); }а select представить например так: <select id="mse2_sort"> <option value="asc" data-sort="resource|pagetitle">по умолчанию</option> <option value="asc" data-sort="ms|price">по возрастанию цены</option> <option value="desc" data-sort="ms|price">по убыванию цены</option> </select> Вопросы / Как сделать сортировку через select? 10 +4 4
Павел Гвоздь · 13 февраля 2016, 08:48 Феномом как-то так: {if $_modx->resource.tags?} {foreach json_decode($_modx->resource.tags,1) as $tag} {var $tags[] = '<a href="">'~ $tag ~'</a>'} {/foreach} {$tags|join:", "} {/if}На стандартном синтаксисе хз, надо писать сниппет. Где-то в марте обновлю пакет, добавлю туда необходимый, для вывода стандартным синтаксисом, сниппет. Сейчас совершенно не до этого, тем более я уже давно не использую почти нигде стандартный синтаксис MODX, поэтому мне «не припекает» особо писать его. Можешь сам для себя написать сниппет, он будет похож на код Fenom. Ничего сверхъестественного нет. Новые дополнения и их версии / [tvSuperSelect] Тип TV: автозаполняемый список из ms2, для реализации тегов 125 +2 3
Василий Наумкин · 30 ноября 2015, 14:40 Сниппеты MODX могут возвращать исключительно строки, так уже повелось. $modx->fromJSON не нужен, Fenom умеет сам это делать: {set $result = json_decode($_modx->runSnippet('snippet'), 1)} Можно еще вот так: {var $resources = $_modx->getResources( ['published' => 1, 'deleted' => 0], ['sortby' => 'id', 'sortdir' => 'ASC', 'limit' => 50] )} {foreach $resources as $resource} {$_modx->getChunk('@INLINE <p>{$id} {$pagetitle}</p>', $resource)} {/foreach}Но это только для ресурсов. Для разработчиков / Пример работы Fenom 55 +1 3
[Решено] Обновление MODX 3.2.2 компонент FetchIt ломает сайт PHP 8.3 FetchIt пока не адаптирован к MODX 3
Плагин EnvBadge: визуальный индикатор окружения в админке MODX3 Расскажите пожалуйста как вы настраиваете сайт на MODX 3 чтобы был dev, prod, stage. Можете описать workflow? Допустим у меня 80% — это магазины, там клиенты, продажи, все онлай...
MaxNotify Обновление компонента 1.3.0-pl (22.07.2026) — добавлено автоматическое получение полей через msOrder->toArray(); — массивы и объекты безопасно пропускаются; — стандартные...
MyFavorites MyFavorites — 3.0.0-beta Первая версия для MODX Revolution 3.x — компонент полностью переписан с нуля (PHP >= 8.4, namespaced-ядро MODX 3, PSR-4, сервис-ориентированная архит...
mxBoard: канбан-доска для команд, людей и ИИ-агентов в MODX 3 Для начала перейдем на Markdown, а дальше будет видно
MaxNotify3 Вышло обновление 1.3.0-pl (20.07.2026) — добавлены уведомления о заявках FormIt через hook-сниппет maxNotify3FormIt; — добавлены уведомления о заявках SendIt через hook-с...
по сути optionFilters подключает нужные таблицы и дает не противоречащие условия, а все остальное прописывает внутри where
Спасибо за наводку, буду дальше искать.
Спасибо, буду искать. Его у меня много везде. Возможно не ругаются следующие конструкции:
Буду проверять.
Спасибо что ответил!
2. Вызываем:
— при дубликате ресурса (клиенты очень любят это делать) — новый ресурс привязан к галереи оригинала
— если удалена галерея ресурса, то косяк с сохранением.
Исправления (приведу полный код):
Плагин CreateGalleryAlbum:
Файл core/components/gallery/elements/tv/input/galleryalbumview.class.php
Например:
Для примера вызов в одном из проектов:
а select представить например так:
На стандартном синтаксисе хз, надо писать сниппет. Где-то в марте обновлю пакет, добавлю туда необходимый, для вывода стандартным синтаксисом, сниппет. Сейчас совершенно не до этого, тем более я уже давно не использую почти нигде стандартный синтаксис MODX, поэтому мне «не припекает» особо писать его.
Можешь сам для себя написать сниппет, он будет похож на код Fenom. Ничего сверхъестественного нет.
Можно еще вот так:
Но это только для ресурсов.