The outline of this method is:
- Declare an array of classes to run, each class represents a boxed module on the page.
- Each module's data is collected as an associative array and sent to the view.
- In the layout, loop through this data and then call each partial passing along the data set when there is one.
Here is a picture of the outcome:
Below is an example of 3 sidebar items to be loaded.
$s = new App_Sidebar_Loader(); $this->view->sidebar = $s->load(array( array('SomeAlert', 'hideEmpty'=> true), array('FavsList'), array('StaticContent', 'viewOnly'=>'true'), ));
File locations:
Library / App / Sidebar / Loader.php
Library / App / Sidebar / Modules / SomeAlert.php
Library / App / Sidebar / Modules / FavsList.php
Library / App / Sidebar / Modules / StaticContent.php
Partials (Zend framework view helper):
View / script / Sidebar / SomeAlert.phtml
View / script / Sidebar / FavsList.phtml
View / script / Sidebar / StaticContent.phtml
I didn't want to pre-process the view file names, like from "SomeAlert" to "some-alert.phtml", so I'll just stick to the camel casing for the partial file names.
The Loader class currently supports 2 types of options:
- "viewOnly": Load the view only, no class to execute.
- "hideEmpty": Show module or not when there is no data for it.
/** * @author 2010 Edward Hew * @license http://creativecommons.org/licenses/MIT/ Creative Commons MIT License * * Options accepted are: * - viewOnly: boolean, when true grab only view script, no class to exec * - hideEmpty: boolean, default false, don't show sidebar module id 'data' is empty */ class App_Sidebar_Loader { public function load($loadList){ $len = count($loadList); for($i = 0; $i < $len; ++$i){ $sidebarHandle = $loadList[$i][0]; // viewOnly check if(empty($loadList[$i]['viewOnly'])) { $class = 'App_Sidebar_Modules_'.$sidebarHandle; $c = new $class; $runData = $c->run(); if (sizeof($runData) > 0) $data[$sidebarHandle]['data'] = $runData; else if (empty($loadList[$i]['hideEmpty'])) { $data[$sidebarHandle]['data'] = null; } } else { $data[$sidebarHandle]['data'] = null; } } return $data; } }
A module class looks like this:
class App_Sidebar_Modules_FavsList { public function run() { // Call model normally, but I'll just show a sample resulting array $fav[] = array( 'id'=>1 , 'name'=> 'Blade Runner' ); $fav[] = array( 'id'=>2 , 'name'=> 'Alien' ); return $fav; } }
For this module, the return value is an empty array on purpose
/* * To test loader option hideEmpty */ class App_Sidebar_Modules_SomeAlert { public function run() { return array(); } }
Finally the view helper partial template is called in the layout like this:
Location: layout / script / layout.phtml
if($this->sidebar) { foreach($this->sidebar as $key => $data){ echo $this->partial( ('sidebar/'.$key.'.phtml'), $data); } }
That's all of it, uploaded a working ZF project to Github here (apologies, its in the Branches link on that page). If you have any comments or criticism, please drop a comment. And thanks for visiting!
1 comment:
Works like a charm Edward, ;-)
Post a Comment