我在ProductsController productsCount()
中有功能。它在表格中给出了大量的记录。
public function productsCount() {
$productsAmount = $this->Products->find('all')->count();
$this->set(compact('productsAmount'));
$this->set('_serialize', ['productsAmount']);
}
我想在PageController中调用此函数。我想简单地在ctp文件中显示产品数量。
我该怎么做?
答案 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();