Всего 123 789 комментариев

Николай Савин
05 сентября 2023, 17:17
+4
Не вижу ни одной причины за эту идею.
В то время как хранение корзины в базе дает кучу преимуществ
1. Во-первых, это уже реализовано в ms2 и повторить реализацию можно тупо быстрее.
2. Во-вторых, менеджеры могут просматривать какие заказы сейчас находятся на стадии оформления, какие брошены и брать контактные данные, если хоть какие-то остались. В общем полный функционал брошенных корзин
3. Сам покупатель не привязан к клиенту. Начал оформлять заказ на телефоне (авторизованный), затем перешел за комп и сразу после авторизации видит свой заказ.
Павел Голубев
05 сентября 2023, 17:13
0
А почему всю корзину не хранить в LocalStorage? А при оформлении заказа прокидывать в процессор создающий заказ данные из LocalStorage. Там и событие есть на изменение, можно сразу все корзины офовлять по нему.
Наумов Алексей
05 сентября 2023, 15:10
0
1. нагенерируйте нужные превью, указав их в источнике файлов miniShop2
2. см. доки docs.modx.pro/components/easycomm/rating-in-pdoresources-and-msproducts
Сергей
05 сентября 2023, 14:44
0
Доброго времени суток! Вопрос по компоненту — amocrm.
у меня работает в режиме хука для Formit — ajaxform.
Проблема — не создается контакт в вмо, телефон пишется просто в доп полях, он приходит но контакта нет.
Создается на сколько я понял, только когда авторизован в modx.
Поковырял исходники. Там вроде как контакт создается на событие — OnUserFormSave (создание, обновление юзера).
Мне надо бы для анонимов сделать.
Артур Шевченко
05 сентября 2023, 13:57
+1
И ещё важно не забыть сделать метод генерации ключа товара в корзине публичным.
Maks
05 сентября 2023, 13:52
0
Во-первых избавляйтесь от phpthumbon.
Чем посоветуете заменить?

Если у вас выводится на странице много товаров — стоит попробовать вместо вызова ecThreadRating делать join таблицы чтобы получать рейтинг товара.
Если не трудно покажите как это сделать?
Наумов Алексей
05 сентября 2023, 12:13
+2
п. 3 и 4 в msProducts — ура))
Необязательная регистрация пользователя — тоже ура)
Константин
05 сентября 2023, 10:57
0
Да, именно на странице товара и не получается отключить вывод артикула.
Ни так:
{if $parent != 31 && $id != 31 && $parent != 29 && $id != 29}
Ни так:
{if $_modx->resource.parent != 31 && $_modx->resource.id != 31 && $_modx->resource.parent != 29 && $_modx->resource.id != 29}
Наумов Алексей
05 сентября 2023, 10:54
0
Ну у вас прям навороченный чанк…
Во-первых избавляйтесь от phpthumbon.
Во-вторых уберите встроенный синтаксис modX (с прямоугольными скобками который).
Если у вас выводится на странице много товаров — стоит попробовать вместо вызова ecThreadRating делать join таблицы чтобы получать рейтинг товара.

Два вызова msOptions тоже… может как-то упростить?
Maks
05 сентября 2023, 10:44
0
<div class="ms2_product col-6 col-sm-6 col-md-4 mb-3 px-2">
              <div class="product text-center">
                  {var $productimage = 'phpthumbon' | snippet : ['input' => $_pls['$thumb'],  'options' => 'h=200&f=jpg&bg=ffffff']}
                  {var $productimagewebp = 'phpthumbon' | snippet : ['input' => $_pls['$thumb'],  'options' => 'h=200&f=webp&bg=ffffff']}
 [[!addComparison?
  &list_id=`15`
  &id=`[[+id]]`
]]                                           
                <a href="{$uri}" class="clr3" title="{$_modx->resource.pagetitle} {$pagetitle}">
                 
                    <picture>
                        <source srcset="{$thumb}" type="image/webp">
                        <source srcset="{$thumb}" type="image/jpg">
                        <img src="{$thumb}" alt="{$_modx->resource.pagetitle} {$pagetitle}" title="{$_modx->resource.pagetitle} {$pagetitle}" class="lazy img-fluid">
                    </picture>

                    
 <div class="flags ">
                    {if $new?}
                        <span class="badge badge-secondarynew  badge-pill mr-md-1">{'ms2_frontend_new' | lexicon}</span>
                    {/if}
                    {if $popular?}
                        <span class="badge badge-secondarytop badge-pill mr-md-1">{'ms2_frontend_popular' | lexicon}</span>
                    {/if}
                    {if $favorite?}
                        <span class="badge badge-secondaryfav badge-pill mr-md-1"> {'ms2_frontend_favorite' | lexicon}</span>
                    {/if}
                    {if $sklad?}
                        <span class="badge badge-secondarysklad badge-pill mr-md-1"> {'ms2_frontend_sklad' | lexicon}</span>
                    {/if}                    
                </div>                      
                    
                </a>
                               
                <div class="product-info">
                  <p class="font-weight-bold text-uppercase h4">
                      <a href="{$uri}" class="clr3" title="{$_modx->resource.pagetitle} {$pagetitle}"> 
