如何在cakephp 3的不同视图中调用控制器的功能?

时间:2016-07-14 19:53:16

标签: php cakephp model-view-controller cakephp-3.0

我在ProductsController productsCount()中有功能。它在表格中给出了大量的记录。

    public function productsCount() {
        $productsAmount = $this->Products->find('all')->count();

        $this->set(compact('productsAmount'));
        $this->set('_serialize', ['productsAmount']);

    }

我想在PageController中调用此函数。我想简单地在ctp文件中显示产品数量。

我该怎么做?

5 个答案:

答案 0 :(得分:2)

您可以使用view cell。它们充当迷你控制器,无论控制器如何,都可以调用任何视图。

src/View/Cell/productsCountCell.php

中创建src/Template/Cell/ProductsCount/display.ctp和模板

src/View/Cell/productsCountCell.php

namespace App\View\Cell;

use Cake\View\Cell;

class productsCountCell extends Cell
{

    public function display()
    {
        $this->loadModel('Products');
        $productsAmount = $this->Products->find('all')->count();

        $this->set(compact('productsAmount'));
        $this->set('_serialize', ['productsAmount']);
    }

}

src/Template/Cell/ProductsCount/display.ctp中列出你想要的方式:

<div class="notification-icon">
    There are <?= $productsAmount ?> products.
</div>

现在您可以将单元格调用到任何视图中:

$cell = $this->cell('productsCount');

答案 1 :(得分:0)

我认为在PageController中找到产品计数会更有意义。因此,在PageController的视图操作中添加$productsAmount = $this->Page->Products->find('all')->count();之类的内容,并设置$productsAmount。如果页面和产品不相关,那么只要您为产品添加use,就可以保持查找呼叫的原样。

另外,请查看模型命名约定:http://book.cakephp.org/3.0/en/intro/conventions.html#model-and-database-conventions

模型名称应该是单数,因此将产品更改为产品。

答案 2 :(得分:0)

您无法从视图页面调用控制器方法。你可以创建帮助,你可以从视图页面调用。

在这里,您将获得创建帮助者的适当文档 - http://book.cakephp.org/3.0/en/views/helpers.html#creating-helpers

答案 3 :(得分:0)

这仅取决于您拨打的电话的种类,因为有3种情况可解决您的问题。 1-如果您要通过点击链接进行呼叫,只需执行以下操作即可:

<?= $this->Html->link(_('Product number'),['controller' =>'ProductsController', 'action' => 'productsCount']) ?>

另外两种情况是您是否要在同一视图中直接渲染结果,然后有一些解决方法。 1-首先,您需要检查Page表和product表之间的关联是什么,并使用BelongTo或hasMany选项将它们绑定到gheter,以便正确使用。 2-如果表之间没有关联,则将创建TableRegistry :: get('Produts');将数据从模型传递到另一个模型,就像在Pages控制器中一样:

 public function initialize()
        {
            parent::initialize();
$this->Products = TableRegistry::get('Produts');
}

但是我很相信第一种选择更有可能是您所描述的。

答案 4 :(得分:-2)

您也可以定义static方法,如下所示

public static function productsCount() {
    return = $this->Products->find('all')->count();
}

并在其他操作中使用self::productsCount()

仅当您需要在控制器中多次计数时,这才有用。否则你可以直接使用它,如下所示:

$this->Products->find('all')->count();