Drupal 有一个名为“ drupal_is_front_page ”的函数。YII 是否有类似的方式来处理导航?
4 回答
不幸的是没有。虽然拼凑起来所需的信息是可用的,但这样做确实比它应该的更痛苦。
首先,首页由CWebApplication::defaultController
属性定义,可以按照权威指南中的讨论进行配置。但是这里有一个大问题: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
以确定确切defaultController
指向的内容(然后使用一行代码检查是否相等) .
我不建议研究基于 URL 的解决方案,因为路由的全部意义在于不同的 URL 可以指向相同的内容——如果你这样做,永远无法确定你有正确的结果。
根据我的经验,Yii 中没有这样的功能。但是,您可以检索以下内容:
- 基本网址:
Yii::app()->request->baseUrl
- 当前网址:
Yii::app()->request->requestUri.
- 当前页面控制器与
Yii::app()->getController()->getAction()->controller->id
.
使用这些 API,应该可以查明当前页面是否为首页。
另一个简单的想法:
在您的操作中(您用来展示“主要首页”的操作),您可以在其视图中使用脚本设置变量:
Yii::app()->getClientScript()->registerScript("main_screen",
"var main_front_page = true;",CClientScript::POS_BEGIN);
将该代码放在“主视图”中(其余视图页面没有这段代码)。因此,当您需要检查页面是否是“主页”时,您可以使用 javascript 检查它,查询:
if(main_front_page){..do something..}.
如果您需要识别php中的主页(在服务器端),请使用Jon提出的方法。
另一种解决方案,基于您的控制器的常用方法:
您的所有控制器都必须从 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"
?>