diff --git a/backend/components/menu/widgets/views/_item.php b/backend/components/menu/widgets/views/_item.php index 7811f8b..d4a3f0f 100644 --- a/backend/components/menu/widgets/views/_item.php +++ b/backend/components/menu/widgets/views/_item.php @@ -4,6 +4,8 @@ * Date: 11.07.2018 */ +use yii\helpers\Html; + /** * @var $this \yii\web\View * @var $item array @@ -22,12 +24,96 @@ $menu_item = $item['item'];

name ?> - + module ?>

- Content Panel + +
+
+ 'color: #555555', + ]) ?> + name, [ + 'id' => 'item-name-' . $menu_item->id, + 'class' => 'form-control', + ]) ?> +
+
+ 'color: #555555', + ]) ?> + title_attr, [ + 'id' => 'item-title-attr-' . $menu_item->id, + 'class' => 'form-control', + ]) ?> +
+
+ +
+
+ 'color: #555555', + ]) ?> + style, [ + 'id' => 'item-style-' . $menu_item->id, + 'class' => 'form-control', + ]) ?> +
+
+ 'color: #555555', + ]) ?> + css, [ + 'id' => 'item-css-' . $menu_item->id, + 'class' => 'form-control', + ]) ?> +
+
+ +
+ url_params): ?> +
+ 'color: #555555', + ]) ?> + url, [ + 'id' => 'item-url-' . $menu_item->id, + 'class' => 'form-control', + ]) ?> +
+ + url, [ + 'id' => 'item-url-' . $menu_item->id, + ]) ?> + +
+ 'color: #555555', + ]) ?> + target, [ + '' => Yii::t('menu', 'Self Window'), + '_blank' => Yii::t('menu', 'Blank Window'), + ], [ + 'id' => 'item-target-' . $menu_item->id, + 'class' => 'form-control', + ]) ?> +
+
+ +
+
+ 'item-delete-button btn btn-sm btn-danger', + 'data-id' => $menu_item->id, + ]) ?> + 'item-save-button btn btn-sm btn-success', + 'data-id' => $menu_item->id, + ]) ?> +
+
diff --git a/backend/components/menu/widgets/views/menu.php b/backend/components/menu/widgets/views/menu.php index 1a71f76..31464b2 100644 --- a/backend/components/menu/widgets/views/menu.php +++ b/backend/components/menu/widgets/views/menu.php @@ -27,6 +27,58 @@ function menu_generate($items) { return $html . ''; } +$name_empty_error = Yii::t('menu', 'Name must be specified'); +$item_save_url = Url::to(['menu/save-menu-item-data']); +$item_delete_url = Url::to(['menu/delete-menu-item']); +$confirm_delete_message = Yii::t('buttons', 'Are you sure you want to delete this item?'); +$current_url = Url::to(['menu/index', 'id' => $menu->id]); +$js = <<registerJs($js, $this::POS_READY); + $url = Url::to(['/menu/save-menu-items']); $redirect = Url::to(['menu/index', 'id' => $menu->id]); ?> diff --git a/backend/controllers/MenuController.php b/backend/controllers/MenuController.php index a0f2065..da05d96 100644 --- a/backend/controllers/MenuController.php +++ b/backend/controllers/MenuController.php @@ -6,8 +6,6 @@ namespace backend\controllers; - -use common\modules\blog\BlogModule; use core\entities\menu\Menu; use core\entities\menu\MenuItem; use core\entities\ModuleRecord; @@ -42,7 +40,7 @@ class MenuController extends Controller 'class' => AccessControl::class, 'rules' => [ [ - 'actions' => ['create', 'update', 'delete', 'index', 'save-menu-items'], + 'actions' => ['create', 'update', 'delete', 'index', 'save-menu-items', 'save-menu-item-data', 'delete-menu-item'], 'allow' => true, 'roles' => ['MenuManagement'], ], @@ -56,6 +54,7 @@ class MenuController extends Controller 'class' => VerbFilter::class, 'actions' => [ 'delete' => ['POST'], + 'delete-menu-item' => ['POST'], ], ], ]; @@ -139,6 +138,72 @@ class MenuController extends Controller return $this->redirect(['index']); } + public function actionDeleteMenuItem() + { + Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; + if (Yii::$app->request->isAjax) { + try { + $id = Yii::$app->request->post('id'); + $item = $this->findItemModel($id); + + //$this->deleteItem($item); + $item->delete(); + + Yii::$app->session->setFlash('success', Yii::t('menu', 'Menu Item Deleted')); + + return [ 'result' => 'success' ]; + } + catch (\RuntimeException $e) { + return [ 'result' => 'error', 'message' => $e->getMessage() ]; + } + } + return ['result' => 'error', 'message' => 'Request error']; + } + + //private function deleteItem(MenuItem $item): void + //{ + /*if ($item->hasChildren()) { + $children = $item->children; + foreach ($children as $child) { + $this->deleteItem($child); + } + }*/ + //$item->delete(); + //} + + public function actionSaveMenuItemData() + { + Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; + if (Yii::$app->request->isAjax) { + try { + $id = Yii::$app->request->post('id'); + $name = Yii::$app->request->post('name'); + $title = Yii::$app->request->post('title'); + $style = Yii::$app->request->post('style'); + $css = Yii::$app->request->post('css'); + $url = Yii::$app->request->post('url'); + $target = Yii::$app->request->post('target'); + + $item = $this->findItemModel($id); + $item->name = $name; + $item->title_attr = $title; + $item->style = $style; + $item->css = $css; + $item->url = $url; + $item->target = $target; + $item->save(); + + Yii::$app->session->setFlash('success', Yii::t('menu', 'Menu Item Saved')); + + return [ 'result' => 'success' ]; + } + catch (\RuntimeException $e) { + return [ 'result' => 'error', 'message' => $e->getMessage() ]; + } + } + return ['result' => 'error', 'message' => 'Request error']; + } + public function actionSaveMenuItems() { $json = Yii::$app->request->post('json'); @@ -151,6 +216,7 @@ class MenuController extends Controller $order[$item[1]] = isset($order[$item[1]]) ? $order[$item[1]]+1 : 0; $this->menu_item_service->setPosition($item, $order[$item[1]]); } + Yii::$app->session->setFlash('success', Yii::t('menu', 'Menu Saved')); return [ 'result' => 'success' ]; } catch (\RuntimeException $e) { @@ -192,4 +258,12 @@ class MenuController extends Controller } throw new NotFoundHttpException('The requested menu does not exist.'); } + + protected function findItemModel($id): MenuItem + { + if (($model = MenuItem::findOne($id)) !== null) { + return $model; + } + throw new NotFoundHttpException('The requested menu item does not exist.'); + } } \ No newline at end of file diff --git a/backend/messages/ru/main.php b/backend/messages/ru/main.php index 7f2a71f..e2acfdd 100644 --- a/backend/messages/ru/main.php +++ b/backend/messages/ru/main.php @@ -28,4 +28,6 @@ return [ 'Search results' => 'Поиск', 'Search...' => 'Поиск...', 'Name' => 'Название', + 'Title attribute' => 'Атрибут тега Title', + 'Url' => 'Ссылка', ]; \ No newline at end of file diff --git a/backend/messages/ru/menu.php b/backend/messages/ru/menu.php index 2e7fd4d..18c3309 100644 --- a/backend/messages/ru/menu.php +++ b/backend/messages/ru/menu.php @@ -9,4 +9,16 @@ return [ 'Current Menu' => 'Текущее меню', 'Available Blocks' => 'Доступные блоки', 'Menu Items' => 'Элементы меню', + 'Item Name' => 'Название', + 'Item Title Attribute' => 'Атрибут Title', + 'Style Attribute' => 'Атрибут Style', + 'CSS' => 'Класс CSS', + 'Self Window' => 'Текущее окно', + 'Blank Window' => 'Новое окно', + 'Target' => 'Цель', + 'URL' => 'Ссылка', + 'Name must be specified' => 'Укажите название пункта меню', + 'Menu Item Saved' => 'Пункт меню сохранен', + 'Menu Item Deleted' => 'Пункт меню удален', + 'Menu Saved' => 'Меню сохранено', ]; \ No newline at end of file diff --git a/backend/views/layouts/left.php b/backend/views/layouts/left.php index 5f05099..bf890e7 100644 --- a/backend/views/layouts/left.php +++ b/backend/views/layouts/left.php @@ -83,12 +83,12 @@ $model = new SearchForm(); 'visible' => \Yii::$app->user->can('admin') || \Yii::$app->user->can('MenuManagement'), ], - [ + /*[ 'label' => Yii::t('page', 'Pages'), 'icon' => 'file-o', 'url' => ['/page/index'], 'active' => $this->context->id == 'page', 'visible' => \Yii::$app->user->can('admin') || \Yii::$app->user->can('PagesManagement'), - ], + ],*/ ['label' => Yii::t('post', 'Posts'), 'icon' => 'newspaper-o', 'items' => array_merge( array_map(function(\core\entities\post\PostType $type) { diff --git a/backend/views/menu/menu.php b/backend/views/menu/menu.php index 6276113..9c5d33b 100644 --- a/backend/views/menu/menu.php +++ b/backend/views/menu/menu.php @@ -75,13 +75,13 @@ $this->params['breadcrumbs'][] = $this->title;
-
+ -
+
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' ] ); field($model, 'name')->hiddenInput([ + 'id' => 'blog_menu_item_name', ])->label(false) ?> field($model, 'title_attr')->hiddenInput([ + 'id' => 'blog_menu_item_title_attr', ])->label(false) ?> 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; field($model, 'parentId')->dropDownList($model->parentsList()) ?> field($model, 'title')->textInput(['maxlength' => true]) ?> field($model, 'slug')->textInput(['maxlength' => true]) ?> - field($model, 'content')->widget(CKEditor::className()) ?> + 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); + + + + +
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') ?> + + +
+ + 'ul', + 'itemTemplate' => '' . "\n", + 'activeItemTemplate' => '' . "\n", + 'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], + ]) ?> + +
+ + +
+ + + +
+ +
+ + +
+ +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; +?> +
+ +

title) ?>

+ + formatter->asHtml($page->content, [ + 'Attr.AllowedRel' => array('nofollow'), + 'HTML.SafeObject' => true, + 'Output.FlashCompat' => true, + 'HTML.SafeIframe' => true, + 'URI.SafeIframeRegexp'=>'%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/)%', + ]) ?> + +