В данном уроке у нас с вами не получится сразу реализовать карточку товара от начала и до конца. Мы сделаем только основные моменты.
За вывод галереи товара у нас отвечает сниппет msGallery. Давайте создадим для него чанк gallery_big.tpl, где у нас будут выводиться большие картинки (большой слайдер):
{if $files?}
{foreach $files as $file}
<!-- item -->
<div class="item">
<a href="{$file['url']}" data-fancybox="gal">
<img src="{$file['url']}" alt="{$_modx->resource.pagetitle | htmlent}" itemprop="image">
</a>
</div>
<!-- / item -->
{/foreach}
{else}
<!-- item -->
<div class="item">
<a href="{$_modx->getPlaceholder('+noimage')}" data-fancybox="gal">
<img src="{$_modx->getPlaceholder('+noimage')}" alt="{$_modx->resource.pagetitle | htmlent}" itemprop="image">
</a>
</div>
<!-- / item -->
{/if}
И сразу создадим чанк для маленькой галереи gallery_small.tpl:
{if $files?}
{foreach $files as $file}
<!-- item -->
<div class="item">
<img src="{$file['url']}" alt="{$_modx->resource.pagetitle | htmlent}">
</div>
<!-- / item -->
{/foreach}
{else}
<!-- item -->
<div class="item">
<img src="{$_modx->getPlaceholder('+noimage')}" alt="{$_modx->resource.pagetitle | htmlent}">
</div>
<!-- / item -->
{/if}
И блок с галереей в шаблоне карточки товара у нас принял следующий вид:
<div class="product-gallery">
<div class="bigger">
<div class="big-gallery owl-carousel">
{$_modx->runSnippet('msGallery', [
'tpl' => '@FILE chunks/gallery_big.tpl'
])}
</div>
{if $_pls["vendor.logo"]}
<img src="{$_pls["vendor.logo"]}" class="vendor" alt="{$_pls["vendor.name"]}">
{/if}
</div>
<!-- small gal -->
<div class="small-gallery owl-carousel">
{$_modx->runSnippet('msGallery', [
'tpl' => '@FILE chunks/gallery_small.tpl'
])}
</div>
<!-- / small gal -->
</div>
Я дополнительно еще вывел логотип производителя, чтобы закончить с этой частью страницы. Вместо тега H1 вставляем знакомую нам конструкцию:
{$_modx->resource.longtitle ?: $_modx->resource.pagetitle}
Также нам нужно вывести основные опции товара, которые мы задавали у категорий родителей. Для этого создадим чанк main_opts_product.tpl:
{foreach $options as $option}
<div class="item inliner vam">
<div class="label">
<span>{$option.caption}</span>
</div>
<div class="value">
<span>
{if $option.value is array}
{$option.value | join : ', '}
{if $option.measure_unit?}
{$option.measure_unit}
{/if}
{else}
{$option.value}
{if $option.measure_unit?}
{$option.measure_unit}
{/if}
{/if}
</span>
</div>
</div>
{/foreach}
И выведем с помошью сниппета msProductOptions вместе с другими параметрами. Я привожу вам код правой части шаблона карточки товара (цвета и размеры мы с вами пока не трогаем):
<div class="col-lg-6">
<div class="product-description">
<div class="description">
<p itemprop="description">{$_modx->resource.introtext}</p>
</div>
<div class="characters">
<!-- item -->
{if $_pls['vendor.name']}
<div class="item inliner vam">
<div class="label">
<span>Производитель</span>
</div>
<div class="value">
<span>{$_pls['vendor.name']}</span>
</div>
</div>
{/if}
{if $_pls['made_in']}
<div class="item inliner vam">
<div class="label">
<span>Страна сборки</span>
</div>
<div class="value">
<span>{$_pls['made_in']}</span>
</div>
</div>
{/if}
{if $_pls['article']}
<div class="item inliner vam">
<div class="label">
<span>Артикул</span>
</div>
<div class="value">
<span>{$_pls['article']}</span>
</div>
</div>
{/if}
{$_modx->runSnippet('msProductOptions', [
'onlyOptions' => $_modx->resource.parent | resource: 'options',
'product' => $id,
'tpl' => '@FILE chunks/main_opts_product.tpl'
])}
</div>
<form class="ms2_form" method="post">
<div class="addition-options">
<div class="product-color">
<div class="sub-title">Выберите цвет:</div>
<div class="colors">
<div class="item radio-inline pull-left">
<label class="input-parent">
<input type="radio" name="options[color]" value="Розовый" checked="">
<div>
<img alt="" title="Розовый" class="img-rounded" style="background-color:#ee9090;width:25px;height:25px;">
</div>
</label>
</div>
<div class="item radio-inline pull-left">
<label class="input-parent">
<input type="radio" name="options[color]" value="Серый">
<div>
<img alt="" title="Серый" class="img-rounded" style="background-color:#c2c2c2;width:25px;height:25px;">
</div>
</label>
</div>
</div>
</div>
<div class="product-size">
<div class="sub-title">Выберите размер (<a href="#" data-toggle="modal" data-target="#sizetable">уточнить</a>):</div>
<span class="pick-size-class active">
<input class="hidden" type="radio" name="options[size]" value="38" id="size[38]" required="" checked="">38</span>
<span class="pick-size-class ">
<input class="hidden" type="radio" name="options[size]" value="40" id="size[40]" required="">40</span>
<span class="pick-size-class ">
<input class="hidden" type="radio" name="options[size]" value="42" id="size[42]" required="">42</span>
<span class="pick-size-class ">
<input class="hidden" type="radio" name="options[size]" value="43" id="size[43]" required="">43</span>
</div>
</div>
<div class="product-form">
<input type="hidden" name="id" value="[[*id]]">
<div class="row inliner vam">
<div class="col-6">
<div class="qnt inliner le-quantity vam">
<button type="button" class="btn btn--count minus">-</button>
<input type="text" name="count" class="counter" value="1" readonly="">
<button type="button" class="btn btn--count plus">+</button>
</div>
</div>
<div class="col-6">
<div class="price" itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<meta itemprop="priceCurrency" content="RUB">
<meta itemprop="price" content="{$_pls['price'] | replace : " " : ""}.00">
<span>{$_pls['price']} <i class="fa fa-ruble"></i></span>
</div>
</div>
</div>
<div class="row inliner vam buttons">
<div class="col-sm-4 col-6">
<button type="submit" name="ms2_action" value="cart/add" class="btn btn-blue btn-rounded big">В корзину</button>
</div>
<div class="col-sm-4 col-6">
<a href="#" class="compare"><span>Сравнить</span></a>
</div>
<div class="col-sm-4 col-6">
<a href="#" class="one-click"><span>Купить в один клик</span></a>
</div>
</div>
</div>
</form>
</div>
</div>
Отлично! Теперь у нас заработало добавление в корзину из карточки товара, правда пока без опций (цвет и размер). На этом мы с вами пока закончим.