Skip to content
Application sitemap and navigation manager module for Yii 2.0 Framework
PHP Makefile JavaScript Other
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
assets
commands
components
controllers
example-views
helpers
migrations
models
tests
traits
views no message Dec 19, 2018
.gitignore aligned tests with phd5-template usage Jan 29, 2018
.gitlab-ci.yml
.travis.yml
Bootstrap.php
Module.php
README.md
composer.json updated pheme/yii2-settings constraint Nov 13, 2019

README.md

Yii2 Page Manager

Latest Stable Version Total Downloads License

Application sitemap and navigation manager module for Yii 2.0 Framework

⚠️ Breaking changes in 0.14.0 and 0.18.0

data structure and public properties are updated and query menu items from now on via domain_id

Requirements

  • URL manager from codemix/yii2-localeurls configured in application
  • role based access control; auth_items for every module_controller_action

Installation

The preferred way to install this extension is through composer.

Either run

composer require dmstr/yii2-pages-module "*"

or add

"dmstr/yii2-pages-module": "*"

to the require section of your composer.json file.

Setup

Run migrations

./yii migrate \
    --disableLookup=1 \
    --migrationPath=@vendor/dmstr/yii2-pages-module/migrations

Configuration

Enable module in application configuration

// module configuration
'pages' => [
	'class' => 'dmstr\modules\pages\Module',
	'layout' => '@admin-views/layouts/main',
	'roles' => ['Admin', 'Editor'],
	'defaultPageLayout' => '@app/modules/frontend/layouts/main',
	'availableRoutes' => [
		'site/index' => 'Index Route',
	],
	'availableViews' => [
		'@app/views/site/index.php' => 'Index View',
	],
],


// if used want a url suffix, e.g. '.html', add Url rules for that
'urlManager' => [
	...
	'rules' => [
		'<pagePath:[a-zA-Z0-9_\-\./\+]*>/<pageSlug:[a-zA-Z0-9_\-\.]*>-<pageId:[0-9]*>.html' => 'pages/default/page',
		'<pageSlug:[a-zA-Z0-9_\-\.]*>-<pageId:[0-9]*>.html' => 'pages/default/page',
	],
	...
],

// register frontend asset for hiding pages via CookieButton
'on '. \yii\web\Application::EVENT_BEFORE_ACTION => function () {
    \dmstr\modules\pages\assets\PagesFrontendAsset::register(Yii::$app->controller->view);
},

Use settings module to configure additional controllers

  • Add one controller route per line to section pages, key availableRoutes

Settings

  • pages.availableRoutes - routes per access_domain (for non-admin users)
  • pages.availableViews - views per access_domain (for non-admin users)
  • pages.availableGlobalRoutes - global routes (for admin users)
  • pages.availableGlobalViews - global views(for admin users)

Usage

Navbar (eg. layouts/main)

find a root node / leave node

by domain_id i.e. root

$menuItems = \dmstr\modules\pages\models\Tree::getMenuItems('root');

use for example with bootstrap Navbar

    echo yii\bootstrap\Nav::widget(
        [
            'options'         => ['class' => 'navbar-nav navbar-right'],
            'activateItems'   => false,
            'encodeLabels'    => false,
            'activateParents' => true,
            'items'           => Tree::getMenuItems('root'),
        ]
    );

Backend

  • visit /pages to create a root-node for your current application language.
  • click the tree icon
  • enter name identifier (no spaces and special chars) as Domain ID and Menu name and save
  • create child node
  • assign name, title, language and route/view
  • save

Now you should be able to see the page in your Nav widget in the frontend of your application.

Traits

We use the \dmstr\db\traits\ActiveRecordAccessTrait to have a check access behavior on active record level

  • Owner Access
  • Read Access
  • Update Access
  • Delete Access

Anchors

available since 0.12.0-beta1

👷 A workaround for creating anchor links is to define a route, like /en/mysite-2 in the settings module. On a node you can attach an anchor by using Advanced URL settings, with {'#':'myanchor'}.

It is recommended to create a new entry in Tree mode.

i18n - sibling pages

Find sibling page in target language

/**
 * Find the sibling page in target language if exists
 *
 * @param string $targetLanguage
 * @param integer $sourceId
 * @param string $route
 *
 * @return Tree|null
 * @throws \yii\console\Exception
 */
public function sibling($targetLanguage, $sourceId = null, $route = self::DEFAULT_PAGE_ROUTE);


Example 1:
---

// page id 12 is a node in language 'en'
$sourcePage = Tree::findOne(12);

// returns corresponding page object in language 'de' or null if not exists
$targetPage = $sourcePage->sibling('de');


Example 2:
---

// find by params
$targetPage = (new Tree())->sibling('de', 12, '/pages/default/page')

Copy pages

Console config

'controllerMap'       => [
	'copy-pages' => '\dmstr\modules\pages\commands\CopyController',
]

CLI

Command: yii copy-pages/root-node --rootId --destinationLanguage

Web UI

Url: /pages/copy

RBAC permission

pages.globalAccess

Whether a user can select * (global) for a menu item.

pages_copy

Usage

  • Switch to the application language you want to copy page root nodes to -> /pages/copy
  • Select the root node you whant to copy
  • Select the target language or you can select the global domain if you have permissions to
  • Start Copy

Testing

Requirements:

  • docker >=1.9.1
  • docker-compose >= 1.6.2

Codeception is run via "Potemkin"-Phundament.

cd tests

Start test stack

make all

Run tests

make run-tests

Ressources

tbd


dmstr logo Built by dmstr

You can’t perform that action at this time.