我使用Yii2为客户端创建静态页面。我正在使用yii2,因为客户端还有一些其他要求可以在以后扩展Web。我使用的是Yii2 Basic应用程序。 yii2 basic有默认页面,如about,contact等。 启用漂亮网址后这些网页的网址是
www.example.com/about
等
现在我需要创建页面
" xyz.php"
在
之类的子目录下" ABC"
。所以我需要我的网址为www.example.com/abc/xyz
我如何实现这一目标?我被告知学习者,我遵循了网址规则,帮助者,但没有找到一个强有力的解决方案。
答案 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;
在子页面的视图文件中。