在Yii2的url中显示静态页面的子目录名称

时间:2015-10-12 17:38:46

标签: yii2 yii2-basic-app

我使用Yii2为客户端创建静态页面。我正在使用yii2,因为客户端还有一些其他要求可以在以后扩展Web。我使用的是Yii2 Basic应用程序。 yii2 basic有默认页面,如about,contact等。 启用漂亮网址后这些网页的网址是

 www.example.com/about

现在我需要创建页面

  

" xyz.php"

之类的子目录下
  

" ABC"

。所以我需要我的网址为www.example.com/abc/xyz

我如何实现这一目标?我被告知学习者,我遵循了网址规则,帮助者,但没有找到一个强有力的解决方案。

3 个答案:

答案 0 :(得分:2)

创建一个像StaticController.php这样的控制器并使用yii \ web \ ViewAction http://www.yiiframework.com/doc-2.0/yii-web-viewaction.html

举个例子:     

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
            ),
        ];
    }
}

并将此规则添加到UrlManager(其中static是您的控制器名称)

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

现在,您可以将静态页面存储在目录/view/static/

e.g。 index.php, test.php or even in subdirectories /sub/test2.php

网址就像/static (or /static/index), /static/test1, /static/sub/test2

第一个路径名当然是控制器名称,但您也可以将网址规则更改为其他名称或重命名控制器。

答案 1 :(得分:0)

配置/ web.php

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

答案 2 :(得分:0)

我有一种情况,我希望 URL 指示子页面(例如“网站/页面/子页面”),但我认为拥有单独的控制器没有意义。 (目前我只有一个控制器;SiteController.php。)

我正在一个新的 Yii2 Basic 站点中重新创建现有站点的站点结构。

客户在其现有站点中有一个名为“laptop-repair”的页面,其中有许多页面链接到该页面,例如“笔记本电脑过热”。所以 URI 需要看起来像“laptop-repair/laptop-overheating”。

解决办法:

在 config>web.php 的 urlManager 中,我添加了一个新规则(注意,规则的顺序很重要,较早的规则优先):

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

                ...

            ],
        ],

SiteController.php 中,我已经对要制作为父页面的页面进行了操作:

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

我替换为:

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

前导斜杠对于覆盖 Yii 应用程序的默认行为是必要的,即在 'views>{controllerName}' 中查找视图。例如,对于 render('laptop-repair');,视图文件 laptop-repair.php 需要在“views>site”中,因为控制器的名称是 SiteController,而 render("/site/laptop-repair/$page"); 对应于视图文件({{1 }}) 在“视图>站点>笔记本电脑维修”中。这允许您在子目录中组织视图。

我在“views>site”中创建了一个名为“laptop-repair”的新文件夹,将父页面的视图 ($page) 移动到新目录中并将其重命名为 laptop-repair.php。我将新子页面的视图文件放在新目录中(“views>site>laptop-repair”),与父视图(index.php)一起。

除了在我的导航小部件中创建 URL 之外,一切正常。在以下之前工作正常的地方,在我实施上述之后“笔记本电脑维修”链接中断了:

index.php

修复只是将相关行更改为:

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

创建从父页面到子页面的链接如下所示:

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

为了将父页面的链接添加到子页面的面包屑中,我替换了:

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

与:

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

在子页面的视图文件中。