Перейти к содержимому

Вывод дополнительного контента — блоки, страницы, блог

Помимо товаров и категорий, в шаблонах Shop-Script можно выводить статические страницы, общие блоки, записи блога и промо-карты. Это позволяет создать полноценный сайт-магазин с информационным контентом.

Карта сайта — страницы, витрины и приложения

Общие блоки — это фрагменты HTML/Smarty, которые создаются в Сайт → Страницы → Общие блоки и подключаются в любых шаблонах.

Типичные примеры: шапка сайта, подвал, баннер акции, блок доверия, счётчики аналитики.

  1. Перейдите в Сайт → Страницы
  2. Переключитесь на вкладку Общие блоки
  3. Создайте блок с ID, например promo_banner
  4. Введите HTML-содержимое
{* Подключить общий блок по ID *}
{$wa->block("promo_banner")}
{* Передать параметры в блок *}
{$wa->block("promo_banner", ['first' => 100, 'second' => 500])}

Каждый переданный параметр доступен внутри блока как Smarty-переменная:

{* Внутри блока promo_banner *}
{$sum = $first + $second}
Итого: {$sum}

Страницы «Доставка и оплата», «О магазине», «Контакты» создаются в бекенде магазина и доступны через $shop_pages или хелпер $wa->shop->pages().

{foreach $shop_pages as $page}
<a href="{$page.url}">{$page.name}</a>
{/foreach}
{$site_pages = $wa->site->pages()}
{foreach $site_pages as $page}
<a href="{$page.url}">{$page.name}</a>
{/foreach}
{$about = $wa->site->page(5)}
{if $about}
<h2>{$about.name}</h2>
<div>{$about.content}</div>
{/if}

Если установлено приложение «Блог», его записи можно выводить в шаблонах магазина — например, на главной странице.

{$posts = $wa->blog->posts(null, 3)}
{if $posts}
<section class="blog-section">
<h2>Блог магазина</h2>
{foreach $posts as $post}
<article class="blog-card">
<h3>
<a href="{$post.link}">{$post.title}</a>
</h3>
<time>{$post.datetime|wa_date}</time>
<p>{$post.text|strip_tags|truncate:150:'...'}</p>
</article>
{/foreach}
</section>
{/if}
{* Получить записи блога с ID=2, лимит 5 *}
{$news = $wa->blog->posts(2, 5)}
{$blog = $wa->blog->blog(1)}
<h2>{$blog.name}</h2>
<a href="{$blog.link}">Все записи</a>

Витрина магазина — дизайн и темы оформления

Промо-карты настраиваются в бекенде магазина (Магазин → Витрина → Промо) и доступны на главной странице через $promocards:

{if $promocards}
<div class="promo-slider">
{foreach $promocards as $promo}
<div class="promo-slide"
style="background-color: {$promo.color}">
{if $promo.image}
<img src="{$promo.image}" alt="{$promo.title|escape}">
{/if}
<div class="promo-slide__content">
<h2>{$promo.title}</h2>
{$promo.body}
{if $promo.link}
<a href="{$promo.link}" class="btn">Подробнее</a>
{/if}
{if $promo.countdown_datetime}
<div class="countdown"
data-until="{$promo.countdown_datetime}">
</div>
{/if}
</div>
</div>
{/foreach}
</div>
{/if}

Если нужно вывести промо-карты не только на главной:

{$promos = $wa->shop->promos('all', 3)}

На главной странице доступны предустановленные наборы:

{* Хиты продаж *}
{if $bestsellers}
<section class="product-set">
<h2>{$theme_settings.homepage_bestsellers_title|default:'Хиты продаж'}</h2>
{foreach $bestsellers as $product}
{include file="product-card.html" product=$product}
{/foreach}
</section>
{/if}
{* Распродажа *}
{if $onsale}
<section class="product-set">
<h2>Распродажа</h2>
{foreach $onsale as $product}
{include file="product-card.html" product=$product}
{/foreach}
</section>
{/if}

Вы можете вывести товары из любого списка, созданного в бекенде:

