1

一般的なタイトルでごめんなさい。私はタイトルが得意ではありません。

とにかく、Cakeが(ハッシュとして)データを渡す方法が、私がこの質問をする必要がある理由です。コントローラーからビューに変数/objを渡したときに、配列/辞書($ duck [')ではなく、質問できるオブジェクト(つまり、$ duck-> quack())だった場合。アヒル']['quack'] == true)これは簡単です。

私のアプリにあるのは、ユーザーxが所有できるかどうかに関係なくアイテムのリストです。特定のビューでは、データベース/アプリ内のすべてのアイテムを表示し(つまり、ページ分割)、アイテムごとに、ログインしているユーザーがそれを所有しているかどうかを知る必要があります。この質問に答えるには、モデル内で行われるクエリを実行する必要があります(複雑なHABTM関係のため)。言い換えると、私のItemモデルには関数isOwnedByUser($ user_id、$ item_id)があり、これはユーザーが所有している場合にtrueになります。ビューからこの関数を呼び出したい。

当然、これはMVCフレームワークに違反していますが、他にどのように行うかはわかりません。私には4つのアイデアがありました:

アイデア1:

ヘルパー内でこれを行います:

App:Import('Model','Item');
$item = new Item();
$item->isOwnedByUser($user_id,$item_id);

ビューからヘルパーを呼び出します(もちろん、$item_idと$user_idを渡します)。しかし、これは本当にMVCフレームワークに違反しています。

アイデア2:

item_controller.php内にアクションを作成し、requestAction()を使用してビューからアクションを呼び出します。しかし、これは非常に非効率的だと聞きました

今、私が自分の問題の解決策を探していたときに見つけたこれらの2つのアイデアですが、それらによると、これら2つのアイデアは悪いので、さらに2つの解決策を思いつきました。

アイデア3:

ページ付けされたデータをビューに返すとき、すべてのアイテムに「user_id」キーがあることを確認して、ビューのキーをログインしたユーザーのIDと照合して、ユーザーがアイテムを所有しているかどうかを確認できます。しかし、これには、a)ページネーションを書き直す必要がありますb)特に特定のビュー(検索)に対する非常に醜いクエリ、c)全体的な醜さと遅さ。だから私はこのアイデアを放棄することにしました

アイデア4:

ビューがアイテムがユーザーによって所有されているかどうかを知る必要があるたびに、ユーザーが所有するすべてのアイテムを含むコントローラーから別の配列を渡すだけです。ビューでは、in_array()を使用してユーザーが所有しているかどうかを確認できます。言ったアイテム。もちろん、これに対する問題は明らかです。ユーザーがたくさんのアイテムを持っている場合はどうなるでしょうか。

要するに、私はこれで立ち往生していて、ここからどこに行くべきかわからないので、すべての助けに感謝します!ありがとう!

4

2 に答える 2

3

3と4を組み合わせます。

あなたの行動では、あなたがすべてのページ付けされたアイテムを手に入れた後:

$items = $this->paginate('Item');

IDを取得し、それをユーザーIDと組み合わせて、すべてのユーザーのアイテムを取得します。

$itemIds = Set::extract('/Item/id', $items);

$usersItems = $this->Item->User->find
    (
        'all',
        array
        (
            'conditions' => array
            (
                'User.id' = $userId,
                'Item.id' => $itemIds
            ),
            'fields' => array('User.id', 'Item.id')
        )
);

これで、$ usersItemsを好みの形式で設定し、それと$itemsの両方をビューに設定できます。これにより、オプション4とin_array()が表示されます。ただし、おそらくSet :: extract()またはSet :: check()になります。

このような何かがそれを行う必要があります:

if (Set::extract(sprintf('/Item[id=%s]', $itemId), $usersItems))
{
    // user has the item
}

(私はこれを私の記憶から書いたので...失敗した場合の対処法を知っています:))

編集:

または、次のようにすることもできます(上記よりも高速である必要があります。必ずSet::extract()ループから外してください)。

$usersItemIds = Set::extract('/Item/id', $usersItems);

if (in_array($itemId, $usersItemIds))
{
    // user has the item
}
于 2009-05-11T06:31:20.140 に答える
0

これは古い質問ですが、ACLコンポーネントがここでの適切なオプションであるように思われます。

于 2009-11-13T21:33:33.737 に答える