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");
Thanks for sharing the code.
When I loads the page for the first time it takes data from table & display also create a cache file and the second time when i refresh the page also it goes fine and picks the cache file & display it.
But when I do change in the table where original template stores and then I refresh the page it doesn’t takes the updated data & display the old cache data.
May be you are not getting this type of problem, if yes then plz let me how you did it !
Jimmy
See no 4. above. You need to touch the scratch/index.tpl file to update the cache. Do that whenever the db changes and it’ll be fine.
Yeah, I did as you said & it works.
But can please tell me as your saying as soon as I update the database I also again created scratch/index.tpl file (empty file) and Smarty update the cache with with updated data of table. But How this happens ?
After creating scratch/index.tpl file (empty file) how Smarty comes to know that it should call the function db_get_template($tpl_name, &$tpl_source, &$smarty_obj) because database has updated ?
I request you while giving answer to above Question please also answer this:
If Smarty updates the cache file as soon as we create scratch/index.tpl file (empty file) when the database updated then I think there is no use of below IF Construct because the program also runs fine after commenting the below IF construct. Except this it displays message: regenerating cache
Also if according to the default $cache_lifetime value(3600 or 1 hr) the cache expires then below code runs but except generating cache with displaying ‘regenerating cache’ & date it doesn’t update the cache with latest database info.
Am I right ?
if( $smarty->is_cached(‘db:index.tpl’) == false )
{
print ‘regenerating cache!’;
$smarty->assign( ‘myDate’, time() );
}
I’ll greatful to you !
now i want to delete all cache file from template_c directory ,what will be happen?