【问题标题】:How to set Sitename with pagetitle in Yii如何在 Yii 中设置带有页面标题的站点名称
【发布时间】:2013-09-01 14:45:32
【问题描述】:

我已经实现了页面标题,并且所有页面都整齐地显示了标题。 现在我还希望显示网站名称。 我可以像这样编码

<title><?php echo Yii::app()->name . $this->pageTitle ?></title>

但是对于那些没有设置标题的页面(即它们默认由CController设置)站点名称将被重复。

我想简单地覆盖控制器的setPageTitle 方法来添加站点名称。该怎么做?

【问题讨论】:

  • 通常称为编程。如果要覆盖,请查看要覆盖的现有代码以获取一些指针。到目前为止你看到了什么,你在哪里遇到了障碍? (您的问题中缺少尝试覆盖的解决方案)

标签: php yii frameworks


【解决方案1】:

在每个控制器中,添加这个属性变量:

class MyController extends Controller {

    public $pageTitle = 'My Custom Title';

同样,您可以覆盖每个控制器的布局:

class MyController extends Controller {

    public $layout = '//layouts/myCustomLayout';

【讨论】:

  • 为什么不把它放在 AppController 中呢?写的少了很多。
【解决方案2】:

您不必将$pageTitle 添加到控制器中,它已经是Controller 类中的一个变量,所以只要您的控制器extend Controller 就可以了。然后,您可以在任何您想要的地方设置页面标题。您可以为整个控制器、单个操作甚至视图更改它。

class MyController extends Controller {
    public function actionAdmin() {
        $this->pageTitle = 'I got set by action'; //only for this action
    }
}

或在视图中

<?php
$this->pageTitle = 'I got set by the view'; //anytime this view gets called
?>
<h1>View File</h1>

如果您希望网站名称始终位于标题的末尾,只需修改您的主布局:

<title><?php echo CHtml::encode($this->pageTitle); ?> <?php echo Yii::app()->name; ?></title>

【讨论】:

    【解决方案3】:

    这就是我通过尝试覆盖 CController 的 setPageTitle 方法解决的问题

    class MyController extends Controller
    {
      public function setPageTitle($value){
        $this->pageTitle = Yii::app()->name ." >> ". $value ;
      }
    }
    

    现在 this 的值将在没有应用名称的布局中设置,即

    <title><?php echo CHtml::encode($this->pageTitle); ?></title>
    

    并在视图中删除应用名称。

    $this->pageTitle = Yii::app()->name . ' >> Custom Title' ;//remove this to show instead
    $this->pageTitle = 'Custom Title' ;//Plain title
    

    现在输出将是

    我的应用名称 >> 自定义标题

    如果某些页面已经在视图中为这些控制器连接了应用程序名称,则您只需覆盖该控制器中的 setPageTitle。但更好的方法是始终遵循一个共同点,从而覆盖基本控制器中的 setPageTitle。

    【讨论】:

      【解决方案4】:

      如果您想要更“自动”的东西,例如:

      • 始终在 pageTitle 中显示“动作 + 控制器”。示例:查看用户、删除用户...

      您可以像这样制作过滤器:(也适用于多语言!!!)

      1- 在protected/components/中创建一个文件PageTitleFilter.php

      class PageTitleFilter extends CFilter {
      
          public $controller;
      
          protected function preFilter($filterChain) {
              // logic being applied before the action is executed
              $this->controller->pageTitle = Yii::t('app', Yii::app()->controller->action->id) . ' ' . Yii::t('app', Yii::app()->controller->id);
              return true; // false if the action should not be executed
          }
      
          protected function postFilter($filterChain) {
              // logic being applied after the action is executed
          }
      
      }
      

      2- 在您的控制器中:

      class MyController extends Controller {
      
          public function filters() {
              return array(
                  'accessControl', // perform access control for CRUD operations
                  array(
                      'PageTitleFilter + view, create, update, delete, admin',
                      'controller' => $this
                  ),
              );
          }
      }
      

      然后你把每个动作的翻译放在一个文件 protected/messages/es/app.php 中,比如:

      return array(
          'view'=>'ver', 
          'delete'='eliminar'
      );
      

      链接:http://www.yiiframework.com/doc/guide/1.1/es/topics.i18n#locale-and-language

      如果你想改变默认的pageTitle,你可以做任何动作:

      $this->pageTitle= 'My page title';
      

      如果你不想要多语言,请移除 Yii::t('app') 函数!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多