View previous topic :: View next topic |
Author |
Message |
hinrichs Smarty Rookie
Joined: 24 Apr 2003 Posts: 28 Location: San Francisco, CA
|
Posted: Thu Apr 24, 2003 12:19 am Post subject: Isolate Caching in included files |
|
|
Is Smarty able to allow me to control caching of a section of a template (or an included template) within another template?
For example, most of our page should be cached, as it changes very little. However the top header navigation has login/logout info or "hi (name)" depending on whether the user is logged in or out. It is a relatively small part of the page.
Obviously we could design it so that the php file calling the template constructs several smarties, all with different caching, but this would complicate our code, as the page composition should reside in the template and not in the php. It would be great if there were a '{nocache}' tag, or perhaps if I could include a file with a modifier like: {include file="nav/Nav_Top.tpl" cache="no"}
maybe this belongs in the new features section?? |
|
Back to top |
|
hinrichs Smarty Rookie
Joined: 24 Apr 2003 Posts: 28 Location: San Francisco, CA
|
Posted: Thu Apr 24, 2003 12:26 am Post subject: insert |
|
|
I just saw the insert function--it was a bit misleading because of the name but now it seems that is what I was looking for.
However the documentation is confounding. It tantalizes me by saying it works like an include. However it seems to work nothing at all like an include and there are no examples of this. Does anyone have one? |
|
Back to top |
|
hinrichs Smarty Rookie
Joined: 24 Apr 2003 Posts: 28 Location: San Francisco, CA
|
Posted: Thu Apr 24, 2003 4:41 pm Post subject: Solution found (?) |
|
|
Smarty, as always, came through with a solution that is exremely elegant. But If anyone is out there who can confirm this I would appreciate it.
I put this function in my smarty.inc that is included in every page to create the customized smarty class for the site:
function insert_noCacheTpl($params, &$smarty){
$smarty->caching=false;
return($smarty->fetch($params['tpl']));
$smarty->caching=$CACHING;
}
note: the $CACHING is a constant inherited from the top-level include that allows us to globally turn all caching off, for instance on development servers. Of course it would need to store the value true. Perhaps this last line is not needed, I'm not sure.
I then put this in my "top nav" template:
{insert name="noCacheTpl" tpl="nav/SessionLinks.tpl"}
Then I created a template for the user-specific links that should not be cached.
This solution appears to be working. Does anyone see a problem with it, or a way to simplify it further?
thanks |
|
Back to top |
|
mohrt Administrator
Joined: 16 Apr 2003 Posts: 7368 Location: Lincoln Nebraska, USA
|
Posted: Thu Apr 24, 2003 4:46 pm Post subject: |
|
|
I don't think you'll never reach the line:
$smarty->caching=$CACHING;
since there is a return statement just before it.
Monte |
|
Back to top |
|
hinrichs Smarty Rookie
Joined: 24 Apr 2003 Posts: 28 Location: San Francisco, CA
|
Posted: Thu Apr 24, 2003 5:01 pm Post subject: |
|
|
duh! of course, I should have seen that. I was too excited about it. Nonetheless it appears that the original true cache value reverts when processing returns to the original template, since I still see a performance gain in the part of the page after this call. There is some extremely complex database querying and munging of results going on that slows the page down when caching is off. |
|
Back to top |
|
Wom.bat Smarty Pro
Joined: 24 Apr 2003 Posts: 107 Location: Munich, Germany
|
Posted: Thu Apr 24, 2003 6:50 pm Post subject: |
|
|
Well... I guess it's generally not a good idea to do this approach. {insert}s are _very_ slow. I had to deal with this issue quite often now and came to the conclusion that the best approach is to use a template that is not cached in which you include other files using include_php. there you can define wheter or not to cache a template. Of course you should keep any time-consuming things out of this index.tpl and move them to seperate, sub-included templates. I know well that this approach doesn't solve the problem of wanting non-cached templates within cached ones, but... well... I'm looking forward to this {nocache}-thing (if it's ever going to come), which will give us a great method of doing exactly what hinrichs wants to do... |
|
Back to top |
|
hinrichs Smarty Rookie
Joined: 24 Apr 2003 Posts: 28 Location: San Francisco, CA
|
Posted: Thu Apr 24, 2003 8:58 pm Post subject: |
|
|
Thanks for the advice! I am a little confused about your comment "there you can define whether or not to cache a template". Does this mean that it is possible to individually control caching of a page's included tpls somehow? Or are you just referring to the control of the top level tpl?
Really, the bottom line for us is that there is one sub-component of the page that is extremely slow. If the "top" level is not cached, that would be fine, if we could cache the slow sub-part. |
|
Back to top |
|
Wom.bat Smarty Pro
Joined: 24 Apr 2003 Posts: 107 Location: Munich, Germany
|
Posted: Fri Apr 25, 2003 12:39 am Post subject: |
|
|
i'll give an example:
index.php: Code: | <?php
// ...
$smarty->caching = false;
$smarty->display("index.tpl");
// ...
?> |
index.tpl: Code: | ....
{include_php file="foo.php"}
...
{include_php file="bar.php"} |
foo.php: Code: | <?php
// ...
$smarty->caching = true;
$smarty->display("foo.tpl");
$smarty->caching = false;
//...
?> |
bar.php Code: | <?php
// ...
$smarty->caching = false;
$smarty->display("bar.tpl");
// ...
?> |
|
|
Back to top |
|
hinrichs Smarty Rookie
Joined: 24 Apr 2003 Posts: 28 Location: San Francisco, CA
|
Posted: Fri Apr 25, 2003 4:14 pm Post subject: Thanks! |
|
|
Wow, thanks for your detailed response. I was afraid about turning caching on and off within the same smarty object.
Perhaps this method should be explained in the documentation under the caching section.
My curiosity is piqued, though--why would the insert be so much slower than the method described above? One advantage to using the insert I as I described is that it would eliminate the need for an extra php file that doesn't do much except turn off caching. Or, could one accomplish it by simply inserting php tags into the template that is not cached? Or doing a php_include within your template, of some php code that does not render a template itself, but just turns off caching in the middle of the template? This would also eliminate the need for the additional template file that stores the uncached info. I guess I could experiment here. |
|
Back to top |
|
messju Administrator
Joined: 16 Apr 2003 Posts: 3336 Location: Oldenburg, Germany
|
Posted: Fri Apr 25, 2003 11:09 pm Post subject: |
|
|
i think a compiler-plugin that emits the code for
Code: |
$this->caching = true;
$this->display('cached.tpl');
$this->caching = false;"
|
into the template would also be handy. it saves the additional file-access of {include_php} and keeps the php out of the template in contrast to {php}...{/php}.
just a thought. |
|
Back to top |
|
|