2013-08-25 2 views
1

CakePHP의 내가 정직 루프 항목을 표시하는 데 내 항목 컨트롤러의 내 index 액션에서 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; ?> 

을 그러나, 페이지의 맨 위에 항목 테이블의 item_category 필드에 대한 링크 메뉴가있는 섹션을 만들어야합니다.

item_category 필드는 Items 테이블의 간단한 varchar 필드입니다. 나는 그것들을 구별하여 링크로 출력하고 싶다.

어떻게해야합니까? 헬퍼를 만들고보기에 포함시켜야합니까? 그렇다면 도우미는 어떻게 생겼을까요?

나는 헬퍼 모델을 사용하여 MVC 로직을 깨뜨릴 것이라고 생각하지만 그 밖의 방법은 무엇입니까?

ADDED는 :

난 그냥 요소를 통해 그것을 할 시도하고 작동하지만 적절한 방법이다?

요소 소스 :

<?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이며 다른 테이블의 기본 키가 아닙니다.

또한 테이블의 모든 항목을 나열하는 항목 컨트롤러에서 인덱스 작업이 있습니다.

내가 필요한 것은 item_category 필드에서 select를 고유하게 만들고 페이지의 헤더에 넣는 것입니다. 당신의 ItemsController에서

+0

편집 후에도 원하는 작업이 명확하지 않습니다. 게시물을 두 번 읽은 후 아이디어를 얻은 것은 이미 항목 모델에 데이터가 있으므로 두 곳에서 두 번 반복해야한다는 것입니다. 별개의 데이터를 가져 오는 데 문제가 있다면 컨트롤러에서 고유 한 것으로 찾기를 실행하고 다른 변수로 전달하십시오. 그러나이 경우 아마도 DB 구조를 다시 생각하고 다른 테이블의 범주 필드를 표준화해야합니다. – user221931

+0

@ user221931 : 너무 명확하지 않은 것에 대해 유감스럽게 생각합니다. 첫째로 나는 아주 간단한 app이기 때문에 종류를 정상화하고 싶지 않다. 내 주요 질문은 2 컨트롤러 동작에서 뷰 데이터를 가져 오는 가장 좋은 방법입니다. 당신이 내 게시물에서 볼 수 있듯이 두 번째 작업 카테고리를 사용하고 있는데 거기에 뚜렷한 부분을 만들고 있습니다. 이 동작은 요소를 공급하고 이것이 내가 어떻게 작동 하는지를 보여줍니다.이 방법이 선호되지 않는다면 나는 모른다. – e4rthdog

답변

1

솔직히 원하는대로보기에서 $의 catigories 변수 선호하는 방법은 테이블 :

뿐만 아니라 그것은을 정상화하는 것 DB가 DISTINCT이 아닌 (제안 된) categories 테이블에서 모든 항목에 대해 VARCHAR 데이터의 수를 초과하여 SELECT *을 실행하는 것이 더 빠릅니다. 또한 RDBMS 및 CakePHP와 함께 작업 할 때 cak e는 데이터에 대해 작업 할 수 있도록 투명하게 만들 것이므로 실제로는 더 복잡하지 않습니다.

"단순한 앱이되는 것"이 ​​당신의 선택을 정당화하는 방법을 볼 수는 없지만 장기적으로 볼 때 현재보다 더 많은 문제를 일으킬 수 있습니다. 성능을 위해 캐싱하지 않고 requestAction을 피해야합니다.당신은 단지 컨트롤러에서 다음 찾기에서 데이터를 반환하고 public function categories()ItemModel에 찾아 ItemsController 당신은 아마 더 추가하는 내부 정보가 필요한 경우

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

같은 당신 여전히 요소를 사용할 수 있습니다. 그냥 전달하십시오. $itemCategories

+0

내보기에 하나 이상의 작업을 포함시키는 방법입니다. 그리고 만약 내가 내 요소에서 무엇을해야 requestaction을 사용하고 싶지 않아? – e4rthdog

+2

CakePHP는 MVC 프레임 워크입니다. MVC 패러다임 모델에서는 비즈니스 로직의 대부분 (코드의 60-80 %)을 포함하고 컨트롤러는 중개자/글루/데이터 준비를 수행해야하며 뷰는 매우 얇아 야합니다. 그래서 '뷰 당 다중 액션'에 대한 질문은 아마도 MVC 흐름을 인식하지 못하기 때문일 것입니다. 'requestAction'은 이미 라우터 -> 컨트롤러 -> 모델 -> 컨트롤러 ->보기를 통해 다른 컨트롤러 -> 모델 -> 컨트롤러로 돌아가서 데이터를 가져 오는 "해킹"으로 생각할 수 있습니다. 어떤 경우에는 정당화되지만 일반적으로는 정당화되지 않습니다. – user221931

+2

그리고 명확히하기 위해 항목 카테고리가 전체 또는 대부분의 페이지에 표시되어야하는 경우'requestAction'이 선호되는 해결책이며 정확히 의미있는 패턴과 일치합니다. 캐싱과 함께 사용하면 정적 코드를 사용하는 것만 큼 좋을 것입니다. 항목 컨트롤러의 몇 가지 작업에서만 범주가 필요하거나 두 가지 이상이 필요한 경우 모델의 논리를 누르고 필요한 각 작업에서 컨트롤러에 요청하십시오. 하지만 ('requestAction'이 사용되는 경우에도) 최상의 해결책은 제가 말했던 것처럼 새로운 테이블/모델입니다. – user221931

0

:

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

사용하면

+0

아마 내가 충분히 명확하지 않았다. – e4rthdog