PHPExperience.nl

› Scripts › Template Parser
PHP & Snippers › Template Parser
Geplaatst op: 08-08-2005 16:57  /  Auteur: Gert-Jan  /  3995 keer bekeken
Info
Ooit gemaakt voor een wedstrijd op WF, nu met een kleine modificatie hier

Functies
SetTemplate: Het laden van een template, dit kan via een database/file array.
SetBlock: Het oproepen van een bepaalde blok.
GotoBlock: Het terug zetten naar een bepaald blok, dit gebruiken na elk blok wanneer je nieuwe (Niet geneste blok) wilt oproepen.
SetVar: Het oproepen van een variabele.
ReturnContent: Het ophalen van de geparsde template
PrintContent: Printen van geparsde template.
<?PHP

#    Author  : Gert-Jan (gert-jan at gert-jan dot ath dot cx)

class noName_1
{
    
## Private vars:
    
var $cblockid  = -1;            // Counts number of blocks.
    
var $parsed    null;
    var 
$parentid  null;            // Contains the ID of the current parent.
    
var $content   null;            // Template content.
    
var $bsequence = array ();        // Sequence on which the blocks are called.
    
var $blockdata = array ();        // Containst data from the blocks.

    ## Template loader.
    
function setTemplate ($template$byvar null)
    {
        
$content '';

        if(!
is_array ($template ))
        {
            if(!
$byvar)
                
$content fread(fopen($template"r"), filesize($template)) or die("Template ".$template." does not exist");
            else
                
$content $template;
        }
        else
        {
            foreach(
$template as $template)
            {
                if(!
$byvar)
                    
$content .= fread(fopen($template"r"), filesize($template)) or die("Template ".$template." does not exist");
                else
                    
$content .= $template;
            }
        }

        if(!
$this->content)
            
$this->setblock('_ROOT'TRUE);
        
        
$this->content .= $content;
    }
    
    
## Block summon function.
    
function setBlock ($blockname$parent NULL)
    {
        
$this->cblockid count($this->bsequence);
        
$this->bsequence [$this->cblockid] = $blockname;
        
$this->blockdata [$this->cblockid]['prnt'] = $this->parentid;
        
$this->parentid = ($parent) ? $this->cblockid $this->parentid;
    }

    
## Goto block function, block is set as parent.
    
function gotoBlock ($blockname)
    {
        
$array array_reverse(array_keys($this->bsequence$blockname));
        
$this->cblockid $array[0];
        
$this->parentid $array[0];
    }

    
## SetVar
    
function setVar ($var$rep NULL)
    {
        if(
is_array($var))
        {
            foreach(
$var as $var => $rep)
                
$this->blockdata[$this->cblockid['vars']][] = array(=> $var=> $rep);
        }
        else
            
$this->blockdata[$this->cblockid]['vars'][] = array(=> $var=> $rep);
    }

    
## Return content
    
function returnContent ()
    {
        if(!
$this->parsed)
            
$this->_parse();

        return 
$this->content;
    }

    
## Print content
    
function printContent ()
    {
        if(!
$this->parsed)
            
$this->_parse();

        print 
$this->content;
    }

    
## Parse function
    
function _parse ()
    {
        
$array   $this->_extract$this->content);
        
$blocks  $array[0];
        
$parts   $array[1];
        
$content $array[2];
        
$content preg_replace("!\[block:(.*?)]!""[block:0.\\1]"$content);

        for (
$i 1$i count$this->bsequence); $i++)
        {
            
$name $this->bsequence[$i];
            
$cont $blocks[$name];            
            
$cont preg_replace("#\[block:(.+)]#is""[block:".$i.".\\1]"$cont);

            
$content str_replace('[block:'.$this->blockdata [$i]['prnt'].'.'.$name.']'$cont.'[block:'.$this->blockdata [$i]['prnt'].'.'.$name.']'$content);
            
            if(isset(
$this->blockdata[$i]['vars']))
            {
                
$c count($this->blockdata[$i][ 'vars' ]);

                for( 
$j 0$j $c$j++ )
                {
                    
$content str_replace('{'.$this->blockdata[$i]['vars'][$j][0].'}'$this->blockdata[$i]['vars'][$j][1], $content);
                }
            }
        }
        
$this->parsed  true;
        
$this->content preg_replace("!\[(block|part):(.*?)]!"''$content);
        
    }

    
## Template extract function.
    
function _extract ($cont)
    {
        
$blocks = array();    // Contains all blockdata
        
$parts  = array();    // Contains all partsdata
        
$apos  0;            // Where was the last start + 1.
        
        ## Looping the content.
        
while(is_int($start strpos$cont'['$apos)))
        {
            
$apos $start 1;                                // Set apos
            
$pos  strpos($cont'='$start);            // Get position of = tag    
            
$spos $pos 1;                                // set of spos        
            
$epos strpos$cont']'$pos);            // get end delim
            
$name substr$cont$spos$epos $spos);    // get name of tag        
            
            ## This explains itself.
            
$stag   '[block='.$name.']';
            
$etag   '[/block='.$name.']';
            
$epos strpos$cont$etag$epos);            // Postion of end tag            
            
            ## Error handling
            
if(!$epos)
                die(
'No end found for block: '.$name);
            
            
## Count length of tags
            
$stag $start strlen ($stag);
            
$etag $epos  strlen ($etag);            
            
            
## Cutting content.
            
$ccon substr ($cont$stag$epos $stag);
            
$par1 substr ($cont0$start);
            
$par2 substr ($cont$etagstrlen($cont));    

            
## Rerun this function with diffrent content
            
