The Smarty manual explains how to use Templates from other sources such as databases. It doesn’t however give an example of caching templates from these sources. I ran into a spot of trouble when I tried to be clever about checking the freshness of a db based template.
I didn’t want to interogate the db on every request just to check if a template is stale or not. Why have caching when you have to hit the db anyway? The db_get_timestamp() function has to be modified to check the freshness in some other way then.
I used a 0-byte file in a web-server writeable directory. Unfortunately it didn’t work. The is_cached() function would return false and I’d assign Smarty variables to prepare a new version of the web page, but when I called the display() function it displayed the last cached version!
It took me a while to figure out that both is_cached() and display() call the db_get_timestamp() function. As the file I used to flag a refresh was deleted on the first run I had to retain the timestamp somehow. That’s where the global $filetimestamp array comes in.
- is_cached() checks the freshness of the cache and returns false.
- I prepare the new Smarty variables.
- The page is displayed using the Smarty display() function
- Use
touch scratch/index.tpl
to update the template cache.
function db_get_timestamp($tpl_name, &$tpl_timestamp, &$smarty_obj)
{
global $filetimestamp;
if( is_file( 'scratch/' . $tpl_name ) == false )
{
if( $filetimestamp[ $tpl_name ] != '' )
{
$tpl_timestamp = $filetimestamp[ $tpl_name ];
}
else
{
$tpl_timestamp = mktime (0,0,0,date("m")-1,date("d"), date("Y"));
}
return true;
}
else
{
$tpl_timestamp = filemtime( 'scratch/' . $tpl_name );
$filetimestamp[ $tpl_name ] = $tpl_timestamp;
unlink( 'scratch/' . $tpl_name );
}
return true;
}
if( $smarty->is_cached( 'db:index.tpl' ) == false )
{
print "regenerating cache!<br>";
$smarty->assign( 'date', time() );
}
$smarty->display("db:index.tpl");