Drupal有一个名为“drupal_is_front_page”的函数。 YII是否有类似于以这种方式处理导航的东西?
答案 0 :(得分:2)
不幸的是没有。虽然可以获得将这些信息拼凑在一起的信息,但这样做确实比它应该更加痛苦。
首先,首页由CWebApplication::defaultController
属性定义,可以在权威指南中将其配置为discussed。但这里有一个很大的问题:defaultController
实际上可以是以下任何一种:
site
module/site
site/index
module/site/index
如果您已将defaultController
指定为#4(如果您的应用程序不包含任何模块,则与#3相同),那么一切都很简单:
function is_home_page() {
$app = Yii::app();
return $app->controller->route == $app->defaultController;
}
问题是,如果将defaultController
指定为#1或#2,则必须检查大量运行时信息,以将其转换为#3或#4(视情况而定),以便您可以然后运行相等检查。
当然,Yii已经包含了可以执行此操作的代码:CWebApplication::createController
方法,它可以接受defaultController
的任何有效格式并将其解析为控制器/操作对(控制器依赖的位置)在模块上,如果适用)。但是看源头并没有让你在期待中微笑。
总结一下:您可以假设defaultController
将始终完全指定并使用一行代码完成工作,或者从createController
借用代码以确切地确定{{1}指向(然后使用一行代码检查是否相等)。
我不建议根据网址查找解决方案,因为路由的重点是不同的网址可以指向相同的内容 - 如果你这样做,就永远无法确定你得到了正确的结果。
答案 1 :(得分:1)
根据我的经验,Yii中没有这样的功能。但是,您可以检索以下内容:
Yii::app()->request->baseUrl
Yii::app()->request->requestUri.
Yii::app()->getController()->getAction()->controller->id
。 使用这些API,应该可以找出当前页面是否是首页。
答案 2 :(得分:0)
另一个简单的想法:
在您的操作中(您用来呈现“主要首页”),您可以在其视图中使用脚本设置变量:
Yii::app()->getClientScript()->registerScript("main_screen",
"var main_front_page = true;",CClientScript::POS_BEGIN);
将该代码放在“主视图”中,(其余视图页面没有这段代码)。 所以当你需要检查一个页面是否是“主页面”时,你可以使用javascript检查它,查询:
if(main_front_page){..do something..}.
如果您需要识别php中的主页面(在服务器端),请使用Jon提出的方法。
答案 3 :(得分:0)
另一种解决方案,基于控制器的常用方法:
你的控制器都必须从CController扩展,但是,当你构建一个新的yii应用程序时,Gii在/protected/components/Controller.php上创建了一个基本控制器,所以你的所有控制器都是从它派生的。
因此,在其上放置一个主要属性,名为:
<?php
class Controller extends CController {
public $is_main_front_page;
public function setMainFrontPage(){ $this->is_main_front_page = true; }
public function getIsMainFrontPage(){ returns $this->is_main_front_page==true; }
}
?>
好吧,当您渲染主要的首页操作时,将此核心变量设置为true:
<?php
class YoursController extends Controller {
public function actionPrimaryPage(){
$this->setMainFrontPage();
$this->render('primarypage');
}
public function actionSecondaryPage(){
$this->render('secondarypage');
}
}
接下来,在任何视图中,您都可以检查它:
<?php // views/yours/primaryview.php
echo "<h1>Main Page</h1>";
echo "is primary ? ".$this->getIsMainFrontPage(); // must say: "is primary ? true"
?>
<?php // views/yours/secondaryview.php
echo "<h1>Secondary Page</h1>";
echo "is primary ? ".$this->getIsMainFrontPage(); // must say: "is primary ? false"
?>