Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
251 lines (165 sloc) 5.4 KB

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


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


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.


Run migrations

./yii migrate \
    --disableLookup=1 \


Enable module in application 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',

Use settings module to configure additional controllers

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


  • 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)


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'),


  • 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.


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


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',


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

Web UI

Url: /pages/copy

RBAC permission



  • 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



  • 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



dmstr logo Built by dmstr