[[+titletovar:ifempty=`[[+pagetitle]]`]]                  
                      </a></p>
                    [[!ecThreadRating?
                    	&thread=`resource-[[+id]]`
                    	&tpl=`RatingTovar`
                    ]]  

                  	  {$_modx->runSnippet('msOptions', [
                		'product' => $id,
                		'options' => 'tags',
                		'tpl' => '@FILE chunks/catalog/ProductOptions.tpl',
                	  ])}                       
                  	  {$_modx->runSnippet('msOptions', [
                		'product' => $id,
                		'options' => 'brand,made_in,available',
                		'tpl' => '@FILE chunks/catalog/msOptionsTags.tpl',
                	  ])}
                
                    {if $old_price?}
                        <img src="assets/img/icons/promo-badge.svg" alt="Иконка Акции" width="40" height="40" loading="lazy" class="promobadge">
                        <span class="old_price ml-md-3"><del>{$old_price} {'ms2_frontend_currency' | lexicon}</del></span>
                    {/if}                  
                  <p class="price clr1 font-weight-bold">
                   [[+price:is=`0`:then=`[[*context_key:is=`web`:then=`Цена по запросу`:else=`Ціна за запитом`]] `:else=`{$price} {'ms2_frontend_currency' | lexicon}`]]  
                  </p>

        
                  <a href="{$uri}" class="product-link" title="{$_modx->resource.pagetitle} {$pagetitle}">{'ms2_frontend_add_to_cart' | lexicon}</a>
 

        
                </div>
              </div>
            </div>
