Quick start¶
Работа с шаблонами¶
Настройка¶
Стандартным для yii2 способом, для определения пути к теме/шаблону сайта, можно путем конфигурирования компонента view.
В файле конфига проекта frontend/config/main.php
отредактировать секцию components
'view' =>
[
'theme' =>
[
'pathMap' =>
[
'@app/views' =>
[
'@app/templates/default',
],
]
],
],
Использование¶
Пути к шаблонам обычно собираюся оттакливаясь от алиаса @app/views
- который выше сконфигурирован.
Пример подключения шаблона в шаблоне¶
<?= $this->render("@app/views/header", []); ?>
Пример глобального рендеринга шаблона¶
<?= \Yii::$app->views->render("@app/views/header", []); ?>
Шаблоны для писем¶
Шаблоны для отправки писем из расширений лежат непосредственно в расширении в папке mail-templates При отправке письма идет проверка
\Yii::$app->mailer->view->theme->pathMap = ArrayHelper::merge(\Yii::$app->mailer->view->theme->pathMap, [
'@app/mail' =>
[
'@skeeks/cms/mail-templates'
]
]);
@app - это папка текущего приложения. Чтобы подложить для отправки свой шаблон, создайте папку mail в папке своего приложения. Положите туда свои шаблоны.
Работа с URL¶
Везде в своих проектах правильно формируйте url, на любое действие на любой раздел, на любой элемент и т.д. Это позволит избежать кучи проблем с ростом проекта. Особенно с добавлением мультиязычности на сайт.
И так, в yii2 на эту тему есть множество примеров, с ними можно ознакомиться, например тут: https://github.com/yiisoft/yii2/blob/master/docs/guide/helper-url.md
Здесь же, мы рассмотрим конкретные примеры всего что связано с базовым модулем cms
Ссылки на разделы¶
Ссылки на разделы сайта, по их id параметру
\yii\helpers\Url::to(['/cms/tree/view', 'id' => 10])
Ссылки на разделы сайта, по их объекту модели model
$model = \skeeks\cms\models\CmsTree::findOne(10);
\yii\helpers\Url::to(['/cms/tree/view', 'model' => $model])
Ссылки на разделы сайта, по их dir параметру
//Ссылка в раздел about
\yii\helpers\Url::to(['/cms/tree/view', 'dir' => 'about'])
Прочие примеры с параметрами
//Ссылка в раздел about с параметрами
\yii\helpers\Url::to(['/cms/tree/view', 'dir' => 'about', 'param1' => 'test1', '#' => 'test1'])
//Абсолютная ссылка на раздел about
\yii\helpers\Url::to(['/cms/tree/view', 'dir' => 'about'], true)
//Абсолютная https ссылка на раздел about
\yii\helpers\Url::to(['/cms/tree/view', 'dir' => 'about'], 'https')
//Ссылка на вложенный раздел
\yii\helpers\Url::to(['/cms/tree/view', 'dir' => 'about/level-2/level-3'])
Но cms поддерживает концепцию многосайтовости. Поэтому можно в параметрах указать код желаемого сайта:
\yii\helpers\Url::to(['/cms/tree/view', 'dir' => 'about/level-2/level-3', 'site_code' => 's2'])
Ссылки в консольном приложении¶
Об этом стоит сказать особенно. Частый случай, что в yii2 сыпятся ошибки при запуске каких либо консольных утилит. Для корректной работы ссылок, необходимо сконфигурировать компонент UrlManager в конскольном приложении.
'urlManager' => [
'baseUrl' => '',
'hostInfo' => 'http://your-site.com'
]
А так же в bootstrap определить пару алиасов:
\Yii::setAlias('webroot', dirname(dirname(__DIR__)) . '/frontend/web');
\Yii::setAlias('web', '');
Авторизация / Регистрация¶
Стандартная авторизация/регистрация¶
В SkeekS CMS уже реализован процесс авторизации, регистрации и восстановления пароля (через email).
Реализация находится в cms/auth
контроллере.
Методы реализающие эти процессы:
login
— процесс авторизацииregister
— процесс регистрацииregister-by-email
— регистрация через email (только ajax)forget
— запроса начала процедуры восстановления пароляreset-password
— действие подтверждения смены пароля
Проверка текущего пользователя¶
Для проверки авторизации текущего пользователя на сайте, используется стандартная конструкция yii2.
if (\Yii::$app->user->isGuest)
{
//Пользователь неавторизован
} else
{
//Пользователь авторизован можно запросить его данные
print_r(\Yii::$app->user->identity->toArray());
}
Ссылки на авторизацию¶
Как получить ссылку на действия связанные с авторизацией
echo \yii\helpers\Url::to(['cms/auth/login']);
echo \yii\helpers\Url::to(['cms/auth/register']);
echo \yii\helpers\Url::to(['cms/auth/forget']);
Еще один вариант через хелпер SkeekS CMS
echo \skeeks\cms\helpers\UrlHelper::construct('cms/auth/login')->setCurrentRef()
Форма авторизации¶
Эту форму можно вставить в любое место на сайте, работает через ajax.
$model = new \skeeks\cms\models\forms\LoginFormUsernameOrEmail();
<?php $form = skeeks\cms\base\widgets\ActiveFormAjaxSubmit::begin([
'action' => \skeeks\cms\helpers\UrlHelper::construct('cms/auth/login')->setCurrentRef()->toString(),
'validationUrl' => \skeeks\cms\helpers\UrlHelper::construct('cms/auth/login')->setSystemParam(\skeeks\cms\helpers\RequestResponse::VALIDATION_AJAX_FORM_SYSTEM_NAME)->toString()
]); ?>
<?= $form->field($model, 'identifier') ?>
<?= $form->field($model, 'password')->passwordInput() ?>
<?= $form->field($model, 'rememberMe')->checkbox() ?>
<div class="form-group">
<?= \yii\helpers\Html::submitButton("<i class=\"glyphicon glyphicon-off\"></i> Войти", ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
</div>
<?php skeeks\cms\base\widgets\ActiveFormAjaxSubmit::end(); ?>
Форма регистрации¶
<?php $form = ActiveForm::begin([
'action' => UrlHelper::construct('cms/auth/register-by-email')->toString(),
'validationUrl' => UrlHelper::construct('cms/auth/register-by-email')->setSystemParam(\skeeks\cms\helpers\RequestResponse::VALIDATION_AJAX_FORM_SYSTEM_NAME)->toString(),
'afterValidateCallback' => <<<JS
function(jForm, ajaxQuery)
{
var handler = new sx.classes.AjaxHandlerStandartRespose(ajaxQuery, {
'blockerSelector' : '#' + jForm.attr('id'),
'enableBlocker' : true,
});
handler.bind('success', function()
{
_.delay(function()
{
$('#sx-login').click();
}, 2000);
});
}
JS
]); ?>
<?= $form->field($model, 'email') ?>
<div class="form-group">
<?= Html::submitButton("<i class=\"glyphicon glyphicon-off\"></i> Зарегистрироваться", ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
</div>
<?php ActiveForm::end(); ?>
Форма восстановления пароля¶
<?php $form = ActiveForm::begin([
'action' => UrlHelper::construct('cms/auth/forget')->toString(),
'validationUrl' => UrlHelper::construct('cms/auth/forget')->setSystemParam(\skeeks\cms\helpers\RequestResponse::VALIDATION_AJAX_FORM_SYSTEM_NAME)->toString()
]); ?>
<?= $form->field($model, 'identifier') ?>
<div class="form-group">
<?= Html::submitButton("Отправить", ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
</div>
<?php ActiveForm::end(); ?>
Компоненты CMS¶
$model = \Yii::$app->companySiteSettings;
$model->setCmsSite(\Yii::$app->project->company->site);
$model->refresh();
$model->load(\Yii::$app->request->post());
$model->setOverride(Component::OVERRIDE_SITE)->save();
Виджеты CMS¶
Виджеты cms наследуются от базвого виджета: skeeks\cms\base\Widget
Преимущество их работы, состоит в том, что их можно редактировать в “Панеле быстрого управления сайтом”.
Редактируемые блоки¶
skeeks\\cms\\cmsWidgets\\text\\TextCmsWidget
— Предназначен для редактирования блоков текста или html кода
Пример использования¶
<? echo \skeeks\cms\cmsWidgets\text\TextCmsWidget::widget([
'namespace' => 'unique-settings-code',
'text' => 'Edited text'
]); ?>
<? echo \skeeks\cms\cmsWidgets\text\TextCmsWidget::widget([
'namespace' => 'unique-settings-code',
'text' => <<<HTML
<p class="cl-gray ">
Edited text
</p>
HTML
]); ?>
<? \skeeks\cms\cmsWidgets\text\TextCmsWidget::begin([
'namespace' => 'unique-settings-code',
]); ?>
<p class="cl-gray ">
Edited text
</p>
<? \skeeks\cms\cmsWidgets\text\TextCmsWidget::end(); ?>
<? \skeeks\cms\cmsWidgets\text\TextCmsWidget::beginWidget('unique-settings-code'); ?>
<p class="cl-gray ">
Edited text
</p>
<? \skeeks\cms\cmsWidgets\text\TextCmsWidget::end(); ?>
Меню¶
skeeks\\cms\\cmsWidgets\\treeMenu\\TreeMenuCmsWidget
— Данный виджет, чаще всего предназначен для построения меню на сайте. При чем как главного меню, так и второстепенного. Добиться этого можно путем манипулации с его параметрами и способом вызова. Так же, виджет может подойти для вывода подразделов определенного раздела сайта (например основные разделы услуг, на главную страницу сайта).
Пример использования¶
<?= \skeeks\cms\cmsWidgets\treeMenu\TreeMenuCmsWidget::widget([
'namespace' => 'top-site-menu',
'viewFile' => '@app/views/widgets/TreeMenuCmsWidget/top-site-menu',
'label' => 'Title menu',
'level' => '1',
'enabledRunCache' => \skeeks\cms\components\Cms::BOOL_N,
]); ?>
Пример содержимого файла: @app/views/widgets/TreeMenuCmsWidget/top-site-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) : ?>
<?= $this->render("menu-top-item", [
"widget" => $widget,
"model" => $tree,
]); ?>
<? endforeach; ?>
<? endif; ?>
</ul>
Пример содержимого файла: @app/views/widgets/TreeMenuCmsWidget/menu-top-item
<?php
/* @var $this yii\web\View */
/* @var $widget \skeeks\cms\cmsWidgets\treeMenu\TreeMenuCmsWidget */
/* @var $model \skeeks\cms\models\Tree */
$dir = $model->dir;
if ($model->redirect_tree_id) {
$dir = $model->redirectTree->dir;
};
$activeClass = '';
if (strpos(\Yii::$app->request->pathInfo, $dir) !== false) {
$activeClass = ' active';
}
?>
<li>
<a href="<?= $model->url; ?>" title="<?= $model->name; ?>" class="<?= $activeClass; ?>">
<?= $model->name; ?>
</a>
</li>
Пример с переопределением настроек¶
<? $widget = \skeeks\cms\cmsWidgets\treeMenu\TreeMenuCmsWidget::beginWidget('menu-top-1', [
'viewFile' => '@app/views/widgets/TreeMenuCmsWidget/menu-top',
'label' => 'Верхнее меню',
'level' => '1',
'enabledRunCache' => \skeeks\cms\components\Cms::BOOL_N,
]); ?>
<?
//Переопределение шаблона, то есть не важно что укажут в настройках виджета, шаблон все равно будет использоваться этот!
$widget->viewFile = '@app/views/widgets/TreeMenuCmsWidget/menu-top-2';
//Изменение запроса
$widget->activeQuery->andWhere(['code' => 'dostavka']);
?>
<? \skeeks\cms\cmsWidgets\treeMenu\TreeMenuCmsWidget::end(); ?>
Второстепенное меню каталога¶
Например, при хождении по каталогу, необходимо чтобы подразделы каталога, отображались всегда слева. Для этого можно опереться на параметр текущего раздела сайта, и передать его в один из параметров виджета в качестве treePid
. В этом случае, в выборке нужных разделов будет всегда участвовать условие родительского раздела. И при этом это условие будет перекрывать настройки указанные администратором через админку, а значит администратор не сможет сломать виджет, но при этом сможет поменять некоторые параметры.
<? $widget = \skeeks\cms\cmsWidgets\treeMenu\TreeMenuCmsWidget::beginWidget('menu-top-1', [
'viewFile' => '@app/views/widgets/TreeMenuCmsWidget/menu-top',
'label' => 'Вложенное меню',
'enabledRunCache' => \skeeks\cms\components\Cms::BOOL_N,
]); ?>
<?
//Если задан текущий раздел, и у него есть достаточная вложенность
if (\Yii::$app->cms->currentTree && \Yii::$app->cms->currentTree->parent && isset(\Yii::$app->cms->currentTree->parents[1]))
{
$currentParentTree = \Yii::$app->cms->currentTree->parents[1];
$widget->treePid = $currentParentTree->id; //Пере определние параметра родительского раздела
$widget->initActiveQuery(); //Применение новых настроек виджета
}
?>
<? \skeeks\cms\cmsWidgets\treeMenu\TreeMenuCmsWidget::end(); ?>
Хлебные крошки¶
\skeeks\cms\cmsWidgets\breadcrumbs\BreadcrumbsCmsWidget
— виджет для построения хлебных крошек на сайте.
Пример вызова¶
<?= \skeeks\cms\cmsWidgets\breadcrumbs\BreadcrumbsCmsWidget::widget([
'viewFile' => '@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\cms\cmsWidgets\contentElements\ContentElementsCmsWidget
— виджет для выборки и вывода элементов контента на сайт.
Пример вызова¶
<?= \skeeks\cms\cmsWidgets\contentElements\ContentElementsCmsWidget::widget([
'namespace' => 'home-news',
'label' => 'Новости компании',
'viewFile' => '@app/views/widgets/ContentElementsCmsWidget/home-news',
]); ?>
Содержимое шаблона¶
<?php
/* @var $this yii\web\View */
/* @var $widget \skeeks\cms\cmsWidgets\contentElements\ContentElementsCmsWidget */
/* @var $element \skeeks\cms\models\CmsContentElement */
?>
<? if ($widget->dataProvider->query->count() > 1) : ?>
<h5><?= $widget->label; ?>:</h5>
<div class="news__posts">
<? foreach ($widget->dataProvider->query->all() as $element) : ?>
<div class="news__post">
<span class="date"><?= \Yii::$app->formatter->asDate($element->published_at); ?></span>
<span><a href="<?= $element->url ?>" title="<?= $element->name; ?>"><?= $element->name; ?></a></span>
</div>
<? endforeach; ?>
</div>
<? if($element->cmsTree) : ?>
<div class="more">
<a class="more" href="<?= $element->cmsTree->url; ?>">остальные новости</a>
</div>
<? endif; ?>
<? endif; ?>