0

Drupal 有一个名为“ drupal_is_front_page ”的函数。YII 是否有类似的方式来处理导航?

4

4 回答 4

2

不幸的是没有。虽然拼凑起来所需的信息是可用的,但这样做确实比它应该的更痛苦。

首先,首页由CWebApplication::defaultController属性定义,可以按照权威指南中的讨论进行配置。但是这里有一个大问题:defaultController实际上可以是以下任何一种:

  1. 一个裸控制器名称,例如site
  2. 一个模块/控制器对,例如module/site
  3. 控制器/动作对,例如site/index
  4. 一个模块/控制器/动作元组,例如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 可以指向相同的内容——如果你这样做,永远无法确定你有正确的结果。

于 2012-11-14T12:28:32.373 回答
1

根据我的经验,Yii 中没有这样的功能。但是,您可以检索以下内容:

  • 基本网址:Yii::app()->request->baseUrl
  • 当前网址:Yii::app()->request->requestUri.
  • 当前页面控制器与Yii::app()->getController()->getAction()->controller->id.

使用这些 API,应该可以查明当前页面是否为首页。

于 2012-11-14T12:28:23.647 回答
0

另一个简单的想法:

在您的操作中(您用来展示“主要首页”的操作),您可以在其视图中使用脚本设置变量:

Yii::app()->getClientScript()->registerScript("main_screen",
   "var main_front_page = true;",CClientScript::POS_BEGIN);

将该代码放在“主视图”中(其余视图页面没有这段代码)。因此,当您需要检查页面是否是“主页”时,您可以使用 javascript 检查它,查询:

if(main_front_page){..do something..}.

如果您需要识别php中的主页(在服务器端),请使用Jon提出的方法。

于 2012-11-14T15:08:00.580 回答
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"
?>
于 2012-11-14T15:16:09.603 回答