I try to develop my own little framework. For this, I\'d like to read up some templating techniques. I know that templating is a really complex topic, but knowing some strat
My strategy is as follows:
Effectively I am creating 'blocks', very similar to what Drupal does - if you are familiar with it.
$this->load->library('tpanel');
$s=$this->tpanel->get('date',$data);
$s.=$this->tpanel->get('navigation_menu',$data);
$s.=$this->tpanel->get('ajax_menu',$data);
$s.=$this->tpanel->get('spacer',$data);
$data['title']='List of Databases';
$post=$this->uri->segment(5);
$blog=(file_get_contents('../'.$dir.'/'.$post.'.dat'));
$s.=markdown($blog);
$data['content']=$s;
$view='/admin/admin_simple_view';
The system is much more flexible that what I have shown above. For example the tpanel->get('ajax_menu, $data)
also handles the script settings using jQuery.
I have been also looking at Django lately and they have some very good ideas on templating. It might be worth getting a look, even if you are not a Python programmer, especially how they handle inheritance.
This is not directly related to your question, but have you considered client side templating? John Resig has a nice micro-template in Javascript that will work with web services and other Ajax techniques. It's quite simple to do a get or post for the template, and then do another get/post for your data. It's quite handy.
This is exactly how I do it, instead of calling a Controller in the View (WHAT?!?) I just compute all the necessary data for the view in the Controller that calls the View in the first place.
A View should never call a Controller / Model! BUT, if you must you can do something like this:
function Controller($pathToControler) // instantiates and returns the Controller
function Model($pathToModel) // instantiates and returns the Model
That way, inside your view you can do something like this:
$this->Controller('path/to/blog/tags.php')->List();
Again, you shouldn't use this pattern, I'm just giving you solutions, not encouraging them.
Similarly, you can also call another view from within a view, like this:
$this->View('path/to/views/header.php', array('title' => 'Hello World!'));
I really enjoyed zend-framework approach to this, and have used it myself in our framework. You will have a view class with will have things like:
$view = new View();
$view->setTemplatesPath('.....');
$view->assign('name','value');
$view->render('index');
the render method will take all the variables stored and make them properties and include the template based on the Path set, so in your templates you will have:
<?php echo $this->foo; ?>
....
<?php echo $this->load('header'); // this includes another template ?>
Have a look at the section Web Presentation Patterns, especially Template View, Transform View, Two-Step View. For stuff like rendering breadcrumbs or pagination, you can utilize a View Helper pattern.