I’m trying to learn CakePHP by building a simple CMS app, it was going well but as I’m adding more, I’m getting a bit confused by the MVC structure.
In addition to my Posts, I have created a simple model for ‘Content Blocks’ (basically an admin editable title and content field) that I want to display as elements within other pages of my site.
To help explain:
My Posts controller has an index action that lists out all of the blog posts. In the view for that action I also want to pull a specific ‘content block’ from the database and display it at the top of the page.
Another example would be an admin-editable ‘about’ blurb that appears in the footer of every page.
Lastly, in a similar fashion to the WordPress text widget or Magento static block, I’d like to prevent ‘content blocks’ being directly accessible (i.e. domain.com/content_blocks/view/id)
What is the ideal way to achieve this whilst staying true to CakePHP and MVC convention?
I’ve had several stabs at it (such as using requestAction in an element) but have only succeeded in getting more confused.
The way I would do it is as you suggested with a request action inside an element because that won’t be directly accessible through the URL. So you would create a view inside the elements folder:
app/View/Elements/block.ctp:
app/Controller/ContentBlocksController.php
Then you can see this post for how to do caching with the element and requestAction: http://mark-story.com/posts/view/how-using-requestaction-increased-performance-on-my-site
Also, you might want to checkout Croogo, which has a lot of the functionality you are looking for and more already built in: http://croogo.org/