cakePHP 2.3
在我的项目控制器的索引操作中,我有一个直接循环来显示项目:
<?php foreach ($items as $item): ?>
<tr>
<td><?php
echo $item['Item']['id'];
if($this->Session->check('validated')){
echo $this->Html->image('/img/action_delete.png',array(
'url'=>array('controller' => 'items','action'=>'markdelete',$item['Item']['id'])
));
echo $this->Html->image('/img/action_edit.png',array(
'url'=>array('controller' => 'items','action'=>'edit',$item['Item']['id'])
));
}
?>
</td>
<td><?php
echo $this->Html->link($item['Item']['item_category'], array('controller' => 'items','action'=>'index',$item['Item']['item_category']));
?>
</td>
<td>
<?php
echo $this->Html->link($item['Item']['item_title'], array('controller' => 'items', 'action' => 'view', $item['Item']['id']));
?>
</td>
<td><?php
if($item['Item']['item_photo_url'] != '') {
echo $this->Html->link('Link','/img/'.$item['Item']['item_photo_url'],array('target'=>'_blank'));
} else {
echo '---';
}
?></td>
<td><?php echo $item['Item']['item_description']; ?></td>
<td><?php echo $item['Item']['item_price']; ?></td>
</tr>
<?php endforeach; ?>
但是,我需要在页面顶部创建一个部分,其中我将从我的Items表中获得item_category字段的链接菜单。
item_category字段是Items表中的一个简单varchar字段。我只想区别于它们并输出链接。
我该怎么办?我应该尝试创建一个帮助器并将其包含在视图中吗?如果是这样,助手应该如何?
我明白我会通过在助手中使用模型来破坏MVC逻辑,但是如何呢?
增加:
我只是尝试通过元素来实现它并且它有效,但是这是适当的方式吗?
元素来源:
<?php
$cat = $this->requestAction('/items/categories');
echo __('Κατηγορίες: ');
foreach ($cat as $category) {
echo $this->Html->link($category['Item']['item_category'], array('controller' => 'items','action'=>'index',$category['Item']['item_category'])). ' | ';
}
echo $this->Html->link('Ολες', array('controller' => 'items','action'=>'index'));
?>
控制器操作:
public function Categories() {
$categories = $this->Item->find('all',array(
'fields' => array('DISTINCT item_category'),
'order' => array('item_category')
));
return $categories;
}
请求摘要:
假设我有一个包含字段item_category的表项。该字段是varchar,不是另一个表的主键。
此外,我在Items控制器中有一个索引操作,我只列出表中的所有项目。
我需要的是在item_category字段上创建一个select distinct并将其放在页面的标题上。
答案 0 :(得分:1)
老实说,首选的方法是规范化表格。)
不仅数据库在(建议的)SELECT *
表上运行categories
而不是在DISTINCT
上运行所有项目上的大量VARCHAR数据,它不仅更快使用RDBMS和CakePHP时也是最佳做法,而cake会让你对数据的处理变得透明,所以它并不是那么复杂。
所以虽然我看不出“成为一个简单的应用程序”如何证明你的选择 - 从长远来看可能会给你带来比现在看起来更多的麻烦 - 你做这件事的方式会很好。请注意,应该避免使用requestAction
而不缓存性能。
如果您只需要ItemsController
中的这些信息,那么最好将查找添加到ItemModel
作为public function categories()
,从查找中返回数据,然后在控制器中做点什么
$itemCategories = $this->Item->categories();
$this->set('itemCategories', $itemCategories);
你仍然可以使用该元素,只需传递它$itemCategories
答案 1 :(得分:0)
在ItemsController中:
public function index() {
$categories = $this->Item->Category->find('all');
$items = $this->Item->paginate();
$this->set(compact('items','categories'));
}
根据需要在视图中使用$ catigories变量