Application sitemap and navigation manager module for Yii 2.0 Framework

Installs: 45 774

Dependents: 3

Suggesters: 1

Security: 0

Stars: 30

Watchers: 10

Forks: 11

Open Issues: 5


2.4.1 2021-11-17 09:49 UTC

This package is auto-updated.

Last update: 2022-04-21 16:47:52 UTC


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

// 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 () {

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\activeRecordPermissions\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


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



  • 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