如何在cakephp 3中创建页面/视图而无需构建仪表板的模型?

时间:2018-12-25 10:11:29

标签: php cakephp associations dashboard

我的目标是创建没有数据库模型的页面/视图-本质上,我想构建一个仪表板,该仪表板最终将用作访问我所用的多个数据表(即国家,州和性别)的门户页面。在Cakephp 3x中使用cake-bake-all方法创建。

通过进行一些研究,我了解到内置的PagesController无法访问模型。如果要构建仪表板,我将必须创建自己的PagesController,但我不知道要使用什么代码。还有其他更简单的方法可以在一页上访问多个未关联的模型吗?任何帮助将不胜感激。

更新-

感谢克里斯(Chriss)的建议,这就是我创建仪表板原型的方式!

这是我的代码-

DashboardsController.php (/src/controller/)

<?php
namespace App\Controller;

use App\Controller\AppController;


class DashboardsController extends AppController
{

public function index()
{
  $this->loadModel ('States'); //Load models from States
  $states = $this->States->find('all');  // query all states
  $this->set('states', $states); // save states inside view

}
}
?>

index.ctp (src/Template/Dashboards/)

<?php //index function of dashboardscontroller ?>

<table>

<h2 class="col span_2_of_2"><?= ('State-Details') ?></h2>

<thead>

<tr>
<th scope="col"><?= $this->Paginator->sort('id') ?></th>
<th scope="col"><?= $this->Paginator->sort('state_name') ?></th>
<th scope="col"><?= $this->Paginator->sort('country_name') ?></th>
</tr>

</thead>

<tbody>
<?PHP foreach ($states as $state) : ?>

<tr>
<td>
<?= $this->Number->format($state->id) ?>
</td>

<td>
<?= h($state->state_name) ?>
</td>

<td>
<?= $state->has('country') ? 
$this->Html->link($state->country->country_name, ['controller' => 
'Countries', 'action' => 'view', 
 $state->country->id]) : '' ?>
</td>

<td class="actions">
<?= $this->Html->link(('View'), ['action' => 'view', $state->id]) ?>
<?= $this->Html->link(('Edit'), ['action' => 'edit', $state->id]) ?>
<?= $this->Form->postLink(('Delete'), ['action' => 'delete', $state->id], 
['confirm' => ('Are you sure you want to delete # {0}?', $state->id)]) ?>
</td>

</tr>

<?PHP endforeach; ?>
</tbody>
</table>

3 个答案:

答案 0 :(得分:0)

创建一个控制器,例如DasboardController并使用\Cake\Orm\TableRegistry::get(tableName)

您也可以使用PagesController,但通过它交付静态页面更为常见

TableRegistry

答案 1 :(得分:0)

首先在./src/Controller/内用文件名DashboardsController.php创建一个仪表板控制器。通常,仪表板只有一个索引功能,除非您准备了几个小节。在这里,我们假设您只有一页。

<?PHP
  namespace App\Controller;

  use App\Controller\AppController;

  class DashboardsController extends AppController {

    public function index(){
      $this->loadModel ('States');
      $states = $this->States->find('all');  // query all states
      $this->set ('states', $states); // save states inside view
    }
  }  // end class DashboardsController
?>

那是MVC中的C。

除非在表和实体中具有特殊功能,否则除非需要PHPDoc声明,否则无需创建Table类或Entity类。 Cake ORM为您接管(默认类)。 因此,让我们回顾一下MVC中的M。

$this->loadModel ('States');仅将模型加载到控制器内部。不多,但不多。如果您已将模型加载到控制器内部,则可以使用$this->States(例如$this->States->find('all');)访问该模型。

现在,您必须将结果保存在视图中(来自Controller:$this->set ('states', $states);)。

最后一部分是MVC的视图(V)。

./src/Template/Dashboards/内创建一个名称为index.ctp的文件(这是Dashboards Controller中的索引函数(操作)的模板文件)。

<?PHP /* index function of Dashboards Controller */ ?>
<ul>
  <?PHP foreach ($states as $state) : ?>
    <li><?=$state->title; ?></li>
  <?PHP endforeach; ?>
</ul>

现在,您可以使用URL和控制器名称(例如http://{url-to-your-cake-system}/dashboards/)访问仪表板。

仅此而已。 Cake使用“约定超越配置”的概念。因此,如果您遵循约定(文件结构,文件名,类名,表名等),Cake或多或少会自动为您完成所有操作。

P.S。我认为,只有几种(甚至更不正确)的方法来使用TableRegistry。您应该从一开始就避免它。

答案 2 :(得分:0)

  1. 使用索引方法创建DashboradController或在PageController处添加dashboard()方法。
  2. 创建Dashborad \ index.ctp或Page \ dashboard.ctp
  3. 为各种数据演示文稿(例如,每小时,每天,每周,..)创建简单的Cells并将其包含在index.ctp / dashboard.ctp中
  4. 路由到仪表板