Re: [SMARTY] Smarty book published & available

[email protected] (DC) Tue, 02 May 2006 14:02:35 -0400
Newsgroups php.smarty.general
Message-ID <[email protected]>
Here's a few tips from my learning curve with caching:

http://smarty.incutio.com/?page=CacheAndCompile

and a thread from 18 months ago that talks to what messju mentioned 
about creating your own caching logic:

--------------------------------------------------
 >
 >>>> i have a typical website serving left menu block, top block, 
center block...
 >>>> etc.
 >>>>
 >>>> i currently use smarty include tags to pull in these other blocks 
to a main
 >>>> index template.
 >>>>
 >>>> i have just realized that the data output from include tags is 
cached along
 >>>> with the index page's cache - there seems to be no way to keep the 
include
 >>>> tags dynamic. i want to be able to have each block be independent -
 >>>> specifically the center block should be able to have new data 
while the left
 >>>> menu block still build from cache.
 >>>>
 >>>> what is the best approach to this problem?
 >
 >>
 >> Do you need to be caching at all? If not, turn off caching, and you
 >> should should be okay.


yes, i need caching to help deal with some database speed issues. that is
the primary reason i use smarty. that, and the way it helps me keep HTML out
of my PHP code.


 >> Alternatively...
 >>
 >> I would create a page template that has placeholder variables for the
 >> various content blocks, and then templates for each type of content
 >> block. Then, in your script, grab content, pass it to the appropriate
 >> content block's template, and use the fetch() method to grab the
 >> compiled template contents into a variable. Then pass these variables to
 >> the main page template.


so i should use fetch() and pass the returned text to a template variable
placed directly in the index template? if i get you right, fetch() in my PHP
code can take the place of an include tag AND i get cache control over it?
cool. i'll give it a try.

i assume that in this technique, i can no longer cache the index template's
output, but should feed it out 'raw' each request. am i correct in that
assumption? if i left the index template caching in place smarty would just
use the final rendered output text from the display() call and ignore the
fresh/uncached text fetched into template variables. should i turn off
caching just before calling display() as you do in the code below?


 >> Using this system, you could turn caching on and off within your script
 >> based on the content type.
 >>
 >> As an example, if $content_blocks contains an array of various content
 >> block objects, then:
 >>
 >>   foreach ($content_blocks as $block) {
 >>       // $block->cache indicates whether or not to cache the block
 >>       if ($block->cache) {
 >>           $smarty->caching = 1;
 >>       } else {
 >>           $smarty->caching = 0;
 >>       }
 >>
 >>       // do some processing, assign some variables...
 >>
 >>       // $block->template_file is the name of the block's template
 >>       // file
 >>       $block_content = $smarty->fetch($block->template_file);
 >>
 >>       // $block->template_var is the name of the Smarty variable into
 >>       // which the blocks content will be placed in the main page
 >>       // template
 >>       $smarty_page->assign($block->template_var, $block_content);
 >>   }
 >>
 >>   // Process the main page's content...
 >>
 >>   // Now display the main page
 >>   $smarty->display('page_template.tpl');


Oh this looks super! I like the idea of organizing my blocks into objects!
Thanks for the tip.
-----------------------------------------------------------

I hope that that helps! It took a long time for me to fully understand 
the caching system in Smarty - take your time.

Oh yeah, and don't forget $smarty->caching=2; to get non-expiring caches 
which is the only way to properly control them. The default is to expire 
in 1 hour!

<minorrant>I don't really understand why the default is to expire 
caches, but that's the way it is. To me, expiring caches is a 
specialized use of caching that should be the result of a request, not 
the default. If you turn on caching, it should just turn on and stay on 
- not turn off in an hour. But, then again, I'm not the one who built 
smarty and it is easy enough to change it. But, it sure stumped me for a 
few days until i read the fine print in the manual.</minorrant>

dan

messju mohr had written:
> On Tue, May 02, 2006 at 05:17:11PM +0200, Jochem Maas wrote:
> [...]
> 
>>hopefully you see that it's not your docs at fault so much as I have got a
>>rather complex codebase and I'm finding it:
>>
>>a, hard to fully understand the compiling/caching paradigm in smarty per se
>>
>>and
>>
>>b, harder still to take the examples in the docs and extrapolate the 
>>concepts
>>into a design for flexible,generic production quality caching mechanism 
>>which
>>i can actually implement (and would work: in terms of the clients' 
>>requirements
>>for dynamic content - i.e. that 'truely' dynamic stuff doesn't get cached, 
>>etc).
> 
> 
> my experience with smarty's caching is, that it's
> 
> a, works best if the whole system is built with caching in mind, and
> built around smarty's caching mechanisms.
> 
> and that you can
> 
> b, use any caching with smarty that you like: just leave smarty's
> caching off, and fetch the cached contents with your cache logic and
> assign them to template variables which are displayed templates.
>  
> 
>>regards,
>>Jochem.
> 
>