Hoi,
Ik ben al jaren tevreden Smarty gebruiker, maar loop nu tegen een probleem aan. Ik wil smarty updaten van versie 2.x naar de nieuwste (3.1.7) en er blijkt in de tussentijd nogal wat veranderd. Ik gebruik custom resources omdat mijn framework bestanden via een cascade laadt ipv direct.Maar de oude handler werkt niet meer, omdat er blijkbaar nogal wat is veranderd (namen van functies etc). Dus die heb ik herschreven, maar nu loop ik op een vreemd probleem.
Mijn custom resource doet kort gezegd twee dingen:
Ik gebruik een eigen template-object die Smarty gebruikt maar bijv een eigen caching-systeem gebruikt wat ik ook hier verder buiten beschouwing wil laten (staat in mijn test-opstelling ook uit-ge-comment!). in mijn template-object init ik Smarty en de custom resource als volgt:
Als ik vervolgens een pagina laat renderen door mijn framework (hij bouwt dan HTML, CSS en JS op adhv templates via Smarty) dan gaan de eerste templates prima, maar bij het renderen van een bepaald bestand gaat het mis.
Ik krijg error:
Natuurlijk heb ik geprobeerd mijn eigen functie te debuggen door hier en daar wat echo's in te bouwen. Wat dan opvalt is dat voor het betreffende template de method fetchTimestamp() wordt aangeroepen. Deze method retourneert een geldige en correcte timestamp. Daarna verschijnt de error, de method fetch() wordt uberhaupt niet aangeroepen.
Helaas staat mijn vraag al meer dan een week onbeantwoord op het Smarty-forum, vandaar dat ik hier eens een balletje opgooi. Geen idee of het wat uitmaakt, maar voor de zekerheid: De probleem-template wordt vanuit een andere template aangeroepen op de volgende manier:
Graag jullie hulp want ik zou niet meer weten wat ik er verder nog aan kan testen/proberen en zit dus al een week muurvast op dit probleem...
Ik ben al jaren tevreden Smarty gebruiker, maar loop nu tegen een probleem aan. Ik wil smarty updaten van versie 2.x naar de nieuwste (3.1.7) en er blijkt in de tussentijd nogal wat veranderd. Ik gebruik custom resources omdat mijn framework bestanden via een cascade laadt ipv direct.Maar de oude handler werkt niet meer, omdat er blijkbaar nogal wat is veranderd (namen van functies etc). Dus die heb ik herschreven, maar nu loop ik op een vreemd probleem.
Mijn custom resource doet kort gezegd twee dingen:
- Hij kijkt eerst of een template in de dir van het paginatype bestaat. Zoniet dat kijkt ie naar de directory van de theme, en als ie daar ook niet bestaat dan gaat ie naar bepaalde dirs in het framework.
- Het is mogelijk om bestanden 'aan mekaar te plakken'. Stel dat je template.tpl wil laden, dan kijkt ie of template_add.tpl bestaat (volgens de cascade van het punt hierboven) en zoja dan plakt ie die eraan vast, zoekt ie naar template_add_add.tpl enz.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| #Afile resource------------------------------------------------------------------------------------ class Smarty_Resource_Afile extends Smarty_Resource_Custom { #fetch method---------------------------------------------------------------------------------- protected function fetch($name, &$source, &$mtime){ #init global $_incl; #read $files = $_incl->lookup($name, true); if ( isset($files['self']) ) { $source = file_get_contents($files['self']); $mtime = filemtime($files['self']); } else { $tpl_source = ""; $mtime = time(); } if ( isset($files['add']) ) { foreach ( $files['add'] as $vfile ) { $source .= file_get_contents($vfile); if ( filemtime($vfile) > $mtime ) { $mtime = filemtime($file); } } } } #fetch timestamp method------------------------------------------------------------------------ protected function fetchTimestamp($name) { #init global $_incl; #read $files = $_incl->lookup($name, true); if ( isset($files['self']) ) { $mtime = filemtime($files['self']); } else { return time(); } if ( isset($files['add']) ) { foreach ( $files['add'] as $vfile ) { if ( filemtime($vfile) > $mtime ) { $mtime = filemtime($file); }}} #return return $mtime; } } |
Ik gebruik een eigen template-object die Smarty gebruikt maar bijv een eigen caching-systeem gebruikt wat ik ook hier verder buiten beschouwing wil laten (staat in mijn test-opstelling ook uit-ge-comment!). in mijn template-object init ik Smarty en de custom resource als volgt:
PHP:
1
2
3
4
5
6
7
| #start template engine $_incl->incl_once("_functions/template_handler/Smarty-3.1.7/libs/Smarty.class.php"); $smarty = new Smarty; #add includer $_incl->incl_once("_functions/template_handler/smarty_custom.php"); $smarty->registerResource("afile", new Smarty_Resource_Afile()); |
Als ik vervolgens een pagina laat renderen door mijn framework (hij bouwt dan HTML, CSS en JS op adhv templates via Smarty) dan gaan de eerste templates prima, maar bij het renderen van een bepaald bestand gaat het mis.
Ik krijg error:
code:
1
| Fatal error: Uncaught exception 'SmartyException' with message 'Unable to read template afile '_stylesheets/contrast_debug.css'' in ***Smarty-3.1.7/libs/sysplugins/smarty_resource_custom.php:80 Stack trace: #0 ***/Smarty-3.1.7/libs/sysplugins/smarty_resource.php(744): Smarty_Resource_Custom->getContent(Object(Smarty_Template_Source)) #1***Smarty-3.1.7/libs/sysplugins/smarty_internal_templatecompilerbase.php(156): Smarty_Template_Source->__get('content') #2 ***Smarty-3.1.7/libs/sysplugins/smarty_internal_template.php(187): Smarty_Internal_TemplateCompilerBase->compileTemplate(Object(Smarty_Internal_Template)) #3 ***Smarty-3.1.7/libs/sysplugins/smarty_internal_templatebase.php(155): Sm in ***Smarty-3.1.7/libs/sysplugins/smarty_resource_custom.php on line 80 |
Natuurlijk heb ik geprobeerd mijn eigen functie te debuggen door hier en daar wat echo's in te bouwen. Wat dan opvalt is dat voor het betreffende template de method fetchTimestamp() wordt aangeroepen. Deze method retourneert een geldige en correcte timestamp. Daarna verschijnt de error, de method fetch() wordt uberhaupt niet aangeroepen.
Helaas staat mijn vraag al meer dan een week onbeantwoord op het Smarty-forum, vandaar dat ik hier eens een balletje opgooi. Geen idee of het wat uitmaakt, maar voor de zekerheid: De probleem-template wordt vanuit een andere template aangeroepen op de volgende manier:
code:
1
2
3
4
5
6
7
8
9
| /*<![CDATA[[*/ {if isset($_stylesheets)}{foreach from=$_stylesheets item=_filename} /* ================ {$_filename} ======== */ {include file="afile:$_filename"} {/foreach}{/if} /*]]>*/ |
Graag jullie hulp want ik zou niet meer weten wat ik er verder nog aan kan testen/proberen en zit dus al een week muurvast op dit probleem...