cakePHP - добавление новых функций в модель или контроллер - PullRequest
0 голосов
/ 12 июня 2011

Я новичок в разработке cakePHP и MVC и пытаюсь создать что-то с помощью cakePHP, но не могу понять, как это сделать:

Я создаю простое приложение CRUD, которое использует Альбомы и Песничерез простые формы ввода данных.Я создал БД и использовал консольное приложение Cake для создания всех моделей / контроллеров и т. Д., И это хорошо работает.Я могу без проблем обрабатывать как альбомы, так и песни, а таблица песен в БД связана с таблицей альбомов внешним ключом, поэтому в модели есть все связи и ассоциации.

Что я хочу сделатьЯ могу нажать на альбом и посмотреть песни, связанные с этим альбомом, но я не знаю, как это сделать.Нужно ли добавить запрос в модель, или эта функция входит в контроллер?

Мое мнение таково: в списке альбомов сделайте ссылки на названия альбомов, которые вызывают | viewAlbum |функция в контроллере композиций с идентификатором альбома.Хотя не уверен, куда идти отсюда ......

Может ли кто-нибудь указать мне правильное направление?

Приветствия, Колм


@ JohnP СпасибоВы за ваш ответ.Как создать ссылку для вызова этой функции в контроллере?У меня есть:

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

Где viewAlbum - это имя функции в контроллере песен.Любые идеи о том, почему это не работает?

Ответы [ 2 ]

0 голосов
/ 13 июня 2011

Протос -

Если я правильно понимаю - вы используете пример Джона, и вам нужно исправить ссылку в своем представлении, которая вызывает его контроллер?

<?
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));
?>
0 голосов
/ 12 июня 2011

ORM Cake's уже делает это для вас.Если вы на самом деле зайдете на страницу просмотра альбома, он сам покажет вам все связанные с ним песни.Это работает, только если вы правильно настроили отношения.

Если вы хотите кодировать это поведение самостоятельно, вы можете поместить действие viewSongs в свой AlbumController.Этот метод будет смотреть на переданный ему идентификатор альбома и вызывать метод (например, getSongsByAlbum($aid)) в вашей модели песни.Внутри этого метода в вашей песенной модели будет вызов, похожий на

$opts = array(
   'conditions' => array(
       'album_id' => $aid
   )
);
return $this->find('all', $opts);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...