[PHP] Template parser: blocksblocks meerdere keren aanroepen

Pagina: 1
Acties:
  • 44 views sinds 30-01-2008

  • S_tef
  • Registratie: December 2004
  • Laatst online: 07-05 01:27
Hey,

ik ben bezig met het schrijven van een template parser, maar als ik nu 1 block meerder malen wil aanroepen, dus geen verschillende, word er gewoon weg maar 1 block getoont.

Ik denk zelf dat ik de blocks in een array moet zetten en dat het dan werkt, alleen heb ik geen idee hoe ik dit moet aanpassen, hopelijk is er iemand die me hierbij wil helpen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        function block($block)
        {
            $this->bAangeroepen = 1;

            if(preg_match("/<!-- START BLOCK : " . $block . " -->(.*?)<!-- EINDE BLOCK : " . $block . " -->/s", $this->inhoud, $matches))
            {   
                $this->bAangeroepen++;
            }
            else
            {
                echo "Block '" . $block . "' is niet gevonden!";
                $this->inhoud = preg_replace("/<!-- START BLOCK : (.*?) -->(.*?)<!-- EINDE BLOCK : (.*?) -->/s", "", $this->inhoud);
            }
        }


en

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        function Plaats()
        {
            if($this->bAangeroepen == 0)
            {
                $this->inhoud = preg_replace("/<!-- START BLOCK : (.*?) -->(.*?)<!-- EINDE BLOCK : (.*?) -->/s", "", $this->inhoud);
            }

            elseif($this->bAangeroepen > 0)
            {
                $this->inhoud = preg_replace("/<!-- START BLOCK : (.*?) -->/i", "", $this->inhoud);
                $this->inhoud = preg_replace("/<!-- EINDE BLOCK : (.*?) -->/i", "", $this->inhoud);
            }
            echo $this->inhoud;
        }


Alvast bedankt! Stef

[ Voor 60% gewijzigd door S_tef op 29-05-2005 17:39 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

En wat heb je zelf al geprobreerd? Niks dus? Je kan ook met de search niks vinden? Ook op google niet? En zelfs de PHP manual liet je in de steek?

Daarbij komt ook dat de taal niet in de topictitel staat en dat je vraag erg onduidelijk is. Je moet er niet vanuit gaan dat iedereen ook je vorige topics gaat lezen om dit te kunnen begrijpen ;)

Bekijk aub P&W FAQ - De "quickstart" eens even voor hoe we een topicstart graag zien. Als je aan de hand daarvan je post aan wilt passen dan graag, de topictitel heb ik voor je gefixt..

[ Voor 35% gewijzigd door Creepy op 29-05-2005 17:36 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • S_tef
  • Registratie: December 2004
  • Laatst online: 07-05 01:27
SOrry hopelijk is het nu beter en duidelijker

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Nouja, voor een buitenstaander is het nog steeds vrij lastig om de globale werking van je 'template parser' in te schatten, en dus ook wat je met deze methods wil doen.

Wat moeten deze methods precies doen, wat voor input geef je en wat wil je dat eruit komt, en wat komt er uit dat je niet wilt? :)

  • S_tef
  • Registratie: December 2004
  • Laatst online: 07-05 01:27
Hier dan m'n compleet ding ;)

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?
error_reporting(E_ALL);

class TemplateParser
{

    var $file;
    var $inhoud;
    var $block;
    var $matches;
    var $bAangeroepen = 0;

        function Template($file)
        {
            if( (!file_exists ($file) ) )
            {
                echo "Bestand '" . $file . "' bestaat niet en of staat op een externe server!";
            }

            elseif( (file_exists ($file) ) )
            {
                $this->inhoud = implode ("", file ($file) );
            }

        }

        function Vervang($var, $door)
        {
            $this->inhoud = str_replace("{" . $var . "}", $door, $this->inhoud);
        }

        function block($block)
        {
            $this->bAangeroepen = 1;

            if(preg_match("/<!-- START BLOCK : " . $block . " -->(.*?)<!-- EINDE BLOCK : " . $block . " -->/s", $this->inhoud, $matches))
            {   
                $this->bAangeroepen++;
            }
            else
            {
                echo "Block '" . $block . "' is niet gevonden!";
                $this->inhoud = preg_replace("/<!-- START BLOCK : (.*?) -->(.*?)<!-- EINDE BLOCK : (.*?) -->/s", "", $this->inhoud);
            }
        }

