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を持つテーブルitemsがあるとしましょう。このフィールドは varchar であり、別のテーブルの主キーではありません。

また、テーブルからすべてのアイテムをリストするアイテムコントローラーにインデックスアクションがあります。

私が必要としているのは、item_category フィールドで個別の選択を行い、それをページのヘッダーに配置することです。

4

2 に答える 2

1

正直なところ、好ましい方法はテーブルを正規化することです:)

すべての項目に対して多数の VARCHAR データを使用するよりもSELECT *、(提案された)テーブルでDB を実行する方が高速であるだけでなく、RDBMS および CakePHP を使用する場合のベスト プラクティスでもあります。データを操作する必要があるため、それほど複雑ではありません。categoriesDISTINCT

したがって、「シンプルなアプリであること」がどのようにあなたの選択を正当化するのかわかりませんが、長い目で見れば現在よりも多くの問題を引き起こす可能性がありますが、あなたのやり方はうまく機能します. requestActionパフォーマンスのためにキャッシュせずに避けるべきであることに注意してください。

内部でこの情報のみが必要な場合は、検索からデータを返すようItemsControllerに検索を追加し、コントローラーで次のようなことを行う方がよいでしょう。ItemModelpublic function categories()

$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 に答える