What are your templating strategies? [closed]
Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
开发者_如何学编程Closed last year.
Improve this questionI 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 strategies could help find the right one.
Please, if you mention one, don't just write "smarty" for example. Write a little about the concept behind it.
Let me start with an idea: To make things simple, my template files are just PHP files that contain HTML. Templates may include other templates. The data is inserted into the templates through a $data variable, which is an associative array containing all the data for the template.
So, at the first stage a controller performs some action and builds up that $data array. Next, the appropriate template will be included.
Problems: A Template might have to include not only templates, but also controllers. i.e. displaying a breadcrumb or menu (with fairly complex logic behind, far too complex to be handled in a 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.
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 ?>
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!'));
My strategy is as follows:
- Try and use the minimum of PHP in the template and if possible down to none.
- I have created classes for various components commonly found in web pages, one of them is tpanel which I am using to demonstrate the concept below
- tpanel for example would handle all the logic to create a menu, parses a small template for 'navigation_menu' and sends the result for final inclusion to overall template.
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.
精彩评论