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.
>
>