Чанк
Наумов Алексей
05 сентября 2023, 09:58
0
Попробовать:
1. отключить suggestions и посмотреть время
2. временно убрать почти все фильтры (оставить 1-2) и посмотреть время
2. покажите чанк с товаром, может там чего?
Артур Шевченко
04 сентября 2023, 23:10
0
Так а с чего бы он их начал парсить, если их нет или они в неподходящем для парсинга формате? У вас и ошибки не было, было предупреждение, что вы передаёте в функцию foreach не массив. Я показал как сделать проверку, чтобы предупреждение ушло, но цикл-то от этого не запустился. Надо разбираться что лежит в $node и исходя из этого корректировать код.
Дмитрий
04 сентября 2023, 21:55
0
Ошибка вроде ушла… все равно параметры не парсит ((
Артур Шевченко
04 сентября 2023, 21:24
0
if($key=='@attributes' && is_array($node)){
                foreach($node as $k => $v) {
                    $this->keys[1][] = '@attributes.'.$k;
                    $this->values[] = trim($v);
Дмитрий
04 сентября 2023, 21:18
0
Ошибка как раз показывает на фаил и в нем строка 1668 ошибка
//Атрибуты элемента
            if($key=='@attributes'){
                foreach($node as $k => $v) {
                    $this->keys[1][] = '@attributes.'.$k;
                    $this->values[] = trim($v);
Артур Шевченко
04 сентября 2023, 21:13
0
В описании ошибки должна быть ссылка на файл и сроку в нём.
Dan
Dan
04 сентября 2023, 17:02
0
Это же страница товара, а не карточка. И я ведь написал в комменте, почему вы его не прочитали? Нужно выводить не [[+article]] в шаблоне, ибо это плейсхолдер, а {$_modx->resource.article}
Артур Шевченко
04 сентября 2023, 16:58
0
Вообще мне кажется, что правильнее показывать уведомление об успешной отправке не в «тосте», а в самой форме.
Дизайнеры зачастую даже стили для отображения ошибок не рисуют, что уж говорить об успешной отправке, а у всплывашек из коробки приятный дизайн.

Кстати, компонент сессии использует?
Нет, не использует, но использует куки.

Есть ли стандартный шаблон для писем?
Есть три шаблона писем: для обычных форм и опросов, для подтверждения email, для сброса пароля.
Константин
04 сентября 2023, 16:52
0
Товар выводим шаблоном
<!DOCTYPE html>
<html lang="ru">
  <head>
    {$_modx->getChunk('meta')}
  </head>
  <body class="common-home res layout-4">
    <div id="wrapper" class="wrapper-fluid banners-effect-5">
      <!-- Header Container  -->
      <header id="header" class=" typeheader-4">
        {$_modx->getChunk('header')}
      </header>
      <!-- //Header Container  -->
      <!-- Main Container  -->
      <div class="main-container container">
        {$_modx->runSnippet('!pdoCrumbs', [
        'showHome' => '0',
        'exclude' => '24',
        'tplWrapper' => '@INLINE 
        <ul class="breadcrumb" itemscope="" itemtype="http://schema.org/BreadcrumbList">{$output}</ul>
        ',
        'tplHome' => '@INLINE 
        <li itemprop="itemListElement" itemscope="" itemtype="http://schema.org/ListItem">
          <a itemprop="item" title="{ $menutitle }" href="{$link}">
            <i class="fa fa-home"></i> <span itemprop="name" class="crumb-item">{$menutitle}</span>
            <meta itemprop="position" content="{ $idx }">
          </a>
        </li>
        ',
        'tplCurrent' => '@INLINE 
        <li class="mr-2" itemprop="itemListElement" itemscope="" itemtype="http://schema.org/ListItem">
          <span itemprop="item" class="current">
            <span itemprop="name">{$menutitle}</span>
            <meta itemprop="position" content="{ $idx }">
          </span>
        </li>
        ',
        'tpl' => '@INLINE 
        <li itemprop="itemListElement" itemscope="" itemtype="http://schema.org/ListItem">
          <a itemprop="item" title="{ $menutitle }" href="{$link}">
            <span itemprop="name" class="crumb-item">{$menutitle}</span>
            <meta itemprop="position" content="{ $idx }">
          </a>
        </li>
        ',
        ])}
        
          {$_modx->runSnippet('!addLooked', [
          'templates' => '3',
          'limit' => '15',
          ])}
          <div class="row">
              
          <div id="content" class="col-md-9 col-sm-8">
            <div class="product-view row">
              <div class="left-content-product">
                <div class="content-product-left class-honizol col-md-5 col-sm-12 col-xs-12">
                  {$_modx->runSnippet('!msGallery', [
                  'tpl' => 'msGalleryProductTpl',
                  ])}
                  {if $_modx->resource.new?}
                  <span class="abel-product label-new">{'ms2_frontend_new' | lexicon}</span>
                  {/if}
                  {if $_modx->resource.popular?}
                  <span class="label-product label-sale">{'ms2_frontend_popular' | lexicon}</span>
                  {/if}
                  {if $_modx->resource.favorite?}
                  <span class="label-product label-new">{'ms2_frontend_favorite' | lexicon}</span>
                  {/if}
                </div>
                <div class="content-product-right col-md-7 col-sm-12 col-xs-12"  itemtype="http://schema.org/AggregateOffer" itemprop="offers" itemscope>
                  <meta itemprop="category" content="{$_modx->resource.parent | resource: "pagetitle"}">
                  <meta itemprop="offerCount" content="1">
                  <meta itemprop="price" content="{$price | replace:" ":""}">
                  <meta itemprop="lowPrice" content="{$price | replace:" ":""}">
                  <meta itemprop="priceCurrency" content="RUR">
                  <div class="title-product">
                    <h1>{$_modx->resource.introtext ?: $_modx->resource.pagetitle}</h1>
                  </div>
                  <!-- Review ---->
                  <form class="form-horizontal ms2_form" method="post">
                    <input type="hidden" name="id" value="[[*id]]"/>
                    <div class="product-label" itemprop="offerDetails" itemscope="" itemtype="http://data-vocabulary.org/Offer">
                      <div class="product_page_price price" itemprop="offers" itemscope="" itemtype="http://schema.org/Offer">
                        <span class="price-new product-price" itemprop="price">{$price} {'ms2_frontend_currency' | lexicon}</span>
                        {if $old_price != 0}
                        <span class="old_price price-old">[[+old_price]] [[%ms2_frontend_currency]]</span>
                        {/if}
                        <meta itemprop="price" content="[[+price]]">
                        <meta itemprop="priceCurrency" content="RUB">
                        <meta itemprop="priceValidUntil" content="[[!+nowdate:default=`now`:strtotime:date=`%Y-%m-%d`]]">
                        <link itemprop="availability" href="http://schema.org/InStock">
                      </div>
                      {if $_modx->resource.available == 1}
                      <div class="stock"><span class="status-stock">В наличии</span></div>
                      {/if}
                      {if $_modx->resource.available == 2}
                      <div class="stock"><span class="status-stock">Нет в наличии</span></div>
                      {/if}
                      {if $_modx->resource.available == 3}
                      <div class="stock"><span class="status-stock">Под заказ</span></div>
                      {/if}
                    </div>
                    <div class="product-box-desc">
                      <div class="inner-box-desc">
                        [[getMarksAndModels]]
  
                        [[*longtitle:notempty=`
                        <div class="price-tax"><span>Примечание:</span> <span class="article">[[*longtitle]]</span></div>
                        `:else=``]]

{if $parent != 31 && $id != 31 && $parent != 29 && $id != 29}
  <div class="reward"><span>Артикул:</span> <span class="item">[[+article]]</span></div>
{/if}

                        [[-*article:gt=`0`:then=`<span>Артикул:</span> <span class="item">[[*article]]</span>`:else=``]]
                        [[msProductOptions?tpl=`msProductOptionsTpl` &onlyOptions=`orign_n`]]
                        [[msProductOptions?tpl=`msProductOptionsTpl` &onlyOptions=`dop_n`]]
                        [[+vendor.name:gt=`0`:then=`
                        <div class="price-tax"><span>Производитель:</span> <span class="article">[[+vendor.name]]</span></div>
                        `:else=``]]
                        [[+vendor.country:gt=`0`:then=`
                        <div class="price-tax"><span>Страна производителя:</span> <span class="article">[[+vendor.country]]</span></div>
                        `:else=``]]
                        <div class="vendor-status">
                          <div class="price-tax">
                            <span>Статус производителя:</span>
                            <span class="article">
                            {if $_pls['vendor.description']?}{$_pls['vendor.description']}{else}Неоригинал{/if}
                            </span>
                          </div>
                          {if $_pls['vendor.logo']?}
                          <div class="vendor-logo">
                            <img src="{$_pls['vendor.logo']}" title="{$_pls['vendor.description']}" class="img-responsive" data-toggle="tooltip"/>
                          </div>
                          {else}
                          <div class="vendor-logo">
                            <img src="assets/images/vendors/no orign_2.png" title="Неоригинал" class="img-responsive" data-toggle="tooltip"/>
                          </div>
                          {/if}
                        </div>
                        [[msProductOptions?tpl=`msProductOptionsTpl` &onlyOptions=`synonym`]]
                      </div>
                    </div>
                    <div id="product">
                      <div class="box-info-product">
                        <button type="submit" class="btn btn-mega btn-lg" name="ms2_action" value="cart/add">
                        {'ms2_frontend_add_to_cart' | lexicon}
                        </button>
                        <div class="input-group">
                          <input type="number" name="count" id="product_price" class="form-control col-md-6" value="1"/>
                          <div class="input-group-append">
                            <span class="input-group-text">{'ms2_frontend_count_unit' | lexicon}</span>
                          </div>
                        </div>
                        [[!msOneClick?
                        &tplBtn=`msoneclickBtnTpl`
                        &tplForm=`msOneClickFormTpl`
                        ]]
                      </div>
                    </div>
                </div>
                <!-- end box info product -->
                </form>
              </div>
            </div>
          </div>
          
          <div class="producttab ">
            <div class="tabsslider horizontal-tabs  col-xs-12">
              <ul class="nav nav-tabs">
                <li class="active"><a data-toggle="tab" href="#tab-1">Описание</a></li>
                <li class="item_nonactive"><a data-toggle="tab" href="#tab-2">Доставка и оплата</a></li>
                <li class="item_nonactive"><a data-toggle="tab" href="#tab-review">Задать вопрос</a></li>
              </ul>
              <div class="tab-content col-xs-12">
                <div id="tab-1" class="tab-pane fade active in">
                  [[*content:default=`
                  <h2>[[*description]] в наличии в магазине Рио</h2>
                  `]]
                </div>
                <div id="tab-2" class="tab-pane fade">
                  [[#41.content]]
                </div>
                <div id="tab-review" class="tab-pane fade">
                  <h3>Запрос по VIN, задать вопрос</h3>
                  [[#815.content]]
                  [[!AjaxForm? 
                  &form=`questionFormTpl` 
                  &snippet=`FormIt` 
                  &hooks=`validate,FormItSaveForm,email`
                  &formName=`Сообщение с сайта`
                  &emailSubject=`Сообщение с сайта`
                  &emailTo=`ekbsanteh@mail.ru`
                  &emailFrom=`no-reply@ekb-santeh.ru`
                  &emailTpl=`tpl.email`
                  &validate=`name:minLength=^2^`
                  &fieldNames=`name==Имя,phone==Телефон,pageurl==Страница отправки,vin==VIN,email==Email,city==Город,marka==Марка,model==Модель,year==Год выпуска,upload==Файл`
                  &validationErrorMessage=`В форме содержатся ошибки!`
                  &successMessage=`Сообщение успешно отправлено`
                  ]]
                </div>
              </div>
            </div>
          </div>
          
          [[!msProducts?
          &tpl=`recentlyViewedTpl`
          &includeThumbs=`medium`
          &parents=`0`
          &link=`1`
          &master=`[[*id]]`
          &wrapIfEmpty=`0`
          &tplWrapper=`@INLINE
          <div class="related titleLine products-list grid module">
            <h3 class="">Аналоги:</h3>
            <div class="releate-products yt-content-slider products-list" data-rtl="no" data-loop="yes" data-autoplay="no" data-autoheight="no" data-autowidth="no" data-delay="4" data-speed="0.6" data-margin="30" data-items_column00="4" data-items_column0="4" data-items_column1="3" data-items_column2="2" data-items_column3="2" data-items_column4="1" data-arrows="yes" data-pagination="no" data-lazyload="yes" data-hoverpause="yes">
              [[+output]]
            </div>
          </div>
          `]]
        
        <aside class="col-sm-4 col-md-3 content-aside" id="column-left">
          [[!looked?
          &limit=`3`
          &tpl=`lookedViewedTpl`
          &tplOuter=`lookedOuterMyTpl`
          &includeThumbs=`medium`
          ]]
          <!--<div class="module banner-left hidden-xs ">
            <div class="banner-sidebar banners">
              <div>
                <a title="Banner Image" href="#"> 
                <img src="assets/images/slider/banner-sidebar.jpg" alt="Banner Image"> 
                </a>
              </div>
            </div>
          </div>-->
          
        </aside>
        
        </div>
      </div>
    </div>
    <!--Middle Part End-->
    <!-- //Main Container -->
    {$_modx->getChunk('footer')}
    <!-- //end Footer Container -->
    </div>
    <!-- End Color Scheme
      ============================================ -->
    {$_modx->getChunk('scripts')}
  </body>
</html>
Dan
Dan
04 сентября 2023, 16:43
0
Во первых, прочитайте тщательно мой коммент выше, где я указал ссылку на документацию и поймете, где у вас ошибка.
Во вторых, покажите вызов сниппета, которым выводятся карточки, код чанка карточки.