8

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

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

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

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

4

4 回答 4

5

您不必将它添加$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>
于 2013-08-29T13:31:20.123 回答
5

这就是我通过尝试覆盖 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。

于 2014-10-16T12:34:58.170 回答
2

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

  • 始终在 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') 功能!

于 2014-12-05T07:47:18.447 回答
0

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

class MyController extends Controller {

    public $pageTitle = 'My Custom Title';

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

class MyController extends Controller {

    public $layout = '//layouts/myCustomLayout';
于 2013-08-29T09:25:29.120 回答