        function Plaats()
        {
            if($this->bAangeroepen == 0)
            {
                $this->inhoud = preg_replace("/<!-- START BLOCK : (.*?) -->(.*?)<!-- EINDE BLOCK : (.*?) -->/s", "", $this->inhoud);
            }

            elseif($this->bAangeroepen > 0)
            {
                $this->inhoud = preg_replace("/<!-- START BLOCK : (.*?) -->/i", "", $this->inhoud);
                $this->inhoud = preg_replace("/<!-- EINDE BLOCK : (.*?) -->/i", "", $this->inhoud);
            }
            echo $this->inhoud;
        }

}
 
$tp = new TemplateParser();
$tp->Template("index.tp");
$tp->block("geen");
$tp->block("geen");
$tp->block("test");
$tp->Plaats();

?>


Zoals je ziet geef ik 2 keer geen in als block, maar het word maar 1 keer getoont.
block test word wel gewoon getoont.

[ Voor 17% gewijzigd door S_tef op 29-05-2005 17:52 ]


  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Het lijkt erop dat je meteen bij de eerste keer dat je block "geen" invult de "blocktags" (<!-- StART ... -->) weg-preg_replacet? Daarna werkt het niet meer.

Krijg je ook geen "Block geen is niet gevonden" te zien?

Probeer anders een tussen elke aanroep van $tp->block de inhoud van je template te laten zien, door er bijv steeds print $tp->inhoud achter te zetten.

Overigens lijkt het dat je in het begin van methode "block" de variabele bAangeroepen steeds weer op 1 zet? Is dat echt de bedoeling?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Nog 1 keer: zet in je startpost nu eens alle relevante informatie. Zet daarbij ook neer wat je als input hebt (delen van index.tp zouden denk ik wel handig zijn) en welke output je nu krijgt, en welke output je had verwacht. Ik kan er in elk geval nog niet zoveel wijs uit..

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • S_tef
  • Registratie: December 2004
  • Laatst online: 07-05 01:27
Ik replace alleen de comment tags weg. Ik krijg ook niet dat het block niet gevonden is.

code:
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
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>

<head>
<title>{title}</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="Content-Language" content="nl" />
<meta name="author" content="{author}" />
<meta name="keywords" content="{keywords}" />
<meta name="description" content="E-mail web" />
<link rel="stylesheet" type="text/css" href="style.css" />
</head>

<body>

    <table style="width: 750px; border: 1px solid #000000; border-top: 0px;" cellspacing="0" cellpadding="0">
        <tr>
            <td style="width: 750px; height: 35px; background-color: #E32A2A; padding-left: 5px; padding-right: 5px; color: #FFFFFF; font-weight: bold;" class="menu"><a href="index.php">Hoofdpagina</a>&nbsp;&nbsp;&nbsp;<a href="inbox.php">Inbox</a>&nbsp;&nbsp;&nbsp;<a href="uitloggen.php">Uitloggen</a></td>
        </tr>
    </table>
    
    <br />

    <!-- START BLOCK : geen -->
    dit is een {block}
    <!-- EINDE BLOCK : geen -->

    <!-- START BLOCK : test -->
    dit is een {block} 2
    <!-- EINDE BLOCK : test -->

</body>

</html>


Das index.tp

Sorry maar ik krijg het niet echt duidelijker uitgelegt :$

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Ok dan.. we zijn er.
Geen staat maar 1 keer in je template. Vindt je het dan gek dat het maar 1 keer wordt getoond? Een preg_match zoekt alleen maar en een preg_replace vervangt alleen maar, je krijgt er niet automagisch een tweede geen blok bij ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • S_tef
  • Registratie: December 2004
  • Laatst online: 07-05 01:27
Ja hetis een block, het doel van een block is dat je hem meerdere keren kan neerzetten (ook het doel).
Ik weet ook wat match en replace doen, alleen ik wil dus dat je het block meerdere keren kan 'aanroepen'.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Zet het dan meerdere keren in je template? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • S_tef
  • Registratie: December 2004
  • Laatst online: 07-05 01:27
-NMe- schreef op zondag 29 mei 2005 @ 18:13:
Zet het dan meerdere keren in je template? :?
Uhm warom, het moet zo ook gaan :P Daarom vraag ik het ook. Maar ik heb ook nog een 2probleem, ik vervang die comment tags dus voor niets, maar dan komen er in de bron witregels, die witregels die wil ik dus niet hebben die van de commenttags afkomen. (weer beetje onduidelijk volgens mij :$)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

S_tef schreef op zondag 29 mei 2005 @ 18:16:
Uhm warom, het moet zo ook gaan :P Daarom vraag ik het ook. Maar ik heb ook nog een 2probleem, ik vervang die comment tags dus voor niets, maar dan komen er in de bron witregels, die witregels die wil ik dus niet hebben die van de commenttags afkomen. (weer beetje onduidelijk volgens mij :$)
Wat maakt een witregel in HTML uit dan? Niet moeilijk over doen, of je laat gewoon in je template een regeleinde weg.

Verder, als je wil dat het ook zo vervangen wordt, dan moet je eerst meerdere blokken opbouwen in PHP, en daarna die opgebouwde blokken neerzetten op de plaats van dat ene blok in je template.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • S_tef
  • Registratie: December 2004
  • Laatst online: 07-05 01:27
-NMe- schreef op zondag 29 mei 2005 @ 18:22:
[...]
Verder, als je wil dat het ook zo vervangen wordt, dan moet je eerst meerdere blokken opbouwen in PHP, en daarna die opgebouwde blokken neerzetten op de plaats van dat ene blok in je template.
Ja maar dat lukt me juist niet, misschien dat iemand me hierbij kan helpen?

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 22:27

MueR

Admin Devschuur® & Discord

is niet lief

Dus je wil een block meerdere keren kunne laten zien.. En hoe moet je code dat weten? Kijk bijvoorbeeld eens naar bestaande template parsers als die van phpBB. Zij gebruiken 2 functies om hun template in te vullen. Een voor repeterende blocks (zoals een thread of memberlist), en een voor "statische" content.

Anyone who gets in between me and my morning coffee should be insecure.


  • S_tef
  • Registratie: December 2004
  • Laatst online: 07-05 01:27
Nou ik denk als je ze in een array stopt.. maargoed, even op dat probleem met de witregels terug komen, weet iemand hoe ik dit kan oplossen?

  • flashin
  • Registratie: Augustus 2002
  • Laatst online: 17-12-2023
Vantevoren parse je de template, haal je de blocks met hun inhoud eruit en zet je die in een array. Je replaced dat block in de TPL met een herkenningsteken zodat je hem later eenvoudig kunt vervangen door de nieuwe vakergebruikte inhoud.

Dan iedere keer als je een block aanmaakt gooit ie hem bij de array erin ($this->newBlock('array index')) en op het einde output je de hele zooi in de TPL en vervangt ie het herkenningsteken met de inhoud in die array..

[ Voor 6% gewijzigd door flashin op 29-05-2005 18:57 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

S_tef schreef op zondag 29 mei 2005 @ 18:50:
Nou ik denk als je ze in een array stopt..
Dan wat? Probeer het eens uit. Array's zijn echt zo moeilijk niet en dat hoef je hier echt niet te komen vragen. Gewoon proberen, als je er dan echt niet uitkomt en je kan een concrete vraag erover stellen dan graag :)
maargoed, even op dat probleem met de witregels terug komen, weet iemand hoe ik dit kan oplossen?
Die witregels is alleen in je bron. Daar zie je niks van want een witregel in HTML is heel iets anders dan een witregel in je bron. Daarnaast: witregels kan je zelf ook filteren of opnemen in je regexp ;)

Maar je eerste vraag blijft nog steeds te vaag. Ga zelf eerst eens wat experimenteren zodat je weet wat er mogelijk is. Als het dan echt nog niet lukt kom dan terug met een concretere vraag :)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.