我userbar
在每个页面上都调用了一个元素 - 它告诉用户他/她是否登录。我创建了这个元素并在 default.ctp 中回显了它:
<?php echo $this->element('userbar', array('text' => 'You are not logged in.')); ?>
现在它显示在每一页上。但是,我在任何地方都找不到如何更改此文本。例如,我想从某个控制器访问此元素并对其进行更改。如何?
您设置一个视图变量,然后使用它。
<?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()
.
还有其他方法可以做到这一点。但是如果你在控制器中渲染元素,你仍然需要设置一个视图变量并在视图中回显它。
希望这可以帮助。
我认为 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