cakePHP - 为模型或控制器添加新功能

时间:2011-06-12 14:17:46

标签: php cakephp

我是CakePHP和MVC开发的新手,并试图用cakePHP创建一些东西,但无法弄清楚如何做到这一点:

我正在创建一个简单的CRUD应用程序,它通过简单的数据输入表单接收专辑和歌曲。我创建了数据库并使用了Cake控制台应用程序来创建所有模型/控制器等,它运行良好。我可以CRUD两个专辑和歌曲没问题,并且DB中的歌曲表连接到具有外键的专辑表,因此模型中存在所有链接和关联。

我想要做的是能够点击相册并查看与该相册相关的歌曲,但我不知道如何去做。我是否需要在模型中添加查询,或者该功能是否会进入Controller?

我的看法是:在专辑列表中制作专辑名称链接,调用| viewAlbum |使用albumID在歌曲控制器中起作用。不知道从哪里开始虽然......

有人能指出我正确的方向吗?

干杯, 科尔姆


@JohnP谢谢你的回复。如何在控制器中创建一个调用该函数的链接呢?我有:

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

其中viewAlbum是歌曲控制器中函数的名称。关于为什么这不起作用的任何想法?

2 个答案:

答案 0 :(得分:0)

Cake的原生ORM已经为您做到了这一点。如果您实际进入相册的视图页面,它应该会显示您自己的所有相关歌曲。仅当您正确设置了关系时,此方法才有效。

如果您想自己编写此行为,可以在AlbumController中添加viewSongs操作。此方法将查看传递给它的相册ID,并在Song模型中调用方法(例如getSongsByAlbum($aid))。在你的歌曲模型里面的那个方法将是一个类似于

的调用
$opts = array(
   'conditions' => array(
       'album_id' => $aid
   )
);
return $this->find('all', $opts);

答案 1 :(得分:0)

Protos -

如果我理解正确 - 您正在使用John的示例,并且您需要修复视图中调用其控制器的链接?

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

?>

John的示例解释了如何在专辑控制器中创建方法,建议点击歌曲模型中返回所需结果的方法。

因此,您的链接将定位到相册控制器,其操作应该是控制器方法。

此方法在歌曲控制器中不太有意义,因为它需要专辑ID 。您只需要Album控制器从Songs模型/表中提取关联数据。约翰的答案是完全正确的,但如果你刚开始使用Cake,可能会太复杂。 John通过在歌曲模型中添加一个方法来分割所需的功能,该方法由专辑控制器中的方法调用,该方法为您的视图提供结果以显示。

我将其切换为“胖控制器”,这对于短代码更容易理解,但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));
?>