Добро пожаловать в SkeekS CMS документацию!¶
SkeekS CMS - современная система общего управления контентом на основе yii2 php framework.
Ссылки¶
Информация¶
Предоставляет возможности для управления структурой сайта и элементами контента (новостями, публикациями, продуктами и т.д.).
Возможности управления и динамического создания дополнительных свойств разделов и элементов контента через систему администрирования.
Возможности управления пользователями, привилегиями, ролями и их назначениями.
Поддерживает точку входа для одного запроса (один index.php), для бэкэнд и фронтенд частей проекта. Удобно настраивать nginx и apache.
Almost every page of the site - content item or section. Each of these models has some povdeniem availability of additional properties. Therefore, any product publkatsii, news, etc. It has a set of common properties, which are described in the model, and a set of dynamically created properties, through the administration system.
This versatility allows you to easily create any site, without writing and design of additional models and migration. What idelalno for quickly writing conventional nevysokonagruzhennyh projects (this does not mean that you can not write highly loaded projects).
Just have https://cms.skeeks.com/marketplace marketpleys the CMS for this, which is constantly updated with useful solutions.
Обзор¶
Требования¶
Программное обеспечение¶
- apache
- модуль apache mod_rewrite
- php >= 5.5
- DB mysql ~ 5.5
- SSH доступ
Модули php¶
- mbstring
- xml
- pdo
- pdo_mysql
- json
- phar
- simplexml
- timezonedb
- gd или imagik
- intl
- mcrypt
- fileinfo
- curl
Настройки php¶
- short_open_tag on
Установка¶
1. Installation composer¶
The recommended way to install SkeekS CMS is with Composer. Composer is a dependency management tool for PHP that allows you to declare the dependencies your project needs and installs them into your project.
If you do not have Composer, follow the instructions in the Installing Yii section of the definitive guide to install it.
# Install Composer
curl -sS https://getcomposer.org/installer | COMPOSER_HOME=.composer php
Примечание
Alternative commands, depending on the server configuration and your access rights:
#composer if not installed globally, you can use this command
COMPOSER_HOME=.composer php composer.phar
# or use if composer installed globally
composer
php yii
# or use (file yii must be executable)
yii
2. Installation files¶
Establish example.com site in example.com folder
Navigate to the folder where are your projects (such as /var/www/sites/).
# Download latest version of composer
curl -sS https://getcomposer.org/installer | COMPOSER_HOME=.composer php
# Installing the base project SkeekS CMS
COMPOSER_HOME=.composer php composer.phar create-project --prefer-dist --stability=dev skeeks/app-basic demo.ru
# Going into the project folder
cd demo.ru
3. Configuring the database¶
Edit the file to access the database, it is located at common/config/db.php
4. Installation of migrations¶
#Installation of ready-dump
php yii dbDumper/mysql/restore
5. Configuring the server¶
By default, your site opens at //example.com/frontend/web/
On hostings are configured by default under the usual sites.
But it can be reconfigured (and even necessary) in detail about this here: Server Configuration (web-server)
6. Authorization system¶
Система управления по умолчанию доступна по следующему адресу (при желании его можно переконфигурировать)
//example.com/~sx/admin/auth/
root (логин)
skeeks (пароль)
7. Check the working environment¶
If the installation process has been completed, but there are still not clear to you the error, it is likely that something is wrong is configured on the server. To do so, download to /frontend/web/ and run the file to test https://github.com/skeeks-cms/cms/blob/master/requirements.php environment. //example.com/frontend/web/requirements.php or //example.com/requirements.php (depends on item 4).
Внимание
It is important to remember to check the setting of php: short_open_tag on
Обновление¶
Стандартное обновление¶
# Composer update to the latest stable version
COMPOSER_HOME=.composer php composer.phar self-update && COMPOSER_HOME=.composer php composer.phar update -o
Настройка сервера¶
Примечание
Info: You may skip this subsection for now if you are just test driving Yii with no intention of deploying it to a production server.
The application installed according to the above instructions should work out of box with either an Apache HTTP server or an Nginx HTTP server, on Windows, Mac OS X, or Linux running PHP 5.5 or higher. Yii 2.0 is also compatible with facebook’s HHVM. However, there are some edge cases where HHVM behaves different than native PHP, so you have to take some extra care when using HHVM.
On a production server, you may want to configure your Web server so that the application can be accessed via the URL //www.example.com/index.php instead of //www.example.com/frontend/web/index.php. Such configuration requires pointing the document root of your Web server to the basic/web folder. You may also want to hide index.php from the URL, as described in the Routing and URL Creation section. In this subsection, you’ll learn how to configure your Apache or Nginx server to achieve these goals.
Recommended Apache Configuration¶
Use the following configuration in Apache’s httpd.conf file or within a virtual host configuration. Note that you should replace path/to/basic/web with the actual path for basic/web.
# Set document root to be "frontend/web"
DocumentRoot "path/to/frontend/web"
<Directory "path/to/frontend/web">
# use mod_rewrite for pretty URL support
RewriteEngine on
# If a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward the request to index.php
RewriteRule . index.php
# ...other settings...
</Directory>
Recommended Nginx Configuration¶
To use Nginx, you should install PHP as an FPM SAPI. You may use the following Nginx configuration, replacing path/to/frontend/web with the actual path for frontend/web and mysite.local with the actual hostname to serve.
server {
charset utf-8;
client_max_body_size 128M;
listen 80; ## listen for ipv4
#listen [::]:80 default_server ipv6only=on; ## listen for ipv6
server_name mysite.local;
root /path/to/frontend/web;
index index.php;
access_log /path/to/frontend/log/access.log;
error_log /path/to/frontend/log/error.log;
location / {
# Redirect everything that isn't a real file to index.php
try_files $uri $uri/ /index.php$is_args$args;
}
# uncomment to avoid processing of calls to non-existing static files by Yii
#location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
# try_files $uri =404;
#}
#error_page 404 /404.html;
# deny accessing php files for the /assets directory
location ~ ^/assets/.*\.php$ {
deny all;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/var/run/php5-fpm.sock;
try_files $uri =404;
}
location ~* /\. {
deny all;
}
}
When using this configuration, you should also set cgi.fix_pathinfo=0 in the php.ini file in order to avoid many unnecessary system stat() calls.
Also note that when running an HTTPS server, you need to add fastcgi_param HTTPS on; so that Yii can properly detect if a connection is secure.
Reporting a security vulnerability¶
Publicly disclosing a vulnerability can put the entire community at risk. If you’ve discovered a security concern, please email us at support@skeeks.com.
After a security vulnerability has been corrected, a security hotfix release will be deployed as soon as possible.
Work with documents¶
Для написания документации используется генератор документации Sphinx. Стандартный синтаксис разметки reStructuredText
Полезные команды для генерации:
apt-get install python-pip
pip install Sphinx
pip install sphinx-intl
pip install sphinx_rtd_theme
make gettext
make html
sphinx-intl update -p _build/gettext -l ru
#make -e SPHINXOPTS="-D language='ru'" html
sphinx-build -D language='ru' ./ build/ru
sphinx-build ./ build/en
Структура¶
Директории¶
common содержит общие файлы всех приложений
config/ содержит общие конфигурационные файлы приложений
mail/ содержит файлы представлений для электронной почты
models/ содержит классы моделей, используемые во всех приложениях
runtime/ временно генерируемые файлы используемые всеми приложениями
widgets/ классы виджетов приложений
console консольное приложение, скрипты для крона и прочее
config/ содержит конфигурационные файлы
controllers/ содержит консольные контроллеры (commands)
migrations/ содержит миграции
models/ содержит классы моделей
runtime/ временно генерируемые файлы
frontend приложение 1
assets/ описание и храенение Asset блоков Yii2
config/ содержит конфигурационные файлы
controllers/ contains Web controller classes
models/ содержит классы моделей
runtime/ временно генерируемые файлы
templates/ содержит набор шаблонов
default/ Файлы представлений шаблона по умолчанию
web/ публичная директория (файлы js, css, img...)
assets/ временные js, css, файлы
widgets/ классы виджетов приложения
frontend2 приложение 2
// ... полностью повторяет структуру предыдущего приложения...
vendor/ используемые дополнительные библиотеки в проекте
tests contains various tests for the advanced application
codeception/ contains tests developed with Codeception PHP Testing Framework
The root directory contains the following subdirectories:
- common - files common to all applications.
- console - console application.
- frontend - frontend web application.
Root directory contains a set of files.
- .gitignore contains a list of directories ignored by git version system. If you need something never get to your source code repository, add it there.
- composer.json - Composer config described in Configuring Composer.
- LICENSE.md - license info. Put your project license there. Especially when opensourcing.
- README.md - basic info about installing template. Consider replacing it with information about your project and its installation.
- yii - console application bootstrap.
- yii.bat - same for Windows.
Predefined path aliases¶
- @yii - framework directory.
- @app - base path of currently running application.
- @common - common directory.
- @frontend - frontend web application directory.
- @console - console directory.
- @runtime - runtime directory of currently running web application.
- @vendor - Composer vendor directory.
- @bower - vendor directory that contains the bower packages.
- @npm - vendor directory that contains npm packages.
- @web - base URL of currently running web application.
- @webroot - web root directory of currently running web application.
The aliases specific to the directory structure of the advanced application (@common, @frontend and @console) are defined in common/config/bootstrap.php.
Приложения¶
There are two applications in advanced template: frontend and console. Frontend is typically what is presented to end user, the project itself. Console is typically used for cron jobs and low-level server management. Also it’s used during application deployment and handles migrations and assets.
There’s also a common directory that contains files used by more than one application. For example, User model.
Frontend and backend are both web applications and both contain the web directory. That’s the webroot you should point your web server to.
Each application has its own namespace and alias corresponding to its name. Same applies to the common directory.
Конфигурация и окружение¶
There are multiple problems with a typical approach to configuration:
- Each team member has its own configuration options. Committing such config will affect other team members.
- Production database password and API keys should not end up in the repository.
- There are multiple server environments: development, testing, production. Each should have its own configuration.
- Defining all configuration options for each case is very repetitive and takes too much time to maintain.
In order to solve these issues Yii introduces a simple environments concept. Each environment is represented by a set of files under the environments directory.
By default there are two environments: dev and prod. First is for development. It has all the developer tools and debug turned on. Second is for server deployments. It has debug and developer tools turned off.
In order to avoid duplication configurations are overriding each other. For example, the frontend reads configuration in the following order:
@skeeks/cms/config/main.php
- Все компонент подключенные компоненты yii2 у которых есть
config/main.php
common/config/main.php
common/config/env/{your-env}/main.php
frontend/config/main.php
frontend/config/env/{your-env}/main.php
Parameters are read in the following order:
common/config/params.php
common/config/env/{your-env}/params.php
frontend/config/params.php
frontend/config/env/{your-env}/params.php
The later config file overrides the former.
Быстрый старт¶
Работа с шаблонами¶
Настройка¶
Стандартным для 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; ?>
CMS Admin¶
Административная часть сайта реализована компонентом skeeks/cms-admin
По умолчанию CMS уже сдержит этот компонент.
Настройка и конфигурирование¶
Компонент админки подключается и настраивается стандартным способом в проект.
Пример конфигурирования¶
В файле конфига проекта frontend/config/main.php
отредактировать секцию components
'backendAdmin' =>
[
'class' => '\skeeks\cms\admin\AdminComponent',
'controllerPrefix' => 'admin',
'urlRule' => [
'urlPrefix' => '~sx' //Префикс админки, то есть путь к админке сайта может быть любой
],
'allowedIPs' => [
'91.219.167.252',
'93.186.50.*'
],
'on beforeRun' => function($event) {
\Yii::$app->httpBasicAuth->verify();
}
],
Меню¶
Административное меню формируется путем слияния конфигов всех установленных расширений и конфига проекта.
@skeeks/cms/config/admin/menu.php
@skeeks/cms-admin/config/admin/menu.php
@all-other-extensions/config/admin/menu.php
@common/config/admin/menu.php
Формат¶
В конечном виде конфиг меню представляет собой один большой массив с элементами
[
'users' =>
[
'label' => \Yii::t('skeeks/cms', 'Users'),
'priority' => 200,
'enabled' => true,
"img" => ['\skeeks\cms\modules\admin\assets\AdminAsset', 'images/icons/user.png'],
'items' =>
[
[
"label" => \Yii::t('skeeks/cms',"User management"),
"url" => ["cms/admin-user"],
"img" => ['\skeeks\cms\modules\admin\assets\AdminAsset', 'images/icons/user.png'],
'priority' => 0
],
//....
]
],
],
Каждый элемент массива может содержать следующие опции:
- label — Название пункта меню
- priority — Порядок чем меньше тем выше пункт
- enabled — Показывается или не показывается
- img — Картинка (массив [Asset, ‘путь к файлу’])
- url — URL массив который будет передан в
yii\helpers\Url::to()
;
Создание контроллера¶
В проекте¶
Ссылка на контроллер: Url::to(['/admin-competition'])
Создать файл контроллера: frontend/controllers/AdminCompetitionController.php
namespace frontend\controllers;
use frontend\modules\competition\models\Competition;
class AdminCompetitionController extends \skeeks\cms\modules\admin\controllers\AdminModelEditorController
{
public function init()
{
$this->name = \Yii::t('app', 'Конкурсы');
$this->modelShowAttribute = "name";
$this->modelClassName = Competition::className();
parent::init();
}
}
Создать файл шаблона: frontend/views/admin-competition/index.php
<? $pjax = \skeeks\cms\modules\admin\widgets\Pjax::begin(); ?>
<?php echo $this->render('_search', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider
]); ?>
<?= \skeeks\cms\modules\admin\widgets\GridViewStandart::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'adminController' => $controller,
'pjax' => $pjax,
'columns' => [
'name',
],
]); ?>
<? $pjax::end(); ?>
Создать файл для фильтров и поиска: frontend/views/admin-competition/_search.php
<?
$filter = new \yii\base\DynamicModel([
'id',
]);
$filter->addRule('id', 'integer');
$filter->load(\Yii::$app->request->get());
if ($filter->id)
{
$dataProvider->query->andWhere(['id' => $filter->id]);
}
?>
<? $form = \skeeks\cms\modules\admin\widgets\filters\AdminFiltersForm::begin([
'action' => '/' . \Yii::$app->request->pathInfo,
]); ?>
<?= $form->field($searchModel, 'name')->setVisible(); ?>
<? $form::end(); ?>
Создать файл для редактирования элементов: frontend/views/admin-competition/_form.php
<?php $form = ActiveForm::begin(); ?>
<?php ?>
<?= $form->fieldSet( \Yii::t('skeeks/form2/app', 'General information'))?>
<?= $form->field($model, 'name')->textInput(); ?>
<?= $form->field($model, 'description')->textInput(); ?>
<?= $form->field($model, 'is_active')->checkbox(); ?>
<?= $form->fieldSetEnd(); ?>
<?= $form->buttonsCreateOrUpdate($model); ?>
<?php ActiveForm::end(); ?>
Создание контроллера¶
Расширения¶
Дополнительные решения, расширяющие стандартные возможности SkeekS CMS
Shop (skeeks/cms-shop)¶
Полноценный интернет магазин.
Виджеты¶
Этапы оформления заказа¶
Потребуется установка skeeks/cms-shop-cart-steps-widget
<?= \skeeks\cms\shopCartStepsWidget\ShopCartStepsWidget::widget(); ?>
Товары в корзине¶
Потребуется установка skeeks/cms-shop-cart-items-widget
<?= \skeeks\cms\shopCartItemsWidget\ShopCartItemsListWidget::widget([
'dataProvider' => new \yii\data\ActiveDataProvider([
'query' => \Yii::$app->shop->shopFuser->getShopBaskets(),
'pagination' =>
[
'defaultPageSize' => 100,
'pageSizeLimit' => [1, 100],
]
]),
]); ?>
Оформление заказа¶
Потребуется установка skeeks/cms-shop-checkout-widget
<? $checkout = \skeeks\cms\shopCheckout\ShopCheckoutWidget::begin([]); ?>
<? \skeeks\cms\shopCheckout\ShopCheckoutWidget::end(); ?>
Скидочные купоны¶
Потребуется установка skeeks/cms-shop-discount-coupon-widget
<?= \skeeks\cms\shopDiscountCoupon\ShopDiscountCouponWidget::widget(); ?>
Примеры¶
Страница полной корзины¶
Шаблон находится по адресу default\modules\shop\cart\cart.php
<?
\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
);
?>
<!--=== Content Part ===-->
<section class="sx-cart-layout bg-printair">
<div class="row">
<div class="container sx-border-block">
<? \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/>
<!--<span class="label label-warning">this is just an empty cart example</span>-->
</div>
</div>
<!-- /EMPTY CART -->
<? else: ?>
<?= \skeeks\cms\shopCartStepsWidget\ShopCartStepsWidget::widget(); ?>
<hr/>
<!-- LEFT -->
<div class="col-lg-9 col-sm-8">
<?= \skeeks\cms\shopCartItemsWidget\ShopCartItemsListWidget::widget([
'dataProvider' => new \yii\data\ActiveDataProvider([
'query' => \Yii::$app->shop->shopFuser->getShopBaskets(),
'pagination' =>
[
'defaultPageSize' => 100,
'pageSizeLimit' => [1, 100],
]
]),
]); ?>
</div>
<!-- RIGHT -->
<div class="col-lg-3 col-sm-4">
<? $url = \yii\helpers\Url::to(['/shop/cart/checkout']); ?>
<?= $this->render("_result", [
'submit' => <<<HTML
<a href="{$url}" class="btn btn-primary btn-lg btn-block size-15" data-pjax="0">
<i class="fa fa-mail-forward"></i> Оформить
</a>
HTML
]); ?>
</div>
<? endif; ?>
<? \skeeks\cms\modules\admin\widgets\Pjax::end() ?>
</div>
</div>
</section>
Страница оформления заказа¶
Шаблон находится по адресу default\modules\shop\cart\checkout.php
<?
\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
);
?>
<!--=== Content Part ===-->
<section class="sx-cart-layout bg-printair">
<div class="row">
<div class="container sx-border-block">
<? \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 />
<!--<span class="label label-warning">this is just an empty cart example</span>-->
</div>
</div>
<!-- /EMPTY CART -->
<? else: ?>
<?= \skeeks\cms\shopCartStepsWidget\ShopCartStepsWidget::widget(); ?>
<hr />
<!-- LEFT -->
<div class="col-lg-9 col-sm-8">
<!-- CART -->
<!-- cart content -->
<div id="cartContent">
<?
$this->registerCss(<<<CSS
.radio input[type=radio]
{
left: 0px;
margin-left: 0px;
}
.checkbox label, .radio label
{
padding-left: 0px;
}
CSS
);
?>
<? $checkout = \skeeks\cms\shopCheckout\ShopCheckoutWidget::begin([
'btnSubmitWrapperOptions' =>
[
'style' => 'display: none;'
]
]); ?>
<? \skeeks\cms\shopCheckout\ShopCheckoutWidget::end(); ?>
<div class="clearfix"></div>
</div>
<!-- /cart content -->
<!-- /CART -->
</div>
<!-- RIGHT -->
<div class="col-lg-3 col-sm-4">
<? $url = \yii\helpers\Url::to(['/shop/cart/payment']) ; ?>
<?= $this->render("_result", [
'submit' => <<<HTML
<a href="#" onclick="$('#{$checkout->formId}').submit(); return false;" class="btn btn-primary btn-lg btn-block size-15" data-pjax="0">
<i class="fa fa-mail-forward"></i> Оформить
</a>
HTML
]); ?>
</div>
<? endif; ?>
<? \skeeks\cms\modules\admin\widgets\Pjax::end() ?>
</div>
</div>
</section>
Финальная страница заказа¶
Шаблон находится по адресу default\modules\shop\order\finish.php
<section>
<div class="row">
<div class="col-sm-12">
<?= \skeeks\cms\shopCartStepsWidget\ShopCartStepsWidget::widget(); ?>
<hr />
<div class="box-light">
<!--=== Content Part ===-->
<div class="row">
<div class="col-lg-12 col-md-10">
<h4>Заказ №<?= $model->id; ?> от <?= \Yii::$app->formatter->asDatetime($model->created_at); ?> </h4>
<div class="table-responsive">
<?= \yii\widgets\DetailView::widget([
'model' => $model,
'template' => "<tr><th>{label}</th><td style='width:50%;'>{value}</td></tr>",
'attributes' => [
/*[ // the owner name of the model
'label' => 'Номер заказа',
'format' => 'raw',
'value' => $model->id,
],*/
/*[ // the owner name of the model
'label' => 'Создан',
'format' => 'raw',
'value' => \Yii::$app->formatter->asDatetime($model->created_at),
],*/
[ // the owner name of the model
'label' => 'Сумма заказа',
'format' => 'raw',
'value' => \Yii::$app->money->convertAndFormat($model->moneyOriginal),
],
[ // the owner name of the model
'label' => 'Способ оплаты',
'format' => 'raw',
'value' => $model->paySystem->name,
],
[
'label' => 'Доставка',
'format' => 'raw',
'value' => 'Курьер',
],
[ // the owner name of the model
'label' => 'Статус',
'format' => 'raw',
'value' => Html::tag('span', $model->status->name, ['style' => 'color: ' . $model->status->color]),
],
[ // the owner name of the model
'label' => 'Оплата',
'format' => 'raw',
'value' => $model->payed == 'Y' ? "<span style='color: green;'>Оплачен</span>" : "<span style='color: red;'>Не оплчаен</span>",
],
[ // the owner name of the model
'attribute' => 'Заказ отменен',
'label' => 'Заказ отменен',
'format' => 'raw',
'value' => $model->reason_canceled,
'visible' => $model->canceled == 'Y',
],
]
]) ?>
</div>
<h4>Данные покупателя: </h4>
<div class="table-responsive">
<?= \yii\widgets\DetailView::widget([
'model' => $model->buyer->relatedPropertiesModel,
'template' => "<tr><th style='width: 50%; '>{label}</th><td style='width:50%;'>{value}</td></tr>",
'attributes' => array_keys($model->buyer->relatedPropertiesModel->toArray())
]) ?>
</div>
<h4>Содержимое заказа: </h4>
<!-- cart content -->
<?= \skeeks\cms\shopCartItemsWidget\ShopCartItemsListWidget::widget([
'dataProvider' => new \yii\data\ActiveDataProvider([
'query' => $model->getShopBaskets(),
'pagination' =>
[
'defaultPageSize' => 100,
'pageSizeLimit' => [1, 100],
],
]),
'footerView' => false,
'itemView' => '@skeeks/cms/shopCartItemsWidget/views/items-list-order-item',
]); ?>
<!-- /cart content -->
<div class="toggle-transparent toggle-bordered-full clearfix">
<div class="toggle active" style="display: block;">
<div class="toggle-content" style="display: block;">
<span class="clearfix">
<span
class="pull-right"><?= \Yii::$app->money->convertAndFormat($model->moneyOriginal); ?></span>
<strong class="pull-left">Товаров:</strong>
</span>
<? if ($model->moneyDiscount->getValue() > 0) : ?>
<span class="clearfix">
<span
class="pull-right"><?= \Yii::$app->money->convertAndFormat($model->moneyDiscount); ?></span>
<span class="pull-left">Скидка:</span>
</span>
<? endif; ?>
<? if ($model->moneyDelivery->getValue() > 0) : ?>
<span class="clearfix">
<span
class="pull-right"><?= \Yii::$app->money->convertAndFormat($model->moneyDelivery); ?></span>
<span class="pull-left">Доставка:</span>
</span>
<? endif; ?>
<? if ($model->moneyVat->getValue() > 0) : ?>
<span class="clearfix">
<span
class="pull-right"><?= \Yii::$app->money->convertAndFormat($model->moneyVat); ?></span>
<span class="pull-left">Налог:</span>
</span>
<? endif; ?>
<? if ($model->weight > 0) : ?>
<span class="clearfix">
<span class="pull-right"><?= $model->weight; ?> г.</span>
<span class="pull-left">Вес:</span>
</span>
<? endif; ?>
<hr/>
<span class="clearfix">
<span
class="pull-right size-20"><?= \Yii::$app->money->convertAndFormat($model->money); ?></span>
<strong class="pull-left">ИТОГ:</strong>
</span>
<hr/>
<? if ($model->allow_payment == \skeeks\cms\components\Cms::BOOL_Y) : ?>
<? if ($model->paySystem->paySystemHandler && $model->payed == 'N') : ?>
<?= Html::a("Оплатить", \yii\helpers\Url::to(['/shop/order/finish-pay', 'key' => $model->key]), [
'class' => 'btn btn-lg btn-primary'
]); ?>
<? else : ?>
<? endif; ?>
<? else : ?>
<? if ($model->paySystem->paySystemHandler) : ?>
В настоящий момент, заказ находится в стадии проверки и сборки. Его можно будет оплатить позже.
<? endif; ?>
<? endif; ?>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
Содержимое шаблона default\modules\shop\cart\_result.php
<div class="toggle-transparent toggle-bordered-full clearfix">
<div class="toggle nomargin-top">
<label>Купон</label>
<div class="toggle-content" style="display: none;">
<?= \skeeks\cms\shopDiscountCoupon\ShopDiscountCouponWidget::widget(); ?>
</div>
</div>
</div>
<div class="toggle-transparent toggle-bordered-full clearfix">
<div class="toggle active" style="display: block;">
<div class="toggle-content" style="display: block;">
<span class="clearfix">
<span class="pull-right"><?= \Yii::$app->money->convertAndFormat(\Yii::$app->shop->shopFuser->moneyOriginal); ?></span>
<strong class="pull-left">Товаров:</strong>
</span>
<? if (\Yii::$app->shop->shopFuser->moneyDiscount->getValue() > 0) : ?>
<span class="clearfix">
<span class="pull-right"><?= \Yii::$app->money->convertAndFormat(\Yii::$app->shop->shopFuser->moneyDiscount); ?></span>
<span class="pull-left">Скидка:</span>
</span>
<? endif; ?>
<? if (\Yii::$app->shop->shopFuser->moneyDelivery->getValue() > 0) : ?>
<span class="clearfix">
<span class="pull-right"><?= \Yii::$app->money->convertAndFormat(\Yii::$app->shop->shopFuser->moneyDelivery); ?></span>
<span class="pull-left">Доставка:</span>
</span>
<? endif; ?>
<? if (\Yii::$app->shop->shopFuser->moneyVat->getValue() > 0) : ?>
<span class="clearfix">
<span class="pull-right"><?= \Yii::$app->money->convertAndFormat(\Yii::$app->shop->shopFuser->moneyVat); ?></span>
<span class="pull-left">Налог:</span>
</span>
<? endif; ?>
<? if (\Yii::$app->shop->shopFuser->weight > 0) : ?>
<span class="clearfix">
<span class="pull-right"><?= \Yii::$app->shop->shopFuser->weight; ?> г.</span>
<span class="pull-left">Вес:</span>
</span>
<? endif; ?>
<hr />
<span class="clearfix">
<span class="pull-right size-20"><?= \Yii::$app->money->convertAndFormat(\Yii::$app->shop->shopFuser->money); ?></span>
<strong class="pull-left">ИТОГ:</strong>
</span>
<hr />
<?= $submit; ?>
</div>
</div>
</div>
FAQ¶
Разные вопросы¶
Тут временно публикуются различные полезные примеры, которые можно использовать на своих сайтах. Куча разных несвязных примеров, которые могут быть полезны. Позже это будет структурированно и разнесено
Как правильно сделать resize изображений?¶
Вот так можно получить ссылку на resize изображения.
echo \Yii::$app->imaging->thumbnailUrlOnRequest($model->image ? $model->image->src : null,
new \skeeks\cms\components\imaging\filters\Thumbnail([
'w' => 0,
'h' => 200,
]), $model->code
);
Как можно загрузить файл в хранилище?¶
Скачать с удаленного сервер и загрузить в хранилище
$imageUrl = 'http://test.ru/test.jpg';
$element = \skeeks\cms\models\CmsContentElement::find(10);
$file = \Yii::$app->storage->upload($imageUrl, [
'name' => $element->name
]);
$element->link('image', $file);
Как правильно поймать событие отправки формы в конструкторе¶
Чаще всего, возниает необходимость отлавливать события успешной отправки формы, и сообщать о них в yandex или google метрику. Для этого предлагается использовать следующий код:
<?
\yii\bootstrap\Modal::begin([
'header' => 'Обратная связь',
'id' => 'sx-feedback',
'toggleButton' => false,
'size' => \yii\bootstrap\Modal::SIZE_DEFAULT
]);
?>
<?= \skeeks\modules\cms\form2\cmsWidgets\form2\FormWidget::widget([
'form_code' => 'feedback',
'namespace' => 'FormWidget-feedback',
'viewFile' => 'with-messages',
'successJs' => new \yii\web\JsExpression(<<<JS
console.log('successJs');
//yaCounter17836507.reachGoal('btn-send');
JS
),
'errorJs' => new \yii\web\JsExpression(<<<JS
console.log('errorJs');
JS
),
//'viewFile' => '@app/views/widgets/FormWidget/fiz-connect'
]); ?>
<?
\yii\bootstrap\Modal::end();
?>
Как отметить обязательные поля в формах *
¶
Для того чтобы добавить во все формы генерируемые стандартными средствами yii2, звездочки *
обязтельных полей. Глобально на стринце можно подключить js и css.
$(function()
{
$('.form-group.required label').each(function()
{
$(this).append($('<span class="sx-from-required">').text(' *'));
});
});
.sx-from-required
{
color: red;
font-weight: bold;
}
Как изменить timeout pjax?¶
Для того, чтобы изменить timeout pjax, глобально во всех виджетах pjax проекта, можно добавить код javascript:
$(function()
{
$.pjax.defaults.timeout = 30000;
});
Как вызвать событие в момент окончания работы pjax-скрипта с определенным id?¶
Для того, чтобы изменить вызвать событие в момент окончания работы pjax-скрипта, можно добавить код javascript:
$(document).on('pjax:complete', function (e) {
//любой pjax на странице закончился
if (e.target.id == self.get('id')) {
//pjax с конкретным id закончился $(e.target)
}
});
Оптимальный robots.txt¶
User-agent: *
Disallow: /~*
Disallow: /search*
Disallow: *&SearchProductsModel*
Disallow: *?SearchProductsModel*
Disallow: *&SearchRelatedPropertiesModel*
Disallow: *?SearchRelatedPropertiesModel*
Disallow: *&ProductFilters*
Disallow: *?ProductFilters*
Clean-Param: from&_openstat&utm_source&utm_medium&utm_campaign&utm_content&utm_term&pm_source&pm_block&pm_position&clid&yclid&ymclid&frommarket&text
Host: https://your-site.com
Sitemap: https://your-site.com/sitemap.xml
Как включить js, css и html оптимизацию?¶
Для этих целей существуют дополнительное расширение, которое обычно уже стоит в базовых проектах.
https://github.com/skeeks-cms/cms-assets-auto-compress
Включение и настройка оптимизаций, проивзодится через систему управления сайтом:
Перенос проекта на другой хостинг¶
Архивация¶
Создать актуальный архив базы данных
php yii dbDumper/mysql/dump
Создать архив вашего проекта
Восстановление¶
1. Скачать файлы проекта¶
Развернуть архив, или склонировать проект из git репозитория
2. Установка composer и зависимостей¶
# Download latest version of composer in project
curl -sS https://getcomposer.org/installer | COMPOSER_HOME=.composer php
# Download dependency
COMPOSER_HOME=.composer php composer.phar install -o
3. Configuring the database¶
Прописать коннект к базе данных common/config/db.php
4. Installation of migrations¶
#Installation of ready-dump
php yii dbDumper/mysql/restore