Баха Волков · 06 февраля 2020, 22:07 Не не не, не делайте так, помните или почитайте о DRY. С парсером MODX все понятно, ей сложно помочь, но феном-то полноценный шаблонизатор: {foreach ['receiver', 'phone', 'index', 'region', 'city', 'street', 'building', 'room', 'comment', 'customfield'] as $field} {if $address[$field]?} <tr> <td style="{$style.th};width: 200px; font-weight: 600;">{('ms2_frontend_' ~ $field) | lexicon}: </td> <td style="{$style.th}">{$address[$field]}</td> </tr> {/if} {/foreach} 8 моих строчек против твоих 80-ти Готовые решения / Данные клиента в письме (e-mail). Minishop2. Изменяем чанк tpl.msEmail 9 +12 5
Володя · 27 января 2017, 22:04 указать в параметре where &where=`{"msDelivery.id:IN":[1,2], "msPayment.id:IN":[1,2,3]}` Вопросы / msOrder указать методы оплаты и доставки руками 4 +1 1
Максим Кузнецов · 05 января 2017, 16:54 С минимальным функционалом, облако тегов к компоненту можно реализовать следующим способом: 1. Создаем сниппет (tags.list): <?php $pdoTools = $modx->getService('pdoTools'); $TvSuperSelect = $modx->getService('tvsuperselect', 'tvsuperselect', MODX_CORE_PATH . 'components/tvsuperselect/model/tvsuperselect/'); if (!$TvSuperSelect) { $modx->log(xPDO::LOG_LEVEL_ERROR, 'Не удалось загрузить TvSuperSelect'); return; } $q = $modx->newQuery('tvssOption'); $q->groupby('value'); $q->select('value, tv_id'); $q->where(array( 'tv_id' => $tv_id )); if ($q->prepare() && $q->stmt->execute()) { $tags = $q->stmt->fetchAll(PDO::FETCH_ASSOC); } $tags_page = $modx->makeUrl($tags_page, '', '', 'full'); foreach($tags as $tag) { $result .= $pdoTools->getChunk($tpl, array( 'tag' => $tag['value'], 'tags_page' => $tags_page )); } return $result; 2. Создаем чанк для отображения кнопки тега (tags.list.item): <a href="{$tags_page}{$tag | replace : " " : "%20"}/">{$tag}</a><br /> 3. Вызываем созданный сниппет: {$_modx->runSnippet('!tags.list', [ 'tv_id' => 5, 'tpl' => 'tags.list.item', 'tags_page' => 99 ])} При желании можно добавить подсчет использований каждого тега, убрав $q->groupby('value') и добавив счетчик внутри цикла. Новые дополнения и их версии / [tvSuperSelect] Тип TV: автозаполняемый список из ms2, для реализации тегов 125 +3 1
Володя · 30 сентября 2016, 17:32 создайте настройку ms2_cart_max_count и укажите там нужное ограничение. Вопросы / Ограничение на количество единиц товара в корзине 4 +2 2
Дмитрий Середюк · 12 февраля 2016, 10:56 [[Sendex? &tplActivate=`tpl.Sendex.activateX` &tplSubscribeAuth=`tpl.Sendex.subscribe.authX` &tplSubscribeGuest=`tpl.Sendex.subscribe.guestX` &tplUnsubscribe=`tpl.Sendex.unsubscribeX` &id=`1` ]]tpl.Sendex.activateX — письмо которое будет отправлено на почту, для подписки на рассылку! Для активации добровольной подписки с сайта <a href="[[++site_url]]">[[++site_name]]</a> пройдите по ссылке ниже!</br> [[+link]]tpl.Sendex.subscribe.authX — чанк с подпиской для авторизированных! <form action="" method="post"> <div class="form-group"> <div class="col-sm-12 padding0 colora1a5ab margin-bottom10"> [[%sendex_subscribe_intro?name=`[[+name]]`]] </div> <div class="col-sm-12 padding0"> <input type="hidden" name="sx_action" value="subscribe"> <button class="btn x btn-default revZ-in1" type="submit">[[%sendex_btn_subscribe]] <i class="glyphicon glyphicon-send"></i></button> </div> </div> <span class="error">[[+message]]</span> </form>tpl.Sendex.subscribe.guestX — ваш вариант для неавторизированных! просто input и кнопка! <form action="" method="post"> <div class="col-sm-12 padding0 colora1a5ab margin-bottom10"> [[%sendex_subscribe_intro?name=`[[+name]]`]] </div> <div class="input-group"> <input class="form-control anonimInput" type="email" name="email" value="" placeholder="Email"> <input type="hidden" name="sx_action" value="subscribe"> <span class="input-group-btn"> <button class="btn btn-default" type="submit" style="padding: 6px 11px;"><i class="glyphicon glyphicon-send"></i>[[-%sendex_btn_subscribe]]</button> </span> </div> <span class="error">[[+message]]</span> </form>tpl.Sendex.unsubscribeX — отписка от рассылки <form action="" method="post"> <!--[[-%sendex_unsubscribe_intro?name=`[[+name]]`]] --> <div class="form-group"> <div class="col-sm-12 padding0 colora1a5ab margin-bottom10"> [[%sendex_unsubscribe_intro?name=`[[+name]]`]] </div> <div class="col-sm-12 padding0"> <input type="hidden" name="code" value="[[+code]]"> <input type="hidden" name="sx_action" value="unsubscribe"> <button class="btn x btn-default revZ-in1" type="submit">[[%sendex_btn_unsubscribe]] <i class="glyphicon glyphicon-send"></i></button> </div> </div> </div> <span class="error">[[+message]]</span> </form> наглядно можно глянуть тут! Вопросы / Sendex подписка по email без регистрации 12 +2 1
Павел Гвоздь · 16 августа 2015, 20:43 Вот какой-то плагин писал давненько. Как раз отсылает мыло. А если мыло не ввели, то создаёт юзера вот с таким мылом «телефон@сайт-на-котором-регается-юзер.ru». На том сайте мне надо было вводить либо мыло, либо телефон. Поэтому такое решение. Обновлено: В конце там у нас есть код — если юзер авторизован, то записать данные введённые в заказе в Profile. <?php $mail_subj_text = 'Регистрация на ' . $modx->getOption('site_name'); $chunk_mail_reg = 'tpl.mail.userRegisterFromOrderSubmit'; $suffix_email = '@сайт-на-котором-регается-юзер.ru'; switch ($modx->event->name) { // Обработка события, чтобы узнать, существовал ли юзер раньше.. // А также подставляет левый email, если он не заполнен, а "телефон" заполнен case "msOnSubmitOrder": $order_data = $order->get(); if( empty($order_user['email']) ) { $order_data = $data; } //$modx->log(modX::LOG_LEVEL_ERROR, print_r( $order->get() , true)); //$modx->log(modX::LOG_LEVEL_ERROR, print_r( $data , true)); // если email пуст или он с нашим суффиксом, то подставляем ему мыло вида - "телефон@suffix_email" if( empty($order_data['email']) || strstr($order_data['email'], $suffix_email) ) { if( trim($order_data['phone']) != '' ) { $phone = preg_replace( "/\D/", "", $order_data['phone'] ); $data['email'] = $order_data['email'] = ( $phone ) . $suffix_email; } else { $data['email'] = $order_data['email'] = ''; } } $modx->event->returnedValues['data'] = $data; // проверяем наличие мыла $email = $order_data['email']; if(empty($email)) { continue; } // проверяем на существование юзера по username=email, и если не существовал, то пишем соответствующее значение в сессию $_SESSION['minishop2']['new_user'] = false; if( !$modx->getCount('modUser', array('username' => $email)) ) { $_SESSION['minishop2']['new_user'] = $email; //$modx->log(modX::LOG_LEVEL_ERROR, print_r( $_SESSION['minishop2']['new_user'] , true)); } //$modx->log(modX::LOG_LEVEL_ERROR, print_r( $data , true)); break; case "msOnCreateOrder": $order_user = $order->get(); // если email с суфиксом нашего сайта - то не продолжаем if( strstr( $order_user['email'], $suffix_email ) ) { continue; } // если не авторизован if( !$modx->user->isAuthenticated($modx->context->key) ) { $email = $order_user['email']; if(empty($email)) {return false;} $user = $modx->getObject("modUser", array('username' => $email) ); // Если юзер не существовал раньше (при событии msOnSubmitOrder), то ставим ему новый пароль и шлём сообщение о регистрации на мыло if( $_SESSION['minishop2']['new_user'] == $email ) { $new_password = substr( md5(rand()), 0, 9 ); $user->set('password', $new_password ); $user->save(); $modx->log(modX::LOG_LEVEL_ERROR, print_r( $new_password , true)); // формируем письмо (тему и текст) $mail_subj = $mail_subj_text; $mail_body = $modx->getChunk( $chunk_mail_reg, array_merge( $user->getOne('Profile')->toArray(), $user->toArray(), array( 'password' => $new_password, ) ) ); // шлём письмо $mail = $modx->getService('mail', 'mail.modPHPMailer'); $mail->set(modMail::MAIL_BODY, $mail_body); $mail->set(modMail::MAIL_FROM, $modx->getOption('emailsender')); $mail->set(modMail::MAIL_FROM_NAME, $modx->getOption('site_name')); $mail->set(modMail::MAIL_SENDER, $modx->getOption('emailsender')); $mail->set(modMail::MAIL_SUBJECT, trim($mail_subj)); $mail->address('to', $email); $mail->address('reply-to', $modx->getOption('emailsender')); $mail->setHTML(true); $mail_response = !$mail->send() ? $mail->mailer->ErrorInfo : true; // пишем в лог, если письмо не ушло if ($mail_response != true) { $modx->log(modX::LOG_LEVEL_ERROR, 'Не получилось отправить email на ящик '.$email.'. Сообщение: '.$mail_response); } $mail->reset(); } //$modx->log(modX::LOG_LEVEL_ERROR, print_r( $_SESSION[ 'user_' . $email ] , true)); } else { $user = $modx->user; // записываем данные из формы в профиль $profile = $user->getOne('Profile'); $profile->set('fullname', $order_user['receiver']); $profile->set('phone', $order_user['phone']); $profile->set('city', $order_user['city']); $profile->set('address', $order_user['street']); $profile->set('comment', $order_user['comment']); $profile->save(); } //$modx->log(modX::LOG_LEVEL_ERROR, print_r( $order_user , true)); break; } Вопросы / При заказе товара пользователь бы регистрировался? 3 +3 6
Илья Уткин · 07 июля 2015, 09:25 Как-то так: [[!msProducts:toPlaceholder=`products`? &parents=`[[+id]]` &depth=`1` &where=`{«template»:5}` &limit=`30` &where=`{"Data.old_price:!=":0}` &tpl=`tpl.msProducts.row` ]] [[+products:eq=``:then=``:else=`<p>[[+pagetitle]]</p> <div class="prodicts"> [[+products]] </div>`]] Вопросы / Проверка вызова сниппета в чанке 2 +3 1
Юрий · 21 апреля 2015, 13:56 преимущества: <div class="uk-container uk-container-center"> <div class="uk-grid "> <div class="uk-width-1-1 uk-margin-large-top "> <h3 class="uk-h2 uk-text-center zm-text-danger">[[pdoField? &id=`87`]]</h3> <hr/> </div> </div> <div class="uk-grid uk-grid-small uk-nbfc" data-uk-grid-match="{target:'.uk-panel'}" > [[pdoResources? &tpl=`tpl.benefits.item` &tplFirst=`tpl.benefits.first.item` &sortby=`menuindex` &sortdir=`ASC` &parents=`87` ]] </div> </div>Галерея: <div class="uk-container uk-container-center uk-margin-large-top uk-margin-small-bottom"> <div class="uk-grid uk-text-center uk-margin-top"> <div class="uk-width-1-1 uk-margin-bottom"> <h3 class="uk-h2 zm-text-danger">[[pdoField? &id=`88`]]</h3> <hr/> </div> </div> <div class="uk-grid uk-text-center uk-margin-top uk-margin-large-bottom"> <div class="uk-width-1-1"> [[ms2Gallery? &resource=`88` &limit=`24` &frontend_css=`` &frontend_js=`` &tplEmpty=`tpl.ms2Gallery.main-folio.empty` &tplOuter=`tpl.ms2Gallery.main-folio.outer` &tplRow=`tpl.ms2Gallery.Main-folio.row` ]] </div> </div> </div>отзывы: [[pdoResources? &tpl=`opinion.main.row` &sortby=`publishedon` &showUnpublished=`0` &sortdir=`DESC` &parents=`264` &tplWrapper=`opinion.main.outer` &scheme=`abs` &loadModels=`ms2gallery` &leftJoin=`{ "360x270": { "class":"msResourceFile" ,"alias":"360x270" ,"on": "360x270.resource_id = modResource.id AND 360x270.path LIKE '%/360x270/' AND 360x270.rank=0" } }` &select=`{ "modResource":"*" ,"360x270":"360x270.url as 360x270" }` &includeContent=`1` &includeTVs=`reviews-company,reviews-autor,reviews-project` &processTVs=`1` ]]Процес: [[pdoResources? &tpl=`process.row` &fastMode=`0` &sortby=`menuindex` &sortdir=`ASC` &parents=`92` &includeTVs=`process-icon,process-arrow,process-class,process-link` &processTVs=`1` &scheme=`abs` &tplWrapper=`process.outer` ]]надеюсь этого хватит для начала :-) Вопросы / Все шаблоны с содержимым на одну страницу 10 +2 1
Виктор Банев · 21 апреля 2015, 00:08 [[!pdoResources? &tpl=`@TEMPLATE` ]]К сниппету написаны очень хорошие манулы. Вопросы / Все шаблоны с содержимым на одну страницу 10 +1 1
Іван Клімчук · 29 января 2015, 15:35 Самое просто — это в переопределить класс msOrder и там унаследовать и переопределить методы получения списка доставок и списка платежей. Вопросы / Многоязыковой сайт и MiniShop2: доставка и оплата? 1 +1 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... Да, планируется. Даже чуть больше, чем просто бонусная система)
8 моих строчек против твоих 80-ти
1. Создаем сниппет (tags.list):
2. Создаем чанк для отображения кнопки тега (tags.list.item):
3. Вызываем созданный сниппет:
При желании можно добавить подсчет использований каждого тега, убрав $q->groupby('value') и добавив счетчик внутри цикла.
tpl.Sendex.subscribe.authX — чанк с подпиской для авторизированных!
tpl.Sendex.subscribe.guestX — ваш вариант для неавторизированных! просто input и кнопка!
tpl.Sendex.unsubscribeX — отписка от рассылки
наглядно можно глянуть тут!
Обновлено: В конце там у нас есть код — если юзер авторизован, то записать данные введённые в заказе в Profile.
Галерея:
отзывы:
Процес:
надеюсь этого хватит для начала :-)