Протос -
Если я правильно понимаю - вы используете пример Джона, и вам нужно исправить ссылку в своем представлении, которая вызывает его контроллер?
<?
echo $this->Html->link(__($album['Album']['title'], true), array('controller'=>'Album', 'action'=>'viewSongs', $id));
?>
Пример Джонаобъяснил, как создать метод в контроллере Albums , предложил использовать метод в модели Songs , который возвращает желаемые результаты.
Таким образом, ваша ссылка будет нацелена на альбомконтроллер, и его действие должно быть методом контроллера.
Этот метод имеет меньший смысл в контроллере Songs , поскольку для него требуется идентификатор альбома .Вы просто хотите, чтобы контроллер Album извлекал связанные данные из модели / таблицы Songs.Ответ Джона точен, но, возможно, слишком сложен, если вы только начинаете с Cake.Джон разделил необходимые функции, поместив метод в модель 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));
?>