2011-06-12 2 views
0

에 새로운 기능을 추가하고 CakePHP의 뭔가를 만들려고하지만,이 수행하는 방법을 알아낼 수 없습니다 : 나는 간단한을 만드는거야CakePHP는 - 내가 CakePHP의와 MVC 개발에 새로 온 모델 또는 컨트롤러

을 간단한 데이터 입력 양식을 통해 앨범과 노래를 가져 오는 CRUD 응용 프로그램입니다. 나는 DB를 만들고 모든 모델/컨트롤러 등을 만들기 위해 Cake 콘솔 앱을 사용했으며 잘 작동합니다. 앨범과 노래를 모두 문제없이 CRUD 할 수 있으며 DB의 노래 테이블은 외부 키가있는 앨범 테이블에 연결되므로 모든 링크와 연결이 모델에 있습니다.

내가하고 싶은 일은 앨범을 클릭하고 해당 앨범과 관련된 노래를 볼 수 있지만 어떻게할지는 잘 모르겠습니다. 모델에 쿼리를 추가해야합니까, 아니면 해당 기능이 컨트롤러에 추가됩니까?

필자 소개 : 앨범 목록에서 앨범 이름 링크를 만들면 | viewAlbum | 기능을 앨범 컨트롤러 ID로 사용합니다. 여기에서 어디로 가야할지 모르겠다. ......

누군가 올바른 방향으로 나를 가리킬 수 있습니까? 답장을 보내 주셔서 감사 @JohnP

건배, 콤


. 컨트롤러에서 해당 함수를 호출하는 링크를 어떻게 만듭니 까? 내가 가진 : viewAlbum이 노래 컨트롤러에서 함수의 이름입니다

echo $html->link(__($album['Album']['title'], true), array('controller'=>'Songs', 'action'=>'viewAlbum', $album['Album']['id']));

. 왜 이것이 작동하지 않는지에 대한 아이디어가 있습니까?

답변

0

PROTOS과 같이 보이는 호출 될 내부 -

을 만약 내가 제대로 이해 - 당신이 요한의 예를 사용하고, 당신은에있는 링크를 고칠 필요 그의 컨트롤러에 전화하는 장면?

<? 
echo $this->Html->link(__($album['Album']['title'], true), array('controller'=>'Album', 'action'=>'viewSongs', $id)); 

?> 

존의 예는

앨범 컨트롤러의 방법을 만드는 방법을 설명, 원하는 결과를 반환 노래 모델의 방법을 타격 제안했다.

그래서 귀하의 링크는 앨범 컨트롤러를 대상으로하며 그 동작은 컨트롤러 방법이어야합니다.

이 방법은 앨범 아이디을 필요로하기 때문에 노래 컨트롤러에서는 의미가 없습니다. 앨범 컨트롤러가 Songs 모델/테이블에서 관련 데이터를 가져 오기만하면됩니다. John의 대답은 정확하게 정확하지만 Cake를 시작하려는 사람에게는 너무 복잡 할 수 있습니다.John은 노래 모델에 메서드를 입력하여 앨범 컨트롤러의 메서드에서 호출하여 필요한 기능을 분할하여보기에 대한 결과를 표시합니다.

짧은 코드는 있지만 MVC는 적지 만 "fat controller"로 바꾸고 있습니다.

당신은 노래에 앨범에서 hasMany의 관계가 필요 - 각 앨범 hasMany의 노래 :

// ../models/album.php 

class Album extends AppModel { 

    var $name = 'Album'; 

    var $hasMany = array(
     'Song' => array(
      'className' => 'Song', 
      'foreignKey' => 'album_id' 
     ) 
    ); 

귀하의 컨트롤러 액션은 다음과 같이됩니다 :

// ../controllers/albums_controller.php 

function viewSongs($id = null) { 
    if(isset($id) && $id != null) { 
     $albums = $this->Album->find('first',  
      array('conditions'=>array('Album.id'=>$id)); 
     $songs = $this->Album->Song->find('all', 
      array('conditions'=>array('Song.album_id'=>$id))); 
     // This returns variables to the view to use 
     $this->set(compact('albums', 'songs')); 
    } 
} 

로보기 viewSongs.ctp 호출됩니다,

// ../views/albums/viewSongs.ctp 

<?php 
foreach($albums as $album) { 
    echo "<h2>{$album['name']}</h2>"; 
    echo "<ul>"; 
    foreach ($songs as $song) { 
     echo "<li>{$song['Song']['name']}</li>" 
    } 
    echo "</ul>"; 
} 

그리고 ../views/alb에 링크 : 그것은 다음과 같이 보일 것이다 ums/view.ctp는 다음과 같습니다 :

<?php 
echo $this->Html->link('View Songs', array('controller'=>'albums', 
    'action'=>'viewSongs', $id)); 
?> 
+0

답장을 보내 주셔서 감사합니다. 내가 찾고있는 것은 기본적으로 노래 모델의 인덱스보기와 동일하지만 노래 컨트롤러를 통과 할 앨범을 하나만 표시하도록 필터링했기 때문입니다. 나는 이것을 볼 수있는 기회가 없었으나, 내가 그렇게 할 때 나는이 방법을 시도 할 것이고 내가 어떻게 돌아 왔는지 그리고 당신의 대답을 걸러 내도록 알려줄 것이다. – Protos

0

Cake의 기본 ORM이 이미이 작업을 수행합니다. 실제로 앨범의보기 페이지로 들어가면, 관련된 모든 노래가 표시됩니다. 이는 관계를 올바르게 설정 한 경우에만 작동합니다.

이 동작을 직접 코딩하려면 viewSongs 액션을 AlbumController에 넣을 수 있습니다. 이 메소드는 전달 된 앨범 ID를보고 노래 모델에서 메소드 (예 : getSongsByAlbum($aid))를 호출합니다. 노래 모델에서 그 방법은

$opts = array(
    'conditions' => array(
     'album_id' => $aid 
    ) 
); 
return $this->find('all', $opts); 
+0

및 @satyrwilder. 당신의 도움을 주셔서 감사합니다. 나는 앨범 콘트롤러에서 새로운 액션 액션을 다루도록했다. 내 모델에는 이미 베이킹 응용 프로그램과 hasMany 관계가있었습니다. 잠시 동안 나를 붙잡 았던 점 중 하나는 viewSongs.ctp가 아니라 viewSongs.ctp라는 뷰가 필요하다는 것입니다. 망할 케이크 PPP 협약! – Protos

+0

@Protos,이 의견을 추가 할 때까지 실제로 후속 조치를 알리지 못했습니다. @ 주석으로 만 사람들에게 주석을 달 수 있으며 답변 섹션은 아닙니다 :) 도움을 청하십시오. – JohnP

관련 문제