简体   繁体   中英

Displaying subdirectory name in the url in Yii2 for static pages

Iam creating static pages for a client using Yii2. I am using yii2 because the client has some other requirements to scale up the web later. I use Yii2 Basic app. The yii2 basic has default pages like about, contact etc. The url for those pages after enabling pretty url is

 www.example.com/about

etc

Now i need to create pages

"xyz.php"

under a sub directory like

"abc"

. So i need my url to be www.example.com/abc/xyz

How do i achieve this? to be informed iam a learner, I followed url rules, helpers but did not find a strong solution.

create a controller like StaticController.php and use the yii\\web\\ViewAction http://www.yiiframework.com/doc-2.0/yii-web-viewaction.html

As an example:

namespace app\controllers;

use Yii;
use yii\web\Controller;
use yii\filters\AccessControl;

/**
 * StaticController is only for displaying static pages.
 */
class StaticController extends Controller
{
    public $defaultAction = 'page';

    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'actions' => ['page'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
        ];
    }

    public function actions()
    {
        return [
            'page'=>array(
                'class'=>'yii\web\ViewAction',
                'viewPrefix'=>null, // or set a specific directory e.g. 'static-pages' if you want to store the static pages in a subdirectory
            ),
        ];
    }
}

And add this Rule to your UrlManager (where static is your controller name)

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        '<controller:static>/<view:.*>' => '<controller>',
        ...
    ]
]

Now you can store your static pages in the directory /view/static/

eg index.php, test.php or even in subdirectories /sub/test2.php

The urls would be like /static (or /static/index), /static/test1, /static/sub/test2

The 1st pathname is of course the controller name, but you can also change the url rule to something else or rename the controller.

config/web.php

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        'abc/<view:\S+>' => 'site/page',
    ]
]

I had a situation where I wanted the URL to indicate a sub page (like 'website/page/sub-page) but I didn't think it made sense to have a separate controller. (At the moment I just have one controller; SiteController.php .)

I am recreating the site structure of an existing site in a new Yii2 Basic site.

Client has a page called 'laptop-repair' in their existing site with a number of pages linked from it, eg 'laptop-overheating'. So the URI needed to look like 'laptop-repair/laptop-overheating'.

The solution:

In urlManager in config>web.php I add a new rule (Nb. the order of rules is important, the earlier rules are prioritised):

'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                '/' => 'site/index',
                [
                    'pattern' => 'laptop-repair/<page:.*>',
                    'route' => 'site/laptop-repair',
                    'defaults' => ['page' => 'index'],
                ],

                ...

            ],
        ],

In SiteController.php I already had an action for the page which I wanted to make into a parent page:

public function actionLaptopRepair()
{
    return $this->render('laptop-repair');
}

which I replaced with:

public function actionLaptopRepair($page)
{
    return $this->render("/site/laptop-repair/$page");
}

The leading slash is necessary to override the default behaviour of the Yii application, which is to look for the view in 'views>{controllerName}'. For example with render('laptop-repair'); the view file laptop-repair.php would need to be in 'views>site' since the name of the controller is SiteController, whereas render("/site/laptop-repair/$page"); corresponds to a view file ( $page ) in 'views>site>laptop-repair'. This allows you to organise your views in subdirectories.

I created a new folder called 'laptop-repair' in 'views>site', moved the view for the parent page ( laptop-repair.php ) into the new directory and renamed it index.php . I put the new sub pages' view files in that new directory ('views>site>laptop-repair'), alongside the parent view ( index.php ).

Everything worked except for the URL creation in my nav widget. Where the following worked fine before, the 'laptop-repair' link broke after I implemented the above:

echo Nav::widget([
    'options' => ['class' => 'navbar-nav ml-auto'],
    'items' => [
        ['label' => 'Home', 'url' => ['/site/index']],
        [
            'label' => 'Repair Services',
            'items' => [
                ['label' => 'Desktop PC Repairs', 'url' => ['/site/pc-repair']],
                ['label' => 'Laptop Repairs', 'url' => ['site/laptop-repair']],
                ['label' => 'Mobile Phone Repairs', 'url' => ['/site/mobile-phone-repair']],
...

The fix was simply changing the relevant line to:

['label' => 'Laptop Repairs', 'url' => ['/laptop-repair']],

Creating a link from the parent page to a sub page looks like this:

<?= Html::a('Laptop overheating?', ['laptop-repair/laptop-overheating'], ['class' => '', 'title' => 'Laptop overheating']) ?>

To add a link to the parent page to the breadcrumbs of the sub page, I replaced:

$this->title = 'Laptop Over Heating?';
$this->params['breadcrumbs'][] = $this->title;

with:

$this->title = 'Laptop Over Heating?';
$this->params['breadcrumbs'][] = ['label' => 'Laptop repair', 'url' => ['/laptop-repair']];
$this->params['breadcrumbs'][] = $this->title;

in the view file of the sub page.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM