[PHP / Smarty] - Custom resources

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 23-09-2024
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:
  1. 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.
  2. 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.
Op deze manier kun je eenvoudig een algemene template op theme-niveau specificeren en die overrulen of uitbreiden met templates in de paginadir. Hiervoor gebruikt de custom resource een method die ik in heel mijn code gebruik en die verder niet heel interessant voor de rest van het verhaal is (object $_incl). Anyway - hier is mijn custom resource:

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

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 23-09-2024
schop, wanhoop nabij ;(

Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
Weet je heel zeker dat je fetch moet overriden en niet getContent? Die throwed namelijk de exception.

En als je dan toch bezig bent, refactor dan gelijk even die global om naar een private of protected var in je class ;)

Driving a cadillac in a fool's parade.