Re: [SMARTY] Seperation of Logic and Presentation

Monte Ohrt <[email protected]>
Newsgroups gmane.comp.php.smarty.general
Message-ID <[email protected]>
OK while we're sharing, here is my setup (or rather some of its basics)

We have an environment with multiple sites (clients) that can have 
multiple "themes", or look-and-feel to their site that they can swap 
with the change of one variable. Then there are "modules" such as news, 
calendar, classifieds, etc. The top-level client/site directory 
structure is as follows (these are not under doc root!):

/templates/
    /theme1/
       init.tpl
       header.tpl
       footer.tpl
       layout.tpl
       /mod1/
             location_top.tpl
             location_left.tpl
             location_main_content.tpl
/images/
    /theme1/
       masthead.gif
       /mod1/
          module.gif
/css/
       /theme/
             /mod1/
/configs/
       /theme/
             lang_en.conf
             lang_de.conf
             /mod1/


templates, images, css and config files are broken down to global, 
theme-specific and module-specific directories. We keep 
language-specific config files under each theme.

I have one "controller" PHP script that acts as the controller (see the 
guestbook example app for complete example)

This script will do something like this (crude example):

index.php:

$smarty = new Smarty;

// set from config file
$smarty->theme = 'bluestuff';

// set by running module
$smarty->mod = 'calendar';

// do some stuff to figure out what page we are displaying
// do whatever necessary tpl var assignments here

$smarty->assign('page','main_menu');
$smarty->display("init.tpl");


The init.tpl acts as the template controller, it basically loads the 
global init.conf then loads the theme-specific init.tpl:

init.tpl:

{config_load file="init.conf"}
{include file="$theme/init.tpl"}

$theme/init.tpl then loads theme-specific stuff, then decides if we're 
loading the main layout or something else:

{config_load file="$theme/init.conf"}
{config_load file="$theme/lang_$lang.conf}
{if $page eq "showimage"}
   {include file="$theme/showimage.tpl"}
{elseif $page eq "printable"}
   {include file="$theme/printable.tpl"}
{else}
   {include file="$theme/layout.tpl"}
{/if}

The $theme is set in the constructor for the current "theme". There is 
an init.conf that contains global config vars, and also an init.conf for 
each theme for theme-specific settings. layout.tpl contains the 
framework for each page, it minimally contains location cells that can 
be controlled per module. Notice that the layout can be skipped, such as 
an "image-only" or "printable" page. Here is a watered-down example of a 
layout.tpl:

layout.tpl:

{include file="$theme/header.tpl"}
<table>
<tr>
    <td colspan="2">{include file="$theme/$mod/location_top.tpl"}</td>
</tr>
<tr>
    <td>{include file="$theme/$mod/location_left.tpl"}</td>
    <td>{include file="$theme/$mod/location_main_content.tpl"}</td>
</tr>
</table>
{include file="$theme/location_footer.tpl"}

That is a very crude example, but basically you put your HTML/CSS here 
to make the theme look how you want. Each module can control what shows 
up in the location templates. location tpls are useful for banners, 
module navigation, etc. The location_main_content.tpl is what shows up 
in the center of the page, it minimally includes module-specific content 
and templates for whatever page we are on, such as:

{include file="$theme/$mod/$page.tpl"}

Then you have a template for each module page in that directory.

That should be enough to put everyone to sleep :)

Monte

-- 
Smarty General Mailing List (http://smarty.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.