0

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

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

现在它显示在每一页上。但是,我在任何地方都找不到如何更改此文本。例如,我想从某个控制器访问此元素并对其进行更改。如何?

4

2 回答 2

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().

还有其他方法可以做到这一点。但是如果你在控制器中渲染元素,你仍然需要设置一个视图变量并在视图中回显它。

希望这可以帮助。

于 2013-01-13T09:11:55.730 回答
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

于 2013-01-13T11:53:17.567 回答