Василий Наумкин · 26 января 2015, 22:03 $pdo = $modx->getService('pdoFetch'); $result = $pdo->getArray( // Класс 'msProduct', // Условие where array( 'deleted' => false, 'published' => true, ), // Параметры выборки array( 'parents' => 5, // Категория с товарами 'innerJoin' => array( 'Data' => array('class' => 'msProductData') ), 'select' => array('Data' => 'price'), 'sortby' => 'Data.price', 'sortdir' => 'asc', ) ); if (!empty($result)) { echo $result['price']; } // При желании можно лог посмотреть echo '<pre>'; print_r($modx->getPlaceholder('pdoTools.log')); Вопросы / Вывод наименьшей цены из списка товаров в категори 5 0 6
Алексей Карташов · 19 ноября 2014, 16:52 Т.к. не мне одному интересна данная тема и кто-то даже добавил этот тикет себе в избранное, то расскажу-ка я об ещё одной возникшей проблеме дабы сэкономить потомкам часы гугления и нервы. Вот такой вот нехитрый код: $id = 1; $o = $modx->getObject('myObjectOne', $id); $o->fromArray(array( 'active' => 0 )); // или так: // $o->set('active', 0); var_dump($o->save());будет приводить к вот такой вот ошибке (в modx-логе): Attempt to save lazy object: Array( <массив объекта> ) Дело в том, что такой вот унаследованный объект полученный методом $modx->getObject будет lazy (а вот через newObject всё хорошо). Не буду расписывать что это такое и почему. Факт в том, что сохраняться ничего не будет. Чтобы всё работало как ожидается, надо в унаследованных классах переопределять метод set: function set ($k, $v= null, $vType= '') { if ($this->isLazy()) $this->_loadFieldData($this->_lazy); return parent::set($k, $v, $vType); }Либо перед изменением данных объекта делать $o->toArray(); // а потом что-то изменяем $o->set('active', 0);Тогда тоже будет хорошо, но это не удобно. Лучше переопределить метод set и не заморачиваться. В этом случае $o->fromArray() тоже будет работать адекватно. Вопросы / Наследуемость полей у расширяемых xPDO-классов 6 +1 2
Evgeny Epifanov · 22 сентября 2014, 17:28 Если кому-то интересно, решил все кардинально: if ($modx->event->name == 'OnLoadWebDocument') { $uri = $_SERVER['REQUEST_URI']; if ($modx->resource->isfolder && substr($uri, -1) != '/' && !strpos($uri, '?')) { $modx->sendRedirect($modx->makeUrl($modx->resource->id),array('responseCode' => 'HTTP/1.1 301 Moved Permanently')); } } Вопросы / Слэш в конце адреса 44 +2 2
Наумов Алексей · 25 июля 2014, 09:37 Да, сделал! 1. Переопределяем msCartHahdler. В частности функцию status: public function status($data = array()) { $status = parent::status($data); // margin && discount $status['margin'] = $this->getCartMargin(); $status['discount'] = $this->getCartDiscount(); $status['total_cost'] = $this->calcTotalCostEx($status['total_cost'], $status['margin'], $status['discount']); return $status; } public function calcTotalCostEx($total_cost, $margin, $discount){ $result = $total_cost; if(!empty($margin)){ $result = $total_cost + $margin; } if(!empty($discount)){ $result = $total_cost - $discount; } return $result; }getCartMargin, getCartDiscount — считайте скидку и наценку как хотите в них, для этого у вас есть $this->cart — корзина с товарами. 2. Копируем файл minishop2.js, указываем в настройках новый путь к нему, добавляем логику: 2.1 Метод miniShop2.Cart… setup miniShop2.Cart.margin = '.ms2_margin'; miniShop2.Cart.discount = '.ms2_discount';2.2. Метод status: if(status['margin'] > 0){ $(miniShop2.Cart.margin).show(); $(miniShop2.Cart.margin + ' .ms2_margin_price').text(status['margin']); } else{ $(miniShop2.Cart.margin).hide(); } if(status['discount'] > 0){ $(miniShop2.Cart.discount).show(); $(miniShop2.Cart.discount + ' .ms2_discount_price').text(status['discount']); } else{ $(miniShop2.Cart.discount).hide(); }3. Ну и добавляем в чанк cart.Outer строчки с наценкой и скидкой: <div class="ms2_discount">Скидка: <span class="ms2_discount_price"></span></div> <div class="ms2_margin">Наценка: <span class="ms2_margin_price"></span></div> Вопросы / miniShop2 - скидка или наценка к сумме заказа 17 +2 1
Возможно ли реализовать возможность предоплаты за доставку на сайте? Так ради этого мне и нужно это все, чтобы клиент платил сразу при оформлении заказа, чтобы избавить себя от мусорных заявок (когда человек оставляет заявку, а предоплату делать не ...
Редизайн сообщества На больших экранах основной текст статьи я бы сделал 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... Да, планируется. Даже чуть больше, чем просто бонусная система)
Вот такой вот нехитрый код:
будет приводить к вот такой вот ошибке (в modx-логе):
Дело в том, что такой вот унаследованный объект полученный методом $modx->getObject будет lazy (а вот через newObject всё хорошо). Не буду расписывать что это такое и почему. Факт в том, что сохраняться ничего не будет.
Чтобы всё работало как ожидается, надо в унаследованных классах переопределять метод set:
Либо перед изменением данных объекта делать
Тогда тоже будет хорошо, но это не удобно.
Лучше переопределить метод set и не заморачиваться. В этом случае $o->fromArray() тоже будет работать адекватно.
1. Переопределяем msCartHahdler. В частности функцию status:
getCartMargin, getCartDiscount — считайте скидку и наценку как хотите в них, для этого у вас есть $this->cart — корзина с товарами.
2. Копируем файл minishop2.js, указываем в настройках новый путь к нему, добавляем логику:
2.1 Метод miniShop2.Cart… setup
2.2. Метод status:
3. Ну и добавляем в чанк cart.Outer строчки с наценкой и скидкой: