2009-05-11 4 views
1

죄송합니다. 무엇이 일반적인 제목입니까? 나는 타이틀에서 최고가 아니야.CakePHP에서 MVC 프레임 워크를 깨지 않고 어떻게해야합니까?

어쨌든 케이크가 데이터를 전달하는 방식 (해시)은이 질문을해야 할 필요가있는 이유입니다. 변수/obj를 컨트롤러에서 뷰로 전달할 때 배열/사전이 아닌 (예 : $ duck-> quack()) 질문을 할 수있는 개체가있었습니다 (예 : $ duck [ Duck '] ['quack '] == true) 이것은 쉬울 것입니다.

내 앱에있는 것은 사용자 x가 소유 할 수있는 항목 목록입니다. 특정보기에서는 데이터베이스/앱 (즉, 페이지 매김)의 모든 항목을 표시하고 로그인 한 사용자가 소유하고 있는지 여부를 알아야하는 각 항목에 대해 표시합니다. 이 질문에 답하기 위해 모델 내부에서 수행되는 쿼리 (복잡한 HABTM 관계로 인해)가 필요합니다. 다시 말해서, My Item 모델은 isOwnedByUser ($ user_id, $ item_id) 함수를 가지고 있는데, 이것은 사용자가 소유하고 있다면 참이다. 보기에서이 함수를 호출하고 싶습니다.

당연히 이것이 MVC 프레임 워크를 위반하고 있지만 어떻게해야할지 모르겠습니다.

아이디어 1 :

는 도우미 안에이 작업을 수행합니다 :

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

하고 뷰에서 도우미를 호출 (하고 $ ITEM_ID 전달 물론 $ USER_ID 나는 네 생각을했다). 그러나 이것은 MVC 프레임 워크에 위배됩니다.

아이디어 2 :

이 item_controller.php 내부 조치를 생성하고 requestAction를 사용하여보기에서 작업을 호출(). 그러나 나는 내 문제에 대한 해결책을 looking을했지만 그들에 따라 두 아이디어 그래서 두 개 더 솔루션을 함께했다 나쁜 때 내가 찾은 지금이 두 가지 아이디어 heard that this was extremeley inefficent

:

아이디어 3 :

페이지가 매겨진 데이터를보기로 되돌릴 때 모든 항목에 'user_id'키가 있는지 확인하여 로그인 한 사용자의 ID와 비교하여 뷰의 키를 확인하여 항목을 소유하고 있는지 확인할 수 있습니다. . 그러나 이것은 a) 페이지 매기기를 다시 작성해야한다. b) 특히 특정보기 (검색)에 대해 매우 추악한 쿼리, c) 전반적인 추악함 및 느려짐.

뷰는 항목이 사용자가 소유하는 경우, 그냥 컨트롤러에서 다른 배열을 따라 통과거야 알 필요가 때마다 ALL을 포함 : 그래서

아이디어 (4)는이 아이디어를 포기하기로 결정 사용자가 소유 한 항목이며보기에서 사용자가 해당 항목을 소유하고 있는지 확인하기 위해 in_array()를 사용할 수 있습니다. 물론이 문제는 명백합니다. 사용자가 많은 항목을 가지고 있다면?

요약하면 나는 이것에 집착하고 여기에서 어디로 가야하는지 전혀 모른다. 그리고 나는 모든 도움에 감사 할 것이다! 감사!

+0

또한 Cake가 HABTM 관계를 처리하는 방식도 짜증 스럽다 고 덧붙여 야합니다. 정말 안됐다. 그러나 그것은이 질문과 아무 관련이 없습니다. – encee

답변

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을 설정하고 뷰에 대한 그와 $ 항목을 모두 설정할 수 있습니다. 그러면 Set :: extract() 또는 Set :: check()를 제외하고는 옵션 4와 in_array()가 나타납니다. 이 같은

뭔가를 수행해야합니다

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

(나는 그렇게 내 기억에서 쓴 ... 당신은 :) 실패 할 경우 어떻게 해야할지)

편집 :

또는 다음과 같이 할 수 있습니다 (위의 것보다 빠름).

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

if (in_array($itemId, $usersItemIds)) 
{ 
    // user has the item 
} 
+0

미안하지만 답장하는 데 거의 하루가 걸렸지 만 훌륭합니다! 나는 완전히 Set 유틸리티에 대해 몰랐고 지금은 비효율적으로 작성된 코드를 리펙토링 할 수 있습니다! 다시 한번 감사드립니다. – encee

+0

괜찮습니다. 세트 클래스는 케이크에서 가장 좋은 것 중 하나이며, 일반 대중에게는 모르는 것입니다. 그래서 단어를 퍼뜨려 라! :) –

0

이 질문은 오래된 질문이지만 ACL 구성 요소가 좋은 옵션 일 것 같습니다.