Максим · 07 октября 2015, 13:52 Может быть кому-то пригодится простенький сниппет для вызова mFilter2, который дописывает в параметр filters имена назначенных для категории опций — эти опции выводятся в фильтре чекбоксами: <?php $catid = $modx->resource->id; $q = $modx->newQuery('msCategoryOption'); $q->select(array( 'msCategoryOption.category_id', 'msCategoryOption.option_id', 'mso.key' )); $q->where(array( 'msCategoryOption.category_id' => $catid ) ); $q->leftJoin('msOption','mso','msCategoryOption.option_id = mso.id'); $q->prepare(); $q->stmt->execute(); $options = $q->stmt->fetchAll(PDO::FETCH_ASSOC); $_options = array(); foreach ($options as $option) { $_options[] = 'msoption|'.$option['key']; } $_options = implode(',',$_options); $scriptProperties['filters'] = implode(',',array($scriptProperties['filters'],$_options)); return $modx->runSnippet('mFilter2',$scriptProperties); Вопросы / В чём разница версий miniShop2? 7 +2 8
Василий Наумкин · 07 августа 2015, 05:24 В pdoResources задача решается несколько иначе: [[!pdoResources? &includeTVs=`manuf,diag,color` &where=`{ "manuf":"Sony", "diag:IN":[65,85], "color:IN":["black","gray"] }` ]]В принципе, там есть и &tvFilters, но только как временная замена при миграции c getResources. Пользоваться этим параметром я никому не советую — &where гораздо гибче, лучше и удобнее. Вот здесь кратко написано, а вот здесь значительно подробнее. Пошаговые инструкции / Сложная выборка по TV параметрам в getResources 13 +3 4
Андрей · 21 марта 2015, 16:31 Ну вот как-то так набросал на скорую руку. -) Создал плагин, повесил на событие 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 +1 9
Наумов Алексей · 22 марта 2014, 08:54 Привет. Вот смотри: 1. В системной настройке ms2_order_handler_class указываем myOrderHandler 2. Создаем файл core/components/minishop2/custom/order/myOrderHandler.class.php 3. В него код: <? class myOrderHandler extends msOrderHandler{ public function submit($data = array()) { if(empty($data['email'])){ $data['email'] = uniqid('user_').'@MYSITE.ru'; } return parent::submit($data); } }Это один из вариантов. Мы просто при отправке заказа, если пользователь не указал почту, генерируем случайный email. Можешь посмотреть исходный msOrderHandler и переопределить в нем другой метод, например, где идет проверка email. Вопросы / Как сделать необязательным поле email в miniShop2? 23 0 4
Stan · 04 марта 2014, 22:48 Эх, тильду я сослепу просмотрел. Ошибка была в <?php $course = $modx->getConfig('rate_usd'); return $price * $course;Должно быть так <?php $course = $modx->getOption('rate_usd'); return $price * $course;Искренне благодарю за потраченное время. Всё работает. Большое человеческое спасибо! Готовые решения / Цена в рублях по курсу доллара в miniShop2 57 0 1
Наумов Алексей · 04 марта 2014, 10:26 Ох… 1. Система-Настройки системы: ключ ms2_price_snippet, указываем значение modifyPrice 2. Делаем сниппет modifyPrice: ну у меня тут несколько другая ситуация, цены на товары вбиты в поля price — в евро, в old_price — в долларах. <?php $priceEURO = $product->get('price'); $priceUSD = $product->get('old_price'); $rateEURO = $modx->getOption('rate_euro'); $rateUSD = $modx->getOption('rate_usd'); if($priceEURO > 0){ return $priceEURO * $rateEURO; } if($priceUSD > 0){ return $priceUSD * $rateUSD; } return 0;3. Создаем ресурс, публикуем его, скрываем из меню, добавляем ему в контент: [[!updateRates]]и этот ресурс на хостинге вешаем по его url на кронтаб раз в сутки. 4. Создаем сниппет updateRates: require_once($modx->getOption('assets_path').'components/cbrf/ExchangeRatesCBRF.class.php'); $rates = new ExchangeRatesCBRF(); $usd = $rates->GetRate("USD"); $euro = $rates->GetRate("EUR"); $setting = $modx->getObject('modSystemSetting', 'rate_euro'); $setting->set('value', $euro); $setting->save(); $setting = $modx->getObject('modSystemSetting', 'rate_usd'); $setting->set('value', $usd); $setting->save(); // обновляем колонку price_rur $sql1 = "UPDATE ".$modx->getTableName('msProductData')." SET `price_rur` = ".str_replace(',','.',$euro)." * `price` WHERE `price` > 0"; $sql2 = "UPDATE ".$modx->getTableName('msProductData')." SET `price_rur` = ".str_replace(',','.',$usd)." * `old_price` WHERE `old_price` > 0"; $q = $modx->prepare($sql1); $q->execute(); $q = $modx->prepare($sql2); $q->execute(); //$cacheRefreshOptions = array( 'system_settings' => array() ); //$modx->cacheManager->refresh($cacheRefreshOptions); $modx->cacheManager->refresh(); echo 'Курс USD: '.$usd; echo '<br />'; echo 'Курс EURO: '.$euro;Я в этом сниппете еще кеш чищу в конце всего сайта, мне так нужно. 5. Создаем файл components/cbrf/ExchangeRatesCBRF.class.php: <?php class ExchangeRatesCBRF { var $rates; function __construct($date = null) //В PHP версии ниже 5 это метод объекта следует переименовать в ExchangeRatesCBRF { $client = new SoapClient("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL"); if (!isset($date)) $date = date("Y-m-d"); $curs = $client->GetCursOnDate(array("On_date" => $date)); $this->rates = new SimpleXMLElement($curs->GetCursOnDateResult->any); } function GetRate ($code) { //Этот метод получает в качестве параметра цифровой или буквенный код валюты и возвращает ее курс $code1 = (int)$code; if ($code1!=0) { $result = $this->rates->xpath('ValuteData/ValuteCursOnDate/Vcode[.='.$code.']/parent::*'); } else { $result = $this->rates->xpath('ValuteData/ValuteCursOnDate/VchCode[.="'.$code.'"]/parent::*'); } if (!$result) { return false; } else { $vc = (float)$result[0]->Vcurs; $vn = (int)$result[0]->Vnom; return ($vc/$vn); } } }6. Создаем 2 системные настройки: rate_euro rate_usd 7. Открываем первый раз ресурс с шага 3 и проверяем, что он сработал и в настройках курсы обновились. Это мое решение с одного из сайтов, успешно работающее. Готовые решения / Цена в рублях по курсу доллара в miniShop2 57 0 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... Да, планируется. Даже чуть больше, чем просто бонусная система)
В принципе, там есть и &tvFilters, но только как временная замена при миграции c getResources. Пользоваться этим параметром я никому не советую — &where гораздо гибче, лучше и удобнее.
Вот здесь кратко написано, а вот здесь значительно подробнее.
Создал плагин, повесил на событие OnDocFormSave.
Можно еще добавить условие, чтобы урл, таким образом, формировался только для новых ресурсов. Мне пока не нужно.
1. В системной настройке ms2_order_handler_class указываем myOrderHandler
2. Создаем файл core/components/minishop2/custom/order/myOrderHandler.class.php
3. В него код:
Это один из вариантов. Мы просто при отправке заказа, если пользователь не указал почту, генерируем случайный email.
Можешь посмотреть исходный msOrderHandler и переопределить в нем другой метод, например, где идет проверка email.
Ошибка была в
Должно быть так
Искренне благодарю за потраченное время. Всё работает.
Большое человеческое спасибо!
1. Система-Настройки системы: ключ ms2_price_snippet, указываем значение modifyPrice
2. Делаем сниппет modifyPrice:
ну у меня тут несколько другая ситуация, цены на товары вбиты в поля price — в евро, в old_price — в долларах.
3. Создаем ресурс, публикуем его, скрываем из меню, добавляем ему в контент:
и этот ресурс на хостинге вешаем по его url на кронтаб раз в сутки.
4. Создаем сниппет updateRates:
Я в этом сниппете еще кеш чищу в конце всего сайта, мне так нужно.
5. Создаем файл components/cbrf/ExchangeRatesCBRF.class.php:
6. Создаем 2 системные настройки:
rate_euro
rate_usd
7. Открываем первый раз ресурс с шага 3 и проверяем, что он сработал и в настройках курсы обновились.
Это мое решение с одного из сайтов, успешно работающее.