[prev in list] [next in list] [prev in thread] [next in thread] 

List:       smarty-general
Subject:    [smarty] Re:Re: Please help on caching [example]
From:       "Brian E. Lozier" <brian () massassi ! net>
Date:       2001-12-28 23:39:43
[Download RAW message or body]

Example:
http://www.massassi.org/saberworks/

If it says 'not cached' at the top, it's telling you that it's not fetching the \
cached content for  ('index.tpl', $REQUEST_URI).  Now, everything should be cached, \
because I clicked on it all and it's saving  for a day. (everything being the two \
scripts I've converted, the index.php and the viewcomments.php).  So  now, if you \
don't see 'not cached' you are getting a cached file.  Then go view a comments.  That \
should have  been cached as well (I've clicked all of them just now).  Now click back \
to the main.  OOOPS! it's not cached  again for some reason.

You can see all the templates in /saberworks/templates/ ('main.tpl', 'index.tpl', and \
'viewcomments.tpl' are  what we're dealing with now).

You can see the source of both here:
http://www.massassi.org/saberworks/source.php

The problem now is that when I finally use all those cheap hacks to get the caching \
working semi-correctly,  the thing is regenerating cache files after I access \
separate pages that use the same 'main.tpl' which makes  no sense to me.

----- Original Message -----
From: Brian E. Lozier <brian@massassi.net>
To: smarty@lists.ispi.net
Date: 12/28/01 3:21:36 PM

> 
> So you're saying to define inside the main.tpl which template I'm supposed to \
> include based on a variable I  pass in?  Isn't this putting too much testing inside \
> the template considering I have dozens of pages and  countless combinations of IDs \
> I'm passing in to generate content? 
> For example, I have a news article.  Any user can post comments on that article.  \
> So you pass in the  articleID and the viewcomments.php page does a bunch of \
> database calls and returns the array which I assign  to a section.  Well the \
> cache_id works as $REQUEST_URI *IF* I have a separate template defining each page.  \
>  Such as viewcomments.tpl and addcomment.tpl.  But since my design all resides in \
> main.tpl, the cached 
content 
> that is returned is *always* the first page that gets accessed directly after the \
> cache period is expired.   So if they access 'addcomment.php' first, then every \
> subsequent page, be it viewcomment.php or index.php is  returned as \
> 'addcomment.php' which makes the whole system not work.  Everything works perfectly \
> when caching  is set to false.
> 
> I have tried all the hacks suggested so far in the list, but nothing seems to work. \
> The whole system is  getting confused for some reason.  When I set caching to false \
> then display the 'main.tpl', it seems to  generate the correct content.  But there \
> is a huge problem.  Every time I reload, it looks fine, it's  generating from \
> cache.  But then I access a separate page, set up the same way, that still uses \
> main.tpl, 
and 
> that page looks fine. But it generates it dynamically.  So then I go back to the \
> original page, and it had  deleted the cached copy, or expired it somehow, because \
> every time I leave the page, then come back, it  regenerates the cache - even \
> though it's still within the time limit (a day) and no template or php page has  \
> changed.  Plus, all the options to not check and all that are turned correctly, and \
> remember, it is 
returning 
> cached content if I reload over and over... just not if I visit a separate page and \
> then come back. 
> I guess I don't see why this is such a hard problem to solve.  Haven't other people \
> used smarty for coding  applications that require user logins and whatnot?  Haven't \
> they used it to cache content that changed  depending on whether you're logged in?  \
> Hasn't this system been used in an environment larger than the  examples in the \
> documentation? 
> It just seems like it would be MUCH easier if the thing had an option to just get \
> cached content... 
> if($tpl->is_cached('index.tpl', $REQUEST_URI)) {
> $tpl->assign('Content', $tpl->fetch_cached('index.tpl', $REQUEST_URI));
> }
> else {
> // do all my calls and assigns, then:
> $tpl->assign('Content', $tpl->fetch('index.tpl', $REQUEST_URI));
> }
> 
> The problem is that the cache variable is 'global' in that it doesn't respond \
> properly when you have mixed  cached and non-cached content :(  When I turn it back \
> off to display, it drops all the output.  It also 
seems 
> to re-generate the cache each time you access a separate page that uses the same \
> template for some reason, a  behaviour that I just can't figure out for the life of \
> me. 
> It's getting to the point that I'm spending so much time trying to figure out how \
> to do it in smarty, that I  could just have written a template/caching system that \
> works correctly in my case.  I'm getting so  frustrated, I can't even get an answer \
> on how the cache is handled.  You say 'per page' but that makes no  sense because \
> smarty has no idea what page I'm calling it from!  So in that case, it must be \
> per-template,  which breaks my whole system because I use the same single template \
> throughout the site.  Which is the root  of all the problems, apparently.  It just \
> doesn't make sense to have to split your page design into two 
files 
> (header, footer) in a templated system.
> 
> And all my questions about why it's storing two copies of the cache, which one it \
> actually uses, how to tell  smarty to only cache specific content, etc., just go \
> unanswered or replied to with smug, "go look at the  compile some time."  I already \
> did, it helps nothing.  It doesn't show me how the actual content is 
inserted, 
> it only shows the template itself with the {if} replaced with if().
> 
> Brian
> ------------------------------------
> "How should I know if it works? That's what beta testers are for. I only coded it." \
> - Linus Torvalds 
> ----- Original Message -----
> From: Monte Ohrt <monte@ispi.net>
> To: smarty@lists.ispi.net
> Date: 12/28/01 3:17:12 PM
> 
> > 
> > Maybe there is a better way to approach your problem.
> > 
> > If I understand correctly, you should be able to do something like this:
> > 
> > // $page is our identifier for our content
> > 
> > $smarty->assign("page",$page);
> > 
> > // possibly use $page or $REQUEST_URI for the cache_id, depeding on if
> > you need separate caches per $page or not
> > $smarty->display('main.tpl',$REQUEST_URI);
> > 
> > 
> > main.tpl
> > ---------
> > 
> > <html>
> > <body>
> > 	{if $page eq "article"}
> > 		{include file="article.tpl"}
> > 	{elseif $page eq "category"}
> > 		{include file="category.tpl"}
> > 	{else}
> > 		{include file="default.tpl"}
> > 	{/if}
> > </body>
> > </html>
> > 
> > 
> > This way, the page fetching happens all in one go, under one cache file
> > (for each cache_id).
> > 
> > Does this help at all?
> > 
> > Monte
> > 
> > "Brian E. Lozier" wrote:
> > > 
> > > > If you don't want a particular template cached, then you can turn off
> > > > caching before displaying it.
> > > > 
> > > > $smarty->caching = false;
> > > > $smarty->display('login.tpl');
> > > 
> > > See, this is why I don't think you guys are understanding my problem.  *ALL* my \
> > > $tpl->display() calls 
look
> > > like:
> > > 
> > > $tpl->display('main.tpl');
> > > 
> > > At the end of EVERY page in my application.  Because 'main.tpl' contains my \
> > > entire design. 
> > > [html][body]
> > > {Content}
> > > [/body][/html]
> > > 
> > > Then I populate {Content} with a $tpl->fetch() command, such as:
> > > 
> > > $tpl->assign('Content', $tpl->fetch('userregister.tpl'));
> > > 
> > > The problem is that it's always trying to cache main.tpl exactly the same no \
> > > matter what.  If I pass a $REQUEST_URI, it still does the same thing.  If I \
> > > pass a $REQUEST_URI to the ->fetch(), it caches my 
> content
> > > correctly, but there's no way to tell ->display('main.tpl') to use *that* \
> > > cached content.  See, since I 
> never
> > > call $tpl->display('userregister.tpl'), there's no way to 'turn off caching' \
> > > before I do that, because 
> that
> > > step never takes place.
> > > 
> > > And I tried turning off (and turning on) caching just before the fetch, but it \
> > > still doesn't work.  It returns nothing at that point.
> > > 
> > > > No, you shouldn't have to do this. You just need to use the caching
> > > > appropriately for your application. Are you using Zend Cache or APC with
> > > > your application? Even without using Smarty's built-in caching, it
> > > > should still be quite fast, and most likely faster than other templating
> > > > solutions because there is no template parsing needed, it just executes
> > > > PHP scripts. The only noticable overhead would be the compilation of the
> > > > PHP scripts themselves, which is where APC or Zend Cache will make a
> > > > _huge_ difference in performance, and Smarty can take advantage of that
> > > > because all the templates _are_ PHP scripts. If your page loading times
> > > > are slow because of database calls, then the problem does not lie in
> > > > your templating solution.
> > > 
> > > I'm not using any of those.  Smarty is taking half a second 0.576877 or \
> > > whatever, and the rest are taking 0.08587575 or something.  When I turn on \
> > > caching, smarty is returning the page in comparable amounts of 
> time.
> > > 
> > > > > There needs to be some way to tell smarty to get the cached content for \
> > > > > certain templates within a 
page
> > > but
> > > > > not others.
> > > > 
> > > > Caching happens at a "page" level. If you want certain components of
> > > > your page dynamic, use the {insert} function to create that content.
> > > > That is exactly what it is intended for.
> > > 
> > > This is the very root of the problem.  Since Smarty thinks *all* my pages are \
> > > 'main.tpl' it can't 
> correctly
> > > cache the parts I want.  I can't use insert, because I populate the {$Content} \
> > > portion of my main.tpl depending on what page they're accessing.  And the \
> > > {$Content} is what I want cached, not the main.tpl. main.tpl doesn't require \
> > > any database calls, just some basic logic such as {if $Logged} {/if}, etc.  But \
> > > since that gets cached, I have to have a way not to cache main.tpl. 
> > > > You can obtain all of this by making non-cached components of your page
> > > > with the {insert} tag. that is exactly how we handle feedback, polls,
> > > > banners, or any other content that needs to remain dynamic on the page.
> > > 
> > > That doesn't make much sense, because then you're placing logic inside the \
> > > design templates.  You're 
> forcing
> > > me, ahead of time, to write a function (of which I have *2* in my entire \
> > > project, the rest of all my functionality is in objects and methods) that \
> > > corrosponds with whatever content isn't cached.  So this 
> means
> > > I have to write a PHP function to do some very simple HTML display/presentation \
> > > stuff like outputting a simple form.  Also, since everything is in main.tpl, I \
> > > can't just pick some specific point and add an {insert} tag.
> > > 
> > > Take for instance my 'right hand sidebar' - this is where I would put the poll, \
> > > or the featured articles list, or whatever I want.  But my application can \
> > > replace the 'standard' sidebar with virtually any 
> content
> > > it wants (for instance, in the admin section, the admin options are there... in \
> > > the files section, thumbnailed screenshots appear there).  There is no way to \
> > > make one canned {insert} function that can 
> handle
> > > all of these options.  And if the content isn't dynamic for that page, IE: if \
> > > it uses the stock one, it should be able to cache it.
> > > 
> > > I think the reason this is so hard to explain is because nobody else (except \
> > > that one guy) has ever use 
> the
> > > templates like this.  You guys are using two {include} statements, one at the \
> > > top and one at the bottom, 
> to
> > > hold your design.  From the beginning, this was what I wanted to get away from, \
> > > because it forces me to 
> make
> > > an artificial split (or 5 or 6 depending on the complexity of the design) in my \
> > > design.  It confuses the designers to have to view their page in multiple files \
> > > split up in the middle of xx number of nested 
> tables.
> > > 
> > > I've tried what seems like a dozen different ways of explaining this, but most \
> > > people aren't 
understanding
> > > for some reason.  I don't know what else to say... Thanks again for all the \
> > > help, though. 
> > > > > 
> > > > > ----- Original Message -----
> > > > > From: Peter Bowyer <reywob@f2s.com>
> > > > > To: smarty@lists.ispi.net
> > > > > Date: 12/27/01 3:34:09 AM
> > > > > 
> > > > > > 
> > > > > > At 04:06 PM 12/26/01 -0800, you wrote:
> > > > > > > I have queried this list quite a few times but nothing is helping.  I
> > > > > > > upgraded to the latest version.  I have
> > > > > > > tried all suggestions.  Is this a bug in Smarty?  Does anyone else have
> > > > > > > this "dynamic" content caching
> > > > > > > correctly using the cache_id?  Because Smarty is just ignoring my \
> > > > > > > cache_id I pass, no matter what it is.
> > > > > > > Please, I really need to get this working, it's important.
> > > > > > 
> > > > > > I have it working with Smarty 1.4.5 - see it in action at
> > > > > > <http://casualties.commemoratewtc.com> where each page is cached for 3 \
> > > > > > days. 
> > > > > > > Here is my 'main.tpl' which is the main layout of the site (note I
> > > > > > > replaced > and < with ] and [ because my
> > > > > > > email program strips the HTML for some reason):
> > > > > > > 
> > > > > > > main.tpl:
> > > > > > > [html]
> > > > > > > [head][title]{$PageTitle}[/title][/head]
> > > > > > > [body]
> > > > > > > {$Content}
> > > > > > > [/body]
> > > > > > > [/html]
> > > > > > 
> > > > > > Great - another coder who hates header/footer files and prefers the \
> > > > > > design to be in one file!  That now makes two of us for whom the "normal" \
> > > > > > smarty method doesn't suit :-)
> > > > > > 
> > > > > > > I have tried passing both $REQUEST_URI (which *is* passing correctly, I
> > > > > > > verified!) and $catID (since it's
> > > > > > > unique for each of the cache results I'm looking for) to main.tpl like:
> > > > > > > $tpl->display('main.tpl', $REQUEST_URI); // and:
> > > > > > > $tpl->display('main.tpl', $catID);
> > > > > > > 
> > > > > > > I've also tried passing it to the $tpl->fetch() where I get the actual
> > > > > > > files.tpl template like:
> > > > > > > $tpl->assign("Content", $tpl->fetch('files.tpl', $REQUEST_URI));
> > > > > > 
> > > > > > This is the right one. After this, just call $tpl->display('main.tpl'); \
> > > > > > and it should work.  You could always try $tpl->display('main.tpl',
> > > > > > $REQUEST_URI); as well.
> > > > > > 
> > > > > > Did you clear the cache and the compiled templates before you tried this?
> > > > > > 
> > > > > > Sorry I can't be more help.
> > > > > > Peter.
> > > > > > 
> > > > > > --
> > > > > > Maple Design - http://www.mapledesign.co.uk
> > > > > > 
> > > > > > 
> > > > > > ---
> > > > > > You are currently subscribed to smarty as: brian@massassi.net
> > > > > > To unsubscribe send a blank email to leave-smarty-700385W@lists.ispi.net
> > > > > > Visit Smarty's homepage at http://www.phpinsider.com/php/code/Smarty/
> > > > > 
> > > > > ---
> > > > > You are currently subscribed to smarty as: monte@ispi.net
> > > > > To unsubscribe send a blank email to leave-smarty-700385W@lists.ispi.net
> > > > > Visit Smarty's homepage at http://www.phpinsider.com/php/code/Smarty/
> > > > 
> > > > --
> > > > Monte Ohrt <monte@ispi.net>
> > > > http://www.ispi.net/
> > > > 
> > > > ---
> > > > You are currently subscribed to smarty as: brian@massassi.net
> > > > To unsubscribe send a blank email to leave-smarty-700385W@lists.ispi.net
> > > > Visit Smarty's homepage at http://www.phpinsider.com/php/code/Smarty/
> > 
> > --
> > Monte Ohrt <monte@ispi.net>
> > http://www.ispi.net/
> > 
> > ---
> > You are currently subscribed to smarty as: brian@massassi.net
> > To unsubscribe send a blank email to leave-smarty-700385W@lists.ispi.net
> > Visit Smarty's homepage at http://www.phpinsider.com/php/code/Smarty/
> 
> 
> ---
> You are currently subscribed to smarty as: brian@massassi.net
> To unsubscribe send a blank email to leave-smarty-700385W@lists.ispi.net
> Visit Smarty's homepage at http://www.phpinsider.com/php/code/Smarty/


---
You are currently subscribed to smarty as: smarty@progressive-comp.com
To unsubscribe send a blank email to leave-smarty-700385W@lists.ispi.net
Visit Smarty's homepage at http://www.phpinsider.com/php/code/Smarty/


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic