这是我的问题:我开发了一个网站,用户可以自己添加内容。该内容通过要从数据库中提取的id和/或别名获取标识符。目标不是为包含该内容的每个页面创建视图和控制器。我们不应该为他们寻找这些。相反,我们在actionIndex()中处理URL,获取定义适当内容的URL部分,并将其进一步加载到模板中。例如:
-
我们有一个主要部分"产品"。其视图位于
/views/Products/index.php
-
我们有一个控制器:
产品控制器扩展控制器
-
我们有一个默认的方法actionIndex()
所以当我们得到这样的URL时:
/mysite/Products/some_product_alias
我们应该在actionIndex()中处理它,这样它就不会引导我们进入404页面,而是通过别名"some_product_alias"将数据加载到产品模板中来获取数据(我想它可能是/views/products/index.php或其他页面)。同时,它需要保留为静态页面定义控制器/操作方法的可能性,静态页面是网站的主要部分,也是主菜单。也就是说,它应该这样工作:如果它能在控制器中找到一个现有的actionMethod,它就会调用它。如果找不到它,它就会在DB中查找从URL中提取的别名。若它存在,那个么它就会获取数据并将其加载到模板中。当然,这项任务是可以管理的,但不幸的是,我是Yii的新手,仍然不知道如何做到:(我将非常感谢你的帮助!
您应该查看Yii关于参数化路线的文档,在这里可以找到
它的要点是,你必须修改你的主配置文件,并将此路线映射为不是控制器/动作,而是具有默认视图动作的控制器/{别名},因此在以下行中:
'rules'=>array(
'<controller:w+>/<id:d+>'=>'<controller>/view',
),
这将映射像Products/15这样的路线来使用操作Products/view,并将GET参数id设置为15
答案(第一部分)几乎就是DeadAlready告诉我们的。但这里有必要补充一些内容。1.我们应该为我们的别名设置一个规则到urlManager(是的!):
Product/<alias:w+>' => 'product/index'
请注意,它将在控制器中调用actionIndex(),并且不会按别名查找方法。2.我们必须指向变量$alias(该名称与模式子字符串相同,即"$alias"/"
function actionIndes($alias){
...handle event...
}
之后,我们可以处理事件以从DB获取数据。