Application sitemap and navigation manager module for Yii 2.0 Framework
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 everymodule_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 \
--migrationPath=@vendor/dmstr/yii2-pages-module/migrations
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
, keyavailableRoutes
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)
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.
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')
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
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
tbd