$ccon $this->_extract($ccon);            
            
            
## Merge arrays
            
$blocks array_merge_recursive($blocks$ccon[0]);
            
$parts  array_merge_recursive($parts$ccon[1]);
            
            
## Explains itself
            
$blocks [$name] = $ccon[2];
            
$cont $par1.'[block:'.$name.']'.$par2;
        }
        
## return an array.
        
return array($blocks$parts$cont);
    }
}

?>

› Waardering

Op dit moment is er 5 keer gestemd op dit onderwerp. De gemiddelde score is 3.6.

Je kunt niet stemmen omdat je al gestemd hebt of omdat je niet bent ingelogd.


› Reacties op dit script (7)

Plaats een reactie

Reacties ordenen
De reacties bovenaan weergeven.

Dit bericht is 6 uur geleden of later geplaatst Reactie van RicardoP op 08-08-2005 19:19
Leuk simpel ding, werken de blocks nested?
Dit bericht is 6 uur geleden of later geplaatst Subreactie van Gert-Jan op 08-08-2005 19:43
Ja ze werken nested (Kun je ook uit de code opmaken )

Dit bericht is 6 uur geleden of later geplaatst Reactie van WumTol op 13-01-2006 18:10
Heb je geen voorbeeld hoe je het moet gebruiken?

Dit bericht is 6 uur geleden of later geplaatst Reactie van Pixel op 23-01-2006 08:44
Code: Geef deze code (volledig) in een popup venster weer Geef deze code in een tekstveld weer

1
2
3
4
5
6
7
8
9
10
11
12
<?php
    
## SetVar
    
function setVar ($var$rep NULL)
    {
        if(
is_array($var))
        {
            foreach(
$var as $var => $rep)
                
$this->blockdata[$this->cblockid['vars']][] = array(=> $var=> $rep); // $this->blockdata[$this->cblockid]['vars'][] = array(0 => $var, 1 => $rep);
        
}
        else
            
$this->blockdata[$this->cblockid]['vars'][] = array(=> $var=> $rep);
    }


Foutje op de regel waar mijn comment bij staat?

Dit bericht is bewerkt op 23-01-2006 08:46

Dit bericht is 6 uur geleden of later geplaatst Reactie van jleconte op 28-03-2007 23:28
Ik ben niet zo ervaren met deze scripts, maar heb dringend een werkende nodig om me er in te verdiepen. Dit is een hele goede basis, want dit script is simpel maar toch wel compact. Ik heb er dus al veel uit geleerd.

Toch vraag ik me af, is het mogelijk om een loop binnen een loop te maken? Ik heb verschillende combinaties, van setBlock en gotoBlock geprobeerd om het resultaat te bereiken, maar tot nu toe geen resultaat. Kan iemand mij helpen of een tip geven waar ik net dat geavanceerdere script kan vinden, zonder gelijk aan die megatemplate engine software vast te zitten.

Ik heb geprobeerd:

Code: Geef deze code (volledig) in een popup venster weer Geef deze code in een tekstveld weer

1
2
3
4
5
6
7
8
9
for($u=0;$u<3;$u++) {
        $template->setBlock("blok1");
        $template->setVar(array("nr_blok1" => $u));    
            
        for($i=0;$i<5;$i++) {
            $template->setBlock("blok2");
            $template->setVar(array("nr_blok2" => $i));    
        }
    }


met

Code: Geef deze code (volledig) in een popup venster weer Geef deze code in een tekstveld weer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[block=blok1]

    {nr_blok1}
    
    <table border="1">
        [block=blok2]
        <tr>
            <td>
                {nr_blok2}
            </td>
        </tr>
        [/block=blok2]
    </table>
    
[/block=blok1]


Doe ik nu iets fout, of bevat dit script niet deze functie?
Dit bericht is 6 uur geleden of later geplaatst Subreactie van Gert-Jan op 04-04-2007 19:59
Code: Geef deze code (volledig) in een popup venster weer Geef deze code in een tekstveld weer

1
2
3
4
5
6
7
8
9
10
11
for($i=0; $i < 2; $i++) {
    $tpl->setBlock('block_1', true);
    $tpl->setVar('block_1', $i);
    
    for($j=0; $j < 2; $j++) {
        $tpl->setBlock('block_2');
        $tpl->setVar('block_2', $j);
        $tpl->gotoBlock('block_1');
    }
        
    $tpl->gotoBlock('_ROOT');

Dit bericht is 6 uur geleden of later geplaatst Reactie van mistery1989 op 11-10-2007 15:56
wat nog mist is de include optie

Dit bericht is bewerkt op 13-10-2007 18:22

Plaats een reactie



Leden
Welkom Gast!

Registreren
Inloggen
Wachtwoord vergeten
Account activeren
Ledenlijst


Actieve topics
Topic 11/07 PHP spatie h...
Topic 25/05 website
Topic 07/05 Nieuw topic!
Poll 07/05 AANSTOTELIJK...
Topic 13/01 Geluid!
Topic 28/08 TroppoCity.n...
Mededeling 27/08 Overzicht Be...
Topic 15/08 PHP Scripter...
Mededeling 27/05 Overzicht gr...
Topic 30/03 unexpected T...

Actieve topics
Topic tracker
Zoeken


Linkpartners
Interhit
PHPFreaky
Shootnshop.nl
Tweakomatic.nl
Web-resource.nl
Webmensen
Webscripters
WmCity


Overige
Crew
Nieuwsarchief
Statistieken
Veel gestelde vragen
Bugs rapporteren