Re: [SMARTY-DEV] Two patches for Smarty post 2.3.1

From: Date: Wed, 20 Nov 2002 15:17:56 +0000
Subject: Re: [SMARTY-DEV] Two patches for Smarty post 2.3.1
References: 1  Groups: php.smarty.dev 
Request: Send a blank email to php-smarty-dev+get-339@lists.php.net to get a copy of this message
On Tue, 2002-11-19 at 17:38, Bharat Mediratta wrote: > I've been using Smarty for a few months on a project of mine and am > quite happy with it. However, I've had to patch it in two ways to > enable certain special functionality that I need. > > I don't know exactly what your patch procedure is, and I'm willing > to maintain these two patches separately if nobody else has a need > for them. But since I'm happy with Smarty and I'd like to help it > keep moving in a direction that I can use, I'm sending them in here. > > Comments, criticisms, alternative suggestions are welcome. > > -Bharat > > __________ > > First, the use_sub_dirs functionality does not work cleanly for me. > My code provides Smarty to add-on modules, each of which can have > its own templates directory. In order for the templates to be able > to {include} each other, each module must set the $smarty->templates_dir > appropriately before doing a fetch. This means that when I go to > fetch a template, it typically looks like this: > > $smarty->template_dir = dirname(__FILE__) . "/templates"; > $smarty->fetch("file.tpl"); > > so that it uses the templates/ directory for the current module. > The problem with this is that the $auto_source variable in > Smarty::_get_auto_filename() no longer has the complete path, which > means that with use_sub_dirs off, the compiled template for this file > will be: > > file.tpl > > instead of > > ^path^to^templates^file.tpl > > So if multiple modules have a "file.tpl" (entirely likely), then they > wind up sharing the same file. Yes, I could also require them to rewrite > their templates_c directory but there are logistical reasons why that > would be a bad idea. Furthermore, if we do use full paths then it's > possible the the paths that are created can be *very* long on systems > that have deep directory trees. The original intention was that each template_dir should be paired with a templates_c dir (and cache_dir), so when you execute a clear_all_cache or clear_compiled_tpl, you confine this per template_dir. I'm not sure how this change may affect some people's setup. Thoughts? On a side note, Smarty uses crc32() instead of md5() since it is about 10x faster and still unique. > > My fix for this is twofold. > 1. Relative template file names are now be prepended with the > template_dir so that they are fully qualified. > > 2. There is a new option ($smarty->short_template_c_names) that > will compress the directory down to a unique value, so: > > ^path^to^templates^file.tpl > > would become: > > f4fd7f7c0cb8e2bc^file.tpl > > This has been tested on Unix and Windows with 2.3.1 > __________ > > Second patch. Smarty lacks good support for registering class methods as > callbacks. You must register functions in the global namespace. However, > I want to minimize the number of functions I declare in the global > namespace, > so I opted to have a single callback method which delegates any calls from > Smarty to the appropriate class. Ie, I want to say: > > foreach (array('Url', 'Text', 'Date', 'Style') as > $method) { > $smarty->register_function('gallery' . $method, > 'galleryTemplateCallback'); > } > > This means that any calls to {galleryUrl} or {galleryText} will go to the > galleryTemplateCallback() function. It will delegate to the appropriate > listener (there may be several such listeners). The problem is that the > callback does not indicate which template function was actually invoked, > so I've tweaked the compiler to include a new argument, "__function" that > will always contain the name of the template function that was invoked. > This lets me have a single function like this: > > function galleryTemplateCallback($params, $content) { > > // blah > // blah > > print $delegate->invoke($params['__function'], $params, $content); > } > > This is a very abbreviated version just for clarity. To really see how > this code delegates control to theme and localization code, you can > check out the Gallery source code (see the "gallery2" module in CVS at > gallery.sourceforge.net). > > This has been tested on Unix and Windows with 2.3.1 > > > > ______________________________________________________________________ This looks like a good addition, so long as backward compatability is maintained. I'm a big fan of gallery btw, long time user. Keep up the good work, I'm happy to see Smarty is useful for you. Monte

« previous php.smarty.dev (#339) next »