diff --git a/.editorconfig b/.editorconfig index d705472..abb6141 100644 --- a/.editorconfig +++ b/.editorconfig @@ -34,8 +34,8 @@ indent_style=space indent_size=2 [{*.hphp,*.phtml,*.module,*.php,*.php5,*.php4,*.inc}] -indent_style=tab -tab_width=4 +indent_style=space +indent_size=4 [*.less] indent_style=space diff --git a/README.md b/README.md index b116917..bf9ba03 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,5 @@ -# ZxCMS - Yii2 site management system +# Zertex CMS - Site management system based on Yii2 framework -Yii 2 Advanced Project Template is a skeleton [Yii 2](http://www.yiiframework.com/) application best for -developing complex Web applications with multiple tiers. - -The template includes three tiers: front end, back end, and console, each of which -is a separate Yii application. - -The template is designed to work in a team development environment. It supports -deploying the application in different environments. +## Deep alpha version Documentation is at [docs/guide/README.md](docs/guide/README.md). - -DIRECTORY STRUCTURE -------------------- - -``` -common - config/ contains shared configurations - mail/ contains view files for e-mails - models/ contains model classes used in both backend and frontend - tests/ contains tests for common classes -console - config/ contains console configurations - controllers/ contains console controllers (commands) - migrations/ contains database migrations - models/ contains console-specific model classes - runtime/ contains files generated during runtime -backend - assets/ contains application assets such as JavaScript and CSS - config/ contains backend configurations - controllers/ contains Web controller classes - models/ contains backend-specific model classes - runtime/ contains files generated during runtime - tests/ contains tests for backend application - views/ contains view files for the Web application - web/ contains the entry script and Web resources -frontend - assets/ contains application assets such as JavaScript and CSS - config/ contains frontend configurations - controllers/ contains Web controller classes - models/ contains frontend-specific model classes - runtime/ contains files generated during runtime - tests/ contains tests for frontend application - views/ contains view files for the Web application - web/ contains the entry script and Web resources - widgets/ contains frontend widgets -vendor/ contains dependent 3rd-party packages -environments/ contains environment-based overrides -``` diff --git a/backend/config/main.php b/backend/config/main.php index 64ca3e4..e11db52 100644 --- a/backend/config/main.php +++ b/backend/config/main.php @@ -7,23 +7,23 @@ $params = array_merge( ); return [ - 'id' => 'app-backend', - 'language' => 'ru', - 'basePath' => dirname(__DIR__), - 'aliases' => [ - '@staticRoot' => $params['staticPath'], - '@static' => $params['staticHostInfo'], + 'id' => 'app-backend', + 'language' => 'ru', + 'basePath' => dirname(__DIR__), + 'aliases' => [ + '@staticRoot' => $params['staticPath'], + '@static' => $params['staticHostInfo'], ], 'controllerNamespace' => 'backend\controllers', - 'bootstrap' => [ - 'log', - 'common\bootstrap\SetUp', - 'backend\bootstrap\SetUp', + 'bootstrap' => [ + 'log', + 'common\bootstrap\SetUp', + 'backend\bootstrap\SetUp', ], - 'modules' => [ - 'elfinder' => [ - 'class' => 'core\components\elfinder\ElFinderModule', - ], + 'modules' => [ + 'elfinder' => [ + 'class' => 'core\components\elfinder\ElFinderModule', + ], ], /*'controllerMap' => [ 'elfinder' => [ @@ -46,109 +46,109 @@ return [ ], ], ],*/ - 'controllerMap' => [ - 'elfinder' => [ - 'class' => 'zertex\elfinder\Controller', - 'access' => ['@'], - 'plugin' => [ - [ - 'class'=>'\zertex\elfinder\plugin\Sluggable', - 'lowercase' => true, - 'replacement' => '-' - ] - ], - 'roots' => [ - [ - 'baseUrl'=>'@static', - 'basePath'=>'@staticRoot', - 'path' => 'files', - 'name' => 'Global' - ], - ], - ], + 'controllerMap' => [ + 'elfinder' => [ + 'class' => 'zertex\elfinder\Controller', + 'access' => ['@'], + 'plugin' => [ + [ + 'class' => '\zertex\elfinder\plugin\Sluggable', + 'lowercase' => true, + 'replacement' => '-' + ] + ], + 'roots' => [ + [ + 'baseUrl' => '@static', + 'basePath' => '@staticRoot', + 'path' => 'files', + 'name' => 'Global' + ], + ], + ], ], - 'components' => [ - 'request' => [ - 'baseUrl' => '', - 'csrfParam' => '_csrf-backend', - 'cookieValidationKey' => $params['cookieValidationKey'], - ], - 'user' => [ - 'identityClass' => 'common\auth\Identity', - 'enableAutoLogin' => true, - 'identityCookie' => [ - 'name' => '_identity', - 'httpOnly' => true, - 'domain' => $params['cookieDomain'], - ], - 'loginUrl' => ['auth/login'], - ], - 'session' => [ - 'name' => '_session', - 'class' => 'yii\web\DbSession', - 'writeCallback' => function($session){ - return [ - 'user_id' => Yii::$app->user->id - ]; - }, - 'cookieParams' => [ - 'domain' => $params['cookieDomain'], - 'httpOnly' => true, - ], - ], - 'log' => [ + 'components' => [ + 'request' => [ + 'baseUrl' => '', + 'csrfParam' => '_csrf-backend', + 'cookieValidationKey' => $params['cookieValidationKey'], + ], + 'user' => [ + 'identityClass' => 'common\auth\Identity', + 'enableAutoLogin' => true, + 'identityCookie' => [ + 'name' => '_identity', + 'httpOnly' => true, + 'domain' => $params['cookieDomain'], + ], + 'loginUrl' => ['auth/login'], + ], + 'session' => [ + 'name' => '_session', + 'class' => 'yii\web\DbSession', + 'writeCallback' => function ($session) { + return [ + 'user_id' => Yii::$app->user->id + ]; + }, + 'cookieParams' => [ + 'domain' => $params['cookieDomain'], + 'httpOnly' => true, + ], + ], + 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, - 'targets' => [ + 'targets' => [ [ - 'class' => 'yii\log\FileTarget', + 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], ], ], - 'errorHandler' => [ + 'errorHandler' => [ 'errorAction' => 'site/error', ], - 'backendUrlManager' => require __DIR__ . '/urlManager.php', - 'frontendUrlManager' => require __DIR__ . '/../../frontend/config/urlManager.php', - 'urlManager' => function () { - return Yii::$app->get('backendUrlManager'); - }, - 'i18n' => [ - 'translations' => [ - 'main' => [ - 'class' => 'yii\i18n\PhpMessageSource', - 'basePath' => '@backend/messages', - ], - 'dashboard' => [ - 'class' => 'yii\i18n\PhpMessageSource', - 'basePath' => '@backend/messages', - ], - 'menu' => [ - 'class' => 'yii\i18n\PhpMessageSource', - 'basePath' => '@backend/messages', - ], - 'page' => [ - 'class' => 'yii\i18n\PhpMessageSource', - 'basePath' => '@backend/messages', - ], - 'user' => [ - 'class' => 'yii\i18n\PhpMessageSource', - 'basePath' => '@backend/messages', - ], - 'post' => [ - 'class' => 'yii\i18n\PhpMessageSource', - 'basePath' => '@backend/messages', - ], - 'buttons' => [ - 'class' => 'yii\i18n\PhpMessageSource', - 'basePath' => '@backend/messages', - ], - 'slider' => [ - 'class' => 'yii\i18n\PhpMessageSource', - 'basePath' => '@backend/messages', - ], - ], - ], + 'backendUrlManager' => require __DIR__ . '/urlManager.php', + 'frontendUrlManager' => require __DIR__ . '/../../frontend/config/urlManager.php', + 'urlManager' => function () { + return Yii::$app->get('backendUrlManager'); + }, + 'i18n' => [ + 'translations' => [ + 'main' => [ + 'class' => 'yii\i18n\PhpMessageSource', + 'basePath' => '@backend/messages', + ], + 'dashboard' => [ + 'class' => 'yii\i18n\PhpMessageSource', + 'basePath' => '@backend/messages', + ], + 'menu' => [ + 'class' => 'yii\i18n\PhpMessageSource', + 'basePath' => '@backend/messages', + ], + 'page' => [ + 'class' => 'yii\i18n\PhpMessageSource', + 'basePath' => '@backend/messages', + ], + 'user' => [ + 'class' => 'yii\i18n\PhpMessageSource', + 'basePath' => '@backend/messages', + ], + 'post' => [ + 'class' => 'yii\i18n\PhpMessageSource', + 'basePath' => '@backend/messages', + ], + 'buttons' => [ + 'class' => 'yii\i18n\PhpMessageSource', + 'basePath' => '@backend/messages', + ], + 'slider' => [ + 'class' => 'yii\i18n\PhpMessageSource', + 'basePath' => '@backend/messages', + ], + ], + ], ], - 'params' => $params, + 'params' => $params, ]; diff --git a/backend/messages/ru/user.php b/backend/messages/ru/user.php index 6e19f35..9c1c353 100644 --- a/backend/messages/ru/user.php +++ b/backend/messages/ru/user.php @@ -39,4 +39,5 @@ return [ 'Registered: {date}' => 'Дата регистрации: {date}', 'Remember Me' => 'Запомнить меня', 'Dashboard Language' => 'Язык панели управления', + 'Undefined user or password.' => 'Ошибка в имени или пароле', ]; \ No newline at end of file diff --git a/common/config/main.php b/common/config/main.php index 5ce84ec..d69dfc0 100644 --- a/common/config/main.php +++ b/common/config/main.php @@ -1,51 +1,51 @@ [ + 'aliases' => [ '@bower' => '@vendor/bower-asset', '@npm' => '@vendor/npm-asset', ], - 'vendorPath' => dirname(dirname(__DIR__)) . '/vendor', - 'controllerMap' => [ + 'vendorPath' => dirname(dirname(__DIR__)) . '/vendor', + 'controllerMap' => [ // Common migrations for the whole application 'migrate' => [ - 'class' => 'yii\console\controllers\MigrateController', + 'class' => 'yii\console\controllers\MigrateController', 'migrationPath' => [ - '@console/migrations', + '@console/migrations', ], ], - ], - 'components' => [ - 'cache' => [ - 'class' => 'yii\caching\FileCache', - 'cachePath' => '@common/runtime/cache', - ], - 'authManager' => [ - 'class' => 'yii\rbac\DbManager', - 'itemTable' => '{{%auth_items}}', - 'itemChildTable' => '{{%auth_item_children}}', - 'assignmentTable' => '{{%auth_assignments}}', - 'ruleTable' => '{{%auth_rules}}', + ], + 'components' => [ + 'cache' => [ + 'class' => 'yii\caching\FileCache', + 'cachePath' => '@common/runtime/cache', + ], + 'authManager' => [ + 'class' => 'yii\rbac\DbManager', + 'itemTable' => '{{%auth_items}}', + 'itemChildTable' => '{{%auth_item_children}}', + 'assignmentTable' => '{{%auth_assignments}}', + 'ruleTable' => '{{%auth_rules}}', + ], + 'queue' => [ + //'class' => 'yii\queue\redis\Queue', + //'as log' => 'yii\queue\LogBehavior', + 'class' => \yii\queue\file\Queue::class, + //'path' => '@runtime/queue', + 'path' => '@common/runtime/queue', + ], + 'avatar' => [ + 'class' => \zertex\avatar_generator\AvatarGenerator::class, + 'images_folder' => '@staticRoot/images/avatars', + 'images_url' => '@static/images/avatars', + 'size_width' => 300, // default: 300 + 'font_size' => 200, // default: 200 + 'salt' => 'my_cms_salt', // salt for image file names + 'texture' => ['sun', 'rain'], // texture name + 'texture_over_image' => false, + 'text_over_image' => false, + ], + 'moduleManager' => [ + 'class' => \core\components\modules\ModuleManager::class, ], - 'queue' => [ - //'class' => 'yii\queue\redis\Queue', - //'as log' => 'yii\queue\LogBehavior', - 'class' => \yii\queue\file\Queue::class, - //'path' => '@runtime/queue', - 'path' => '@common/runtime/queue', - ], - 'avatar' => [ - 'class' => \zertex\avatar_generator\AvatarGenerator::class, - 'images_folder' => '@staticRoot/images/avatars', - 'images_url' => '@static/images/avatars', - 'size_width' => 300, // default: 300 - 'font_size' => 200, // default: 200 - 'salt' => 'my_cms_salt', // salt for image file names - 'texture' => ['sun', 'rain'], // texture name - 'texture_over_image' => false, - 'text_over_image' => false, - ], - 'moduleManager' => [ - 'class' => \core\components\modules\ModuleManager::class, - ], ], ]; diff --git a/common/modules/banners/BannersModule.php b/common/modules/banners/BannersModule.php index 9809133..f495a2e 100644 --- a/common/modules/banners/BannersModule.php +++ b/common/modules/banners/BannersModule.php @@ -5,7 +5,6 @@ namespace common\modules\banners; use core\components\modules\ModuleInterface; use yii\helpers\ArrayHelper; - /** * blog module definition class */ @@ -26,52 +25,52 @@ class BannersModule extends \yii\base\Module implements ModuleInterface // custom initialization code goes here } - public function bootstrap($app) - { - // add migration path - $app->controllerMap['migrate']['migrationPath'][] = '@common/modules/banners/migrations'; + public function bootstrap($app) + { + // add migration path + $app->controllerMap['migrate']['migrationPath'][] = '@common/modules/banners/migrations'; - // add search rules - $app->params['search_rules'][] = "SELECT title, title as content, CONCAT('/banners/manage/banner/view/', id) AS url FROM {{banners}}"; + // add search rules + $app->params['search_rules'][] = "SELECT title, title as content, CONCAT('/banners/manage/banner/view/', id) AS url FROM {{banners}}"; - $app->getUrlManager()->addRules([ - 'banner/view' => 'banners/banner/view', - 'banner/click' => 'banners/banner/click', - ]); + $app->getUrlManager()->addRules([ + 'banner/view' => 'banners/banner/view', + 'banner/click' => 'banners/banner/click', + ]); - $app->getUrlManager()->addRules([ - 'banners/manage/banner/view/' => 'banners/manage/banner/view', - ]); + $app->getUrlManager()->addRules([ + 'banners/manage/banner/view/' => 'banners/manage/banner/view', + ]); - // add languages - $app->getI18n()->translations = ArrayHelper::merge($app->getI18n()->translations, [ - 'banners' => [ - 'class' => 'yii\i18n\PhpMessageSource', - 'basePath' => '@common/modules/banners/messages', - ], - ]); + // add languages + $app->getI18n()->translations = ArrayHelper::merge($app->getI18n()->translations, [ + 'banners' => [ + 'class' => 'yii\i18n\PhpMessageSource', + 'basePath' => '@common/modules/banners/messages', + ], + ]); - // add menu items - if (basename(\Yii::$app->getBasePath()) === 'backend') { - $app->params['adminMenu'][] = [ - 'label' => \Yii::t( 'banners', 'Banners' ), - 'icon' => 'flag', - 'items' => [ - [ - 'label' => \Yii::t( 'banners', 'Banners' ), - 'icon' => 'caret-right', - 'url' => [ '/banners/manage/banner/index' ], - //'active' => \Yii::$app->controller->getUniqueId() == 'banners/manage/banner' - ], - [ - 'label' => \Yii::t( 'banners', 'Places' ), - 'icon' => 'caret-right', - 'url' => [ '/banners/manage/place/index' ], - //'active' => \Yii::$app->controller->getUniqueId() == 'banners/manage/place' - ], - ], - 'visible' => $app->user->can( 'admin' ) || \Yii::$app->user->can( 'BannersManagement' ), - ]; - } - } + // add menu items + if (basename(\Yii::$app->getBasePath()) === 'backend') { + $app->params['adminMenu'][] = [ + 'label' => \Yii::t('banners', 'Banners'), + 'icon' => 'flag', + 'items' => [ + [ + 'label' => \Yii::t('banners', 'Banners'), + 'icon' => 'caret-right', + 'url' => ['/banners/manage/banner/index'], + //'active' => \Yii::$app->controller->getUniqueId() == 'banners/manage/banner' + ], + [ + 'label' => \Yii::t('banners', 'Places'), + 'icon' => 'caret-right', + 'url' => ['/banners/manage/place/index'], + //'active' => \Yii::$app->controller->getUniqueId() == 'banners/manage/place' + ], + ], + 'visible' => $app->user->can('admin') || \Yii::$app->user->can('BannersManagement'), + ]; + } + } } diff --git a/common/modules/banners/controllers/BannerController.php b/common/modules/banners/controllers/BannerController.php index 466b659..4107068 100644 --- a/common/modules/banners/controllers/BannerController.php +++ b/common/modules/banners/controllers/BannerController.php @@ -6,7 +6,6 @@ namespace common\modules\banners\controllers; - use common\modules\banners\entities\Banner; use common\modules\banners\services\BannerManageService; use frontend\components\FrontendController; @@ -14,36 +13,37 @@ use yii\web\NotFoundHttpException; class BannerController extends FrontendController { - private $service; - - public function __construct( string $id, $module, BannerManageService $service, array $config = [] ) { - parent::__construct( $id, $module, $config ); - $this->service = $service; - } - - public function actionView() - { - $id = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT); - if (\Yii::$app->request->isAjax && $id) { - $banner = $this->findModel( $id ); - $this->service->addView( $banner ); - } - } - - public function actionClick() - { - $id = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT); - if (\Yii::$app->request->isAjax && $id) { - $banner = $this->findModel( $id ); - $this->service->addClick( $banner ); - } - } - - protected function findModel($id): Banner - { - if (($model = Banner::findOne($id)) !== null) { - return $model; - } - throw new NotFoundHttpException('The requested banner does not exist.'); - } -} \ No newline at end of file + private $_service; + + public function __construct(string $id, $module, BannerManageService $service, array $config = []) + { + parent::__construct($id, $module, $config); + $this->_service = $service; + } + + public function actionView() + { + $id = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT); + if (\Yii::$app->request->isAjax && $id) { + $banner = $this->findModel($id); + $this->_service->addView($banner); + } + } + + public function actionClick() + { + $id = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT); + if (\Yii::$app->request->isAjax && $id) { + $banner = $this->findModel($id); + $this->_service->addClick($banner); + } + } + + protected function findModel($id): Banner + { + if (($model = Banner::findOne($id)) !== null) { + return $model; + } + throw new NotFoundHttpException('The requested banner does not exist.'); + } +} diff --git a/common/modules/banners/controllers/manage/BannerController.php b/common/modules/banners/controllers/manage/BannerController.php index fac3c1c..ce0cec6 100644 --- a/common/modules/banners/controllers/manage/BannerController.php +++ b/common/modules/banners/controllers/manage/BannerController.php @@ -14,32 +14,32 @@ use Yii; class BannerController extends Controller { - private $service; + private $_service; public function __construct($id, $module, BannerManageService $service, $config = []) { parent::__construct($id, $module, $config); - $this->service = $service; + $this->_service = $service; } public function behaviors(): array { return [ - 'access' => [ - 'class' => AccessControl::class, - 'rules' => [ - [ - 'allow' => true, - 'roles' => ['BannersManagement'], - ], - [ // all the action are accessible to admin - 'allow' => true, - 'roles' => ['admin'], - ], - ], - ], - 'verbs' => [ - 'class' => VerbFilter::class, + 'access' => [ + 'class' => AccessControl::class, + 'rules' => [ + [ + 'allow' => true, + 'roles' => ['BannersManagement'], + ], + [ // all the action are accessible to admin + 'allow' => true, + 'roles' => ['admin'], + ], + ], + ], + 'verbs' => [ + 'class' => VerbFilter::class, 'actions' => [ 'delete' => ['POST'], ], @@ -52,21 +52,21 @@ class BannerController extends Controller */ public function actionIndex() { - $searchModel = new BannerSearch(); + $searchModel = new BannerSearch(); $dataProvider = $searchModel->search(Yii::$app->request->queryParams); return $this->render('index', [ - 'searchModel' => $searchModel, + 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, ]); } - /** - * @param $id - * - * @return string - * @throws NotFoundHttpException - */ + /** + * @param $id + * + * @return string + * @throws NotFoundHttpException + */ public function actionView($id) { return $this->render('view', [ @@ -83,36 +83,38 @@ class BannerController extends Controller if ($form->load(Yii::$app->request->post()) && $form->validate()) { try { - $form = $this->service->create($form); + $form = $this->_service->create($form); + return $this->redirect(['view', 'id' => $form->id]); } catch (\DomainException $e) { Yii::$app->errorHandler->logException($e); Yii::$app->session->setFlash('error', $e->getMessage()); } + } else { + $form->active = $form->active ?: Banner::STATUS_ACTIVE; } - else { - $form->active = $form->active ?: Banner::STATUS_ACTIVE; - } + return $this->render('create', [ 'model' => $form, ]); } - /** - * @param $id - * - * @return string|\yii\web\Response - * @throws NotFoundHttpException - */ + /** + * @param $id + * + * @return string|\yii\web\Response + * @throws NotFoundHttpException + */ public function actionUpdate($id) { - $banner = $this->findModel($id); - $form = new BannerForm($banner); - $form->start_at = date('d.m.Y H:i:s', $form->start_at); - $form->end_at = date('d.m.Y H:i:s', $form->end_at); + $banner = $this->findModel($id); + $form = new BannerForm($banner); + $form->start_at = date('d.m.Y H:i:s', $form->start_at); + $form->end_at = date('d.m.Y H:i:s', $form->end_at); if ($form->load(Yii::$app->request->post()) && $form->validate()) { try { - $this->service->edit($banner->id, $form); + $this->_service->edit($banner->id, $form); + return $this->redirect(['view', 'id' => $banner->id]); } catch (\DomainException $e) { Yii::$app->errorHandler->logException($e); @@ -121,28 +123,31 @@ class BannerController extends Controller } return $this->render('update', [ - 'model' => $form, + 'model' => $form, 'banner' => $banner, ]); } /** * @param integer $id + * * @return mixed */ public function actionDelete($id) { try { - $this->service->remove($id); + $this->_service->remove($id); } catch (\DomainException $e) { Yii::$app->errorHandler->logException($e); Yii::$app->session->setFlash('error', $e->getMessage()); } + return $this->redirect(['index']); } /** * @param integer $id + * * @return Banner the loaded model * @throws NotFoundHttpException if the model cannot be found */ diff --git a/common/modules/banners/controllers/manage/PlaceController.php b/common/modules/banners/controllers/manage/PlaceController.php index be2b5d5..f8f8b06 100644 --- a/common/modules/banners/controllers/manage/PlaceController.php +++ b/common/modules/banners/controllers/manage/PlaceController.php @@ -14,32 +14,32 @@ use Yii; class PlaceController extends Controller { - private $service; + private $_service; public function __construct($id, $module, BannerPlaceManageService $service, $config = []) { parent::__construct($id, $module, $config); - $this->service = $service; + $this->_service = $service; } public function behaviors(): array { return [ - 'access' => [ - 'class' => AccessControl::class, - 'rules' => [ - [ - 'allow' => true, - 'roles' => ['BannersManagement'], - ], - [ // all the action are accessible to admin - 'allow' => true, - 'roles' => ['admin'], - ], - ], - ], - 'verbs' => [ - 'class' => VerbFilter::class, + 'access' => [ + 'class' => AccessControl::class, + 'rules' => [ + [ + 'allow' => true, + 'roles' => ['BannersManagement'], + ], + [ // all the action are accessible to admin + 'allow' => true, + 'roles' => ['admin'], + ], + ], + ], + 'verbs' => [ + 'class' => VerbFilter::class, 'actions' => [ 'delete' => ['POST'], ], @@ -52,21 +52,21 @@ class PlaceController extends Controller */ public function actionIndex() { - $searchModel = new PlaceSearch(); + $searchModel = new PlaceSearch(); $dataProvider = $searchModel->search(Yii::$app->request->queryParams); return $this->render('index', [ - 'searchModel' => $searchModel, + 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, ]); } - /** - * @param $id - * - * @return string - * @throws NotFoundHttpException - */ + /** + * @param $id + * + * @return string + * @throws NotFoundHttpException + */ public function actionView($id) { return $this->render('view', [ @@ -82,27 +82,28 @@ class PlaceController extends Controller $form = new BannerPlaceForm(); if ($form->load(Yii::$app->request->post()) && $form->validate()) { try { - $form = $this->service->create($form); + $form = $this->_service->create($form); + return $this->redirect(['view', 'id' => $form->id]); } catch (\DomainException $e) { Yii::$app->errorHandler->logException($e); Yii::$app->session->setFlash('error', $e->getMessage()); } + } else { + $form->active = $form->active ?: BannerPlace::STATUS_ACTIVE; } - else { - $form->active = $form->active ?: BannerPlace::STATUS_ACTIVE; - } + return $this->render('create', [ 'model' => $form, ]); } - /** - * @param $id - * - * @return string|\yii\web\Response - * @throws NotFoundHttpException - */ + /** + * @param $id + * + * @return string|\yii\web\Response + * @throws NotFoundHttpException + */ public function actionUpdate($id) { $place = $this->findModel($id); @@ -110,7 +111,8 @@ class PlaceController extends Controller $form = new BannerPlaceForm($place); if ($form->load(Yii::$app->request->post()) && $form->validate()) { try { - $this->service->edit($place->id, $form); + $this->_service->edit($place->id, $form); + return $this->redirect(['view', 'id' => $place->id]); } catch (\DomainException $e) { Yii::$app->errorHandler->logException($e); @@ -126,21 +128,24 @@ class PlaceController extends Controller /** * @param integer $id + * * @return mixed */ public function actionDelete($id) { try { - $this->service->remove($id); + $this->_service->remove($id); } catch (\DomainException $e) { Yii::$app->errorHandler->logException($e); Yii::$app->session->setFlash('error', $e->getMessage()); } + return $this->redirect(['index']); } /** * @param integer $id + * * @return BannerPlace the loaded model * @throws NotFoundHttpException if the model cannot be found */ diff --git a/common/modules/banners/entities/Banner.php b/common/modules/banners/entities/Banner.php index 7a5f1df..39a0572 100644 --- a/common/modules/banners/entities/Banner.php +++ b/common/modules/banners/entities/Banner.php @@ -8,7 +8,6 @@ use yii\db\ActiveRecord; use yii\web\UploadedFile; use Yii; - /** * This is the model class for table "banners". * @@ -32,49 +31,70 @@ use Yii; */ class Banner extends ActiveRecord { - const STATUS_DRAFT = 0; - const STATUS_ACTIVE = 1; - - const TARGET_BLANK = '_blank'; - const TARGET_SELF = '_self'; - - const FILE_ORIGINAL_PATH = '@staticRoot/origin/banners'; - - public static function create($title, $image, $url, $target, $start_at, $end_at, $include_urls, $exclude_urls, $active, $place_id): self - { - $banner = new static(); - $banner->title = $title; - $banner->image = $image; - $banner->url = $url; - $banner->target = $target; - $banner->start_at = $start_at; - $banner->end_at = $end_at; - $banner->include_urls = $include_urls; - $banner->exclude_urls = $exclude_urls; - $banner->active = $active; - $banner->place_id = $place_id; - return $banner; - } - - public function setImage(UploadedFile $image): void - { - $this->image = $image; - } - - - public function edit($title, $image, $url, $target, $start_at, $end_at, $include_urls, $exclude_urls, $active, $place_id): void - { - $this->title = $title; - $this->image = $image; - $this->url = $url; - $this->target = $target; - $this->start_at = $start_at; - $this->end_at = $end_at; - $this->include_urls = $include_urls; - $this->exclude_urls = $exclude_urls; - $this->active = $active; - $this->place_id = $place_id; - } + const STATUS_DRAFT = 0; + const STATUS_ACTIVE = 1; + + const TARGET_BLANK = '_blank'; + const TARGET_SELF = '_self'; + + const FILE_ORIGINAL_PATH = '@staticRoot/origin/banners'; + + public static function create( + $title, + $image, + $url, + $target, + $start_at, + $end_at, + $include_urls, + $exclude_urls, + $active, + $place_id + ): self { + $banner = new static(); + $banner->title = $title; + $banner->image = $image; + $banner->url = $url; + $banner->target = $target; + $banner->start_at = $start_at; + $banner->end_at = $end_at; + $banner->include_urls = $include_urls; + $banner->exclude_urls = $exclude_urls; + $banner->active = $active; + $banner->place_id = $place_id; + + return $banner; + } + + public function setImage(UploadedFile $image): void + { + $this->image = $image; + } + + + public function edit( + $title, + $image, + $url, + $target, + $start_at, + $end_at, + $include_urls, + $exclude_urls, + $active, + $place_id + ): void { + $this->title = $title; + $this->image = $image; + $this->url = $url; + $this->target = $target; + $this->start_at = $start_at; + $this->end_at = $end_at; + $this->include_urls = $include_urls; + $this->exclude_urls = $exclude_urls; + $this->active = $active; + $this->place_id = $place_id; + } /** * @inheritdoc @@ -90,67 +110,67 @@ class Banner extends ActiveRecord public function attributeLabels() { return [ - 'id' => Yii::t('banners', 'ID'), - 'title' => Yii::t('banners', 'Title'), - 'url' => Yii::t('banners', 'URL'), - 'image' => Yii::t('banners', 'Image'), - 'target' => Yii::t('banners', 'Target'), - 'active' => Yii::t('banners', 'Status'), - 'start_at' => Yii::t('banners', 'Start At'), - 'end_at' => Yii::t('banners', 'End At'), - 'created_at' => Yii::t('banners', 'Created At'), - 'updated_at' => Yii::t('banners', 'Updated At'), + 'id' => Yii::t('banners', 'ID'), + 'title' => Yii::t('banners', 'Title'), + 'url' => Yii::t('banners', 'URL'), + 'image' => Yii::t('banners', 'Image'), + 'target' => Yii::t('banners', 'Target'), + 'active' => Yii::t('banners', 'Status'), + 'start_at' => Yii::t('banners', 'Start At'), + 'end_at' => Yii::t('banners', 'End At'), + 'created_at' => Yii::t('banners', 'Created At'), + 'updated_at' => Yii::t('banners', 'Updated At'), 'include_urls' => Yii::t('banners', 'Show only on URLs'), 'exclude_urls' => Yii::t('banners', 'Not show on URLs'), - 'views' => Yii::t('banners', 'Views'), - 'clicks' => Yii::t('banners', 'Visits'), - 'place_id' => Yii::t('banners', 'Place'), + 'views' => Yii::t('banners', 'Views'), + 'clicks' => Yii::t('banners', 'Visits'), + 'place_id' => Yii::t('banners', 'Place'), ]; } - public function activate(): void - { - if ($this->isActive()) { - throw new \DomainException('Banner is already active.'); - } - $this->active = self::STATUS_ACTIVE; - } - - public function draft(): void - { - if ($this->isDraft()) { - throw new \DomainException('Banner is already draft.'); - } - $this->active = self::STATUS_DRAFT; - } - - public function isActive(): bool - { - return $this->active == self::STATUS_ACTIVE; - } - - - public function isDraft(): bool - { - return $this->active == self::STATUS_DRAFT; - } - - public function getPlace() - { - return $this->hasOne(BannerPlace::class, ['id' => 'place_id']); - } + public function activate(): void + { + if ($this->isActive()) { + throw new \DomainException('Banner is already active.'); + } + $this->active = self::STATUS_ACTIVE; + } + + public function draft(): void + { + if ($this->isDraft()) { + throw new \DomainException('Banner is already draft.'); + } + $this->active = self::STATUS_DRAFT; + } + + public function isActive(): bool + { + return $this->active == self::STATUS_ACTIVE; + } + + + public function isDraft(): bool + { + return $this->active == self::STATUS_DRAFT; + } + + public function getPlace() + { + return $this->hasOne(BannerPlace::class, ['id' => 'place_id']); + } ###################################### - public function behaviors(): array - { - return [ - TimestampBehavior::class, - ]; - } - - public static function find(): BannerQuery - { - return new BannerQuery(static::class); - } + public function behaviors(): array + { + return [ + TimestampBehavior::class, + ]; + } + + public static function find(): BannerQuery + { + return new BannerQuery(static::class); + } } diff --git a/common/modules/banners/entities/BannerPlace.php b/common/modules/banners/entities/BannerPlace.php index 83faaaf..1879de5 100644 --- a/common/modules/banners/entities/BannerPlace.php +++ b/common/modules/banners/entities/BannerPlace.php @@ -6,7 +6,6 @@ use common\modules\banners\entities\queries\BannerPlaceQuery; use yii\db\ActiveRecord; use Yii; - /** * This is the model class for table "banners". * @@ -22,26 +21,27 @@ use Yii; */ class BannerPlace extends ActiveRecord { - const STATUS_DRAFT = 0; - const STATUS_ACTIVE = 1; + const STATUS_DRAFT = 0; + const STATUS_ACTIVE = 1; - public static function create($title, $width, $height, $active): self - { - $place = new static(); - $place->title = $title; - $place->width = $width; - $place->height = $height; - $place->active = $active; - return $place; - } + public static function create($title, $width, $height, $active): self + { + $place = new static(); + $place->title = $title; + $place->width = $width; + $place->height = $height; + $place->active = $active; - public function edit($title, $width, $height, $active): void - { - $this->title = $title; - $this->width = $width; - $this->height = $height; - $this->active = $active; - } + return $place; + } + + public function edit($title, $width, $height, $active): void + { + $this->title = $title; + $this->width = $width; + $this->height = $height; + $this->active = $active; + } /** * @inheritdoc @@ -57,52 +57,52 @@ class BannerPlace extends ActiveRecord public function attributeLabels() { return [ - 'id' => Yii::t('banners', 'ID'), - 'title' => Yii::t('banners', 'Title'), - 'width' => Yii::t('banners', 'Width'), + 'id' => Yii::t('banners', 'ID'), + 'title' => Yii::t('banners', 'Title'), + 'width' => Yii::t('banners', 'Width'), 'height' => Yii::t('banners', 'Height'), 'active' => Yii::t('banners', 'Status'), ]; } - public function activate(): void - { - if ($this->isActive()) { - throw new \DomainException('Place is already active.'); - } - $this->active = self::STATUS_ACTIVE; - } + public function activate(): void + { + if ($this->isActive()) { + throw new \DomainException('Place is already active.'); + } + $this->active = self::STATUS_ACTIVE; + } - public function draft(): void - { - if ($this->isDraft()) { - throw new \DomainException('Place is already draft.'); - } - $this->active = self::STATUS_DRAFT; - } + public function draft(): void + { + if ($this->isDraft()) { + throw new \DomainException('Place is already draft.'); + } + $this->active = self::STATUS_DRAFT; + } - public function isActive(): bool - { - return $this->active == self::STATUS_ACTIVE; - } + public function isActive(): bool + { + return $this->active == self::STATUS_ACTIVE; + } - public function isDraft(): bool - { - return $this->active == self::STATUS_DRAFT; - } + public function isDraft(): bool + { + return $this->active == self::STATUS_DRAFT; + } - public function getBanners() - { - return $this->hasMany(Banner::class, ['place_id' => 'id']); - } + public function getBanners() + { + return $this->hasMany(Banner::class, ['place_id' => 'id']); + } - public function getActiveBanners() - { - return $this->hasMany(Banner::class, ['place_id' => 'id'])->andWhere(['active' => Banner::STATUS_ACTIVE]); - } + public function getActiveBanners() + { + return $this->hasMany(Banner::class, ['place_id' => 'id'])->andWhere(['active' => Banner::STATUS_ACTIVE]); + } - public static function find(): BannerPlaceQuery - { - return new BannerPlaceQuery(static::class); - } + public static function find(): BannerPlaceQuery + { + return new BannerPlaceQuery(static::class); + } } diff --git a/common/modules/banners/entities/queries/BannerPlaceQuery.php b/common/modules/banners/entities/queries/BannerPlaceQuery.php index f25c43e..3d38083 100644 --- a/common/modules/banners/entities/queries/BannerPlaceQuery.php +++ b/common/modules/banners/entities/queries/BannerPlaceQuery.php @@ -5,6 +5,11 @@ namespace common\modules\banners\entities\queries; use common\modules\banners\entities\BannerPlace; use yii\db\ActiveQuery; +/** + * Class BannerPlaceQuery + * + * @see BannerPlace + */ class BannerPlaceQuery extends ActiveQuery { /** @@ -17,4 +22,4 @@ class BannerPlaceQuery extends ActiveQuery ($alias ? $alias . '.' : '') . 'active' => BannerPlace::STATUS_ACTIVE, ]); } -} \ No newline at end of file +} diff --git a/common/modules/banners/entities/queries/BannerQuery.php b/common/modules/banners/entities/queries/BannerQuery.php index e0b7fa8..2e77278 100644 --- a/common/modules/banners/entities/queries/BannerQuery.php +++ b/common/modules/banners/entities/queries/BannerQuery.php @@ -3,23 +3,29 @@ namespace common\modules\banners\entities\queries; use common\modules\banners\entities\Banner; -use yii\helpers\Url; use yii\db\ActiveQuery; +/** + * Class BannerQuery + * + * @see Banner + */ class BannerQuery extends ActiveQuery { /** - * @param null $alias - * @return $this + * @return BannerQuery */ public function active() { return $this->andWhere(['active' => Banner::STATUS_ACTIVE]); } + /** + * @return BannerQuery + */ public function showTime() { - return $this->andWhere(['<', 'start_at', time()])->andWhere(['>', 'end_at', time()]); + return $this->andWhere(['<', 'start_at', time()])->andWhere(['>', 'end_at', time()]); } /*public function excludeFree() @@ -27,4 +33,4 @@ class BannerQuery extends ActiveQuery $current = Url::current([]); return $this->andWhere(['not rlike', 'exclude_urls', '^'.$current.'$']); }*/ -} \ No newline at end of file +} diff --git a/common/modules/banners/forms/BannerForm.php b/common/modules/banners/forms/BannerForm.php index 29e1f57..5b2a1d6 100644 --- a/common/modules/banners/forms/BannerForm.php +++ b/common/modules/banners/forms/BannerForm.php @@ -11,9 +11,9 @@ class BannerForm extends Model { public $title; - /** - * @var UploadedFile - */ + /** + * @var UploadedFile + */ public $image; public $url; public $target; @@ -29,17 +29,17 @@ class BannerForm extends Model public function __construct(Banner $banner = null, $config = []) { if ($banner) { - $this->title = $banner->title; - $this->image = $banner->image; - $this->url = $banner->url; - $this->target = $banner->target; - $this->active = $banner->active; - $this->start_at = $banner->start_at; - $this->end_at = $banner->end_at; - $this->include_urls = $banner->include_urls; - $this->exclude_urls = $banner->exclude_urls; - $this->place_id = $banner->place_id; - $this->_banner = $banner; + $this->title = $banner->title; + $this->image = $banner->image; + $this->url = $banner->url; + $this->target = $banner->target; + $this->active = $banner->active; + $this->start_at = $banner->start_at; + $this->end_at = $banner->end_at; + $this->include_urls = $banner->include_urls; + $this->exclude_urls = $banner->exclude_urls; + $this->place_id = $banner->place_id; + $this->_banner = $banner; } parent::__construct($config); } @@ -51,50 +51,54 @@ class BannerForm extends Model [['active', 'place_id', 'active'], 'integer'], [['title', 'target', 'url'], 'string', 'max' => 255], [['include_urls', 'exclude_urls'], 'string'], - [['image'], 'file', 'extensions' => 'png, jpg, gif'], - [['start_at','end_at'],'safe'], - /*[['start_at', 'end_at'], 'date', - 'format' => 'php:d.m.Y H:i' - ],*/ + [['image'], 'file', 'extensions' => 'png, jpg, gif'], + [['start_at', 'end_at'], 'safe'], + /*[['start_at', 'end_at'], 'date', + 'format' => 'php:d.m.Y H:i' + ],*/ ]; } - public function attributeLabels() { - return [ - 'id' => Yii::t('banners', 'ID'), - 'title' => Yii::t('banners', 'Title'), - 'url' => Yii::t('banners', 'URL'), - 'image' => Yii::t('banners', 'Image'), - 'target' => Yii::t('banners', 'Target'), - 'active' => Yii::t('banners', 'Status'), - 'start_at' => Yii::t('banners', 'Start At'), - 'end_at' => Yii::t('banners', 'End At'), - 'created_at' => Yii::t('banners', 'Created At'), - 'updated_at' => Yii::t('banners', 'Updated At'), - 'include_urls' => Yii::t('banners', 'Show only on URLs'), - 'exclude_urls' => Yii::t('banners', 'Not show on URLs'), - 'views' => Yii::t('banners', 'Views'), - 'clicks' => Yii::t('banners', 'Visits'), - 'place_id' => Yii::t('banners', 'Place'), - ]; - } + public function attributeLabels() + { + return [ + 'id' => Yii::t('banners', 'ID'), + 'title' => Yii::t('banners', 'Title'), + 'url' => Yii::t('banners', 'URL'), + 'image' => Yii::t('banners', 'Image'), + 'target' => Yii::t('banners', 'Target'), + 'active' => Yii::t('banners', 'Status'), + 'start_at' => Yii::t('banners', 'Start At'), + 'end_at' => Yii::t('banners', 'End At'), + 'created_at' => Yii::t('banners', 'Created At'), + 'updated_at' => Yii::t('banners', 'Updated At'), + 'include_urls' => Yii::t('banners', 'Show only on URLs'), + 'exclude_urls' => Yii::t('banners', 'Not show on URLs'), + 'views' => Yii::t('banners', 'Views'), + 'clicks' => Yii::t('banners', 'Visits'), + 'place_id' => Yii::t('banners', 'Place'), + ]; + } + + public function beforeValidate() + { + if (parent::beforeValidate()) { + $this->image = UploadedFile::getInstance($this, 'image'); + $this->start_at = strtotime($this->start_at); + $this->end_at = strtotime($this->end_at); - public function beforeValidate() { - if (parent::beforeValidate()) { - $this->image = UploadedFile::getInstance($this, 'image'); - $this->start_at = strtotime($this->start_at); - $this->end_at = strtotime($this->end_at); - return true; - } - return false; - } + return true; + } - /*public function afterValidate() { - if (parent::afterValidate()) { - $this->start_at = strtotime($this->start_at); - $this->end_at = strtotime($this->end_at); - return true; - } - return false; - }*/ + return false; + } + + /*public function afterValidate() { + if (parent::afterValidate()) { + $this->start_at = strtotime($this->start_at); + $this->end_at = strtotime($this->end_at); + return true; + } + return false; + }*/ } diff --git a/common/modules/banners/forms/BannerPlaceForm.php b/common/modules/banners/forms/BannerPlaceForm.php index 248c478..cd334bd 100644 --- a/common/modules/banners/forms/BannerPlaceForm.php +++ b/common/modules/banners/forms/BannerPlaceForm.php @@ -18,10 +18,10 @@ class BannerPlaceForm extends Model public function __construct(BannerPlace $place = null, $config = []) { if ($place) { - $this->title = $place->title; - $this->width = $place->width; - $this->height = $place->height; - $this->active = $place->active; + $this->title = $place->title; + $this->width = $place->width; + $this->height = $place->height; + $this->active = $place->active; $this->_place = $place; } parent::__construct($config); @@ -35,13 +35,14 @@ class BannerPlaceForm extends Model ]; } - public function attributeLabels() { - return [ - 'id' => Yii::t('banners', 'ID'), - 'title' => Yii::t('banners', 'Title'), - 'width' => Yii::t('banners', 'Width'), - 'height' => Yii::t('banners', 'Height'), - 'active' => Yii::t('banners', 'Status'), - ]; - } -} \ No newline at end of file + public function attributeLabels() + { + return [ + 'id' => Yii::t('banners', 'ID'), + 'title' => Yii::t('banners', 'Title'), + 'width' => Yii::t('banners', 'Width'), + 'height' => Yii::t('banners', 'Height'), + 'active' => Yii::t('banners', 'Status'), + ]; + } +} diff --git a/common/modules/banners/forms/search/BannerSearch.php b/common/modules/banners/forms/search/BannerSearch.php index e46fb62..7308f90 100644 --- a/common/modules/banners/forms/search/BannerSearch.php +++ b/common/modules/banners/forms/search/BannerSearch.php @@ -24,6 +24,7 @@ class BannerSearch extends Model /** * @param array $params + * * @return ActiveDataProvider */ public function search(array $params): ActiveDataProvider @@ -32,7 +33,7 @@ class BannerSearch extends Model $dataProvider = new ActiveDataProvider([ 'query' => $query, - 'sort' => [ + 'sort' => [ 'defaultOrder' => ['id' => SORT_DESC] ] ]); @@ -41,18 +42,20 @@ class BannerSearch extends Model if (!$this->validate()) { $query->where('0=1'); + return $dataProvider; } $query->andFilterWhere([ - 'id' => $this->id, - 'active' => $this->active, + 'id' => $this->id, + 'active' => $this->active, 'place_id' => $this->place_id, - 'target' => $this->target + 'target' => $this->target ]); $query ->andFilterWhere(['like', 'title', $this->title]); + return $dataProvider; } } diff --git a/common/modules/banners/forms/search/PlaceSearch.php b/common/modules/banners/forms/search/PlaceSearch.php index b4b8913..79347fe 100644 --- a/common/modules/banners/forms/search/PlaceSearch.php +++ b/common/modules/banners/forms/search/PlaceSearch.php @@ -10,8 +10,8 @@ class PlaceSearch extends Model { public $id; public $title; - public $width; - public $height; + public $width; + public $height; public $active; public function rules(): array @@ -24,6 +24,7 @@ class PlaceSearch extends Model /** * @param array $params + * * @return ActiveDataProvider */ public function search(array $params): ActiveDataProvider @@ -32,7 +33,7 @@ class PlaceSearch extends Model $dataProvider = new ActiveDataProvider([ 'query' => $query, - 'sort' => [ + 'sort' => [ 'defaultOrder' => ['id' => SORT_DESC] ] ]); @@ -41,18 +42,20 @@ class PlaceSearch extends Model if (!$this->validate()) { $query->where('0=1'); + return $dataProvider; } $query->andFilterWhere([ - 'id' => $this->id, - 'active' => $this->active, - 'width' => $this->width, - 'height' => $this->height + 'id' => $this->id, + 'active' => $this->active, + 'width' => $this->width, + 'height' => $this->height ]); $query ->andFilterWhere(['like', 'title', $this->title]); + return $dataProvider; } } diff --git a/common/modules/banners/helpers/BannerHelper.php b/common/modules/banners/helpers/BannerHelper.php index 54cde37..e25e5e5 100644 --- a/common/modules/banners/helpers/BannerHelper.php +++ b/common/modules/banners/helpers/BannerHelper.php @@ -6,56 +6,54 @@ namespace common\modules\banners\helpers; - use common\modules\banners\entities\Banner; use yii\helpers\ArrayHelper; use yii\helpers\Html; -use yii\helpers\Url; use Yii; class BannerHelper { - public static function targetList(): array - { - return [ - Banner::TARGET_SELF => Yii::t('banners', 'Self window'), - Banner::TARGET_BLANK => Yii::t('banners', 'Blank window'), - ]; - } - - public static function targetName($target): string - { - return ArrayHelper::getValue(self::targetList(), $target); - } - - public static function statusList(): array - { - return [ - Banner::STATUS_DRAFT => Yii::t('banners', 'Draft'), - Banner::STATUS_ACTIVE => Yii::t('banners', 'Active'), - ]; - } - - public static function statusName($status): string - { - return ArrayHelper::getValue(self::statusList(), $status); - } - - public static function statusLabel($status): string - { - switch ($status) { - case Banner::STATUS_DRAFT: - $class = 'label label-default'; - break; - case Banner::STATUS_ACTIVE: - $class = 'label label-success'; - break; - default: - $class = 'label label-default'; - } - - return Html::tag('span', ArrayHelper::getValue(self::statusList(), $status), [ - 'class' => $class, - ]); - } + public static function targetList(): array + { + return [ + Banner::TARGET_SELF => Yii::t('banners', 'Self window'), + Banner::TARGET_BLANK => Yii::t('banners', 'Blank window'), + ]; + } + + public static function targetName($target): string + { + return ArrayHelper::getValue(self::targetList(), $target); + } + + public static function statusList(): array + { + return [ + Banner::STATUS_DRAFT => Yii::t('banners', 'Draft'), + Banner::STATUS_ACTIVE => Yii::t('banners', 'Active'), + ]; + } + + public static function statusName($status): string + { + return ArrayHelper::getValue(self::statusList(), $status); + } + + public static function statusLabel($status): string + { + switch ($status) { + case Banner::STATUS_DRAFT: + $class = 'label label-default'; + break; + case Banner::STATUS_ACTIVE: + $class = 'label label-success'; + break; + default: + $class = 'label label-default'; + } + + return Html::tag('span', ArrayHelper::getValue(self::statusList(), $status), [ + 'class' => $class, + ]); + } } diff --git a/common/modules/banners/manifest.php b/common/modules/banners/manifest.php index 8d61728..6f145b6 100644 --- a/common/modules/banners/manifest.php +++ b/common/modules/banners/manifest.php @@ -5,4 +5,9 @@ return [ 'name' => 'banners', 'description' => 'Banners management and rotation system for site', 'module' => 'BannersModule', + 'permissions' => [ + 'BannersManagement' => [ + 'description' => 'Manage banners system' + ], + ], ]; \ No newline at end of file diff --git a/common/modules/banners/repositories/BannerPlaceRepository.php b/common/modules/banners/repositories/BannerPlaceRepository.php index b9e2769..630ed9a 100644 --- a/common/modules/banners/repositories/BannerPlaceRepository.php +++ b/common/modules/banners/repositories/BannerPlaceRepository.php @@ -28,4 +28,4 @@ class BannerPlaceRepository throw new \RuntimeException('Removing error.'); } } -} \ No newline at end of file +} diff --git a/common/modules/banners/repositories/BannerRepository.php b/common/modules/banners/repositories/BannerRepository.php index ebdfdd7..61bf2c4 100644 --- a/common/modules/banners/repositories/BannerRepository.php +++ b/common/modules/banners/repositories/BannerRepository.php @@ -28,4 +28,4 @@ class BannerRepository throw new \RuntimeException('Removing error.'); } } -} \ No newline at end of file +} diff --git a/common/modules/banners/services/BannerManageService.php b/common/modules/banners/services/BannerManageService.php index c617dc0..3413fc6 100644 --- a/common/modules/banners/services/BannerManageService.php +++ b/common/modules/banners/services/BannerManageService.php @@ -9,29 +9,28 @@ use yii\base\Security; class BannerManageService { - private $repository; + private $_repository; public function __construct(BannerRepository $repository) { - $this->repository = $repository; + $this->_repository = $repository; } public function create(BannerForm $form): Banner { - if ($form->image) { - $filename = $form->image->baseName . '_' . (new Security())->generateRandomString(5) . '.' . $form->image->extension; - $path = \Yii::getAlias(Banner::FILE_ORIGINAL_PATH); - if (!file_exists($path)) - { - mkdir($path, 0777, true); - } - $form->image->saveAs($path . '/' . $filename); - $form->image = $filename; - } + if ($form->image) { + $filename = $form->image->baseName . '_' . (new Security())->generateRandomString(5) . '.' . $form->image->extension; + $path = \Yii::getAlias(Banner::FILE_ORIGINAL_PATH); + if (!file_exists($path)) { + mkdir($path, 0777, true); + } + $form->image->saveAs($path . '/' . $filename); + $form->image = $filename; + } $banner = Banner::create( $form->title, - $form->image, + $form->image, $form->url, $form->target, $form->start_at, @@ -41,54 +40,54 @@ class BannerManageService $form->active, $form->place_id ); - $this->repository->save($banner); + $this->_repository->save($banner); + return $banner; } public function edit($id, BannerForm $form): void { - $banner = $this->repository->get($id); + $banner = $this->_repository->get($id); - if ($form->image) { - $filename = $form->image->baseName . '_' . (new Security())->generateRandomString(5) . '.' . $form->image->extension; - $path = \Yii::getAlias(Banner::FILE_ORIGINAL_PATH); - $form->image->saveAs($path . '/' . $filename); - $form->image = $filename; - } - else { - $form->image = $banner->image; - } + if ($form->image) { + $filename = $form->image->baseName . '_' . (new Security())->generateRandomString(5) . '.' . $form->image->extension; + $path = \Yii::getAlias(Banner::FILE_ORIGINAL_PATH); + $form->image->saveAs($path . '/' . $filename); + $form->image = $filename; + } else { + $form->image = $banner->image; + } $banner->edit( - $form->title, - $form->image, - $form->url, - $form->target, - $form->start_at, - $form->end_at, - $form->include_urls, - $form->exclude_urls, - $form->active, - $form->place_id + $form->title, + $form->image, + $form->url, + $form->target, + $form->start_at, + $form->end_at, + $form->include_urls, + $form->exclude_urls, + $form->active, + $form->place_id ); - $this->repository->save($banner); + $this->_repository->save($banner); } public function remove($id): void { - $banner = $this->repository->get($id); - $this->repository->remove($banner); + $banner = $this->_repository->get($id); + $this->_repository->remove($banner); } public function addView(Banner $banner) { - $banner->views++; - $this->repository->save($banner); + $banner->views++; + $this->_repository->save($banner); } - public function addClick(Banner $banner) - { - $banner->clicks++; - $this->repository->save($banner); + public function addClick(Banner $banner) + { + $banner->clicks++; + $this->_repository->save($banner); } } diff --git a/common/modules/banners/services/BannerPlaceManageService.php b/common/modules/banners/services/BannerPlaceManageService.php index c205d66..b362e9b 100644 --- a/common/modules/banners/services/BannerPlaceManageService.php +++ b/common/modules/banners/services/BannerPlaceManageService.php @@ -8,40 +8,41 @@ use common\modules\banners\repositories\BannerPlaceRepository; class BannerPlaceManageService { - private $repository; + private $_repository; public function __construct(BannerPlaceRepository $repository) { - $this->repository = $repository; + $this->_repository = $repository; } public function create(BannerPlaceForm $form): BannerPlace { $place = BannerPlace::create( $form->title, - $form->width, + $form->width, $form->height, $form->active ); - $this->repository->save($place); + $this->_repository->save($place); + return $place; } public function edit($id, BannerPlaceForm $form): void { - $place = $this->repository->get($id); + $place = $this->_repository->get($id); $place->edit( - $form->title, - $form->width, - $form->height, - $form->active + $form->title, + $form->width, + $form->height, + $form->active ); - $this->repository->save($place); + $this->_repository->save($place); } public function remove($id): void { - $place = $this->repository->get($id); - $this->repository->remove($place); + $place = $this->_repository->get($id); + $this->_repository->remove($place); } } diff --git a/common/modules/banners/views/manage/banner/_form.php b/common/modules/banners/views/manage/banner/_form.php index e1e11d0..b8fa27c 100644 --- a/common/modules/banners/views/manage/banner/_form.php +++ b/common/modules/banners/views/manage/banner/_form.php @@ -33,98 +33,98 @@ $this->registerJs($js2); -
-
- -
-
- -
-
- field($model, 'place_id')->dropDownList(ArrayHelper::map(BannerPlace::find()->all(), 'id', 'title')) ?> -
-
- field($model, 'title')->textInput(['maxlength' => true]) ?> -
-
- -
-
- field($model, 'url')->textInput(['maxlength' => true]) ?> -
-
- field($model, 'target')->dropDownList(BannerHelper::targetList()) ?> -
-
- -
-
- field($model, 'image')->widget(FileInput::class, [ - 'options' => [ - 'accept' => 'image/*', - ], - 'pluginOptions' => [ - 'showUpload' => false, - 'showPreview' => false, - ], - ]) ?> -
-
- -
-
- field($model, 'start_at')->widget(DateTimePicker::class, [ - 'options' => [], - 'removeButton' => false, - 'pluginOptions' => [ - 'autoclose' => true, - 'format' => 'dd.mm.yyyy hh:ii:ss', - ] - ]); ?> -
-
- field($model, 'end_at')->widget(DateTimePicker::class, [ - 'options' => [], - 'removeButton' => false, - 'pluginOptions' => [ - 'autoclose' => true, - //'format' => 'dd.MM.yyyy hh:i', - 'format' => 'dd.mm.yyyy hh:ii:ss', - ] - ]); ?> -
-
- - - -
-
- -
- 'btn btn-success']) ?> -
- -
- -
-
-
-
- - field($model, 'active')->radioList(BannerHelper::statusList()) ?> - -
-
-
- -
+
+
+ +
+
+ +
+
+ field($model, 'place_id')->dropDownList(ArrayHelper::map(BannerPlace::find()->all(), 'id', 'title')) ?> +
+
+ field($model, 'title')->textInput(['maxlength' => true]) ?> +
+
+ +
+
+ field($model, 'url')->textInput(['maxlength' => true]) ?> +
+
+ field($model, 'target')->dropDownList(BannerHelper::targetList()) ?> +
+
+ +
+
+ field($model, 'image')->widget(FileInput::class, [ + 'options' => [ + 'accept' => 'image/*', + ], + 'pluginOptions' => [ + 'showUpload' => false, + 'showPreview' => false, + ], + ]) ?> +
+
+ +
+
+ field($model, 'start_at')->widget(DateTimePicker::class, [ + 'options' => [], + 'removeButton' => false, + 'pluginOptions' => [ + 'autoclose' => true, + 'format' => 'dd.mm.yyyy hh:ii:ss', + ] + ]); ?> +
+
+ field($model, 'end_at')->widget(DateTimePicker::class, [ + 'options' => [], + 'removeButton' => false, + 'pluginOptions' => [ + 'autoclose' => true, + //'format' => 'dd.MM.yyyy hh:i', + 'format' => 'dd.mm.yyyy hh:ii:ss', + ] + ]); ?> +
+
+ + + +
+
+ +
+ 'btn btn-success']) ?> +
+ +
+ +
+
+
+
+ + field($model, 'active')->radioList(BannerHelper::statusList()) ?> + +
+
+
+ +
diff --git a/common/modules/banners/widgets/BannerWidget.php b/common/modules/banners/widgets/BannerWidget.php index 027b7c3..ee9b593 100644 --- a/common/modules/banners/widgets/BannerWidget.php +++ b/common/modules/banners/widgets/BannerWidget.php @@ -12,30 +12,31 @@ use yii\base\Widget; class BannerWidget extends Widget { - public $id; - - public function run() { - $place = BannerPlace::findOne($this->id); - if (!$place) { - return 'Place is not found'; - } - - $banners = Banner::find() - ->active() - ->showTime() - //->excludeFree() - ->andWhere(['place_id' => $place->id]) - ->all(); - - if (!$banners || $place->isDraft()) { - return ''; - } - - /* @var $banner Banner */ - $banner = $banners[array_rand($banners)]; - - return $this->render('banner', [ - 'banner' => $banner, - ]); - } -} \ No newline at end of file + public $id; + + public function run() + { + $place = BannerPlace::findOne($this->id); + if (!$place) { + return 'Place is not found'; + } + + $banners = Banner::find() + ->active() + ->showTime() + //->excludeFree() + ->andWhere(['place_id' => $place->id]) + ->all(); + + if (!$banners || $place->isDraft()) { + return ''; + } + + /* @var $banner Banner */ + $banner = $banners[array_rand($banners)]; + + return $this->render('banner', [ + 'banner' => $banner, + ]); + } +} diff --git a/common/modules/blog/entities/BlogCategory.php b/common/modules/blog/entities/BlogCategory.php index 08b59d5..47ed277 100644 --- a/common/modules/blog/entities/BlogCategory.php +++ b/common/modules/blog/entities/BlogCategory.php @@ -8,7 +8,6 @@ use core\behaviors\SluggableRelationBehavior; use yii\db\ActiveRecord; use Yii; - /** * @property integer $id * @property string $slug @@ -18,41 +17,42 @@ use Yii; * @method ActiveRecord findTranslation(string $language) * @method void saveTranslations($translations) * - * @property ActiveRecord[] translations - * @property ActiveRecord[] translation + * @property ActiveRecord[] $translations + * @property ActiveRecord $translation */ class BlogCategory extends ActiveRecord { - public $_form; + public $_form; public static function create($form, $slug, $sort): self { - $category = new static(); - $category->slug = $slug; - $category->sort = $sort; + $category = new static(); + $category->slug = $slug; + $category->sort = $sort; $category->_form = $form; + return $category; } public function edit($form, $slug, $sort): void { - $this->slug = $slug; - $this->sort = $sort; + $this->slug = $slug; + $this->sort = $sort; $this->_form = $form; } public function attributeLabels() { return [ - 'id' => Yii::t('blog', 'ID'), - 'name' => Yii::t('blog', 'Name'), - 'slug' => Yii::t('blog', 'SEO link'), - 'sort' => Yii::t('blog', 'Sort'), - 'title' => Yii::t('blog', 'Title'), - 'description' => Yii::t('blog', 'Description'), - 'meta_title' => Yii::t('blog', 'META Title'), + 'id' => Yii::t('blog', 'ID'), + 'name' => Yii::t('blog', 'Name'), + 'slug' => Yii::t('blog', 'SEO link'), + 'sort' => Yii::t('blog', 'Sort'), + 'title' => Yii::t('blog', 'Title'), + 'description' => Yii::t('blog', 'Description'), + 'meta_title' => Yii::t('blog', 'META Title'), 'meta_description' => Yii::t('blog', 'META Description'), - 'meta_keywords' => Yii::t('blog', 'META Keywords'), + 'meta_keywords' => Yii::t('blog', 'META Keywords'), ]; } @@ -68,7 +68,7 @@ class BlogCategory extends ActiveRecord public function getPostsCount(): int { - return BlogPost::find()->where(['category_id' => $this->id])->count('*'); + return BlogPost::find()->where(['category_id' => $this->id])->count('*'); } public static function tableName(): string @@ -79,32 +79,39 @@ class BlogCategory extends ActiveRecord public function behaviors(): array { return [ - /*[ - 'class' => SluggableBehavior::class, - 'attribute' => 'title', - 'ensureUnique' => true, - 'preserveNonEmptyValues' => true, - ],*/ - [ - 'class' => LanguageBehavior::class, - 'virtualClassName' => 'BlogCategoryVirtualTranslate', - 'translatedLanguages' => \Yii::$app->params['translatedLanguages'], - 'relativeField' => 'blog_category_id', - 'tableName' => "{{%blog_categories_lng}}", - 'attributes' => ['title', 'description', 'name', 'meta_title', 'meta_description', 'meta_keywords'], - //'defaultLanguage' => basename(Yii::$app->getBasePath()) === 'backend' ? Yii::$app->language : Yii::$app->params['defaultLanguage'], - 'defaultLanguage' => \Yii::$app->params['defaultLanguage'], - ], - [ - 'class' => SluggableRelationBehavior::class, - 'attribute' => 'name', - 'relation' => 'translation', - ], + /*[ + 'class' => SluggableBehavior::class, + 'attribute' => 'title', + 'ensureUnique' => true, + 'preserveNonEmptyValues' => true, + ],*/ + [ + 'class' => LanguageBehavior::class, + 'virtualClassName' => 'BlogCategoryVirtualTranslate', + 'translatedLanguages' => \Yii::$app->params['translatedLanguages'], + 'relativeField' => 'blog_category_id', + 'tableName' => '{{%blog_categories_lng}}', + 'attributes' => [ + 'title', + 'description', + 'name', + 'meta_title', + 'meta_description', + 'meta_keywords' + ], + //'defaultLanguage' => basename(Yii::$app->getBasePath()) === 'backend' ? Yii::$app->language : Yii::$app->params['defaultLanguage'], + 'defaultLanguage' => \Yii::$app->params['defaultLanguage'], + ], + [ + 'class' => SluggableRelationBehavior::class, + 'attribute' => 'name', + 'relation' => 'translation', + ], ]; } - public static function find(): BlogCategoryQuery - { - return new BlogCategoryQuery(static::class); - } -} \ No newline at end of file + public static function find(): BlogCategoryQuery + { + return new BlogCategoryQuery(static::class); + } +} diff --git a/common/modules/blog/forms/search/BlogPostSearch.php b/common/modules/blog/forms/search/BlogPostSearch.php index da9c59b..b68447f 100644 --- a/common/modules/blog/forms/search/BlogPostSearch.php +++ b/common/modules/blog/forms/search/BlogPostSearch.php @@ -30,7 +30,7 @@ class BlogPostSearch extends Model */ public function search(array $params): ActiveDataProvider { - $query = BlogPost::find()->typePublic(); + $query = BlogPost::find()->typePublic()->joinWith('translation'); $dataProvider = new ActiveDataProvider([ 'query' => $query, @@ -59,7 +59,9 @@ class BlogPostSearch extends Model public function categoriesList(): array { - return ArrayHelper::map(BlogCategory::find()->orderBy('sort')->asArray()->all(), 'id', 'title'); + return ArrayHelper::map(BlogCategory::find()->orderBy('sort')->all(), 'id', function (BlogCategory $category) { + return $category->translation->name; + }); } public function statusList(): array diff --git a/common/modules/blog/manifest.php b/common/modules/blog/manifest.php index a575267..5505144 100644 --- a/common/modules/blog/manifest.php +++ b/common/modules/blog/manifest.php @@ -5,4 +5,9 @@ return [ 'name' => 'blog', 'description' => 'Blog system for site with comments and slug', 'module' => 'BlogModule', + 'permissions' => [ + 'BlogManagement' => [ + 'description' => 'Blog management system' + ], + ], ]; \ No newline at end of file diff --git a/common/modules/blog/services/BlogPostManageService.php b/common/modules/blog/services/BlogPostManageService.php index d2f0014..e614033 100644 --- a/common/modules/blog/services/BlogPostManageService.php +++ b/common/modules/blog/services/BlogPostManageService.php @@ -12,7 +12,6 @@ use common\modules\blog\repositories\BlogTagRepository; use core\helpers\VideoHelper; use core\services\TransactionManager; use yii\base\Security; -use yii\db\ActiveRecord; use yii\helpers\Inflector; class BlogPostManageService @@ -154,6 +153,8 @@ class BlogPostManageService $post = $this->posts->get($id); // Remove revisions $this->clearHistory($post); + // Remove preview + $this->removePreviews(); $this->posts->remove($post); } @@ -189,130 +190,4 @@ class BlogPostManageService return $from->id; } - - public function restoreHistory2($from_id, $id): void - { - $post = $this->posts->get($id); - $from = $this->posts->get($from_id); - - $post->category_id = $from->category_id; - $post->published_at = $from->published_at; - $post->created_at = $from->created_at; - $post->updated_at = $from->updated_at; - $post->video = $from->video; - $post->revision_at = $from->revision_at; - $post->status = $from->status; - $post->slug = $from->slug; - - $this->posts->save($post); - - // remove distance translation - foreach ( $post->translations as $translate ) { - /* @var $translate ActiveRecord */ - $translate->delete(); - } - - // move source translation - foreach ( $from->translations as $translate ) { - /* @var $translate ActiveRecord */ - $translate->blog_post_id = $post->id; - $translate->save(); - } - - // get from tags - $from_tags = $from->tags; - $new_tags_names = array_map(function ($item){ - return $item->name; - }, $from_tags); - - // clear from tags - $from->revokeTags(); - $this->posts->save($from); - - // remove current revision - $this->posts->remove($post); - - // copy image - $path = \Yii::getAlias('@staticRoot/origin/posts'); - $parts = pathinfo($from->image); - copy($path . '/' . $from->id . '.' . $parts['extension'], $path . '/' . $id . '.' . $parts['extension']); - $from->createThumbs(); - - //$from->id = $id; - //$from->type = BlogPost::TYPE_PUBLIC; - //$from->revision_id = null; - - foreach ($new_tags_names as $tag_name) { - if ( ! $tag = $this->tags->findByName( $tag_name ) ) { - $tag = BlogTag::create( $tag_name, Inflector::slug( $tag_name, '_' ) ); - $this->tags->save( $tag ); - } - $from->assignTag( $tag->id ); - } - $this->posts->save($from); - - // delete never revisions - BlogPost::deleteAll(['AND', ['revision_id' => $from->id], ['>', 'revision_at', $from->revision_at]]); - } - - /*public function saveRevision2(BlogPost $model) { - if (!$model->revision_id) { - $revision = clone $model; - $revision->id = null; - $revision->isNewRecord = true; - $revision->revision_at = $revision->updated_at; - $revision->revision_id = $model->id; - $revision->type = BlogPost::TYPE_REVISION; - $revision->_form = new BlogPostForm($model); - $revision->save(); - - // tags - foreach ($model->tags as $tag) { - $revision->assignTag($tag->id); - } - $revision->save(); - - if ($model->image) { - $path = Yii::getAlias( '@staticRoot/origin/posts' ); - $parts = pathinfo( $model->image ); - copy( $path . '/' . $model->id . '.' . $parts['extension'], $path . '/' . $revision->id . '.' . $parts['extension'] ); - } - } - }*/ - - /*public function saveRevision(BlogPost $model) { - if (!$model->revision_id) { - - $blogForm = new BlogPostForm($model); - $blog = BlogPost::create( - $blogForm, - $blogForm->category_id, - $blogForm->slug, - $blogForm->published_at, - $blogForm->video, - BlogPost::TYPE_REVISION - ); - //$blog->id = null; - //$blog->isNewRecord = true; - $blog->revision_at = $model->updated_at; - $blog->revision_id = $model->id; - - $this->transaction->wrap(function () use ($blog, $model) { - foreach ( $model->tags as $tag ) { - $blog->assignTag( $tag->id ); - } - - $this->posts->save($blog); - - //print_r($blog->translations); die; - //print_r($model->translations); die; - - if ($model->image) { - $path = Yii::getAlias( '@staticRoot/origin/posts' ); - $parts = pathinfo( $model->image ); - copy( $path . '/' . $model->id . '.' . $parts['extension'], $path . '/' . $blog->id . '.' . $parts['extension'] ); - } - }); - } - }*/ } \ No newline at end of file diff --git a/common/modules/blog/views/manage/post/_form.php b/common/modules/blog/views/manage/post/_form.php index d57f9ba..ee8f63b 100644 --- a/common/modules/blog/views/manage/post/_form.php +++ b/common/modules/blog/views/manage/post/_form.php @@ -1,7 +1,6 @@ registerJs($js2);
- 'btn btn-info', - 'value'=>'preview', - 'name'=>'submit_preview', - 'formaction' => Url::to(['/blog/manage/post/create-preview', 'id' => $model->_post ? $model->_post->id : null]), - 'formtarget' => '_blank', - ]) ?> - -
diff --git a/common/modules/blog/views/manage/post/index.php b/common/modules/blog/views/manage/post/index.php index e3f9c1e..2d4b151 100644 --- a/common/modules/blog/views/manage/post/index.php +++ b/common/modules/blog/views/manage/post/index.php @@ -10,8 +10,8 @@ use yii\grid\GridView; /* @var $searchModel \common\modules\blog\forms\search\BlogPostSearch */ /* @var $dataProvider yii\data\ActiveDataProvider */ -$title = Yii::t('blog', 'All Posts'); -$this->title = $title; +$title = Yii::t('blog', 'All Posts'); +$this->title = $title; $this->params['breadcrumbs'][] = $title; ?>
@@ -24,52 +24,55 @@ $this->params['breadcrumbs'][] = $title;
$dataProvider, - 'filterModel' => $searchModel, - 'columns' => [ + 'filterModel' => $searchModel, + 'columns' => [ [ - 'attribute' => 'id', - 'options' => ['style' => 'width: 40px;'], + 'attribute' => 'id', + 'options' => ['style' => 'width: 40px;'], 'contentOptions' => ['class' => 'text-center'], ], [ 'attribute' => 'title', - 'value' => function (BlogPost $model) { - $title = isset($model->findTranslation(Yii::$app->language)->title) ? $model->findTranslation(Yii::$app->language)->title : $model->findTranslation(Yii::$app->params['defaultLanguage'])->title; + 'value' => function (BlogPost $model) { + $title = isset($model->translation->title) ? $model->findTranslation(Yii::$app->language)->title : $model->findTranslation(Yii::$app->params['defaultLanguage'])->title; + return Html::a(Html::encode($title), ['view', 'id' => $model->id]); }, - 'format' => 'raw', + 'format' => 'raw', ], [ 'attribute' => 'category_id', - 'filter' => $searchModel->categoriesList(), - 'value' => 'category.name', + 'filter' => $searchModel->categoriesList(), + 'value' => function (BlogPost $model) { + return $model->category->translation->name; + }, + ], + [ + 'attribute' => 'published_at', + 'format' => ['datetime', 'php:d.m.Y H:i'], + 'options' => ['style' => 'width: 60px;'], + 'contentOptions' => ['class' => 'text-center'], ], - [ - 'attribute' => 'published_at', - 'format' => ['datetime', 'php:d.m.Y H:i'], - 'options' => ['style' => 'width: 60px;'], - 'contentOptions' => ['class' => 'text-center'], - ], [ - 'attribute' => 'status', - 'filter' => $searchModel->statusList(), - 'value' => function (BlogPost $model) { + 'attribute' => 'status', + 'filter' => $searchModel->statusList(), + 'value' => function (BlogPost $model) { return BlogPostHelper::statusLabel($model->status); }, - 'format' => 'raw', - 'options' => ['style' => 'width: 120px;'], + 'format' => 'raw', + 'options' => ['style' => 'width: 120px;'], + 'contentOptions' => ['class' => 'text-center'], + ], + [ + 'class' => ActionColumn::class, + /*'urlCreator' => function($action, BlogPost $model, $key, $index, $column) { + $params = is_array($key) ? $key : ['id' => (string) $key]; + $params[0] = $column->controller ? $column->controller . '/' . $action : $action; + return Url::toRoute($params); + },*/ + 'options' => ['style' => 'width: 100px;'], 'contentOptions' => ['class' => 'text-center'], ], - [ - 'class' => ActionColumn::class, - /*'urlCreator' => function($action, BlogPost $model, $key, $index, $column) { - $params = is_array($key) ? $key : ['id' => (string) $key]; - $params[0] = $column->controller ? $column->controller . '/' . $action : $action; - return Url::toRoute($params); - },*/ - 'options' => ['style' => 'width: 100px;'], - 'contentOptions' => ['class' => 'text-center'], - ], ], ]); ?>
diff --git a/common/modules/blog/widgets/views/categories/categories.php b/common/modules/blog/widgets/views/categories/categories.php index da94605..94344f8 100644 --- a/common/modules/blog/widgets/views/categories/categories.php +++ b/common/modules/blog/widgets/views/categories/categories.php @@ -22,7 +22,7 @@ use yii\helpers\Html;
  • - name, ['/blog/post/category', 'id' => $category->id]) ?> + translation->name, ['/blog/post/category', 'id' => $category->id]) ?>
diff --git a/common/modules/forms/manifest.php b/common/modules/forms/manifest.php index fea09de..1ed9e60 100644 --- a/common/modules/forms/manifest.php +++ b/common/modules/forms/manifest.php @@ -5,4 +5,9 @@ return [ 'name' => 'forms', 'description' => 'Form widget generator for site', 'module' => 'FormsModule', + 'permissions' => [ + 'FormsManagement' => [ + 'description' => 'Forms management' + ], + ], ]; \ No newline at end of file diff --git a/common/modules/languages/manifest.php b/common/modules/languages/manifest.php index cbe063b..0f7faeb 100644 --- a/common/modules/languages/manifest.php +++ b/common/modules/languages/manifest.php @@ -5,4 +5,9 @@ return [ 'name' => 'languages', 'description' => 'Web site languages management', 'module' => 'LanguagesModule', + 'permissions' => [ + 'LanguagesManagement' => [ + 'description' => 'Languages management' + ], + ], ]; \ No newline at end of file diff --git a/common/modules/pages/forms/PageSearch.php b/common/modules/pages/forms/PageSearch.php index fd5846b..fe5f964 100644 --- a/common/modules/pages/forms/PageSearch.php +++ b/common/modules/pages/forms/PageSearch.php @@ -27,7 +27,7 @@ class PageSearch extends Model */ public function search(array $params): ActiveDataProvider { - $query = Page::find()->typePublic()->andWhere(['>', 'depth', 0]); + $query = Page::find()->typePublic()->andWhere(['>', 'depth', 0])->joinWith('translation'); $dataProvider = new ActiveDataProvider([ 'query' => $query, diff --git a/core/forms/MetaForm-org.php b/core/forms/MetaForm-org.php deleted file mode 100644 index ce9cbed..0000000 --- a/core/forms/MetaForm-org.php +++ /dev/null @@ -1,40 +0,0 @@ -title = $meta->title; - $this->description = $meta->description; - $this->keywords = $meta->keywords; - } - parent::__construct($config); - } - - public function rules(): array - { - return [ - [['title'], 'string', 'max' => 255], - [['description', 'keywords'], 'string'], - ]; - } - - public function attributeLabels() { - return [ - 'title' => Yii::t('main', 'Title'), - 'description' => Yii::t('main', 'Description'), - 'keywords' => Yii::t('main', 'Keywords'), - ]; - } -} \ No newline at end of file diff --git a/core/services/ModuleService.php b/core/services/ModuleService.php index d6c5de3..f3b4703 100644 --- a/core/services/ModuleService.php +++ b/core/services/ModuleService.php @@ -2,6 +2,7 @@ namespace core\services; +use core\components\SearchPerformance; use core\entities\ModuleRecord; use core\repositories\ModuleRepository; use yii\helpers\FileHelper; @@ -9,139 +10,147 @@ use Yii; class ModuleService { - private $modules; - private $permission_manager; + private $_modules; + private $_permission_manager; public function __construct(ModuleRepository $modules, PermissionManager $permission_manager) { - $this->modules = $modules; - $this->permission_manager = $permission_manager; + $this->_modules = $modules; + $this->_permission_manager = $permission_manager; } public function create($name, $class, $type = 'common', $active = ModuleRecord::STATUS_DISABLED): ModuleRecord { - $module = new ModuleRecord(); - $module->name = $name; - $module->class = $class; - $module->type = $type; - $module->active = $active; - $this->modules->save($module); - return $module; + $module = new ModuleRecord(); + $module->name = $name; + $module->class = $class; + $module->type = $type; + $module->active = $active; + $this->_modules->save($module); + + return $module; } + /** + * @param ModuleRecord $module + * + * @throws \yii\base\ErrorException + */ public function delete(ModuleRecord $module) { - // connect manifest - $manifest = require Yii::getAlias('@common/modules/' . $module->name . '/manifest.php'); - - // down migrations - $migrations = $this->getMigrationFiles($module->name); - $migrations = array_reverse($migrations); - foreach ($migrations as $migrationPath) { - $migrationFile = basename($migrationPath); - $migration = str_replace('.php', '', $migrationFile); - if ($this->migrationExists($migration)) { - require $migrationPath; - $obj = new $migration; - if (method_exists($obj, 'safeDown')) { - $obj->safeDown(); - Yii::$app->moduleManager->removeFromMigrationTable($migration); - - } - elseif (method_exists($obj, 'down')) { - $obj->down(); - Yii::$app->moduleManager->removeFromMigrationTable($migration); - } - } - } - - // remove permissions - if (isset($manifest['permissions']) && is_array($manifest['permissions'])) { - $this->removePermissions($manifest['permissions']); - } - - // delete files - $modulePath = Yii::getAlias('@common/modules/' . $module->name); - if (file_exists($modulePath)) { - FileHelper::removeDirectory($modulePath); - } - // delete module record - $this->modules->remove($module); + // connect manifest + $manifest = require Yii::getAlias('@common/modules/' . $module->name . '/manifest.php'); + + // down migrations + $migrations = $this->getMigrationFiles($module->name); + $migrations = array_reverse($migrations); + foreach ($migrations as $migrationPath) { + $migrationFile = basename($migrationPath); + $migration = str_replace('.php', '', $migrationFile); + if ($this->migrationExists($migration)) { + require $migrationPath; + $obj = new $migration; + if (method_exists($obj, 'safeDown')) { + $obj->safeDown(); + Yii::$app->moduleManager->removeFromMigrationTable($migration); + } elseif (method_exists($obj, 'down')) { + $obj->down(); + Yii::$app->moduleManager->removeFromMigrationTable($migration); + } + } + } + + // remove permissions + if (isset($manifest['permissions']) && is_array($manifest['permissions'])) { + $this->removePermissions($manifest['permissions']); + } + + // delete files + $modulePath = Yii::getAlias('@common/modules/' . $module->name); + if (file_exists($modulePath)) { + FileHelper::removeDirectory($modulePath); + } + // delete module record + $this->_modules->remove($module); } public function disable(ModuleRecord $module) { - $module->active = ModuleRecord::STATUS_DISABLED; - $this->modules->save($module); + $module->active = ModuleRecord::STATUS_DISABLED; + $this->_modules->save($module); + // regenerate global control panel search + SearchPerformance::init(); } - public function enable(ModuleRecord $module) - { - // connect manifest - $manifest = require Yii::getAlias('@common/modules/' . $module->name . '/manifest.php'); - - $module->active = ModuleRecord::STATUS_ENABLED; - - // migration if not exists - $migrations = $this->getMigrationFiles($module->name); - foreach ($migrations as $migrationPath) { - $migrationFile = basename($migrationPath); - $migration = str_replace('.php', '', $migrationFile); - if (!$this->migrationExists($migration)) { - // run migration - require $migrationPath; - $obj = new $migration; - if (method_exists($obj, 'safeUp')) { - $obj->safeUp(); - Yii::$app->moduleManager->appendToMigrationTable($migration); - - } - elseif (method_exists($obj, 'up')) { - $obj->up(); - Yii::$app->moduleManager->appendToMigrationTable($migration); - } - } - } - - // add not exists permissions - if (isset($manifest['permissions']) && is_array($manifest['permissions'])) { - $this->assignPermissions($manifest['permissions']); - } - - $this->modules->save($module); - } - - private function assignPermissions(array $permissions): void - { - foreach ($permissions as $permission => $description) { - if (!$this->permission_manager->permissionExists($permission)) { - $this->permission_manager->create($permission, $description); - } - } - } - - private function removePermissions(array $permissions) - { - foreach ($permissions as $permission => $description) { - if ($this->permission_manager->permissionExists($permission)) { - $this->permission_manager->delete($permission); - } - } - } - - private function getMigrationFiles($module) - { - // migration if not exists - $migrationPath = Yii::getAlias('@common/modules/' . $module . '/migrations'); - return file_exists($migrationPath) ? FileHelper::findFiles($migrationPath) : []; - } - - private function migrationExists($name): bool - { - // check record exists - $connection = Yii::$app->getDb(); - $command = $connection->createCommand("SELECT * FROM migration WHERE version = '$name'"); - $result = $command->queryAll(); - return $result ? true : false; - } -} \ No newline at end of file + public function enable(ModuleRecord $module) + { + // connect manifest + $manifest = require Yii::getAlias('@common/modules/' . $module->name . '/manifest.php'); + + $module->active = ModuleRecord::STATUS_ENABLED; + + // migration if not exists + $migrations = $this->getMigrationFiles($module->name); + foreach ($migrations as $migrationPath) { + $migrationFile = basename($migrationPath); + $migration = str_replace('.php', '', $migrationFile); + if (!$this->migrationExists($migration)) { + // run migration + require $migrationPath; + $obj = new $migration; + if (method_exists($obj, 'safeUp')) { + $obj->safeUp(); + Yii::$app->moduleManager->appendToMigrationTable($migration); + } elseif (method_exists($obj, 'up')) { + $obj->up(); + Yii::$app->moduleManager->appendToMigrationTable($migration); + } + } + } + + // add not exists permissions + if (isset($manifest['permissions']) && is_array($manifest['permissions'])) { + $this->assignPermissions($manifest['permissions']); + } + + $this->_modules->save($module); + // regenerate global control panel search + SearchPerformance::init(); + } + + private function assignPermissions(array $permissions): void + { + foreach ($permissions as $permission => $description) { + if (!$this->_permission_manager->permissionExists($permission)) { + $this->_permission_manager->create($permission, $description); + } + } + } + + private function removePermissions(array $permissions) + { + foreach ($permissions as $permission => $description) { + if ($this->_permission_manager->permissionExists($permission)) { + $this->_permission_manager->delete($permission); + } + } + } + + private function getMigrationFiles($module) + { + // migration if not exists + $migrationPath = Yii::getAlias('@common/modules/' . $module . '/migrations'); + + return file_exists($migrationPath) ? FileHelper::findFiles($migrationPath) : []; + } + + private function migrationExists($name): bool + { + // check record exists + $connection = Yii::$app->getDb(); + $command = $connection->createCommand("SELECT * FROM migration WHERE version = '$name'"); + $result = $command->queryAll(); + + return $result ? true : false; + } +} diff --git a/core/services/auth/AuthService.php b/core/services/auth/AuthService.php index 971090c..61721a9 100644 --- a/core/services/auth/AuthService.php +++ b/core/services/auth/AuthService.php @@ -20,7 +20,7 @@ class AuthService { $user = $this->users->findByUsernameOrEmail($form->username); if (!$user || !$user->isActive() || !$user->validatePassword($form->password)) { - throw new \DomainException(Yii::t('auth', 'Undefined user or password.')); + throw new \DomainException(Yii::t('user', 'Undefined user or password.')); } return $user; } diff --git a/frontend/web/themes/start/modules/blog/views/post/post.php b/frontend/web/themes/start/modules/blog/views/post/post.php index 44153cc..4bd7528 100644 --- a/frontend/web/themes/start/modules/blog/views/post/post.php +++ b/frontend/web/themes/start/modules/blog/views/post/post.php @@ -13,7 +13,7 @@ $this->registerMetaTag(['name' =>'description', 'content' => $post->translation- $this->registerMetaTag(['name' =>'keywords', 'content' => $post->translation->meta_keywords]); $this->params['breadcrumbs'][] = ['label' => Yii::t('blog_public', 'Blog'), 'url' => ['/blog/post/index']]; -$this->params['breadcrumbs'][] = ['label' => $post->category->name, 'url' => ['/blog/post/category', 'id' => $post->category->id]]; +$this->params['breadcrumbs'][] = ['label' => $post->category->translation->name, 'url' => ['/blog/post/category', 'id' => $post->category->id]]; $this->params['breadcrumbs'][] = $post->translation->title; $this->params['active_category'] = $post->category;