Павел Романов · 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
Возможно ли реализовать возможность предоплаты за доставку на сайте? У меня Робокасса, у них вроде есть docs.robokassa.ru/ru/iframe
Редизайн сообщества На больших экранах основной текст статьи я бы сделал 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]]