Павел Романов · 01 июля 2016, 11:39 У Вас дата в базе хранится в виде 2016-07-01 03:00:00, а Вы пытаетесь фильтровать по дате в Unix-формате. Если в лоб, то решение следующее: 1. Сделать еще одно поле timeUnix типа текст. 2. Сделать плагин на событие OnDocFormSave, который будет брать дату из поля timeEvent, переводить ее в нужный формат и записывать в поле TV timeUnix: <?php $res = $modx->getObject('modResource', $id); $date = $res->getTVValue('timeEvent'); if(empty($date)) return ''; $time = strtotime($date); $res->setTVValue('timeUnix', $time); 3. Выборку в pdoResources cделать уже через этот новый TV: &where=`{"timeUnix:>=,<=:AND":[1467331200,1498867200]}` Вопросы / Выбрать диапазон дат в pdoResources 2 +1 1
Николай Загумённов · 28 мая 2016, 22:56 Я использовал компонент tvSuperSelect. Чтобы с фронта добавлять тэги добавил плагин, который заполняет ТВ поле и таблицу компонента значениями: <?php // tvssTagsSave $tvss = $modx->getService('tvsuperselect', 'tvsuperselect', $modx->getOption('core_path').'components/tvsuperselect/model/tvsuperselect/'); if (!($tvss instanceof tvSuperSelect)) { return ''; } switch ($modx->event->name) { case 'OnDocFormSave': if (is_object($resource) && is_array($resource->_fields)) { $data = $resource->_fields; $resource_id = $data['id']; // $modx->log(1, print_r($data, 1)); $flds = $tv_values = array(); foreach ($data as $key => $value) { if ($key == 'tags') { $tv_id = 1; $array = array_diff($value, array('')); if (!empty($array)) { $flds[] = array( 'resource_id' => $resource_id, 'tv_id' => $tv_id, 'data' => $array, ); $tv_values[$tv_id] = $modx->toJSON($array); } } } // пишем в таблицу пакета if (!empty($flds)) { // $modx->log(1, print_r($flds, 1)); $table = $modx->getTableName('tvssOption'); foreach ($flds as $fld) { $sql = 'DELETE FROM '.$table.' WHERE `resource_id` = '.$fld['resource_id'].' AND `tv_id` = '.$fld['tv_id']; $stmt = $modx->prepare($sql); $stmt->execute(); $stmt->closeCursor(); $values = array(); foreach ($fld['data'] as $value) { if (!empty($value)) { $values[] = '('.$fld['resource_id'].',"'.$fld['tv_id'].'","'.addslashes($value).'")'; } } if (!empty($values)) { $sql = 'INSERT INTO '.$table.' (`resource_id`,`tv_id`,`value`) VALUES '.implode(',', $values); $stmt = $modx->prepare($sql); $stmt->execute(); $stmt->closeCursor(); } } } // пишем в таблицу modTemplateVarResource if (!empty($tv_values)) { //$modx->log(1, print_r($tv_values, 1)); foreach ($tv_values as $tv_id => $values) { if (!$tv_obj = $modx->getObject('modTemplateVarResource', array( 'tmplvarid' => $tv_id, 'contentid' => $resource_id, ))) { $tv_obj = $modx->newObject('modTemplateVarResource'); } $tv_obj->fromArray(array( 'tmplvarid' => $tv_id, 'contentid' => $resource_id, 'value' => $values, )); $tv_obj->save(); // $modx->log(1, print_r($tv_obj->toArray(), 1)); unset($tv_obj); } } } break; }Чтобы выводить во фронте поле добавил сниппет: <?php // tvssTagsOptions /* @var pdoFetch $pdoFetch */ $fqn = $modx->getOption('pdoFetch.class', null, 'pdotools.pdofetch', true); $path = $modx->getOption('pdotools_class_path', null, MODX_CORE_PATH.'components/pdotools/model/', true); if ($pdoClass = $modx->loadClass($fqn, $path, false, true)) { $pdoFetch = new $pdoClass($modx, $scriptProperties); } else { return false; } $pdoFetch->addTime('pdoTools loaded'); if (!$modx->addPackage('tvsuperselect', MODX_CORE_PATH.'components/tvsuperselect/model/')) { return false; } $tv = $modx->getOption('tv', $scriptProperties, ''); // TV name or... $tvid = $modx->getOption('tvId', $scriptProperties, ''); // ... TV id $tvInput = $modx->getOption('tvInput', $scriptProperties, ''); // TV input name $res = $modx->getOption('res', $scriptProperties, 0); // Resource id $tpl = $modx->getOption('tpl', $scriptProperties, 'tpl.tvssTagsOptions'); $tv_where = $tv ? array( 'name' => $tv ) : ''; $tv_where = $tv_where ?: ( $tvid? array( 'id' => $tvid ) : '' ); // print_r($tv_where); if( empty($tv_where) ) { return; } if( $tv_obj = $modx->getObject('modTemplateVar', $tv_where) ) { $value = ''; if( $res != 0 && $tv_val_obj = $modx->getObject('modTemplateVarResource', array( 'tmplvarid' => $tv_obj->id, 'contentid' => $res, ))) { $value = $tv_val_obj->value; } $value_arr = $modx->fromJSON($value); // Массив со значениями тэгов конкретного ресурса // Массив, который мы передадим в процессор, там его ловить в $scriptProperties $processorProps = array( 'tv_id' => $tv_obj->id, ); // Массив опций для метода runProcessor $otherProps = array( // Здесь указываем где лежат наши процессоры 'processors_path' => $modx->getOption('core_path') . 'components/tvsuperselect/processors/' ); // Запускаем $response = $modx->runProcessor('mgr/option/getoptions', $processorProps, $otherProps); // И возвращаем ответ от процессора $options_array = $modx->fromJSON($response->response); // Массив со всеми тэгами if (is_array($options_array['results']) || is_object($options_array['results'])) { foreach($options_array['results'] as $v) { $selected = ''; if (is_array($value_arr) || is_object($value_arr)) { foreach ($value_arr as $key => $val) { if ($v['value'] == $val) { $selected = "selected=\"selected\""; } } } $options .= "<option ". $selected ." value=\"". $v['value'] ."\">"; $options .= $v['value']; $options .= "</option>"; $selected = ""; } } $return = $modx->getChunk($tpl, array( 'tv_id' => $tv_obj->id, 'tv_name' => $tv_obj->name, 'tv_input_name' => $tvInput ?: $tv_obj->name, 'tv_value' => $value, 'res_id' => $res, 'options' => $options )); return $return; } else { return; }Чанк tpl.tvssTagsOptions: <select name="tags[]" multiple="multiple" class="js-tvSuperSelect-tags form-control" id="ticket-tags"> [[+options]] </select>В чанке с формой добавления/редактирования тикетов добавил: <link href="/js/select2-4.0.2/dist/css/select2.min.css" rel="stylesheet" /> <script src="/js/select2-4.0.2/dist/js/select2.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ $(".js-tvSuperSelect-tags").select2({ tags: true }); }); </script> <div class="form-group"> <label for="ticket-sections">Тэги</label> [[!tvssTagsOptions? &tv=`tags` &res=`0`]] // В чанке редактирования [[!tvssTagsOptions? &tv=`tags` &res=`[[+id]]`]] <span class="error"></span> </div>Прикрутил к полю тэгов Select2, чтобы тэги было удобно заполнять и все. Может кому пригодится =) Краудфандинг / Тэги к тикетам 49 +2 7
Алексей Кудров · 02 мая 2016, 13:56 В меню «Настройка форм» создать новый профиль с именем, например, «Блог». В профиле создать новый набор правил: Действие: Создать ресурс Ограничивающее поле: parent Ограничивающее значение: id родителя Правой кнопкой по созданному набору — редактировать. Указать id шаблона для дочерних элементов. Вопросы / Дефолтное назначение шаблонов для категорий блога 37 0 2
Володя · 14 апреля 2016, 11:27 Отправил Василию PR — github.com/bezumkin/pdoTools/pull/203 добавляет PCRE модификаторы, можно будет делать следующее {'$40 за g3/400' | preg_quote} {if 'email@mail.ru'|preg_match : '/^.+@.+\.\w+$/' } email {/if} {$_modx->resource.content|preg_get : '!http://.+\.(?:jpe?g|png|gif)!Ui'} {["26-04-1974", "Сергей", "27-11-1977", "Юля"] | preg_grep : "/(\d{2})-(\d{2})-(\d{4})/" | print_r : true} Website: {'http://site.name'|preg_replace : '~^https?://~'} {'I love MODX' | preg_split : '/ /' | print_r : true}ваша задача тогда может быть решена просто как выбираем первое изображение из поля <b>content</b> {set $image = $_modx->resource.content|preg_get : '!http://.+\.(?:jpe?g|png|gif)!Ui} Вопросы / Картинка для микроразметки? 11 +1 2
Дмитрий Танцирев · 08 апреля 2016, 21:56 Может кому пригодится: {"field":"published", "caption":"Чекбокс", "inputTVtype":"checkbox", "inputOptionValues":"Да==1"} {"header": "Чекбокс", "dataIndex":"published", "show_in_grid":1, "renderer":"this.renderCrossTick"} Вопросы / MIGX и checkbox 3 0 11
Павел · 23 марта 2016, 11:48 Вообщем по разбивка ресурсов по месяцам: [[!pdoResources? &parents=`26` &sortby=`publishedon` &sortdir=`ASC` &limit=`0` &select=`publishedon as period` &groupby=`DAYOFMONTH(FROM_UNIXTIME(publishedon))` &tpl=`test_pavel2` ]]tpl.NewsFeed: <h2>[[+period:date=`%B-%Y`]]</h2> [[!timePeriod? &period=`[[+period]]`]] [[pdoResources? &parents=`26` &sortby=`publishedon` &sortdir=`ASC` &limit=`0` &where=`["publishedon BETWEEN [[+tp.start]] AND [[+tp.end]]"]` &tpl=`@INLINE <h3>{{+pagetitle}}</h3><p>{{+introtext}}</p>` ]]и сам сниппет timePeriod: <?php $start = strftime("1.%m.%Y",$period) . " 00:00:00"; $end = strftime(date('t', $period).".%m.%Y",$period) . " 23:59:59"; $modx->toPlaceholders(array( 'start' => strtotime($start), 'end' => strtotime($end), ),'tp'); return $start." - ".$end ; Вопросы / pdoResources разбивка ресурсов по дням 3 +1 1
Сергей Сергеевич · 07 марта 2016, 15:02 Спасибо вам! Соорудил свой велосипед, все работает! Но чует сердце, это плохой путь =) <nav class="nav"> [[pdoMenu? &parents=`0` &resources=`1,3,4,5` &level=`2` &outerClass=`nav__list` &rowClass=`nav__item` &firstClass=`0` &lastClass=`0` &hereClass=`` &parentClass=`` &tpl=`@INLINE <li[[+classes]]><a href="[[+link]]" class="nav__link">[[+menutitle]]</a></li>[[+wrapper]]` &tplHere=`@INLINE <li class="nav__item current"><a href="[[+link]]" class="nav__link">[[+menutitle]]</a></li>[[+wrapper]]` &tplInner=`@INLINE [[+wrapper]]` ]] </nav> Вопросы / Как в pdoMenu потомка отобразить не в родителе? 5 +1 1
Сергей Фещуков · 04 марта 2016, 06:02 Для товаров miniShop2 упрощённый вариант плагина: <?php if ( $modx->event->name != "OnDocFormSave" || $resource->get('class_key') != 'msProduct' || !empty($resource->get('article')) ) return; $resource->set('article', substr($resource->get('alias'),0,2).'-'.$resource->get('parent').$resource->get('id')); $resource->save(); $resource->clearCache(); Готовые решения / Автоматическое создание артикула 14 0 3
Максим Кузнецов · 29 февраля 2016, 13:46 Для fenom: {set $canonical_url = $_modx->makeUrl($_modx->resource.id, '', '', 'full')} <link rel="canonical" href="{$canonical_url}" /> <meta property="og:url" content="{$canonical_url}" /> Тегами modx: <link rel="canonical" href="[[~[[*id]]? &scheme=`full`]]" /> <meta property="og:url" content="[[~[[*id]]? &scheme=`full`]]" /> Или, например, вот так (не помню для чего, но как-то возникла проблема с предыдущим вариантом, которая решилась нижеописанным примером): [[++site_url]][[*id:isnot=`[[++site_start]]`:then=`[[~[[*id]]]]`]] Вопросы / Почему 404 страница не всегда выбивает? 12 +2 4
Антон Пастухов · 22 февраля 2016, 00:27 Сделать сниппет splitText c таким кодом: <?php $input = explode(".", $input); $output = "<p>"; $count = 0; foreach ($input as $i) { $output .= "$i."; $count += strlen($i); if ($count > 400) { $output .= "</p><p>"; $count = 0; } } return $output . "</p>";2. Вызвать как фильтр вывода для нужного текста: [[*content:splitText]] Вопросы / Автоматическая разбивка текста на абзацы 3 +2 2
Возможно ли реализовать возможность предоплаты за доставку на сайте? В любом случаем стандартный флоу минишоп2 рассчитан на оплату по ссылке, т.е. чтобы получить информацию об оплате, нужно чтобы заказ существовал. Чтобы сделать иначе, нужно использ...
Редизайн сообщества На больших экранах основной текст статьи я бы сделал 18 px. Да и текст комментариев можно таким сделать. Для меня лично 16 — мелковато на больших экранах (в комментариях вообще 15 ...
MiniShop3 1.11.0 при клике на radio идет пересчет итоговой суммы в orderUI, в зависимости от способов(оплаты доставки) я так поняла. попробуй код запуска события поставить ниже чем orderUI, после
ImageOptimizer - WebP/AVIF и responsive <picture> для MODX 3 Дополнение доступно modstore.pro/packages/photos-and-files/imageoptimizer
Localizator3 для MODX 3: перевод полей и TV без отдельного context на язык, Vue 3 + PrimeV... Добавил localizator3_default_language
msInShopNotify Начиная с версии 3.0.0-beta добавлена поддержка MiniShop3 Минимальные требования: PHP 8.4 MODX 3.2 MiniShop3
MaxNotify Обновление 1.2.0-pl (03.07.2026) — добавлены уведомления о заявках FormIt через hook-сниппет `maxNotifyFormIt`; — добавлены уведомления о заявках SendIt через hook-...
[msBonus2] 1.3.0 Бонус-коды, уведомления о сгорании и совместимость с msMultiCurre... Да, планируется. Даже чуть больше, чем просто бонусная система)
Если в лоб, то решение следующее:
1. Сделать еще одно поле timeUnix типа текст.
2. Сделать плагин на событие OnDocFormSave, который будет брать дату из поля timeEvent, переводить ее в нужный формат и записывать в поле TV timeUnix:
3. Выборку в pdoResources cделать уже через этот новый TV:
Чтобы с фронта добавлять тэги добавил плагин, который заполняет ТВ поле и таблицу компонента значениями:
Чтобы выводить во фронте поле добавил сниппет:
Чанк tpl.tvssTagsOptions:
В чанке с формой добавления/редактирования тикетов добавил:
Прикрутил к полю тэгов Select2, чтобы тэги было удобно заполнять и все.
Может кому пригодится =)
В профиле создать новый набор правил:
Действие: Создать ресурс
Ограничивающее поле: parent
Ограничивающее значение: id родителя
Правой кнопкой по созданному набору — редактировать.
Указать id шаблона для дочерних элементов.
добавляет PCRE модификаторы, можно будет делать следующее
ваша задача тогда может быть решена просто как
tpl.NewsFeed:
и сам сниппет timePeriod:
Тегами modx:
Или, например, вот так (не помню для чего, но как-то возникла проблема с предыдущим вариантом, которая решилась нижеописанным примером):
2. Вызвать как фильтр вывода для нужного текста: [[*content:splitText]]