{* Вывод набора по ID *}
{$gifts = $wa->shop->productSet(5, ['limit' => 8])}
{if $gifts}
{foreach $gifts as $product}
{include file="product-card.html" product=$product}
{/foreach}
{/if}
{* Вывод товаров по тегу *}
{$tagged = $wa->shop->products('tag/подарок', 0, 6)}
{* Вывод товаров из конкретной категории *}
{$from_cat = $wa->shop->products('category/12', 0, 4)}

Если установлено приложение «Фото»:

{* Последние 6 фото из альбома с ID=3 *}
{$photos = $wa->photos->photos('album/3', 'middle', 6)}
{if $photos}
<div class="gallery">
{foreach $photos as $photo}
<a href="{$photo.thumb_big}">
<img src="{$photo.thumb_middle}"
alt="{$photo.name|escape}"
loading="lazy">
</a>
{/foreach}
</div>
{/if}
{$schedule = $wa->shop->schedule()}
{if $schedule}
<div class="work-schedule">
<h3>Режим работы</h3>
{foreach $schedule.current_week as $day}
<div class="schedule-day {if !$day.work}day-off{/if}">
<span>{$day.name}</span>
{if $day.work}
<span>{$day.start_work} — {$day.end_work}</span>
{else}
<span>Выходной</span>
{/if}
</div>
{/foreach}
</div>
{/if}
<div class="contacts">
<p>Магазин: {$wa->shop->settings('name')}</p>
<p>Телефон: {$wa->shop->settings('phone')}</p>
<p>Email: {$wa->shop->settings('email')}</p>
</div>

Если магазин работает с несколькими валютами, в подвале можно вывести переключатель:

{if $currencies|count > 1}
<div class="currency-switcher">
{foreach $currencies as $code => $cur}
<a href="?currency={$code}"
class="{if $code == $wa->shop->currency()}active{/if}">
{$cur.title}
</a>
{/foreach}
</div>
{/if}

По умолчанию отзывы отображаются только на страницах отдельных товаров. Чтобы собрать все отзывы на одной странице, нужна небольшая доработка.

Создайте файл shopAllReviews.class.php в папке /wa-apps/shop/lib/classes/:

<?php
class shopAllReviews
{
public static function reviews($limit = 500, $offset = 0)
{
$product_reviews_model = new shopProductReviewsModel();
return $product_reviews_model->getList('*,is_new,contact,product,images', array(
'where' => array(
'review_id' => 0,
'status' => shopProductReviewsModel::STATUS_PUBLISHED
),
'limit' => $limit,
'offset' => $offset,
'escape' => true
));
}
}

Перейдите в Настройки → Системные и очистите кеш, чтобы система подхватила новый класс.

Очистка системного кеша

Перейдите в Магазин → Витрина → Страницы и создайте новую страницу «Отзывы».

Создание страницы отзывов в витрине

На вкладке HTML вставьте код:

{$rev_on_page = 10}
{$page_count = ceil(count($wa->shop->reviews(500))/$rev_on_page)}
{$curr_page = $smarty.get.page-1}
{if $curr_page < 0}{$curr_page = 0}{/if}
{$reviews = shopAllReviews::reviews($rev_on_page, $rev_on_page*$curr_page)}
<div class="full-review">
{foreach $reviews as $review}
<div class="full-review-item">
<div class="full-review-item__leftside">
<a href="{$review.product_url}">
<img src="{$review.product_url_crop_small|replace:'48x48':'200x0'}"
alt="{$review.product.name|escape}">
</a>
</div>
<div class="full-review-item__rightside">
<div class="full-review-item__username">{$review.author.name}</div>
<div class="full-review-item__date">
{$review.datetime|wa_datetime:'humandatetime'}
</div>
{if $review.title}
<div class="full-review-item__title">{$review.title}</div>
{/if}
{if $review.text}
<div class="full-review-item__description">{$review.text}</div>
{/if}
{if !empty($review.images)}
<div class="full-review-item__images">
{foreach $review.images as $_image}
<a href="{$_image.url_0|escape}" target="_blank">
<img src="{$_image.url_2|escape}"
alt="{$_image.description|escape}">
</a>
{/foreach}
</div>
{/if}
</div>
</div>
{/foreach}
{wa_pagination total=$page_count attrs=['class' => 'r-pagination']}
</div>

Параметр $rev_on_page задаёт количество отзывов на одной странице. Пагинация добавляется автоматически через {wa_pagination}.

Результат — страница всех отзывов магазина