+
-
+
= $item['content'] ?>
diff --git a/common/modules/blog/BlogModule.php b/common/modules/blog/BlogModule.php
index 8a75e0f..bd76084 100644
--- a/common/modules/blog/BlogModule.php
+++ b/common/modules/blog/BlogModule.php
@@ -1,11 +1,11 @@
'blog',
'title' => \Yii::t('blog', 'Blog'),
'content' => MenuItemCreatorWidget::widget([
'menu_id' => $menu_id,
diff --git a/common/modules/blog/widgets/views/menu-item/creator.php b/common/modules/blog/widgets/views/menu-item/creator.php
index 9b338a4..6e93ca0 100644
--- a/common/modules/blog/widgets/views/menu-item/creator.php
+++ b/common/modules/blog/widgets/views/menu-item/creator.php
@@ -14,26 +14,35 @@ use yii\helpers\Html;
use yii\web\JsExpression;
use yii\helpers\Url;
+$block_name = Yii::t('blog', 'Blog');
+$block_title_attr = Yii::t('blog', 'Blog');
+
$js = <<
[
'placeholder' => Yii::t('blog', 'Select post...'),
'id' => 'post_select',
- 'onchange' => new JsExpression("updateUrl('post')"),
+ 'onchange' => new JsExpression("updateBlogUrl('post')"),
],
'pluginOptions' => [
'disabled' => true,
@@ -86,9 +95,11 @@ $fetchUrl = Url::to( [ '/blog/manage/post/post-search' ] );
= $form->field($model, 'name')->hiddenInput([
+ 'id' => 'blog_menu_item_name',
])->label(false) ?>
= $form->field($model, 'title_attr')->hiddenInput([
+ 'id' => 'blog_menu_item_title_attr',
])->label(false) ?>
= $form->field($model, 'module')->hiddenInput([
diff --git a/common/modules/links/LinksModule.php b/common/modules/links/LinksModule.php
new file mode 100644
index 0000000..ec7e313
--- /dev/null
+++ b/common/modules/links/LinksModule.php
@@ -0,0 +1,57 @@
+getI18n()->translations = ArrayHelper::merge($app->getI18n()->translations, [
+ 'link' => [
+ 'class' => 'yii\i18n\PhpMessageSource',
+ 'basePath' => '@common/modules/links/messages',
+ ],
+ 'link_public' => [
+ 'class' => 'yii\i18n\PhpMessageSource',
+ 'basePath' => '@common/modules/links/messages',
+ ],
+ ]);
+ }
+
+ public static function getMenuItemCreator($menu_id): array
+ {
+ $widgets = [];
+ $widgets[] = [
+ 'id' => 'links',
+ 'title' => \Yii::t('link', 'Links'),
+ 'content' => MenuItemCreatorWidget::widget([
+ 'menu_id' => $menu_id,
+ ]),
+ ];
+ return $widgets;
+ }
+}
diff --git a/common/modules/links/messages/ru/link.php b/common/modules/links/messages/ru/link.php
new file mode 100644
index 0000000..72d235e
--- /dev/null
+++ b/common/modules/links/messages/ru/link.php
@@ -0,0 +1,4 @@
+ 'Ссылки',
+];
\ No newline at end of file
diff --git a/common/modules/links/widgets/MenuItemCreatorWidget.php b/common/modules/links/widgets/MenuItemCreatorWidget.php
new file mode 100644
index 0000000..cd11575
--- /dev/null
+++ b/common/modules/links/widgets/MenuItemCreatorWidget.php
@@ -0,0 +1,26 @@
+module = \Yii::t('link', 'Links');
+ $form->menu_id = $this->menu_id;
+
+ return $this->render('menu-item/creator', [
+ 'model' => $form,
+ ]);
+ }
+}
\ No newline at end of file
diff --git a/common/modules/links/widgets/views/menu-item/creator.php b/common/modules/links/widgets/views/menu-item/creator.php
new file mode 100644
index 0000000..6b5ecc8
--- /dev/null
+++ b/common/modules/links/widgets/views/menu-item/creator.php
@@ -0,0 +1,40 @@
+
+
+
\ No newline at end of file
diff --git a/common/modules/pages/PagesModule.php b/common/modules/pages/PagesModule.php
new file mode 100644
index 0000000..1dadde0
--- /dev/null
+++ b/common/modules/pages/PagesModule.php
@@ -0,0 +1,78 @@
+params['search_rules'][] = "SELECT title, content, CONCAT('/pages/manage/page/view/', id) AS url FROM {{pages}}";
+
+ $app->getUrlManager()->addRules([
+ ['class' => 'common\modules\pages\urls\PageMainUrlRule'],
+ ]);
+
+ $app->getUrlManager()->addRules([
+ 'pages/manage/page/view/' => 'pages/manage/page/view',
+ ]);
+
+ // add languages
+ $app->getI18n()->translations = ArrayHelper::merge($app->getI18n()->translations, [
+ 'page' => [
+ 'class' => 'yii\i18n\PhpMessageSource',
+ 'basePath' => '@common/modules/pages/messages',
+ ],
+ 'page_public' => [
+ 'class' => 'yii\i18n\PhpMessageSource',
+ 'basePath' => '@common/modules/pages/messages',
+ ],
+ ]);
+
+ // add menu items
+ if (basename($app->getBasePath()) === 'backend') {
+ $app->params['adminMenu'][] = [
+ 'label' => \Yii::t( 'page', 'Pages' ),
+ 'icon' => 'file-o',
+ 'url' => [ '/pages/manage/page/index' ],
+ 'visible' => \Yii::$app->user->can( 'admin' ) || \Yii::$app->user->can( 'PagesManagement' )
+ ];
+ }
+ }
+
+ public static function getMenuItemCreator($menu_id): array
+ {
+ $widgets = [];
+ $widgets[] = [
+ 'id' => 'pages',
+ 'title' => \Yii::t('page', 'Pages'),
+ 'content' => MenuItemCreatorWidget::widget([
+ 'menu_id' => $menu_id,
+ ]),
+ ];
+ return $widgets;
+ }
+}
diff --git a/frontend/controllers/PageController.php b/common/modules/pages/controllers/PageController.php
similarity index 86%
rename from frontend/controllers/PageController.php
rename to common/modules/pages/controllers/PageController.php
index 59e8d23..94fb026 100644
--- a/frontend/controllers/PageController.php
+++ b/common/modules/pages/controllers/PageController.php
@@ -1,8 +1,8 @@
[
- 'class' => AccessControl::className(),
+ 'class' => AccessControl::class,
'rules' => [
[
'actions' => ['view'],
diff --git a/backend/controllers/PageController.php b/common/modules/pages/controllers/manage/PageController.php
similarity index 82%
rename from backend/controllers/PageController.php
rename to common/modules/pages/controllers/manage/PageController.php
index 22306f9..22f79e0 100644
--- a/backend/controllers/PageController.php
+++ b/common/modules/pages/controllers/manage/PageController.php
@@ -1,16 +1,17 @@
redirect(['index']);
}
+ public function actionPageSearch($q = null, $id = null)
+ {
+ \Yii::$app->response->format = Response::FORMAT_JSON;
+ $out = ['results' => ['id' => '', 'text' => '']];
+ if (!is_null($q)) {
+ $data = Page::find()->select('id, title as text')->andWhere(['like', 'title', $q])->limit(20)->asArray()->all();
+ $out['results'] = array_values($data);
+ }
+ elseif ($id > 0) {
+ $tag_name = Page::findOne($id)->title;
+ $out['results'] = ['id' => $tag_name, 'text' => $tag_name];
+ }
+ else {
+ $data = Page::find()->select('id, title as text')->orderBy(['id' => SORT_DESC])->limit(20)->asArray()->all();
+ $out['results'] = array_values($data);
+ }
+ return $out;
+ }
+
/**
* @param integer $id
* @return Page the loaded model
diff --git a/core/entities/Page.php b/common/modules/pages/entities/Page.php
similarity index 97%
rename from core/entities/Page.php
rename to common/modules/pages/entities/Page.php
index 9e907aa..9d69749 100644
--- a/core/entities/Page.php
+++ b/common/modules/pages/entities/Page.php
@@ -1,6 +1,6 @@
'№',
'Parent Page' => 'Родительская страница',
'Update Page: {name}' => 'Редактирование страницы: {name}',
+ 'Select page...' => 'Укажите страницу',
];
\ No newline at end of file
diff --git a/core/repositories/page/PageRepository.php b/common/modules/pages/repositories/PageRepository.php
similarity index 86%
rename from core/repositories/page/PageRepository.php
rename to common/modules/pages/repositories/PageRepository.php
index a0bd631..05de05c 100644
--- a/core/repositories/page/PageRepository.php
+++ b/common/modules/pages/repositories/PageRepository.php
@@ -1,8 +1,8 @@
repository = $repository;
+ $this->cache = $cache;
+ }
+
+ public function parseRequest($manager, $request)
+ {
+ if (preg_match('#^' . $this->prefix . '(.*[a-z])$#is', $request->pathInfo, $matches)) {
+ $path = $matches['1'];
+
+ $result = $this->cache->getOrSet( [ 'page_main_route', 'path' => $path ], function () use ( $path ) {
+ if ( ! $post = $this->repository->findBySlug($this->getPathSlug( $path ) ) ) {
+ return [ 'id' => null, 'path' => null ];
+ }
+ return [ 'id' => $post->id, 'path' => $post->slug ];
+ }, null, new TagDependency(['tags' => ['pages']]) );
+
+ if ( empty( $result['id'] ) ) {
+ return false;
+ }
+
+ if ( $path != $result['path'] ) {
+ throw new UrlNormalizerRedirectException( [ 'pages/page/view', 'id' => $result['id'] ], 301 );
+ }
+
+ return ['pages/page/view', ['id' => $result['id']]];
+ }
+ return false;
+ }
+
+ public function createUrl($manager, $route, $params)
+ {
+ if ($route == 'pages/page/view') {
+ if (empty($params['id'])) {
+ throw new InvalidArgumentException('Empty id.');
+ }
+ $id = $params['id'];
+
+ $url = $this->cache->getOrSet(['page_main_route', 'id' => $id], function () use ($id) {
+ if (!$page = $this->repository->find($id)) {
+ return null;
+ }
+ return $page->slug;
+ }, null, new TagDependency(['tags' => ['pages']]));
+
+ if (!$url) {
+ return '#';
+ //throw new InvalidArgumentException('Undefined id.');
+ }
+
+ $url = $this->prefix . '/' . $url;
+ unset($params['id']);
+ if (!empty($params) && ($query = http_build_query($params)) !== '') {
+ $url .= '?' . $query;
+ }
+
+ return $url;
+ }
+ return false;
+ }
+
+ private function getPathSlug($path): string
+ {
+ $chunks = explode('/', $path);
+ return end($chunks);
+ }
+}
\ No newline at end of file
diff --git a/backend/views/page/_form.php b/common/modules/pages/views/manage/page/_form.php
similarity index 95%
rename from backend/views/page/_form.php
rename to common/modules/pages/views/manage/page/_form.php
index a110c21..a9d217f 100644
--- a/backend/views/page/_form.php
+++ b/common/modules/pages/views/manage/page/_form.php
@@ -5,7 +5,7 @@ use yii\helpers\Html;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
-/* @var $model core\forms\PageForm */
+/* @var $model \common\modules\pages\forms\PageForm */
/* @var $form yii\widgets\ActiveForm */
?>
@@ -19,7 +19,7 @@ use yii\widgets\ActiveForm;
= $form->field($model, 'parentId')->dropDownList($model->parentsList()) ?>
= $form->field($model, 'title')->textInput(['maxlength' => true]) ?>
= $form->field($model, 'slug')->textInput(['maxlength' => true]) ?>
- = $form->field($model, 'content')->widget(CKEditor::className()) ?>
+ = $form->field($model, 'content')->widget(CKEditor::class) ?>
diff --git a/backend/views/page/create.php b/common/modules/pages/views/manage/page/create.php
similarity index 85%
rename from backend/views/page/create.php
rename to common/modules/pages/views/manage/page/create.php
index 5be1319..4271875 100644
--- a/backend/views/page/create.php
+++ b/common/modules/pages/views/manage/page/create.php
@@ -1,7 +1,7 @@
title = Yii::t('page', 'Create Page');
$this->params['breadcrumbs'][] = ['label' => Yii::t('page', 'Pages'), 'url' => ['index']];
diff --git a/backend/views/page/index.php b/common/modules/pages/views/manage/page/index.php
similarity index 95%
rename from backend/views/page/index.php
rename to common/modules/pages/views/manage/page/index.php
index a1a873f..2368545 100644
--- a/backend/views/page/index.php
+++ b/common/modules/pages/views/manage/page/index.php
@@ -1,12 +1,12 @@
title = Yii::t('page', 'Pages');
diff --git a/backend/views/page/update.php b/common/modules/pages/views/manage/page/update.php
similarity index 81%
rename from backend/views/page/update.php
rename to common/modules/pages/views/manage/page/update.php
index ea93140..3d9a13d 100644
--- a/backend/views/page/update.php
+++ b/common/modules/pages/views/manage/page/update.php
@@ -1,8 +1,8 @@
title = Yii::t('page', 'Update Page: {name}', ['name' => $page->title]);
$this->params['breadcrumbs'][] = ['label' => Yii::t('page', 'Pages'), 'url' => ['index']];
diff --git a/backend/views/page/view.php b/common/modules/pages/views/manage/page/view.php
similarity index 97%
rename from backend/views/page/view.php
rename to common/modules/pages/views/manage/page/view.php
index 0532100..5b5a9ed 100644
--- a/backend/views/page/view.php
+++ b/common/modules/pages/views/manage/page/view.php
@@ -4,7 +4,7 @@ use yii\helpers\Html;
use yii\widgets\DetailView;
/* @var $this yii\web\View */
-/* @var $page core\entities\Page */
+/* @var $page \common\modules\pages\entities\Page */
$this->title = $page->title;
$this->params['breadcrumbs'][] = ['label' => Yii::t('page', 'Pages'), 'url' => ['index']];
diff --git a/frontend/views/page/view.php b/common/modules/pages/views/page/view.php
similarity index 94%
rename from frontend/views/page/view.php
rename to common/modules/pages/views/page/view.php
index bf1aa14..d46e86e 100644
--- a/frontend/views/page/view.php
+++ b/common/modules/pages/views/page/view.php
@@ -3,7 +3,7 @@
use yii\helpers\Html;
/* @var $this yii\web\View */
-/* @var $page \core\entities\Page */
+/* @var $page \common\modules\pages\entities\Page */
$this->title = $page->getSeoTitle();
diff --git a/common/modules/pages/widgets/MenuItemCreatorWidget.php b/common/modules/pages/widgets/MenuItemCreatorWidget.php
new file mode 100644
index 0000000..ebc1c32
--- /dev/null
+++ b/common/modules/pages/widgets/MenuItemCreatorWidget.php
@@ -0,0 +1,29 @@
+module = \Yii::t('page', 'Pages');
+ $form->name = \Yii::t('page', 'Pages');
+ $form->title_attr = \Yii::t('page', 'Pages');
+ $form->menu_id = $this->menu_id;
+ $form->url = '/pages/page/index';
+
+ return $this->render('menu-item/creator', [
+ 'model' => $form,
+ ]);
+ }
+}
\ No newline at end of file
diff --git a/common/modules/pages/widgets/views/menu-item/creator.php b/common/modules/pages/widgets/views/menu-item/creator.php
new file mode 100644
index 0000000..54c87b0
--- /dev/null
+++ b/common/modules/pages/widgets/views/menu-item/creator.php
@@ -0,0 +1,95 @@
+registerJs($js, $this::POS_HEAD);
+
+$fetchUrl = Url::to( [ '/pages/manage/page/page-search' ] );
+?>
+
+
\ No newline at end of file
diff --git a/core/entities/menu/MenuItem.php b/core/entities/menu/MenuItem.php
index 3897219..f9cc849 100644
--- a/core/entities/menu/MenuItem.php
+++ b/core/entities/menu/MenuItem.php
@@ -6,8 +6,9 @@
namespace core\entities\menu;
-use paulzi\sortable\SortableBehavior;
use yii\db\ActiveRecord;
+use yii\helpers\Json;
+use yii\helpers\Url;
/**
* Class MenuItem
@@ -91,11 +92,34 @@ class MenuItem extends ActiveRecord
return false;
}
+ public function beforeDelete(){
+ foreach($this->children as $child) {
+ $child->delete();
+ }
+ return parent::beforeDelete();
+ }
+
+ public function getUrl(): string
+ {
+ $params = $this->url_params ? Json::decode($this->url_params, true) : [];
+ return Url::to(array_merge([$this->url], $params));
+ }
+
+ public function isActive(): bool
+ {
+ return \Yii::$app->request->getUrl() == $this->getUrl();
+ }
+
public function getChildren()
{
return $this->hasMany(MenuItem::class, ['parent_id' => 'id'])->orderBy(['sort' => SORT_ASC]);
}
+ public function hasChildren(): bool
+ {
+ return $this->hasMany(MenuItem::class, ['parent_id' => 'id'])->orderBy(['sort' => SORT_ASC])->count() > 0 ? true : false;
+ }
+
public function getParent()
{
return $this->hasOne(MenuItem::class, ['id' => 'parent_id']);
diff --git a/core/widgets/menu/MenuWidget.php b/core/widgets/menu/MenuWidget.php
new file mode 100644
index 0000000..7a56d05
--- /dev/null
+++ b/core/widgets/menu/MenuWidget.php
@@ -0,0 +1,22 @@
+menu_id);
+ return $this->render('menu', [
+ 'menu' => $menu,
+ ]);
+ }
+}
\ No newline at end of file
diff --git a/core/widgets/menu/views/menu.php b/core/widgets/menu/views/menu.php
new file mode 100644
index 0000000..f4824cd
--- /dev/null
+++ b/core/widgets/menu/views/menu.php
@@ -0,0 +1,30 @@
+
+
+
\ No newline at end of file
diff --git a/frontend/web/themes/start/layouts/main.php b/frontend/web/themes/start/layouts/main.php
index f55d798..5bbf7de 100644
--- a/frontend/web/themes/start/layouts/main.php
+++ b/frontend/web/themes/start/layouts/main.php
@@ -32,11 +32,20 @@ rmrevin\yii\fontawesome\cdn\AssetBundle::register($this);
+
+
+ = \core\widgets\menu\MenuWidget::widget([
+ 'menu_id' => 3,
+ ]) ?>
+
+
+
+
diff --git a/frontend/web/themes/start/modules/pages/views/layouts/page.php b/frontend/web/themes/start/modules/pages/views/layouts/page.php
new file mode 100644
index 0000000..0b4d900
--- /dev/null
+++ b/frontend/web/themes/start/modules/pages/views/layouts/page.php
@@ -0,0 +1,28 @@
+beginContent('@frontend/web/themes/start/layouts/main.php') ?>
+
+
+
+
+ = \yii\widgets\Breadcrumbs::widget([
+ 'tag' => 'ul',
+ 'itemTemplate' => '
{link} ' . "\n",
+ 'activeItemTemplate' => '
{link} ' . "\n",
+ 'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
+ ]) ?>
+
+
+
+
+
+
+ = $content ?>
+
+
+
+
+
+
+
+
+endContent() ?>
+
diff --git a/frontend/web/themes/start/modules/pages/views/page/view.php b/frontend/web/themes/start/modules/pages/views/page/view.php
new file mode 100644
index 0000000..d46e86e
--- /dev/null
+++ b/frontend/web/themes/start/modules/pages/views/page/view.php
@@ -0,0 +1,32 @@
+title = $page->getSeoTitle();
+
+$this->registerMetaTag(['name' => 'description', 'content' => $page->meta->description]);
+$this->registerMetaTag(['name' => 'keywords', 'content' => $page->meta->keywords]);
+
+foreach ($page->parents as $parent) {
+ if (!$parent->isRoot()) {
+ $this->params['breadcrumbs'][] = ['label' => $parent->title, 'url' => ['view', 'id' => $parent->id]];
+ }
+}
+$this->params['breadcrumbs'][] = $page->title;
+?>
+