I’m trying my best to learn MVC and cakePHP and I had a question about passing arrays to the view. Currently, I have some basic code below.
class AwarenesscampaignsController extends AppController {
public function view($id = null) {
$this->Awarenesscampaign->id = $id;
$this->set('data', $this->Awarenesscampaign->read());
}
This is what I “think” is currently happening.
AwarenesscampaignsController is set up. The view paramater requests id and matches it up with the Model, Awarenesscampaign. This matches up with the database and returns an array which is set to the variable “$data”, and then the view is loaded.
My first question: is my understanding accurate?
What I would like to do is with this is to be able to pass another array, from a different model. For instance, I would like to query the table Posts (Controller: PostsController/ Model: Post).
For instance, my first attempt was to do the following inside the function:
$this->Post->find(‘all’);
But this yields the error:
Indirect modification of overloaded property AwarenesscampaignsController::$Post has no effect [APP/Controller/AwarenesscampaignsController.php, line 20]
Additionally, I’m not sure how I would send both variables to the view.
To recap:
- Was my understanding accurate?
- How do I query a variable from another controller/model?
- How do I sent this array to the appropriate view for that controller?
Thanks,
-M
You’re on the right lines, and aren’t doing it wrong per se. I would say your understanding is pretty good for a beginner.
By default Cake automatically loads a model that it thinks is directly related to the controller. So in
AwarenesscampaignController, you can automatically accessAwarenesscampaign(the model).It doesn’t know about any other model, though. One way you might solve this is by adding the following property to your controller:
This goes at the top of the class, before you start declaring the functions. It tells Cake that you want to use other models except the ‘default’ one, but you have to add that one to the array too, or you’ll lose access to it.
You can also use
loadModelinside your action, if it’s a one-off. It’s then accessed the same way as you would access a model normally:To send this to your view, you can call
setagain, but you might want to changedatato something more readable, and to prevent confusion:They’ll be accessible as
$campaignand$postrespectively.One tweak I would make, though, is to not use ‘read’ unless you intend to edit something. You can use
findByColumnNameto get the same data. Since you’re using just anid, you can callfindById:There’s quite a lot of magic going on there. It just means you can search for a particular value in a more short-hand format.
http://book.cakephp.org/2.0/en/models/retrieving-your-data.html
Finally, while you can access other models (as demonstrated), you can’t, or generally shouldn’t, try and access one controller from another. If you have code that you want to use in more than one controller, but can’t go in the model, you can create
Components.http://book.cakephp.org/2.0/en/controllers/components.html#creating-a-component
The manual is fairly comprehensive. While sometimes hard to navigate, it will often have an answer to most of your questions.
http://book.cakephp.org/2.0/en/