【问题标题】:Displaying subdirectory name in the url in Yii2 for static pages在 Yii2 的 url 中显示静态页面的子目录名称
【发布时间】:2016-01-10 06:49:06
【问题描述】:

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

 www.example.com/about

现在我需要创建页面

“xyz.php”

在像

这样的子目录下

“abc”

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

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

【问题讨论】:

  • 显示你的 urlManager 配置。
  • 其实我并没有对 url manager 做任何修改..我只是通过解决方案。
  • Yii 2 static pages的可能重复

标签: yii2 yii2-basic-app


【解决方案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 规则更改为其他内容或重命名控制器。

【讨论】:

  • 如果视图下有很多子文件夹怎么办?我应该创建单独的控制器吗?
  • 你不需要它。正如我在控制器代码上方所写的那样,由于控制器名称为静态控制器,因此它在他的视图文件夹“静态”中搜索文件。您可以毫无问题地拥有多个子文件夹和子子文件夹。
  • 你把StaticController.php放在哪里?在你也有SiteController.php的控制器文件夹中?
  • 是的,当然,StaticController 的位置与普通控制器的位置相同。
【解决方案2】:

配置/web.php

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

【讨论】:

  • 虽然此答案可能是正确且有用的,但如果您 include some explanation along with it 解释它如何帮助解决问题,则最好。如果有更改(可能不相关)导致它停止工作并且用户需要了解它曾经是如何工作的,这在未来变得特别有用。
  • 如果我有几个子文件夹和静态页面,那么我需要在规则下声明所有这些页面。对吗?
  • @NuthanRaghunath,对。但是你可以通过google搜索cms yii2查找其他人如何实现这个机制
【解决方案3】:

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

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

客户在其现有站点中有一个名为“laptop-repair”的页面,其中链接了许多页面,例如“笔记本电脑过热”。所以 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"); 对应于'views>site 中的视图文件($page) >笔记本电脑维修'。这允许您在子目录中组织视图。

我在 '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;

在子页面的视图文件中。

【讨论】:

    猜你喜欢
    • 2019-08-23
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    相关资源
    最近更新 更多