如何在Yii2中修复“子目录中的静态页面”问题

时间:2019-04-01 23:49:37

标签: php yii2

我已经设置了支持Yii2的网站,但是我希望在子目录中获得一些静态页面,然后在URL中显示子目录的名称。例如,进入site / hotel / pacific.php和site / mini-rooms / standard.php,然后使用xyz.com/hotel/pacific和xyz.com/mini-rooms/standard访问它们。

我已尝试在线遵循一些示例,但是我不确定为什么它们不起作用。一些示例也适用于yii而非yii2。 这是我所做的:

SiteController.php中,在使用下面的代码之前,我已经创建了一个静态页面,可以在xyz.com/hotel/pacific上进行访问。但是现在我将其移到子目录hotel中。它以前位于views / site文件夹中:

public function actionPacific()
{
    return $this->render('pacific');
}

然后我在pages文件夹中创建了一个文件夹名称view。在pages文件夹中,我创建了hotel文件夹,在酒店文件夹中,我放置了pacific.php文件,所以我有了views/site/pages/hotel/pacific.php

我还在SiteController.php中添加了这个内容:

public function actions()
{
    return [
        'error' => [
            'class' => 'yii\web\ErrorAction',
        ],
        'captcha' => [
            'class' => 'yii\captcha\CaptchaAction',
            'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
        ],
        'page' => [
            'class'=>'CViewAction',
        ],
        'hotels' => [
            'class'=>'CViewAction',
            'basePath' => 'pages/hotels'
        ],          
    ];
}

然后我通过添加以下代码来配置config/web.php

    'urlManager' => [
        'class' => 'yii\web\UrlManager',
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'enableStrictParsing'=>false,
        'rules' => [
            '<alias:[\w\-]+>' => 'site/<alias>',
            '<controller:\w+>/<id:\d+>'=>'<controller>/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
            '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',               
        ],
    ],

我访问xyz.com/hotel/pacific时遇到404错误。

如何为两个示例-xyz.com/hotel/pacificxyz.com/mini-rooms/standard正确执行此操作。

2 个答案:

答案 0 :(得分:0)

据我了解,您在1中使用2而不是CWebView中使用Yii1来混合Yii Yii2yii\web\ViewAction。因此,您可能需要的是views/site/hotel/pacific.php,它将代表一个动作。别人可能会建议更好的答案。

因此,如果您有目录。

  • views/site/hotel/five-star.php
  • pacific.php

您想通过使用xyz.com/hotel/pacific输入URL five-star.phpxyz.com/hotel/five-star来访问public function actions() { return [ 'error' => [ 'class' => 'yii\web\ErrorAction' ], 'pacific' => [ 'class' => 'yii\web\ViewAction', 'defaultView' => 'pacific', 'viewPrefix' => 'hotel' ], 'five-star' => [ 'class' => 'yii\web\ViewAction', 'defaultView' => 'five-star', 'viewPrefix' => 'hotel' ], 'captcha' => [ 'class' => 'yii\captcha\CaptchaAction', 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null ] ]; } 视图。

然后,您应按以下方式配置它们

'urlManager' => [
        'class' => 'yii\web\UrlManager',
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'enableStrictParsing'=>false,
        'rules' => [
            '/' => 'site/index',
            '<alias:[\w\-]+>' => 'site/<alias>',
            'hotel/<alias:[\w\-]+>' => 'site/<alias>',
            '<controller:\w+>/<id:\d+>' => '<controller>/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
            '<controller:\w+>/<action:\w+>' => '<controller>/<action>'
        ]
],

然后按如下所示更新urlManager

xyz.com/hotel/pacific

现在,如果您输入浏览器xyz.com/hotel/five-starvoid OnTriggerEnter2D(Collision2D other) { if(other.gameObject.CompareTag("gem")){ GemScript gemScript = other.gameObject.GetComponent<GemScript>(); if(!gemScript.isUsed){ DO YOU STUFF HERE gemScript.isUsed = true; } } } ,它将显示相应的视图。

希望它可以解决您的问题。

答案 1 :(得分:0)

我决定在HotelController.php文件夹内创建controller,然后在hotel文件夹下创建views文件夹。然后,我在酒店文件夹中添加了pacific.php,并在HotelController.php中添加了操作代码,如下所示。

public function actionPacific()
{
    return $this->render('pacific');
}

尽管我不确定是否有更好的选择,但它可以按我的意愿工作。我删除了网址管理器中的规则,因为现在不需要它们了。我只需要转到mysite.com/hotel/pacific即可显示该页面。我可以在文件夹中创建任意数量的页面,只需添加其操作代码即可。