Верхнее и нижнее меню сайта
- Поставить виджет в шаблон где необходимо меню
<?= \skeeks\cms\cmsWidgets\treeMenu\TreeMenuCmsWidget::widget([
'namespace' => 'footer-menu',
'viewFile' => '@app/views/widgets/TreeMenuCmsWidget/menu-top',
//'label' => 'Title menu',
'level' => 1,
'enabledRunCache' => \skeeks\cms\components\Cms::BOOL_N,
]); ?>
- Содержимое шаблона
@app/views/widgets/TreeMenuCmsWidget/menu-top
<?php
/* @var $this yii\web\View */
/* @var $widget \skeeks\cms\cmsWidgets\treeMenu\TreeMenuCmsWidget */
/* @var $trees \skeeks\cms\models\Tree[] */
?>
<ul>
<? if ($trees = $widget->activeQuery->all()) : ?>
<? foreach ($trees as $tree) : ?>
<li><a href="<?= $tree->url; ?>" title="<?= $tree->name; ?>"><?= $tree->name; ?></a></li>
<? endforeach; ?>
<? endif; ?>
</ul>
Вложенное меню каталога
- Поставить виджет в шаблон где необходимо меню
<?= \skeeks\cms\cmsWidgets\treeMenu\TreeMenuCmsWidget::widget([
'namespace' => 'catalog-menu',
'viewFile' => '@app/views/widgets/TreeMenuCmsWidget/catalog-menu',
//'label' => 'Title menu',
//'level' => 1,
//'enabledRunCache' => \skeeks\cms\components\Cms::BOOL_N,
]); ?>
- Содержимое шаблона
@app/views/widgets/TreeMenuCmsWidget/catalog-menu
<?php
/* @var $this yii\web\View */
/* @var $widget \skeeks\cms\cmsWidgets\treeMenu\TreeMenuCmsWidget */
/* @var $trees \skeeks\cms\models\Tree[] */
?>
<ul class="menu">
<? if ($trees = $widget->activeQuery->all()) : ?>
<? foreach ($trees as $tree) : ?>
<li class="menu__item">
<a href="<?= $tree->url; ?>" title="<?= $tree->name; ?>"><?= $tree->name; ?></a>
<? if ($tree->children) : ?>
<ul class="sub-menu">
<? foreach ($tree->children as $childTree) : ?>
<li class="sub-menu__item">
<a href="<?= $childTree->url; ?>" title="<?= $childTree->name; ?>"><?= $childTree->name; ?></a>
</li>
<? endforeach; ?>
</ul>
<? endif; ?>
</li>
<? endforeach; ?>
<? endif; ?>
</ul>
Редкатируемые области
Для управления блоками текста на сайте, в шапке и в футере
<? \skeeks\cms\cmsWidgets\text\TextCmsWidget::beginWidget('home-text'); ?>
<h1>Добро пожаловать!</h1>
<? \skeeks\cms\cmsWidgets\text\TextCmsWidget::end(); ?>
Слайдер
Создать контент — слайды В место слайдера вставить виджет:
<?= \skeeks\cms\cmsWidgets\contentElements\ContentElementsCmsWidget::widget([
'namespace' => 'home-slides',
'viewFile' => '@app/views/widgets/ContentElementsCmsWidget/slides',
]); ?>
Блок "новости"
Создать контент — новости Создать раздел новости Настроить главный раздел для новостей (соответствующий новости) В место слайдера вставить виджет:
<?= \skeeks\cms\cmsWidgets\contentElements\ContentElementsCmsWidget::widget([
'namespace' => 'home-news',
'label' => 'Новости компании',
'viewFile' => '@app/views/widgets/ContentElementsCmsWidget/home-news',
]); ?>
Текстовый раздел + хлебные крошки
Привести шаблон к виду шаблона исходной верстки \frontend\templates\default\modules\cms\tree\text.php
Виджет хлебных крошек:
<?= \skeeks\cms\cmsWidgets\breadcrumbs\BreadcrumbsCmsWidget::widget([
'viewFile' => '@app/views/widgets/BreadcrumbsCmsWidget/default',
]); ?>
Шаблон @app/views/widgets/BreadcrumbsCmsWidget/default
<?php
/* @var $this yii\web\View */
/* @var $widget \skeeks\cms\cmsWidgets\breadcrumbs\BreadcrumbsCmsWidget */
?>
<? if (\Yii::$app->breadcrumbs->parts) : ?>
<? $count = count(\Yii::$app->breadcrumbs->parts); ?>
<? $counter = 0; ?>
<? if ($count > 1) : ?>
<ul class="breadcrumb">
<? foreach (\Yii::$app->breadcrumbs->parts as $data) : ?>
<? $counter ++; ?>
<? if ($counter == $count): ?>
<li class="active"><?= $data['name']; ?></li>
<? else : ?>
<li><a href="<?= $data['url']; ?>" title="<?= $data['name']; ?>"><?= $data['name']; ?></a></li>
<? endif;?>
<? endforeach; ?>
</ul>
<? endif;?>
<? endif;?>
Страница контакты (кастомные страницы)
Для того чтобы создать страницу в необычном шаблоне. Необходимо создать раздел в дереве разделов, и назначить ему собственный шаблон.
Конструктор форм (обратная связь, заказать звонок)
Пример вызова формы
<?= \skeeks\modules\cms\form2\cmsWidgets\form2\FormWidget::widget([
'namespace' => 'phone',
'form_code' => 'callback',
'viewFile' => 'with-messages'
]); ?>
Пример альтернативного вызова формы
<? \skeeks\modules\cms\form2\cmsWidgets\form2\FormWidget::beginWidget('phone', [
'form_code' => 'callback',
'viewFile' => 'with-messages'
]); ?>
<? \skeeks\modules\cms\form2\cmsWidgets\form2\FormWidget::end(); ?>
Пример в модальном окне bootstrap + js success callback
<? $modal = \yii\bootstrap\Modal::begin([
'header' => 'Заказать звонок',
'toggleButton' => [
'label' => '<i class="fa fa-phone"></i> Заказать звонок',
'class' => 'call-me btn btn-lg btn-blue hidden-xs',
],
]); ?>
<? \skeeks\modules\cms\form2\cmsWidgets\form2\FormWidget::beginWidget('phone', [
'form_code' => 'callback',
'viewFile' => 'with-messages',
'successJs' => <<<JS
function(jForm, data)
{
_.delay(function()
{
$("#{$modal->id}").modal('hide');
}, 1500);
}
JS
,
]); ?>
<? \skeeks\modules\cms\form2\cmsWidgets\form2\FormWidget::end(); ?>
<? \yii\bootstrap\Modal::end(); ?>
Авторазиция / Регистрация
Примеры в официальной документации https://docs.cms.skeeks.com/ru/latest/quickstart.html#id9
Вывод товаров на главную страницу
Пример вызова виджета
<?= \skeeks\cms\cmsWidgets\contentElements\ContentElementsCmsWidget::widget([
'namespace' => 'home-news',
'label' => 'Новости компании',
'viewFile' => '@app/views/widgets/ContentElementsCmsWidget/home-news',
]); ?>
Пример шаблона @app/views/widgets/ContentElementsCmsWidget/home-news
<?php
/**
* @var \skeeks\cms\models\CmsContentElement $model
*/
$shopProduct = \skeeks\cms\shop\models\ShopProduct::getInstanceByContentElement($model);
$additional = $model->relatedPropertiesModel->getEnumByAttribute('additional');
?>
<div class="col col-4">
<div class="catalog__item">
<div class="tag <?= $additional ? $additional->code : ""; ?>"></div>
<div class="img">
<a href="<?= $model->url; ?>" title="<?= $model->name; ?>" data-pjax="0">
<img src="<?= \Yii::$app->imaging->thumbnailUrlOnRequest($model->image ? $model->image->src : null,
new \skeeks\cms\components\imaging\filters\Thumbnail([
'w' => 0,
'h' => 200,
]), $model->code
) ?>" alt="<?= $model->name; ?>">
</a>
</div>
<? if ($ageFrom = $model->relatedPropertiesModel->getAttribute('ageFrom')) : ?>
<div class="age-limit">
<span><?= $ageFrom; ?>+</span>
</div>
<? endif; ?>
<h2><?= $model->name; ?></h2>
<div class="excerpt"><?= $model->description_short; ?></div>
<div class="buy">
<div class="row">
<div class="col col-6">
<div class="price">
<? if ($shopProduct->minProductPrice->id == $shopProduct->baseProductPrice->id) : ?>
<?= \Yii::$app->money->convertAndFormat($shopProduct->minProductPrice->money); ?>
<? else : ?>
<span
class="line-through"><?= \Yii::$app->money->convertAndFormat($shopProduct->baseProductPrice->money); ?></span>
<span
class="sx-discount-price"><?= \Yii::$app->money->convertAndFormat($shopProduct->minProductPrice->money); ?></span>
<? endif; ?>
</div>
</div>
<div class="col col-6">
<div class="button"><a class="btn btn-buy" href="#" onclick="sx.Shop.addProduct(<?= $shopProduct->id; ?>, 1); return false;">Купить</a></div>
</div>
</div>
</div>
</div>
</div>
Корзина в шапке + добавление товаров в корзину
Корзина в шапке сайта
Вызов
<?= \skeeks\cms\shop\widgets\cart\ShopCartWidget::widget([
'namespace' => 'ShopCartWidget-small-top',
'viewFile' => '@app/views/widgets/ShopCartWidget/small-top'
]); ?>
Содержимое шаблона @app/views/widgets/ShopCartWidget/small-top
<?php
/* @var $this yii\web\View */
/* @var $widget \skeeks\cms\shop\widgets\cart\ShopCartWidget */
\frontend\assets\CartAsset::register($this);
$this->registerJs(<<<JS
(function(sx, $, _)
{
new sx.classes.shop.SmallCart(sx.Shop, 'sx-cart', {
'delay': 500
});
})(sx, sx.$, sx._);
JS
);
?>
<? \skeeks\cms\widgets\Pjax::begin([
'id' => 'sx-cart'
]); ?>
<div class="text">
<span>Товаров:<a href="<?= \yii\helpers\Url::to(['/shop/cart']); ?>" data-pjax="0"><?= \Yii::$app->shop->shopFuser->countShopBaskets; ?> шт.</a></span>
<span>На<a href="<?= \yii\helpers\Url::to(['/shop/cart']); ?>" data-pjax="0"><?= \Yii::$app->money->convertAndFormat(\Yii::$app->shop->shopFuser->money); ?></a></span>
<a class="btn btn-orange" href="<?= \yii\helpers\Url::to(['/shop/cart']); ?>" data-pjax="0">Оформить заказ</a>
</div>
<? \skeeks\cms\widgets\Pjax::end(); ?>
Добавление товара в корзину
Отрисовка соответствующей кнопки уведомить или добавить в корзину
<? if ($shopProduct->quantity > 0) : ?>
<?= \yii\helpers\Html::tag('a', 'Купить', [
'class' => 'js-to-cart sx-to-cart btn btn-buy',
'type' => 'button',
'onclick' => new \yii\web\JsExpression("sx.Shop.addProduct({$shopProduct->id}, 1); return false;"),
'data' => \yii\helpers\ArrayHelper::merge($model->toArray(['name', 'id']), [
'url' => $model->url,
'image' => \skeeks\cms\helpers\Image::getSrc($model->image ? $model->image->src : null),
'price' => \Yii::$app->money->convertAndFormat($shopProduct->minProductPrice->money),
]),
]); ?>
<? else : ?>
<?= \skeeks\cms\shop\widgets\notice\NotifyProductEmailModalWidget::widget([
'product_id' => $model->id,
'success_modal_id' => 'readyNotifyEmail',
'header' => 'Уведомить о поступлении',
'closeButton' =>
[
'tag' => 'button',
'class' => 'modal-close btn-circle fill',
'label' => '<i class="fa fa-remove"></i>',
],
'toggleButton' => [
'label' => 'Уведомить',
'style' => '',
'class' => 'subscribe btn btn-buy',
],
]); ?>
<? endif; ?>
Добавление эффекта при добавлении в корзину
$('.sx-to-cart').on('click', function()
{
UIkit.modal("#sx-toCartModal").show();
});
Страница товаров + фильтры
Конструирование виджета фильтров
$shopFilters = new \skeeks\cms\shop\cmsWidgets\filters\ShopProductFiltersWidget([
'namespace' => 'ShopProductFiltersWidget-left1',
'onlyExistsFilters' => true,
'viewFile' => 'slider',
]);
$shopFilters->realatedProperties = \yii\helpers\ArrayHelper::map(
\skeeks\cms\models\CmsContentProperty::find()
->andWhere(['!=', 'property_type', \skeeks\cms\relatedProperties\PropertyType::CODE_STRING])
->all(), 'code', 'code'
);
<? $filters = new \common\models\ProductFilters(); ?>
<? $filters->load(\Yii::$app->request->get()); ?>
<? $widgetElements = new \skeeks\cms\cmsWidgets\contentElements\ContentElementsCmsWidget([
'namespace' => 'products-second',
'viewFile' => '@app/views/widgets/ContentElementsCmsWidget/products',
'contentElementClass' => \skeeks\cms\shop\models\ShopCmsContentElement::className(),
'dataProviderCallback' => function (\yii\data\ActiveDataProvider $activeDataProvider)
use ($filters, $shopFilters)
{
$activeDataProvider->query->with('relatedProperties');
$activeDataProvider->query->with('shopProduct');
$activeDataProvider->query->with('shopProduct.baseProductPrice');
$activeDataProvider->query->with('shopProduct.minProductPrice');
$shopFilters->search($activeDataProvider);
$filters->search($activeDataProvider);
//$activeDataProvider->query->joinWith('shopProduct.baseProductPrice as basePrice');
//$activeDataProvider->query->orderBy(['basePrice' => SORT_ASC]);
},
]); ?>
<?
$widgetElementsContent = $widgetElements->run();
$shopFiltersContent = $shopFilters->run();
?>
Страница одного товара
Виджет поделиться в соц. сетях
<?= \skeeks\cms\yandex\share\widget\YaShareWidget::widget([
'namespace' => 'YaShareWidget-main'
]); ?>
Виджет отзывы
<?= \skeeks\cms\reviews2\widgets\reviews2\Reviews2Widget::widget([
'namespace' => 'Reviews2Widget',
'viewFile' => '@app/views/widgets/Reviews2Widget/package',
'cmsContentElement' => $model
]); ?>
Необходимые данные по товару
$shopProduct = \skeeks\cms\shop\models\ShopProduct::getInstanceByContentElement($model);
$shopCmsContentElement = new \v3toys\skeeks\models\V3toysProductContentElement($model->toArray());
$shopProduct->quantity;
<dd>Артикул: <?= $shopCmsContentElement->v3toysProductProperty->sku; ?></dd>
<dd>Код товара: <?= $shopCmsContentElement->v3toysProductProperty->v3toys_id; ?></dd>
Похожие товары
<?= \skeeks\cms\cmsWidgets\contentElements\ContentElementsCmsWidget::widget([
'namespace' => 'productpage-same-products',
'viewFile' => '@app/views/widgets/ContentElementsCmsWidget/products-same',
'label' => 'Похожие товары',
'options' => [
'class' => 'xd_gallery_third',
'navigateId' => 'cb_best_checkout_products_for_product_third'
],
'contentElementClass' => \skeeks\cms\shop\models\ShopCmsContentElement::className(),
'dataProviderCallback' => function (\yii\data\ActiveDataProvider $activeDataProvider) use ($model)
{
$activeDataProvider->query->with('relatedProperties');
$activeDataProvider->query->with('shopProduct');
$activeDataProvider->query->with('shopProduct.baseProductPrice');
$activeDataProvider->query->with('shopProduct.minProductPrice');
$query = $activeDataProvider->query;
$query->andWhere(['cms_content_element.tree_id' => $model->tree_id]);
/*$query
->joinWith('relatedElementProperties map')
->joinWith('relatedElementProperties.property property')
->andWhere(['property.code' => 'brand'])
->andWhere(['map.value' => $model->relatedPropertiesModel->getAttribute('brand')])
;*/
$filters = new \common\models\ProductFilters([]);
$filters->search($activeDataProvider);
},
]); ?>
Определение местоположения + виджет выбора
- Получить токен https://dadata.ru/
- Указать этот токен в настройках компонента в системе управления сайтом
Пример запуска виджета:
<?= \skeeks\cms\dadataSuggest\widgets\address\DadataGetAddressWidget::widget([
'options' =>
[
'href' => '#',
'onclick' => 'new sx.classes.ModalRegionPageReload(); return false;',
'class' => 'sx-dadata-suggestion-city',
]
]); ?>
Отзывы на главной странице
<?
/**
* @var \skeeks\cms\reviews2\models\Reviews2Message $review
*/
?>
<? if ($reviews = \skeeks\cms\reviews2\models\Reviews2Message::find()->limit(5)->all()) : ?>
<div class="review">
<h5>Отзывы:</h5>
<div class="review__posts">
<? foreach ($reviews as $review) : ?>
<div class="review__post">
<span class="author"><?= $review->createdBy ? $review->createdBy->displayName : $review->user_name; ?></span><span>
<a href="<?= $review->element->url; ?>"><?= $review->comments; ?></a>
</span><br>
<select class="stars">
<option value="1" <?= $review->rating == 1 ? "selected" : ""; ?>>1</option>
<option value="2" <?= $review->rating == 2 ? "selected" : ""; ?>>2</option>
<option value="3" <?= $review->rating == 3 ? "selected" : ""; ?>>3</option>
<option value="4" <?= $review->rating == 4 ? "selected" : ""; ?>>4</option>
<option value="5" <?= $review->rating == 5 ? "selected" : ""; ?>>5</option>
</select>
</div>
<? endforeach; ?>
</div>
</div>
<? endif; ?>
Поиск по сайту
Поисковая форма
<form class="site-search search" action="/search" method="get">
<input type="text" class="uk-input" name="<?= \Yii::$app->cmsSearch->searchQueryParamName; ?>" value="<?= \Yii::$app->cmsSearch->searchQuery; ?>" placeholder="Искать товар..."/>
<button class="btn btn-grey">Поиск</button>
</form>
Шаблон @app/views/modules/cmsSearch/result/index
<? \skeeks\cms\modules\admin\widgets\Pjax::begin(); ?>
<?= \skeeks\cms\cmsWidgets\contentElements\ContentElementsCmsWidget::widget([
'namespace' => 'ContentElementsCmsWidget-search-result',
'viewFile' => '@app/views/widgets/ContentElementsCmsWidget/products',
'enabledCurrentTree' => \skeeks\cms\components\Cms::BOOL_N,
'active' => "Y",
'dataProviderCallback' => function (\yii\data\ActiveDataProvider $dataProvider) {
\Yii::$app->cmsSearch->buildElementsQuery($dataProvider->query);
\Yii::$app->cmsSearch->logResult($dataProvider);
},
]) ?>
<? \skeeks\cms\modules\admin\widgets\Pjax::end(); ?>
1-й шаг оформления заказа (корзина)
Поправить шаблон: @app/views/modules/shop/cart/cart
<?php
/* @var $this yii\web\View */
?>
<?
\frontend\assets\CartAsset::register($this);
\skeeks\cms\shop\widgets\ShopGlobalWidget::widget();
$this->registerJs(<<<JS
(function(sx, $, _)
{
new sx.classes.shop.FullCart(sx.Shop, 'sx-cart-full');
})(sx, sx.$, sx._);
JS
);
?>
<div class="content order">
<? \skeeks\cms\modules\admin\widgets\Pjax::begin([
'id' => 'sx-cart-full',
]) ?>
<? if (\Yii::$app->shop->shopFuser->isEmpty()) : ?>
<!-- EMPTY CART -->
<div class="panel panel-default">
<div class="panel-body">
<strong>Ваша корзина пуста!</strong><br/>
В вашей корзине нет покупок.<br/>
Кликните <a href="/" data-pjax="0">сюда</a> для продолжения покупок. <br/>
</div>
</div>
<? else: ?>
<div class="order-progress">
<?= \skeeks\cms\shopCartStepsWidget\ShopCartStepsWidget::widget([
'viewFile' => '@app/views/modules/shop/cart/_steps'
]); ?>
</div>
<div class="order-table-list">
<?
echo \skeeks\cms\shopCartItemsWidget\ShopCartItemsListWidget::widget([
'dataProvider' => new \yii\data\ActiveDataProvider([
'query' => \Yii::$app->shop->shopFuser->getShopBaskets(),
'pagination' =>
[
'defaultPageSize' => 100,
'pageSizeLimit' => [1, 100],
]
]),
'layout' => "<table class=\"table no-border\">{header}\n{items}\n{pager}</table>{footer}",
'itemView' => '@app/views/modules/shop/cart/items-list-item',
'headerView' => '@app/views/modules/shop/cart/items-list-header',
'footerView' => '@app/views/modules/shop/cart/items-list-footer'
]); ?>
<hr />
<div class="order-submit">
<div class="all-total">Итого: <span><?= \Yii::$app->money->convertAndFormat(\Yii::$app->shop->shopFuser->money); ?></span></div>
<a href="<?= \yii\helpers\Url::to(['/v3toys/cart/checkout']); ?>" class="btn btn-orange big" data-pjax="0">К оформлению</a>
</div>
</div>
<? endif; ?>
<? \skeeks\cms\modules\admin\widgets\Pjax::end() ?>
</div>
Шаблон @app/views/modules/shop/cart/_steps
<ul class="process-steps nav nav-justified">
<li class="active">
<a href="<?/*= \yii\helpers\Url::to(['/shop/cart']); */?>" data-pjax="0">1</a>
<h5><?/*= \Yii::t('skeeks/shop-cart-steps-widget', 'Cart'); */?></h5>
</li>
<li class="<?/*= in_array(\Yii::$app->controller->action->getUniqueId(), ['shop/cart/checkout', 'shop/order/finish']) ? "active" : ""; */?>">
<a href="<?/*= \yii\helpers\Url::to(['/shop/cart/checkout']); */?>" data-pjax="0">2</a>
<h5><?/*= \Yii::t('skeeks/shop-cart-steps-widget', 'Ordering'); */?></h5>
</li>
<li class="<?/*= \Yii::$app->controller->action->getUniqueId() == 'shop/order/finish' ? "active" : ""; */?>">
<a href="#">3</a>
<h5><?/*= \Yii::t('skeeks/shop-cart-steps-widget', 'Ready order'); */?></h5>
</li>
</ul>
Шаблон @app/views/modules/shop/cart/items-list-item
<tr>
<td style="width: 250px;">
<div class="item-card">
<div class="img">
<a href="<?= $model->url; ?>" data-pjax="0">
<img src="<?= \skeeks\cms\helpers\Image::getSrc(
\Yii::$app->imaging->getImagingUrl($model->image ? $model->image->src : null, new \skeeks\cms\components\imaging\filters\Thumbnail([
'h' => 150,
'w' => 150,
]))
) ?>">
</a>
</div>
</div>
</td>
<td style="width: 400px;">
<div class="item-card">
<div class="desc">
<div class="title">
<a href="<?= $model->url; ?>" data-pjax="0">
<?= $model->name; ?>
</a>
</div>
<br />
<a href="#" class="" data-toggle="tooltip"
onclick="sx.Shop.removeBasket('<?= $model->id; ?>'); return false;"
title="<?= \Yii::t('skeeks/shop-cart-items-widget', 'Remove this item'); ?>">
<i class="glyphicon glyphicon-remove"></i> удалить
</a>
<span></span>
</div>
<div class="meta">
</div>
</div>
</td>
<td>
<div class="price">
<? if ($model->moneyOriginal->getAmount() == $model->money->getAmount()) : ?>
<?= \Yii::$app->money->convertAndFormat($model->moneyOriginal); ?>
<? else : ?>
<span
class="line-through nopadding-left"><?= \Yii::$app->money->convertAndFormat($model->moneyOriginal); ?></span>
<?= \Yii::$app->money->convertAndFormat($model->money); ?>
<? endif; ?>
</div>
</td>
<td style="width: 150px;">
<div class="qnt">
<input type="number" value="<?= round($model->quantity); ?>" name="qty"
class="sx-basket-quantity uk-input slim" maxlength="3" max="999" min="1"
data-basket_id="<?= $model->id; ?>"/>
<!--<input class="uk-input slim" type="number" value="1">-->
<div class="available">В Наличии более 10 шт.</div>
</div>
</td>
<td>
<div class="total"><?= \Yii::$app->money->convertAndFormat($model->money->multiply($model->quantity)); ?></div>
</td>
</tr>
2-й шаг оформления заказа (оформление)
Шаблон @app/views/modules/v3toys/cart/checkout
<?php
/* @var $this yii\web\View */
/* @var $model \v3toys\skeeks\models\V3toysOrder */
?>
<?
\frontend\assets\CartAsset::register($this);
\skeeks\cms\shop\widgets\ShopGlobalWidget::widget();
?>
<?
$json = \yii\helpers\Json::encode([
'getPrices' => \yii\helpers\Url::to(['/v3toys/cart/get-prices']),
'save' => \yii\helpers\Url::to(['/v3toys/cart/save-session']),
]);
$this->registerJs(<<<JS
(function(sx, $, _)
{
sx.classes.Checkout = sx.classes.Component.extend({
_onDomReady: function()
{
var self = this;
this.JForm = $('#sx-checkout');
$('.sx-deliveryChange, #v3toysorder-pickup_point_id', this.JForm).on('change', function()
{
self.updatePrices();
});
$('select, input, textarea', this.JForm).on('change', function()
{
self.save();
});
},
save: function()
{
var self = this;
var ajaxQuery = sx.ajax.preparePostQuery(this.get('save'), self.JForm.serialize());
ajaxQuery.execute();
return this;
},
updatePrices: function()
{
var self = this;
this.ajaxQuery = sx.ajax.preparePostQuery(this.get('getPrices'), self.JForm.serialize());
this.ajaxQuery.bind('success', function(e, data)
{
var result = data.response.data;
$('.sx-money').empty().append(result.money.convertAndFormat);
$('.sx-moneyDiscount').empty().append(result.moneyDiscount.convertAndFormat);
$('.sx-moneyDelivery').empty().append(result.moneyDelivery.convertAndFormat);
$('.sx-moneyOriginal').empty().append(result.moneyOriginal.convertAndFormat);
});
this.ajaxQuery.execute();
}
});
sx.Checkout = new sx.classes.Checkout({$json});
})(sx, sx.$, sx._);
JS
);?>
<? if (!\Yii::$app->shop->shopFuser->isEmpty()) : ?>
<div class="content order">
<div class="order-progress">
<div class="row">
<div class="col col-4">
<div class="progress"><span class="number">1</span><span>Ваша корзина</span></div>
</div>
<div class="col col-4">
<div class="progress active"><span class="number">2</span><span>Оформление заказа</span></div>
</div>
<div class="col col-4">
<div class="progress"><span class="number">3</span><span>Покупка завершена</span></div>
</div>
</div>
</div>
<?php $form = \skeeks\cms\base\widgets\ActiveFormAjaxSubmit::begin([
'validationUrl' => \yii\helpers\Url::to('/v3toys/cart/checkout-validate'),
'id' => 'sx-checkout',
'enableClientValidation' => false,
'enableAjaxValidation' => true,
'options' => [
'class' => 'order-form'
],
'afterValidateCallback' => new \yii\web\JsExpression(<<<JS
function(jForm, ajax)
{
var handler = new sx.classes.AjaxHandlerStandartRespose(ajax, {
'blockerSelector' : '#' + jForm.attr('id'),
'enableBlocker' : true,
});
handler.bind('error', function(e, data)
{
$('.sx-success-message', jForm).hide();
$('.sx-error-message', jForm).show();
$('.sx-error-message .sx-body', jForm).empty().append(data.message);
});
handler.bind('success', function(e, data)
{
$('.sx-error-message', jForm).hide();
$('.sx-success-message', jForm).show();
$('.sx-success-message .sx-body', jForm).empty().append(data.message);
$('input, textarea', jForm).each(function(value, key)
{
var name = $(this).attr('name');
if (name != '_csrf' && name != 'sx-model-value' && name != 'sx-model')
{
$(this).val('');
}
});
$('.sx-btn-order-result').empty().text('Принято!');
_.delay(function()
{
//$.fancybox.close();
//window.location.reload();
$('.modal-close', jForm).click();
}, 3000);
});
}
JS
),
]);
?>
<section class="order-form--group">
<!--<label class="order-form--group--title">Контактная информация</label>-->
<div class="row">
<div class="col-sm-8">
<div class="form-tbl">
<?= $form->field($model, 'email', [
'template' => "<div class=\"tbl-cell lbl\">{label}</div>\n<div class='tbl-cell'><div class='form-control--wrapper required'>{input}</div>{hint}{error}</div>",
'errorOptions' => ['class' => 'form-note'],
'options' => ['class' => 'tbl-row form-group'],
])->textInput([
'placeholder' => 'для получения деталей заказа',
'type' => 'email'
]); ?>
<?= $form->field($model, 'phone', [
'template' => "<div class=\"tbl-cell lbl\">{label}</div>\n<div class='tbl-cell'><div class='form-control--wrapper required'>{input}</div>{hint}{error}</div>",
'errorOptions' => ['class' => 'form-note'],
'options' => ['class' => 'tbl-row form-group'],
])->textInput([
'class' => 'form-control input-mask-phone-placeholder',
'placeholder' => 'для связи с вами',
'type' => 'tel'
]); ?>
<?
$radioElement = new \v3toys\skeeks\widgets\delivery\V3toysDeliveryInputWidget([
'model' => $model,
'attribute' => 'shipping_method',
'options' => [
'class' => 'sx-deliveryChange'
],
]);
$radioElement = $radioElement->run();
$controller = $this->context;
$region = \Yii::$app->dadataSuggest->address ? \Yii::$app->dadataSuggest->address->regionString : "Выбрать город";
?>
<div class="tbl-row form-group">
<div class="tbl-cell lbl">
<label class="form-label">Город</label>
</div>
<div class="tbl-cell">
<div class="link-region">
<a href="#" onclick="new sx.classes.ModalRegionPjaxReload({
'id' : 'sx-cart-full'
}); return false;" style="border-bottom: dotted 1px;">
<?= \Yii::$app->dadataSuggest->address ? \Yii::$app->dadataSuggest->address->regionString : "Выбрать город"; ?>
</a>
</div>
</div>
</div>
<?= $form->field($model, 'name', [
'template' => "<div class=\"tbl-cell lbl\">{label}</div>\n<div class='tbl-cell'><div class='form-control--wrapper required'>{input}</div>{hint}{error}</div>",
'options' => ['class' => 'tbl-row form-group'],
'errorOptions' => ['class' => 'form-note'],
])->label('Имя и фамилия')->textInput(); ?>
</div>
</div>
</div>
</section>
<div class="row">
<div class="col-sm-12">
<?= \v3toys\skeeks\widgets\delivery\V3toysDeliveryWidget::widget([
'contentSelectRegion' => <<<HTML
HTML
,
'contentPost' => $this->render('_post', [
'form' => $form,
'model' => $model,
]),
'contentPickup' => $this->render('_pickup', [
'form' => $form,
'model' => $model,
]),
'contentCourier' => $this->render('_courier', [
'form' => $form,
'model' => $model,
]),
'contentRadioElement' => $radioElement,
]); ?>
</div>
</div>
<div class="order-form">
<section class="order-form--group">
<!--<label class="order-form--group--title">Комментарии к заказу</label>-->
<div class="row">
<div class="col-sm-8">
<div class="form-tbl">
<?= $form->field($model, 'comment', [
'template' => "<div class=\"tbl-cell lbl\">{label}</div>\n<div class='tbl-cell'><div class='form-control--wrapper'>{input}</div>{hint}{error}</div>",
'errorOptions' => ['class' => 'form-note'],
'options' => ['class' => 'tbl-row form-group'],
])->textarea([
'placeholder' => 'У вас есть пожелания к заказу?',
'rows' => 7
]); ?>
</div>
</div>
</div>
</section>
</div>
<section>
<div class="form-inner">
<div class="row">
<div class="col-lg-12">
<div class="order-delivery--price">
<span class="lbl">Сумма заказа:</span>
<span class="amount sx-moneyOriginal"><?= \Yii::$app->money->convertAndFormat(\Yii::$app->shop->shopFuser->moneyOriginal); ?></span>
</div>
<div class="order-delivery--price">
<span class="lbl">Доставка:</span>
<span class="amount sx-moneyDelivery"><?= \Yii::$app->money->convertAndFormat($model->moneyDelivery); ?></span>
</div>
<!--<div class="order-delivery--price">
<span class="lbl">Скидка:</span>
<span class="amount sx-moneyDiscount">-<?/*= \Yii::$app->money->convertAndFormat(\Yii::$app->shop->shopFuser->moneyDiscount); */?></span>
</div>-->
<div class="order-delivery--total">
Итого к оплате:
<span class="text-nowrap"><span class="number amount sx-money"><?= \Yii::$app->money->convertAndFormat(\Yii::$app->shop->shopFuser->money); ?></span>
</div>
<button type="submit" class="btn btn-orange big">Оформить заказ</button>
</div>
</div>
</div>
</section>
<div class="tbl-cart-bottom order" style="margin-top: 20px;">
<div class="col-left">
<div class="back">
<a href="<?= \yii\helpers\Url::to(['/shop/cart']); ?>">Изменить заказ</a>
</div>
</div>
<!--<div class="col-right">
<button type="submit" class="btn btn-lg">Перейти к оформлению</button>
</div>--><!--.col-right-->
</div>
<div class="row">
<?= \yii\bootstrap\Alert::widget([
'options' => [
'class' => 'alert-success sx-form-message sx-success-message',
'style' => 'display: none;',
],
'closeButton' => false,
'body' => '<div class="sx-body">Ok</div>',
])?>
<?= \yii\bootstrap\Alert::widget([
'options' => [
'class' => 'alert-danger sx-form-message sx-error-message',
'style' => 'display: none;',
],
'closeButton' => false,
'body' => '<div class="sx-body">Ok</div>',
])?>
</div>
<? $form::end(); ?>
</div>
<? endif; ?>
3-й шаг оформления заказа (готовый заказ)
<div class="content order">
<div class="order-progress">
<div class="row">
<div class="col col-4">
<div class="progress"><span class="number">1</span><span>Ваша корзина</span></div>
</div>
<div class="col col-4">
<div class="progress"><span class="number">2</span><span>Оформление заказа</span></div>
</div>
<div class="col col-4">
<div class="progress active"><span class="number">3</span><span>Покупка завершена</span></div>
</div>
</div>
</div>
<div class="title">
<h1>Заказ № <?= $model->id; ?> оформлен!</h1>
<h4>Наш менеджер свяжется с Вами в ближайшее время для подтверждения заказа.</h4>
</div>
<form>
<div class="row">
<div class="col col-6">
<h5>Данные заказа:</h5>
<dl>
<dd>Получатель: <?= $model->name; ?></dd>
<dd>Телефон: <?= $model->phone; ?></dd>
<dd>Доставка: <?= $model->deliveryFullName; ?></dd>
</dl>
<dl>
<dd>Итоговая стоимость с учётом доставки: <?= \Yii::$app->money->convertAndFormat($model->money); ?></dd>
</dl>
<dl>
<dd>Данные о заказе отправлены Вам на E-mail: <?= $model->email; ?></dd>
<dd>Статус заказа можете посмотреть в
<? if (\Yii::$app->user->isGuest) : ?>
<a href="<?= \skeeks\cms\helpers\UrlHelper::construct('cms/auth/login')->setCurrentRef(); ?>">Личном кабинете</a>
<? else: ?>
<a href="<?=\yii\helpers\Url::to(['/shop/order/list']); ?>">Личном кабинете</a>
<? endif; ?>
</dd>
</dl>
</div>
</div>
</form>
<h2>Спасибо за заказ!</h2>
</div>
Личный кабинет клиента
Содержимое шаблона @app/views/modules/cms/user/edit
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $context \frontend\controllers\UserController */
/* @var $model common\models\User */
$context = $this->context;
$model = $context->user;
$this->title = $model->getDisplayName();
$this->title = $model->getDisplayName();
\Yii::$app->breadcrumbs->createBase()->append([
'name' => $model->displayName,
'url' => $model->getPageUrl()
])->append([
'name' => 'Упраление настройками'
]);
?>
<div class="row">
<div class="col col-3">
<div class="sidebar">
<?= \skeeks\cms\cmsWidgets\treeMenu\TreeMenuCmsWidget::widget([
'namespace' => 'catalog-menu',
'viewFile' => '@app/views/widgets/TreeMenuCmsWidget/catalog-menu',
//'label' => 'Title menu',
//'level' => 1,
//'enabledRunCache' => \skeeks\cms\components\Cms::BOOL_N,
]); ?>
</div>
</div>
<div class="col col-9">
<div class="content">
<?= \skeeks\cms\cmsWidgets\breadcrumbs\BreadcrumbsCmsWidget::widget([
'viewFile' => '@app/views/widgets/BreadcrumbsCmsWidget/default',
]); ?>
<!--<div class="breadcrumb">
<ul>
<li><a href="#">Главная</a></li>
<li><a href="#">Страница</a></li>
</ul>
</div>-->
<div class="title">
<h1><?= $model->name; ?></h1>
</div>
<div class="page">
<div class="tab-v1">
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" href="#profile">Личные данные</a></li>
<li><a data-toggle="tab" href="#passwordTab">Изменение пароля</a></li>
<? if (isset(\Yii::$app->authClientCollection) && \Yii::$app->authClientCollection->clients) : ?>
<li><a data-toggle="tab" href="#sx-social">Социальные профили</a></li>
<? endif; ?>
</ul>
<div class="tab-content">
<div id="profile" class="profile-edit tab-pane fade in active">
<? $modelForm = $model; ?>
<? $form = \skeeks\cms\base\widgets\ActiveFormAjaxSubmit::begin([
'validationUrl' => \skeeks\cms\helpers\UrlHelper::construct('cms/user/edit-info', ['username' => $model->username])->setSystemParam(\skeeks\cms\helpers\RequestResponse::VALIDATION_AJAX_FORM_SYSTEM_NAME)->toString(),
'action' => \skeeks\cms\helpers\UrlHelper::construct('cms/user/edit-info', ['username' => $model->username])->toString(),
'afterValidateCallback' => new \yii\web\JsExpression(<<<JS
function(jForm, ajax)
{
var handler = new sx.classes.AjaxHandlerStandartRespose(ajax, {
'enableBlocker' : true,
'blockerSelector' : '#' + jForm.attr('id')
});
handler.bind('success', function(e, response)
{});
}
JS
)
]); ?>
<?/*= $form->field($model, 'image_id')->widget(
\skeeks\cms\widgets\formInputs\StorageImage::className()
) */?>
<?= $form->field($model, 'username')->textInput(['maxlength' => 12])->hint('Уникальное имя пользователя. Используется для авторизации, для формирования ссылки на личный кабинет.'); ?>
<?= $form->field($model, 'name')->textInput(); ?>
<?= $form->field($model, 'email')->textInput(); ?>
<?= $form->field($model, 'phone')->textInput(); ?>
<?= $form->field($model, 'gender')->radioList([
'men' => 'Муж',
'women' => 'Жен',
]); ?>
<?/*= $form->field($model, 'status_of_life')->textarea(); */?>
<button class="btn btn-primary">Сохранить</button>
<? \skeeks\cms\base\widgets\ActiveFormAjaxSubmit::end(); ?>
</div>
<div id="passwordTab" class="profile-edit tab-pane fade">
<? $modelForm = new \skeeks\cms\models\forms\PasswordChangeForm(); ?>
<? $form = \skeeks\cms\base\widgets\ActiveFormAjaxSubmit::begin([
'validationUrl' => \skeeks\cms\helpers\UrlHelper::construct('cms/user/change-password', ['username' => $model->username])->setSystemParam(\skeeks\cms\helpers\RequestResponse::VALIDATION_AJAX_FORM_SYSTEM_NAME)->toString(),
'action' => \skeeks\cms\helpers\UrlHelper::construct('cms/user/change-password', ['username' => $model->username])->toString()
]); ?>
<?= $form->field($modelForm, 'new_password')->passwordInput() ?>
<?= $form->field($modelForm, 'new_password_confirm')->passwordInput() ?>
<button class="btn btn-primary">Изменить</button>
<? \skeeks\cms\base\widgets\ActiveFormAjaxSubmit::end(); ?>
</div>
<? if (isset(\Yii::$app->authClientCollection) && \Yii::$app->authClientCollection->clients) : ?>
<div id="sx-social" class="profile-edit tab-pane fade">
<? \yii\bootstrap\Alert::begin([
'options' => [
'class' => 'alert-info',
],
])?>
Вы можете подключить профиль социальной сети, или стороннего приложения, и авторизовываться через него на нашем сайте.
<? \yii\bootstrap\Alert::end()?>
<? if (\Yii::$app->user->identity->cmsUserAuthClients) : ?>
<h4>Уже подключены:</h4>
<?=
\yii\grid\GridView::widget([
'dataProvider' => new \yii\data\ArrayDataProvider([
'allModels' => \Yii::$app->user->identity->cmsUserAuthClients
]),
'columns' =>
[
'provider'
]
])
?>
<? endif; ?>
<hr />
<h4>Подключить еще:</h4>
<?= yii\authclient\widgets\AuthChoice::widget([
'baseAuthUrl' => ['/cms/auth/client'],
'popupMode' => true,
]) ?>
</div>
<? endif; ?>
</div>
</div>
<? if ($orders = \v3toys\skeeks\models\V3toysOrder::find()->where(['user_id' => $model->id])->orderBy(['id' => SORT_DESC])->all()) : ?>
<section class="order-list">
<h4>Мои заказы</h4>
<table class="table order">
<thead>
<tr>
<!--<th class="no-border-left"></th>-->
<th>Дата</th>
<th>Номер заказа</th>
<th>Сумма</th>
<th>Статус</th>
<th class="no-border-right"></th>
</tr>
</thead>
<tbody>
<?
/**
* @var $order \v3toys\skeeks\models\V3toysOrder
*/
?>
<? foreach ($orders as $order) : ?>
<tr>
<!--<td class="no-border-left">
<i class="icon-time"></i>
</td>-->
<td><?= \Yii::$app->formatter->asDatetime($order->created_at); ?></td>
<td><?= $order->id; ?></td>
<td><?= \Yii::$app->money->convertAndFormat($order->money); ?></td>
<td><?= $order->v3toys_status_id ? $order->status->name : "только что создан"; ?></td>
<td class="no-border-right"><a href="<?= \yii\helpers\Url::to(['/v3toys/cart/finish', 'key' => $order->key]); ?>">подробнее о заказе</a></td>
</tr>
<? endforeach; ?>
</tbody>
</table>
</section>
<? endif; ?>
</div>
</div>
</div>