原型 -
如果我理解正确 - 您使用的是 John 的示例,并且您需要修复视图中调用他的控制器的链接?
<?
echo $this->Html->link(__($album['Album']['title'], true), array('controller'=>'Album', 'action'=>'viewSongs', $id));
?>
John 的示例解释了如何在 Albums 控制器 中创建一个方法,建议在 Songs 模型 中点击一个返回所需结果的方法。
因此您的链接将针对专辑控制器,其操作应该是控制器方法。
此方法在 Songs 控制器中意义不大,因为它需要 专辑 ID。您只希望专辑控制器从 Songs 模型/表中提取相关数据。约翰的回答是完全正确的,但如果你刚刚开始使用 Cake,可能太复杂了。 John 通过在 Song 模型 中放置一个方法来拆分所需的功能,该方法由 Albums 控制器 中的方法调用,该方法会拉取结果以供您的视图显示。
我将其切换为“胖控制器”,这对于短代码更容易理解,但 MVC 更少。
您需要从专辑到歌曲的 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/albums/view.ctp 中的链接如下:
<?php
echo $this->Html->link('View Songs', array('controller'=>'albums',
'action'=>'viewSongs', $id));
?>