CakePHP 2.x 如何在视图的 foreach 中调用助手?

CakePHP 2.x How to call a helper in a foreach in a View?

以下是我的情况:

CakePHP 2.x

我有一个名为 SalesLog 的模型,它包含 user_idsale_idactiondescription

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); 看看是否输入了正确的内容。