GrinRom · 10 апреля 2015, 12:39 Решил проблему подключив напрямую, но может можно как то более правильно это сделать? require_once MODX_CORE_PATH.'components/new_era/model/new_era/newerachange.class.php'; Вопросы / Как подключить свой контроллер в сниппете 6 0 1
Василий Наумкин · 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
Fi1osof · 22 января 2015, 15:42 Ставите Console. Выполняете код: ini_set('max_execution_time', 0); ignore_user_abort(true); $c = 'modResource'; $q = $modx->newQuery($c); $q->sortby('id'); $q->select(array( "{$c}.*", )); $s = $q->prepare(); $s->execute(); while($row = $s->fetch(2)) $response = $modx->runProcessor('resource/update', $row); if($response->isError()){ print_r($response->getResponse()); return; } $modx->error->reset(); }Так как у вас документов много, советую сначала прогнать только корневые документы (добавить в запрос $q->where(array('parent' => 0));), а потом по каждому разделу в отдельности, указывая соответствующий parent. Вопросы / как пересохранить 2000 ресурсов ? 16 +3 5
Алексей Ерохин · 21 января 2015, 16:44 github.com/bezumkin/miniShop2/blob/186b18504214f0afde06343d9e9036c3505cf6a1/assets/components/minishop2/js/web/default.js#L128 Здесь делаете проверку, какое действие происходит. Например так var skip = 0; for (var i=0; i < data.length; i++) { if (data[i].name == 'ms2_action' && data[i].value == 'cart/add') { skip = 1; } } if (!skip) { miniShop2.Message.success(response.message); } Вопросы / РЕШЕНО Отключить jgrowl при добавлении в корзину 11 +1 1
Володя · 12 июля 2014, 00:11 switch ($modx->event->name) { case 'OnDocFormSave': $param = array( 'place' => $resource->get('pagetitle'), // допустим адрес у вас в pagetitle 'id' => $resource->get('id') ); $modx->runSnippet('getcoord',$param); break; }ну и сниппет getcoord — там запрос к апи и сохранение координат Вопросы / [Решено] Геокодирование и запись в базу 14 +1 1
Володя · 13 апреля 2014, 11:04 Приведу небольшой пример на пакете — Office, может кому пригодится… Допустим хотим ограничить доступ пользователей по email. Пускать только разрешенные email. 1. создаем свое событие для плагина <?php $Event = $modx->newObject('modEvent'); $Event->set('name', 'OnOfficeBeforeLogin'); $Event->set('service',1); $Event->set('groupname', 'office'); $Event->save();проверить создалось ли событие можно так $test = $modx->getObject('modEvent',array('name'=>'OnOfficeBeforeLogin')); echo $test->get('groupname');2. добавляем в action.php $modx->invokeEvent('OnOfficeBeforeLogin', array( '_REQUEST' => $_REQUEST ));3. пишем плагин на наше событие <?php switch ($modx->event->name) { case 'OnOfficeBeforeLogin': if ($_REQUEST['action']='auth/sendlink') { $command = $modx->getOption('office_ms2_command', null, "", true);//системная настройка с email участниками $instructor = $modx->getOption('office_ms2_instructor', null, "", true);//системная настройка с email тренерами $emails = array_merge(explode(',', $command ),explode(',', $instructor )); if (!in_array($_REQUEST['email'], $emails)) { //меняем почту на неправильную для выдачи ошибки $_REQUEST['email'] = "неправильная"; } else { //если есть доступ то ничего не делаем //или делаем чтото еще))) } } break; } Вопросы / Создание своего события в MODX 8 +1 4
Andrey Grachov · 06 февраля 2014, 16:29 Этот код: $q = $modx->newQuery('modResource'); $q->select(array( 'modResource.*', )); $q->where(array( 'template' => 1, 'OR:pagetitle:LIKE' => '%home%', ));даст такой запрос: SELECT modResource.* FROM `modx_site_content` AS `modResource` WHERE ( `modResource`.`template` = 1 OR `modResource`.`pagetitle` LIKE '%home%' )А этот: $q = $modx->newQuery('modResource'); $q->select(array( 'modResource.*', )); $q->where(array( array( 'template' => 1, 'pagetitle:LIKE' => '%home%', ), array( 'OR:id:=' => 1, 'published' => true, ), ));даст две группы, объединенные оператором OR: SELECT modResource.* FROM `modx_site_content` AS `modResource` WHERE ( ( `modResource`.`template` = 1 AND `modResource`.`pagetitle` LIKE '%home%' ) OR ( `modResource`.`id` = 1 AND `modResource`.`published` = 1 ) )Дополнительную информацию можно посмотреть тут: rtfm.modx.com/xpdo/2.x/class-reference/xpdoquery/xpdoquery.where Для разработчиков / Пара фокусов с xPDO 39 0 1
Василий Наумкин · 28 октября 2013, 22:15 Рано радуешься, нужно же еще форму вынести в чанк. Указываем параметр с именем чанка: <div id="connect_table"> [[!resource?tpl=`myForm`]] </div> Прописываем обработку чанка в сниппете: if ($_SERVER['REQUEST_METHOD'] == 'POST') { extract($_POST); } $count = $count1 + $count2 + $count3; return $modx->getChunk($tpl, array( 'count' => $count )); И пишем сам чанк с формой myForm: <form action="[[~[[*id]]]]" method="post" class="form_db"> <input type="number" name="count1" value="5" /> <input type="number" name="count2" value="7" /> <input type="number" name="count3" value="2" /> <button type="submit" name="submit">ok</button> </form> <p>[[+count]]</p> Вот, примерно так все в MODX и разделяется. Вопросы / Передать данные формы в сниппет 9 0 2
Перетягин Илья · 28 октября 2013, 21:51 Блин, спасибо большое, ты реально помог! Может кому интересно или пригодиться, выложу чудо творение: Чанк <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js" type="text/javascript"></script> <script type="text/javascript"> $(function(){ $('.form_db').submit(function(e){ e.preventDefault(); var m_method=$(this).attr('method'); var m_action=$(this).attr('action'); var m_data=$(this).serialize(); $.ajax({ type: m_method, url: m_action, data: m_data, success: function(result){ $('#connect_table').html(result); } }); }); }); </script> <div id="connect_table">[[!resource]]</div>Тут мы вызываем наш сниппет который содержит форму, а script type перехватывает его… в общем получается ajax Код сниппета if ($_SERVER['REQUEST_METHOD'] == 'POST') { extract($_POST); } $count = $count1 + $count2 + $count3; $output = '<form action="[[~[[*id]]]]" method="post" class="form_db">'; $output .= '<input type="number" name="count1" value="5" />'; $output .= '<input type="number" name="count2" value="7" />'; $output .= '<input type="number" name="count3" value="2" />'; $output .= '<button type="submit" name="submit">ok</button>'; $output .= '</form>'; $output .= "<p>$count</p>"; return $output; Тут мы имеем три поля и кнопку отправки, так же прием запроса и вычисления суммы этих трех полей. Еще раз большое спасибо Василий! Вопросы / Передать данные формы в сниппет 9 0 1
Василий Наумкин · 06 апреля 2013, 06:31 Выводить на сайте разные цены можно хотя бы условиями в чанке. Использовать можно не только ТВ, но и поле old_price, а также можно добавить свое собственное, расширением свойств товара. Главная цель — положить товар в корзину с нужной ценой, этого можно добиться написанием плагина на событие корзины msOnBeforeAddToCart. Плагин должен проверять авторизацию и получать нужную цену, а затем менять её в объекте product (но не сохранять!). Пример плагина, меняющего нормальный price на old_price, если юзер авторизован: if ($modx->event->name == 'msOnBeforeAddToCart' && $modx->user->isAuthenticated()) { $old_price = $product->get('old_price'); if (!empty($old_price)) { $product->set('price', $old_price); } } Вопросы / miniShop2 — работа с оптовыми ценами 28 0 5
Возможно ли реализовать возможность предоплаты за доставку на сайте? У меня Робокасса, у них вроде есть 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... Да, планируется. Даже чуть больше, чем просто бонусная система)
Fi1osof·Выполняете код:
Так как у вас документов много, советую сначала прогнать только корневые документы (добавить в запрос $q->where(array('parent' => 0));), а потом по каждому разделу в отдельности, указывая соответствующий parent.
Здесь делаете проверку, какое действие происходит.
Например так
Допустим хотим ограничить доступ пользователей по email. Пускать только разрешенные email.
1. создаем свое событие для плагина
проверить создалось ли событие можно так
2. добавляем в action.php
3. пишем плагин на наше событие
даст такой запрос:
А этот:
даст две группы, объединенные оператором OR:
Дополнительную информацию можно посмотреть тут: rtfm.modx.com/xpdo/2.x/class-reference/xpdoquery/xpdoquery.where
Указываем параметр с именем чанка:
Прописываем обработку чанка в сниппете:
И пишем сам чанк с формой myForm:
Вот, примерно так все в MODX и разделяется.
Может кому интересно или пригодиться, выложу чудо творение:
Чанк
Тут мы вызываем наш сниппет который содержит форму, а script type перехватывает его… в общем получается ajax
Код сниппета
Тут мы имеем три поля и кнопку отправки, так же прием запроса и вычисления суммы этих трех полей.
Еще раз большое спасибо Василий!
Главная цель — положить товар в корзину с нужной ценой, этого можно добиться написанием плагина на событие корзины msOnBeforeAddToCart.
Плагин должен проверять авторизацию и получать нужную цену, а затем менять её в объекте product (но не сохранять!).
Пример плагина, меняющего нормальный price на old_price, если юзер авторизован: