CakePHP 2.x 如何在视图的 foreach 中调用助手?
CakePHP 2.x How to call a helper in a foreach in a View?
以下是我的情况:
CakePHP 2.x
我有一个名为 SalesLog
的模型,它包含 user_id
、sale_id
、action
和 description
。
SalesLogs
索引显示日志列表(提供一些过滤器)。
View
代码当前运行一个 if 语句来决定在呈现 action
值时使用哪个 label class
。
但是,这种呈现在整个应用程序的许多地方都会发生。每次,无论 View
它运行它自己的 if 语句。
我正试图将这个决定从 Views
中移开,并将其放在一个集中的地方,这样每当任何 View
需要渲染 action
时,他们都可以调用在这个地方得到答案。
我遇到了 CakePHP 2.x Helpers
并成功创建了我的 ActionLabelHelper.php
.
现在的问题是 index
View
使用 foreach
语句列出日志,当我调用 foreach 中的方法时,它说我不能那样做到一个非对象。
// Just a shortened example here:
<?php foreach($SalesLogs as $sl) { ?>
<tr>
<td> <?= $sl['SalesLog']['user_id']; ?> </td>
<td> <?= $sl->ActionLabel->actionLabel($sl['SalesLog']['action']); ?> </td>
</tr>
<?php } ?>
如果我这样称呼它(基于文档显示的内容):
<?= $this->ActionLabel->actionLabel($sl['SalesLog']['action']); ?>
View
显示了包含所有正确 actions
的列表,但它们都根据第一个日志的 action
是什么进行了标记。
关于如何调整调用的任何想法 and/or 这个方法应该在什么地方才能工作?
我也和 Rails
一起工作,这让我想为 action
创建一个 partial
,但是为一个字段创建一个 partial
似乎很愚蠢,并且看起来 CakePHP 不像 Rails
那样自然地处理它们。
你们有什么要给我的吗?
帮助代码:
App::uses('AppHelper', 'View/Helper');
class ActionLabelHelper extends AppHelper {
public function actionLabel($action)
{
switch ($action) {
case 'inserted':
$type = 'primary';
case 'removed':
$type = 'danger';
case 'changed':
$type = 'warning';
default:
$type = 'warning';
}
return "<span class='label label-" . $type . "'>" . $action . "</span>";
}
}
你是对的,像这样调用 Helper 函数,因为 Helper 是视图的 属性 而不是模型:
<?= $this->ActionLabel->actionLabel($sl['SalesLog']['action']); ?>
如果这没有输出预期的结果,我建议首先在 actionLabel
方法中 debug($action);
看看是否输入了正确的内容。
以下是我的情况:
CakePHP 2.x
我有一个名为 SalesLog
的模型,它包含 user_id
、sale_id
、action
和 description
。
SalesLogs
索引显示日志列表(提供一些过滤器)。
View
代码当前运行一个 if 语句来决定在呈现 action
值时使用哪个 label class
。
但是,这种呈现在整个应用程序的许多地方都会发生。每次,无论 View
它运行它自己的 if 语句。
我正试图将这个决定从 Views
中移开,并将其放在一个集中的地方,这样每当任何 View
需要渲染 action
时,他们都可以调用在这个地方得到答案。
我遇到了 CakePHP 2.x Helpers
并成功创建了我的 ActionLabelHelper.php
.
现在的问题是 index
View
使用 foreach
语句列出日志,当我调用 foreach 中的方法时,它说我不能那样做到一个非对象。
// Just a shortened example here:
<?php foreach($SalesLogs as $sl) { ?>
<tr>
<td> <?= $sl['SalesLog']['user_id']; ?> </td>
<td> <?= $sl->ActionLabel->actionLabel($sl['SalesLog']['action']); ?> </td>
</tr>
<?php } ?>
如果我这样称呼它(基于文档显示的内容):
<?= $this->ActionLabel->actionLabel($sl['SalesLog']['action']); ?>
View
显示了包含所有正确 actions
的列表,但它们都根据第一个日志的 action
是什么进行了标记。
关于如何调整调用的任何想法 and/or 这个方法应该在什么地方才能工作?
我也和 Rails
一起工作,这让我想为 action
创建一个 partial
,但是为一个字段创建一个 partial
似乎很愚蠢,并且看起来 CakePHP 不像 Rails
那样自然地处理它们。
你们有什么要给我的吗?
帮助代码:
App::uses('AppHelper', 'View/Helper');
class ActionLabelHelper extends AppHelper {
public function actionLabel($action)
{
switch ($action) {
case 'inserted':
$type = 'primary';
case 'removed':
$type = 'danger';
case 'changed':
$type = 'warning';
default:
$type = 'warning';
}
return "<span class='label label-" . $type . "'>" . $action . "</span>";
}
}
你是对的,像这样调用 Helper 函数,因为 Helper 是视图的 属性 而不是模型:
<?= $this->ActionLabel->actionLabel($sl['SalesLog']['action']); ?>
如果这没有输出预期的结果,我建议首先在 actionLabel
方法中 debug($action);
看看是否输入了正确的内容。