2012-04-07 4 views
1

Я стараюсь учиться MVC и cakePHP, и у меня возник вопрос о передаче массивов в представление. В настоящее время у меня есть базовый код ниже.Передача двух массивов от контроллера в cakePHP

класс AwarenesscampaignsController расширяет AppController {

public function view($id = null) { 
    $this->Awarenesscampaign->id = $id; 
    $this->set('data', $this->Awarenesscampaign->read()); 
} 

Это то, что я "думаю, что" в настоящее время происходит.

AwarenesscampaignsController настроен. Параметр view param запрашивает id и сопоставляет его с Model, Awarenesscampaign. Это соответствует базе данных и возвращает массив, который настроен на переменную «$ data», а затем загружается представление.

Мой первый вопрос: мое понимание точного?

То, что я хотел бы сделать, заключается в том, чтобы иметь возможность передавать другой массив из другой модели. Например, я хотел бы запросить таблицу Posts (Контроллер: PostsController/Model: Post).

Например, моя первая попытка была сделать следующее внутри функции:

$ this-> Post-> найти ('все');

Но это дает ошибку:

Косвенное модификация перегружен имущества AwarenesscampaignsController :: $ Post не имеет никакого эффекта [APP/Controller/AwarenesscampaignsController.php, строка 20]

Кроме того, я не уверен, как я бы послал обе переменные в представление.

Чтобы резюмировать:

  1. ли мое понимание точным?
  2. Как запросить переменную от другого контроллера/модели?
  3. Как отправить этот массив в соответствующее представление для этого контроллера?

Спасибо, -М

ответ

2

Вы находитесь на правильном пути, и не делают это неправильно само по себе. Я бы сказал, что ваше понимание очень хорошо для новичка.

По умолчанию Cake автоматически загружает модель, которая, по ее мнению, напрямую связана с контроллером. Таким образом, в AwarenesscampaignController вы можете автоматически получить доступ к Awarenesscampaign (модель).

Он не знает ни о какой другой модели. Один из способов, вы могли бы решить эту проблему, добавляя следующее свойство к контроллеру:

// This has to contain ALL models you intend to use in the controller 
public $uses = array('Awarenesscampaign', 'Post'); 

Это идет в верхней части класса, прежде чем начать декларирование функции. Он говорит Cake, что вы хотите использовать другие модели, кроме «по умолчанию», но вы должны добавить его в массив, иначе вы потеряете доступ к нему.

Вы также можете использовать loadModel внутри своего действия, если это одноразовый.Это то доступ к таким же образом, как вы могли бы получить доступ к модели обычно:

public function view($id = null) { 
    $this->loadModel('Post'); 
    $posts = $this->Post->find('all'); 
    ... 
} 

Чтобы отправить на ваш взгляд, вы можете позвонить set снова, но вы можете захотеть изменить data к чему-то более читаемым, и для предотвращения путаницы :

public function view($id = null) { 
    ... 
    $this->set('campaign', $this->Awarenesscampaign->read()); 
    $this->set('posts', $this->Post->find('all')); 
} 

Они будут доступны в качестве $campaign и $post соответственно.

Одна из настроек, которую я сделал бы, заключается в том, чтобы не использовать «читать», если вы не собираетесь что-то редактировать. Вы можете использовать findByColumnName, чтобы получить те же данные. Так как вы используете только в id, вы можете позвонить findById:

$campaign = $this->Awarenesscampaign->findById($id); 

Там довольно много магии происходит там. Это просто означает, что вы можете искать определенную ценность в более коротком формате.

http://book.cakephp.org/2.0/en/models/retrieving-your-data.html

Наконец, в то время как вы можете получить доступ к другим моделям (как показано), вы не можете, или вообще не должны попробовать и доступ один контроллер от другого. Если у вас есть код, который вы хотите использовать в нескольких контроллерах, но не можете войти в модель, вы можете создать Components.

http://book.cakephp.org/2.0/en/controllers/components.html#creating-a-component

Пособие является довольно исчерпывающим. Хотя иногда трудно ориентироваться, он часто будет отвечать на большинство ваших вопросов.

http://book.cakephp.org/2.0/en/

+0

Благодарим вас за то, что нашли время, чтобы подробно ответить на вопросы и дать мне возможность проследить за чтением. Я искренне ценю это. – user1319580

2

1) Ваше понимание достаточно хорошо. То, что это делает, это в основном сопоставление строки таблицы базы данных с объектом. Поэтому после установки идентификатора модели $this->Awarenesscampaign->id = $id теперь модель указывает на строку таблицы базы данных, которая имеет идентификатор, равный тому, что было передано для просмотра действия.

2) вы можете запросить другую таблицу, вызвав методы этой конкретной модели. Если ваша модель каким-то образом связана с текущей моделью, в которой вы находитесь, вы можете использовать цепочку для вызова действия этой модели. например если ваш контроллер сообщений и Post Model связан с моделью комментариев, t получите данные, с которыми вы можете переходить.

$comments = $this->Post->Comment->find(); 

Однако, если ваша модель представляет интерес не связана с текущей моделью, существует несколько способов выполнения операций другой модели. Хорошим вариантом является использование Class Registry. Скажем, например, вы хотите использовать модель клиента, которая не связана с текущей моделью. В контроллере вы будете делать

$customer= ClassRegistry::init("Customer"); 
    $customers= $customer->find(); 

3) установить несколько переменных для вида вы можете установить их с помощью compact функции или с помощью соответствующей строки.

$posts = $this->Post->find(); 
    $comments = $this->Post->Comment->find(); 

    $this->set(compact('posts', 'comments')); 
    // or 
    $this->set('posts' => $posts, 'comments' => $comments); 
Смежные вопросы