从cakePHP中的其他操作或简单查询获取一个视图中的数据

时间:2013-08-25 12:24:35

标签: php cakephp

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并将其放在页面的标题上。

2 个答案:

答案 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变量