Как правильно затащить шаблон "list-thumbs.html" в страницу магазина? Есть решение

В магазине на главной есть списки "Популярные товары" и "Новинки", и справа от заголовков есть ссылки, чтобы открыть списки на отдельной странице. Для популярных товаров я создал страницу (Магазин - Витрина - Страницы - Популярные товары). Ну и туда закинул

{$bestsellers = $wa->shop->productSet( 'bestsellers' )}
{include file="list-thumbs.html" products=$bestsellers}

Однако получил ошибку, которая вроде как говорит, что нельзя заинклудить шаблон на страницу. Впрочем, ошибку можно увидеть здесь

Можно ли как-то всё-таки заинклудить шаблон? Если нет, то как отобразить список на отдельной странице?

3 ответа

  • 1
    replicant 3 мая 2018 09:10 # Решение

    Можете поэкспериментировать с подобными вставками через блоки, чтобы уменьшить визуальный "кошмар" в контенте самой страницы, создав блок {$wa->block("list-thumbs")} с кодом шаблона внутри и определением списка продуктов, как в предыдущем моем комментарии. Ну и дальше уже берем блок и вставляем его одной строкой на любую страницу. Красиво будет.

    • +1
      devellopah devellopah 3 мая 2018 14:35 #

      не будет, увы. Придётся тупо копипастить килограммы строк, дичь какая-то.


      • +1
        replicant replicant 3 мая 2018 16:12 #

        Блоки использовать надо потому что. Написал же вторым комментарием. Шаблон надо создать в блоке. Для этого надо напрячься, собрать волю в кулак, сосредоточиться и один раз придется сделать Ctrl+C и Ctrl+V. Тогда последующая вставка вашей хотелки в страницу будет выглядеть красиво.

        Внутренность блока волновать уже не должна и её мы не видим, т.к. он (блок) предварительно правильно приготовлен (рецепт выше). Блоки появляются в Шпаргалках для быстрой вставки в редакторе одним кликом мыши. Блоков можно сделать несколько для разных списков товаров и вставлять по необходимости. Если не пробовали, то рекомендую. Рецепт работает отлично, быстро, надежно и практично.

        • +1
          replicant replicant 3 мая 2018 16:35 #

          P.S. Блоки создавать надо в приложении Сайт.

        • +1
          devellopah devellopah 3 мая 2018 19:26 #

          Вариант с блоком не прокатывает, поэтому я и написал, что красиво, увы, не выйдет.

          • +1
            replicant replicant 4 мая 2018 00:27 #

            Странно. Очень странно. У меня на разных проектах работает без ошибок с помощью блоков. Возможно не учли какую-то мелочь, что-то упустили из виду. Надо внимательно всё перепроверить шаг за шагом.

            • +1
              devellopah devellopah 4 мая 2018 08:05 #

              ну я сделал так:

              это блок(просто скопировал ul из list-thumbs.html) {$wa->block("list_thumbs")}

              <ul class="thumbs product-list row">
              {if !empty($theme_settings.list_features)}
                  {$features = $wa->shop->features($products)}
              {/if}
              {foreach $products as $p}
                  {$available = $wa->shop->settings('ignore_stock_count') || $p.count === null || $p.count > 0}
                  <li itemscope itemtype ="http://schema.org/Product" class="col-sm-6 col-lg-4 col-xxl-3">
                      <div class="item js-origin">
                          {$badge_html = $wa->shop->badgeHtml($p.badge)}
                          {if $badge_html}
                              {$badge_html}
                          {/if}
                          <a href="{$p.frontend_url}" title="{$p.name}" class="item__top">
                              <div class="image">
                                  {$wa->shop->productImgHtml($p, '200', ['itemprop' => 'image', 'alt' => $p.name, 'default' => "`$wa_theme_url`img/dummy200.png"])}  
                              </div>
                              
                              <h5>
                                  <span itemprop="name">{$p.name}</span>
                              </h5>
                          </a>
                          {if !empty($p.features)}
                          <table class="features">
                              {foreach $p.features as $f_code => $f_value}
                              <tr{if $features[$f_code].type == 'divider'} class="divider"{/if}>
                              <td class="name">
                                  {$features[$f_code].name|escape}
                              </td>
                              <td class="value" itemprop="{$f_code|escape}">
                                  {if is_array($f_value)}
                                      {if $features[$f_code].type == 'color'}
                                          {implode('<br /> ', $f_value)}
                                      {else}
                                          {implode(', ', $f_value)}
                                      {/if}
                                  {else}
                                      {$f_value}
                                  {/if}
                              </td>
                              </tr>
                              {/foreach}
                          </table>
                          {/if}
                          <div itemprop="offers" class="offers" itemscope itemtype="http://schema.org/Offer">
                              {if $available}
                                  <form class="purchase addtocart" {if $p.sku_count > 1}data-url="{$p.frontend_url}{if strpos($p.frontend_url, '?')}&{else}?{/if}cart=1"{/if} method="post" action="{$wa->getUrl('shop/frontendCart/add')}">
                                      <div class="pricing">
                                          {if $p.compare_price > 0}<span class="compare-at-price nowrap"> {shop_currency_html($p.compare_price)}</span> {/if}
                                          <span class="price nowrap">{shop_currency_html($p.price)}</span>
                                          <meta itemprop="price" content="{shop_currency($p.price, null, null, 0)}">
                                          <meta itemprop="priceCurrency" content="{$wa->shop->currency()}">
                                      </div>
                                      <input type="hidden" name="product_id" value="{$p.id}">
                                      <input type="submit" value="Купить" class="btn btn-small btn-primary-outlined">
                                      <i class="adding2cart"></i>
                                      {if !empty($theme_settings.compare_products)}
                                          <a data-product="{$p.id}" class="compare compare-item" href="#" title="[`Compare`]">
                                              <img class="compare-item__icon compare-from-list{if $wa->shop->inComparison($p.id)} active{/if}" src="/wa-data/public/site/themes/muslim_shop_2018/img/compare-from-list.png" alt="img">
                                              <img class="compare-item__hidden compare-from-list{if $wa->shop->inComparison($p.id)} active{/if}" src="/wa-data/public/site/themes/muslim_shop_2018/img/compare-from-list-hover.png" alt="img">
                                              <span class="ml-2">Добавить к сравнению</span>
                                          </a>{/if}
                                      <span class="added2cart" style="display: none;">{sprintf('[`%s is now <a href="%s"><strong>in your shopping cart</strong></a>`]', $p.name, $wa->getUrl('shop/frontend/cart'))}</span>
                                  </form>
                                  <link itemprop="availability" href="http://schema.org/InStock" />
                              {else}
                                  <span class="price nowrap">{shop_currency_html($p.price)}</span>
                                  <meta itemprop="price" content="{shop_currency($p.price, null, null, 0)}">
                                  <meta itemprop="priceCurrency" content="{$wa->shop->currency()}">
                                  <div class="out-of-stock"><strong>{if $wa->shop->settings('ignore_stock_count')}[`Pre-order only`]{else}[`Out of stock`]{/if}</strong></div>
                                  <link itemprop="availability" href="http://schema.org/OutOfStock" />
                              {/if}
                          </div>
                          {if $p.rating > 0}
                              <span class="rating nowrap">{$wa->shop->ratingHtml($p.rating, 16)}</span>
                          {/if}
                      </div>
                  </li>
              {/foreach}
              </ul>

              страница Новинки

              {$products = $wa->shop->productSet( 'novinki' )}
              {$wa->block("list_thumbs")}

              Ошибок, как уже упоминал нет, но список пустой на странице.

              Так ли вы делаете?

              • +1
                replicant replicant 4 мая 2018 12:44 #

                Не так.

                Строку

                {$products = $wa->shop->productSet( 'novinki' )} 

                список novinki есс-но должен существовать и в нем должны быть товары

                надо вставлять внутрь блока перед шаблоном <ul></ul> как я писал в примере ранее, а на странице нужно оставить только само упоминание блока

                {$wa->block("list_thumbs")} - имя блока может быть любым удобным для вас

                Поэтому и пустота, потому что вы не определили $products внутри шаблона, а надо определить, задав нужный список товаров. Тогда и пустоты не будет.

                • +1
                  devellopah devellopah 5 мая 2018 15:21 #

                  ну это не решение, ибо блок

                  {$wa->block("list_thumbs")}

                  теперь нельзя повторно использовать. По сути, правильнее назвать его

                  {$wa->block("novinki_list_thumbs")}

                  Для каждого списка придётся создавать отдельный блок. Конечно, всё же немного лучше, чем копипастинг, но не далеко ушло. Я же надеялся на какое-то более общее решение. Но всё равно спасибо).

  • 1
    devellopah 26 мая 2018 02:02 # Решение

    Всё-таки, затащить "list-thumbs.html" в блок приложения "Сайт" можно. На решение наткнулся чисто случайно.

    Магазин - Товары - выбираем любой список - "Код для встраивания" - "Страницу или другое приложение Webasyst"


    {if $wa->shop}
    {$products = $wa->shop->productSet("название списка")}
    {include file="`$wa->shop->themePath('id активной темы приложения Магазин')`list-thumbs.html" products=$products}
    {/if}
  • 1
    replicant 3 мая 2018 08:54 #

    Может быть проблема в том, что содержимое страницы - это лишь {$page.content} в шаблоне page.html, а когда внутрь {$page.content} ещё и шаблон вкладывается, то возникает проблема.

    Но сделать это можно. Даю подсказку. Берем содержимое list-thumbs.html и вставляем в страницу целиком.

    А в начало этого файла вводим такую строку {$products = $wa->shop->productSet('product_list')}

    И все работает, т.к. нет инклюдов неудобных и для массива products заранее определены товары.

    Мелочи типа сортировки можно отрезать. Т.е. фактически контент страницы будет таким, когда оставим только "голый" список

    {$products = $wa->shop->productSet('product_list')} - имя вашего список товаров

    <ul class="thumbs li250px product-list thumbs"> - класс оформления ваш
    {foreach $products as $p}
    ...... тут весь код внутренностей шаблона, включая фото товаров и кнопки купить .....
    </ul>

    При желании там же в голове перед $products подключаются js и корректирующие css, точечно обслуживающие шаблон list-thumbs.html, если необходимо. Хотя это уже частный случай.

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите