在CakePHP中更改元素的文本

时间:2013-01-13 09:07:21

标签: php cakephp

我在每个页面上都有一个名为userbar的元素 - 它会告诉用户他/她是否已登录。我创建了这个元素并在default.ctp中回显它:

<?php echo $this->element('userbar', array('text' => 'You are not logged in.')); ?>

现在它显示在每个页面上。但是,我can't find anywhere如何更改此文字。例如,我想从某个控制器访问该元素并进行更改。怎么样?

2 个答案:

答案 0 :(得分:1)

您设置了一个视图变量,然后使用它。

<?php
class MyController extends AppController
{
    function myaction () {
        $this->set ('my_var', 'You are not logged in');
    }
}
?>

然后在视图中:

<?php echo $this->element ('userbar', array ('text' => $my_var)); ?>

考虑到这是您在每个页面请求时最好将其放入AppController::beforeFilter()

There are other ways to do this。但是,如果在控制器中渲染元素,则​​仍需要设置视图变量并在视图中回显该元素。

希望这有帮助。

答案 1 :(得分:1)

我认为vanneto非常专业地回答了这个问题。但根据我的观点,这里发生的是一个设计缺陷。这就是为什么我添加这个答案给你另一个选择如何处理这个问题。因为我看到了这种解决方案,从长远来看会导致问题。

案例是已登录或已注销的文字。

假设您使用Auth组件:

http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html

我们将从控制器开始,可能你在AppController中有这样的东西:

public function beforeFilter() {
    parent::beforeFilter();
    $this->set('userIsLoggedIn', AuthComponent:: loggedIn());
    $this->set('loggedInUser', AuthComponent::user());
}

这是做什么的:在每次请求时,它都会将登录用户发送到视图。现在你可以说控制器可以有一个if语句来检测应该发送哪个文本,但这不是必需的。

在你的元素中你也可以这样做。

所以在你的元素中添加如下内容:

if($userIsLoggedIn) {
    echo 'User is logged in.';
}else{
    echo 'You are not logged in!';
}

通常我们会更多地使用helper来实现这种逻辑,因为它们是具有更多选项以便进行良好编码的类。但它也可以简单地使用元素。

所以现在你的文本是正确的。然后你明白了:静态文本是否属于元素?不,不是的。那么改善它的方法就是实现它:

if($userIsLoggedIn) {
    echo __('User is logged in');
}else{
    echo __('User is not logged in');
}

这样您就可以将静态文本放入.po文件中。如果你不知道它们是什么:

http://book.cakephp.org/2.0/en/core-libraries/internationalization-and-localization.html

如果您的网站成为多语言,现在也可以使用该元素。或者您可以让文本编写者在不触及源代码的情况下编辑文本。

如您所见,这是一种不同的方法,但我认为它会为您提供更清晰的代码。它解耦了代码,控制器完成了他的任务,元素执行了他的任务,文本也被分离了,因为它不属于视图中的硬编码。

就代码而言,它不是更多,所以我强烈建议一些看起来像这样的解决方案。也可以用帮手完成。

关于这种方法的一些消息来源:

http://en.wikipedia.org/wiki/Object-oriented_programming#Decoupling

http://en.wikipedia.org/wiki/Single_responsibility_principle