[development] theme_foo() functions vs tpl.php templates (was Move all core modules into their own directories)

Adrian Rossouw adrian at bryght.com
Thu May 4 13:27:23 UTC 2006

On 04 May 2006, at 3:10 PM, Jonathan Chaffer wrote:
> Your module:
>   function theme_foo($bar) {
>       $variables = array(
>         'bar' => $bar,
>       );
>       return _phptemplate_callback('foo', $variables);
>   }
Actually :  The 'phptemplate' part of it is not necessarily true.

With META INFORMATION the theme engine doesn't have to have a  
_templates() hook,
which means it can just tell system_listing what extension to search  
for to find templates. (ie: *.tpl.php, or *.tal).
This was one of the first places I wanted to introduce meta- 
information but later removed it at Dries' request.

Every single contrib theme engine (except perhaps xtemplate) is a  
copy paste job from phptemplate, re-implementing perhaps
a max of 2 functions.

Originally I had 3 namespaces.

1 : theme_ : what drupal ships with.
2 : engine_ : ie what phptemplate_node and phptemplate_page should  
have been (engine_node, engine_page)
3 : template_ : instead of having $themename_ functions, all of them  
were centralised under template_

This all works, because in my design you should never have multiple  
theme engines, or multiple themes loaded at the same time.

I built the theme engine system initially to have this level of  
abstraction in core, but when it wasn't accepted, i moved it
into phptemplate.

'phptemplate' it self is just this code :

function _phptemplate_render($file, $variables) {
   extract($variables, EXTR_SKIP);  // Extract the variables to a  
local namespace
   ob_start();                      // Start output buffering
   include "./$file";               // Include the file
   $contents = ob_get_contents();   // Get the contents of the buffer
   ob_end_clean();                  // End buffering and discard
   return $contents;                // Return the contents

The useful part of phptemplate is the variable collection and  
filtering semantics.

If all the rest of phptemplate is moved into core as engine_  
functions, and we nothing else.
most other template engines can be implemented by just creating  
_phptal_render($file, $variables)
or whatever.

Adrian Rossouw
Drupal developer and Bryght Guy
http://drupal.org | http://bryght.com

More information about the development mailing list