Илья Уткин · 24 июня 2015, 09:32 3 +1 У ресурса есть метод cleanAlias, который генерирует псевдоним: $title = $data->get('pagetitle') . '-' . $data->get('id'); $alias = $data->cleanAlias($title); $data->set('alias', $alias); $modx->runProcessor('resource/update', $resource->toArray()); Вопросы / Как сгенерировать алиас с помощью Translit? 17
Павел · 23 июня 2015, 15:43 2 0 Скинуть сайт сюда не могу, если только в личку… Проблему решил, скидываю код: <script> function masonryFunc(){ var $container = $('#mse2_results'); $container.masonry({ columnWidth: 280, itemSelector: '.grid_item', gutter: 30, isAnimated: true, }); } setTimeout(masonryFunc,300); $(document).on('mse2_load', function() { $('#mse2_results').masonry('destroy'); setTimeout(masonryFunc(),300); }); </script> Вопросы / msearch2 + masonry 11
Володя · 17 июня 2015, 08:47 1 0 Привет, вот тут сниппет набросал demo.vgrish.ru/manager/?a=element/snippet/update&id=46 <?php /** @var array $scriptProperties */ /** @var msop2 $msop2 */ $miniShop2 = $modx->getService('minishop2'); $msop2 = $modx->getService('msop2', 'msop2', $modx->getOption('msop2_core_path', null, $modx->getOption('core_path') . 'components/msop2/') . 'model/msop2/', $scriptProperties); if (!($msop2 instanceof msop2)) return 'Could not load msop2 class!'; if (empty($product)) {$product = $modx->resource->id;} $msProduct = $modx->getObject('msProduct', $product); if (!($msProduct instanceof msProduct)) { return 'This resource is not instance of msProduct class.'; } $q = $modx->newQuery('msop2Option'); $q->where(array('key' => $name, 'active' => 1)); $q->select('id as option_id'); if ($q->prepare() && $q->stmt->execute()) { $data = $q->stmt->fetch(PDO::FETCH_ASSOC); $option_id = $data['option_id']; } $q = $modx->newQuery('msop2Price'); $q->sortby('CAST(price AS DECIMAL(10,2))', 'ASC'); $q->where(array('product_id' => $product, 'option' => $option_id,'active' => 1, 'operation' => 1)); $q->select('price as price_min, value as value'); $q->limit(1); if ($q->prepare() && $q->stmt->execute()) { $data = $q->stmt->fetchAll(PDO::FETCH_ASSOC); } if (!empty($data)) { $priceMin = $data[0]['price_min']; } else { $priceMin = $msProduct->get('price'); } $priceMin = $miniShop2->formatPrice($priceMin); if (!empty($toPlaceholder)) { $modx->setPlaceholder($toPlaceholder, $priceMin); } else { return $priceMin; }вызов [[!msop2GetMinPrice? &product=`[[+id]]` &name=`size` ]] Новые дополнения и их версии / [msOptionsPrice2] - теперь с весом товаров. 12
Наумов Алексей · 02 июня 2015, 08:54 1 0 Вы можете в параметре where сниппета ecMessages указать поисковый запрос, например: &where=`{"`ecMessage`.`text`:LIKE": "%слово%"}`А для подстановки «слово» из $_GET использовать простой сниппет return empty($_GET['query']) ? '' : $_GET['query'];не проверял, но как то так… Новые дополнения и их версии / easyComm - комментарии, отзывы, вопросы на сайте 536
Павел Романов · 19 мая 2015, 17:47 7 +3 На одном форуме народ соревновался в самом «компактном» решении этой задачи )) Победило такое решение: <?php if($n!=''){ return= $n%10==1&&$n%100!=11?$w1:($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?$w2:$w3); }Ну и вызываем: [[Snippet? &n=`123` &w1=`год` &w2=`года` &w3=`лет` ]] Готовые решения / Сниппет Declension для склонения слов 30
Воеводский Михаил · 11 мая 2015, 16:46 2 +2 Самый простой способ — отправить ajax запрос с параметром: /?ms2_action=cart/clean Вопросы / Очистка корзины через AJAX 9
Андрей · 21 марта 2015, 16:31 9 +1 Ну вот как-то так набросал на скорую руку. -) Создал плагин, повесил на событие OnDocFormSave. <?php if ($modx->event->name == 'OnDocFormSave') { $parentIds = $modx->getParentIds($id, 4, array('context' => 'web')); // Получаем id всех родителей ресурса $res = $modx->getObject('modResource',$id); $curAlias = $res->get('alias'); // Алиас текущего ресурса $cnt = count($parentIds); // Количество родителей if($cnt > 2) { $aliases = array(); // Массив для всех найденных алиасов foreach($parentIds as $v) { if($v == 22 || $v == 0) continue; // Если родитель - контейнер Shop(22) или главный родитель (0) - пропускаем. $obj = $modx->getObject('modResource', $v); $alias = $obj->get('alias'); $aliases[] = $alias; } $resource->set('uri', implode('/',array_reverse($aliases)) . '/' . $curAlias); } else { $resource->set('uri', $curAlias); } $resource->set('uri_override', true); $resource->save(); }Можно еще добавить условие, чтобы урл, таким образом, формировался только для новых ресурсов. Мне пока не нужно. if ($mode == 'new') { // код выше } Вопросы / Убрать часть Url 19
but1head · 17 марта 2015, 12:36 3 0 if($resource->class_key == 'msProduct' && $modx->event->name == 'OnDocFormSave' && $mode == 'new'){ $article = $resource->get('article'); $alias = ($article == '' ? $id : $article); $resource->set('alias', $alias); $resource->save(); }для товаров, подставляет артикул вместо алиаса Вопросы / Добавить ID ресурса в alias (url) 8
Василий Наумкин · 15 марта 2015, 12:34 2 +1 А ведь и правда, работает. Нужно только отключить вывод "… назад": [[!dateAgo? &input=`2015-03-16 12:45:00` &dateHours=`0` &dateMinutes=`0` &dateNow=`0` ]]Выводит Завтра в 12:45 Сам себя иногда удивляю =) Вопросы / Вывод даты (Завтра сегодня вчера) 7
Виталий Валерьевич · 06 марта 2015, 09:03 1 0 Ну понятно ;) В общем есть 2 варианта реализованные Василием: 1) Внести изменения в вызовы mSearch2.load(), придется править исходники объекта mSearch2 mSearch2.load('', function(response) { $(".vers").colorbox({inline:true, width:"80%"}); }); 2) Слушать событие «mse2_load», можно указывать в любом месте, исходники править не нужно. (function() { $(function() { $(document).on("mse2_load", function(response) { $(".vers").colorbox({inline:true, width:"80%"}); }); }); }) (); Метод mSearch2.afterLoad(); не подходит, т.к. вызывается раньше, чем формируется итоговый DOM Сам этим компонентом не пользовался, посмотрел как работает JS данного компонента тут minishop2.com (default.js), естественно код не проверял, но попробуйте, должно сработать. Вопросы / mFiltr2 + Colorbox 8
MiniShop3 1.11.0 при клике на radio идет пересчет итоговой суммы в 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`; — добавлены ...
[msBonus2] 1.3.0 Бонус-коды, уведомления о сгорании и совместимость с msMultiCurre... Да, планируется. Даже чуть больше, чем просто бонусная система)
FileMan - прикрепление файлов к ресурсам для MODX 3 Добрый день! Может что-то с правами доступа к файлам? Посмотрите логи в modx, в php. С ходу сложно ответить, ранее не было таких случаев.
Проблему решил, скидываю код:
вызов
А для подстановки «слово» из $_GET использовать простой сниппет
не проверял, но как то так…
Победило такое решение:
Ну и вызываем:
Создал плагин, повесил на событие OnDocFormSave.
Можно еще добавить условие, чтобы урл, таким образом, формировался только для новых ресурсов. Мне пока не нужно.
Выводит
Сам себя иногда удивляю =)
В общем есть 2 варианта реализованные Василием:
1) Внести изменения в вызовы mSearch2.load(), придется править исходники объекта mSearch2
2) Слушать событие «mse2_load», можно указывать в любом месте, исходники править не нужно.
Метод mSearch2.afterLoad(); не подходит, т.к. вызывается раньше, чем формируется итоговый DOM
Сам этим компонентом не пользовался, посмотрел как работает JS данного компонента тут minishop2.com (default.js), естественно код не проверял, но попробуйте, должно сработать.