如何使用YII检查当前页面是否为首页?

时间:2012-11-14 12:04:44

标签: yii

Drupal有一个名为“drupal_is_front_page”的函数。 YII是否有类似于以这种方式处理导航的东西?

4 个答案:

答案 0 :(得分:2)

不幸的是没有。虽然可以获得将这些信息拼凑在一起的信息,但这样做确实比它应该更加痛苦。

首先,首页由CWebApplication::defaultController属性定义,可以在权威指南中将其配置为discussed。但这里有一个很大的问题:defaultController实际上可以是以下任何一种:

  1. 裸控制器名称,例如site
  2. 模块/控制器对,例如module/site
  3. 控制器/动作对,例如site/index
  4. 模块/控制器/动作元组,例如, module/site/index
  5. 如果您已将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"
?>