5

我正在使用 Yii2 为客户创建静态页面。我使用 yii2 是因为客户端有一些其他要求来扩展 Web。我使用 Yii2 Basic 应用程序。yii2 基础版有默认页面,例如 about、contact 等。启用漂亮 url 后这些页面的 url 是

 www.example.com/about

ETC

现在我需要创建页面

“xyz.php”

在像这样的子目录下

“ABC”

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

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

4

3 回答 3

1

创建一个控制器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/

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

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

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

于 2015-10-13T07:55:01.970 回答
0

配置/web.php

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        'abc/<view:\S+>' => 'site/page',
    ]
]
于 2015-10-13T07:55:44.070 回答
0

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

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

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

解决方案:

在 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");对应$page于“views>site>laptop-repair”中的视图文件 ( )。这允许您在子目录中组织视图。

我在 'views>site' 中创建了一个名为 'laptop-repair' 的新文件夹,将父页面 ( laptop-repair.php) 的视图移动到新目录中并重命名了它index.php。我将新子页面的视图文件放在新目录('views>site>laptop-repair')和父视图()旁边index.php

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

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;

和:

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

在子页面的视图文件中。

于 2021-02-08T14:59:36.643 回答