1

蛋糕PHP 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 字段上进行选择并将其放在页面的标题上。

4

2 回答 2

1

老实说,首选的方法是规范化表格:)

不仅数据库SELECT *在(建议的)categories表上运行一个而不是DISTINCT在所有项目上运行多个 VARCHAR 数据更快,这也是使用 RDBMS 和 CakePHP 时的最佳实践,加上 cake 将使它对你来处理数据,所以它并不是真的更复杂。

因此,尽管我看不出“作为一个简单的应用程序”如何证明你的选择是合理的——从长远来看,它可能会给你带来比现在看起来更多的麻烦——但你这样做的方式会很好。请注意,requestAction如果不缓存性能,应该避免这种情况。

如果您只需要其中的这些信息,则ItemsController最好将 find 添加到您的ItemModelaspublic function categories()中,以从 find 返回数据,然后在控制器中执行类似的操作

$itemCategories = $this->Item->categories();
$this->set('itemCategories', $itemCategories);

您仍然可以使用该元素,只需传递它$itemCategories

于 2013-08-26T20:20:49.157 回答
0

在您的 ItemsController 中:

public function index() {
    $categories = $this->Item->Category->find('all');
    $items = $this->Item->paginate();
    $this->set(compact('items','categories'));
}

根据需要在视图中使用 $catigories 变量

于 2013-08-25T15:46:12.927 回答