[PHP] Blocks

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • S_tef
  • Registratie: December 2004
  • Laatst online: 20-09 12:29
Hallo,

ik ben bezig met blocks.

html code
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
    
    <head>
    
    <title>{title}</title>

    </head>

    <body>
        {inhoud}<br>
        <!-- START BLOCK test -->hahah<br><!-- START BLOCK blaat -->grapjas<!-- EINDE BLOCK blaat --><!-- EINDE BLOCK test -->
    </body>

</html>


php
PHP:
1
2
3
4
5
6
7
8
9
10
11
        function Block ( $naam )
        {
            if ( preg_match ( '/<!-- (START|EINDE) BLOCK ' . $naam . ' -->(.*?)<!-- (START|EINDE) BLOCK ' . $naam . ' -->/si', $this->inhoud, $matches ) )
            {
                echo 'Jahoor<br>';
            }
            else
            {
                echo 'Nee<br>' ;
            }
        }


broncode output
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Jahoor<br>Nee<br><html>
    
    <head>
    
    <title>Parser!</title>

    </head>

    <body>
        :P
        <!-- START BLOCK test -->hahah<!-- EINDE BLOCK test -->

    </body>

</html>


Hij haalt die block dus weg wat in die ene block zit.
Iemand enig idee hoe dit kan?

Alvast bedankt.
Groetjes stef

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Niet om het een of ander maar is zoiets niet een oplossing: PHP als template engine.

template.php
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
<html>
  <head>
    <title><?PHP echo $data['title']; ?></title>
  </head>
  <body>
    <?PHP
      foreach($data['somerows'] AS $text) {
        echo '<li>'.$text.'</li>';
      }
    ?>
  </body>
</html>


je PHP file:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?PHP
$data=array(); //je array met alle output

//hier haal je data uit een database of wat dan ook
$data['title']='hello world';

$data['somerows']=array(
  1 => 'hello',
  2 => 'world',
);

require_once('template.php');

?>



edit:
zoiets kan ook nog:

HTML:
1
2
3
4
5
6
7
8
9
10
<html>
  <head>
    <title><?PHP echo $data['title']; ?></title>
  </head>
  <body>
    <?PHP foreach($data['somerows'] AS $text) {?>
        <li><?=$text;?></li>
    <?PHP } ?>
  </body>
</html>

[ Voor 33% gewijzigd door djluc op 22-11-2005 16:44 ]


Acties:
  • 0 Henk 'm!

  • S_tef
  • Registratie: December 2004
  • Laatst online: 20-09 12:29
Nee, ik wil graag op mijn manier, om ao makkelijk van design te wisselen.
Toch dank voor je moeite en idee.

Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Hij haalt die block dus weg wat in die ene block zit.
Iemand enig idee hoe dit kan?
Kan je dat iets duidelijker formuleren want ik volg je niet helemaal.
S_tef schreef op dinsdag 22 november 2005 @ 16:44:
Nee, ik wil graag op mijn manier, om ao makkelijk van design te wisselen.
Toch dank voor je moeite en idee.
Ben benieuwd naar je overige redenen om deze methode te gebruiken. Als dit je belangrijkste motivatie is om deze opzet te gebruiken kan je jezelf een hoop moeite besparen door gewoon php in je templates te gebruiken. Vanuit performance oogpunt is dit ook interessanter.

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
je regex matcht een block waar geen ander block in zit ....

werkt prima toch ?

als je wilt dat de buitenste blokken ook geresolved worden, moet je hem nog een keer door je regex gooien :) (net zovaak als dat je nesting diep is)

Acties:
  • 0 Henk 'm!

  • S_tef
  • Registratie: December 2004
  • Laatst online: 20-09 12:29
Brakkie schreef op dinsdag 22 november 2005 @ 16:54:
[...]

Kan je dat iets duidelijker formuleren want ik volg je niet helemaal.

[...]

Ben benieuwd naar je overige redenen om deze methode te gebruiken. Als dit je belangrijkste motivatie is om deze opzet te gebruiken kan je jezelf een hoop moeite besparen door gewoon php in je templates te gebruiken. Vanuit performance oogpunt is dit ook interessanter.
Zie bericht van joopst.

Werken met meerdere templates.
als je wilt dat de buitenste blokken ook geresolved worden, moet je hem nog een keer door je regex gooien :) (net zovaak als dat je nesting diep is)
Dus zeg maar de if in een for?
Hoe kijk ik dan hoevaak hij dat doen moet?

Alvast bedankt

Acties:
  • 0 Henk 'm!

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
je weet dat je niet meer hoeft te replacen als je preg_replace geen matches meer maakt.
in de handleiding staat dat er dan 0 (false) wordt terug gegeven.

Acties:
  • 0 Henk 'm!

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
DUS, je template moet je altijd minstens 2x preg_replacen op deze manier .. en dat is niet zo efficient .. ik vind het ook niet zo'n goeie oplossing die je aan het maken bent ... :r

Acties:
  • 0 Henk 'm!

  • S_tef
  • Registratie: December 2004
  • Laatst online: 20-09 12:29
Hoe zou jij het doen?
Ik ben dus bezig met een stackbased parser voor de duidelijkheid :p

Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

djluc schreef op dinsdag 22 november 2005 @ 16:42:
template.php:
PHP:
1
2
3
    foreach($data['somerows'] AS $text) {
        echo '<li>'.$text.'</li>';
    }
template.php:
PHP:
1
2
3
<? foreach($data['somerows'] as $text) { ?>
  <li><?= $text ?></li>
<? } ?>
Is in mijn ogen dan veel overzichtelijker.

edit:
Ik moet ook niet reageren een eeuw nadat ik heb gelezen en bedacht had dat het toch wel een nuttige toevoeging was :X :+ . djluc zij dit dus al :P .

@ TS: ik zie niet in waarom je bovenstaande niet gebruikt kan worden. Je kan toch ook als je meerdere templates hebt dit soort blokken gebruiken? En met behulp van template-php functies hoeft dat ook niet meer code op te leveren, terwijl het jou wel moeite bespaart, en je hebt bovendien gelijk de volledige php-library beschikbaar in je templates. Alleen als dat een probleem is, zou een template parser wat te overwegen zijn, in mijn ogen, verder ís PHP voor een deel template parser...

Maar dat biedt natuurlijk geen antwoord op je vraag :P .

[ Voor 42% gewijzigd door JHS op 22-11-2005 17:28 ]

DM!


Acties:
  • 0 Henk 'm!

  • S_tef
  • Registratie: December 2004
  • Laatst online: 20-09 12:29
JHS schreef op dinsdag 22 november 2005 @ 17:15:
[...]
template.php:
PHP:
1
2
3
<? foreach($data['somerows'] as $text) { ?>
  <li><?= $text ?></li>
<? } ?>
Is in mijn ogen dan veel overzichtelijker.

@ TS: ik zie niet in waarom je bovenstaande niet gebruikt kan worden. Je kan toch ook als je meerdere templates hebt dit soort blokken gebruiken? En met behulp van template-php functies hoeft dat ook niet meer code op te leveren, terwijl het jou wel moeite bespaart, en je hebt bovendien gelijk de volledige php-library beschikbaar in je templates. Alleen als dat een probleem is, zou een template parser wat te overwegen zijn, in mijn ogen, verder ís PHP voor een deel template parser...

Maar dat biedt natuurlijk geen antwoord op je vraag :P .
Ik vind het ook fijner om html en php gescheiden te houden, bedankt voor de reactie's maar heb er jammer genoeg niet echt wat aan gehad..

Maar wat niet is kan nog komen ;)

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
@JHS: kijk eens naar mijn 2e voorbeeldje ;)

@TS
Werken met meerdere templates.
Waarom zou dat niet kunnen met een PHP template? Dat is precies hetzelfde als met een template welke je parsed middels een template parser.

[edit]
Ik vind het ook fijner om html en php gescheiden te houden, bedankt voor de reactie's maar heb er jammer genoeg niet echt wat aan gehad..
Deze opmerkingen zijn meer uit ervaring geplaatst. Je mag uiteraard proberen testen enzovoorts met je parser. Uiteindelijk kom je waarschijnlijk tot de conclusie dat het te beperken is, te traag is en/of teveel tijd kost om te ontwikkelen. Een nadeel wat je niet hebt met PHP als template parser.

edit:
Om je een idee te geven van mogelijke problemen:

In layout 1 wil je de titels met een hoofdletter, in andere templates niet. Wat zou ik doen:
<title><?PHP echo ucfirst($data['title']); ?></title>
Hoe los je zoiets handig op met een template parser? Ga je dan in je parser ook weer functies implementeren? [ucfirst]{title}[/ucfirst] ? Dan kan je bezig blijven en uiteindelijk is het gewoon niet handig. In je PHP file kan je dit uiteraard niet doen, je wilt je PHP tenslotte niet vervuilen met template zaken.

[ Voor 72% gewijzigd door djluc op 22-11-2005 17:34 ]


Acties:
  • 0 Henk 'm!

  • S_tef
  • Registratie: December 2004
  • Laatst online: 20-09 12:29
Ik vind het zelf netter / overizchtelijker met een template parser.
Lijkt me niet nodig om hier over te discusseren.

Toch bedankt.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Ik vind het erg jammer dat je niet gewoon wil discussieren over je aanpak. Ik zie dat je dit ook in andere topics niet echt accepteert. Geef o.a. eens reactie op mijn edit.

Indien je echt je eigen zin wilt doordrijven moet je dit uiteraard doen, ik kan je daarmee niet helpen bij de vele problemen die je tegen gaat komen. Denk a.u.b. eerst even goed na voor je er veel tijd in gaat steken.

Acties:
  • 0 Henk 'm!

  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 18-09 12:34
S_tef schreef op dinsdag 22 november 2005 @ 17:09:
Hoe zou jij het doen?
Ik ben dus bezig met een stackbased parser voor de duidelijkheid :p
Ik heb hier ooit een artikel over geschreven, misschien dat je er iets aan hebt? Dit artikel gaat erover HOE je stackbased kan parsen en neemt als voorbeeld een template parser!

http://www.phpexperience.nl/artikelen/artikel/68

edit: wat jij dus op dit moment doet is niet stackbased werken, dat is de structuur regel voor regel nalopen! Maar lees het artikel maar eens!

[ Voor 16% gewijzigd door maurad3r op 22-11-2005 19:33 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

joopst schreef op dinsdag 22 november 2005 @ 17:07:
DUS, je template moet je altijd minstens 2x preg_replacen op deze manier .. en dat is niet zo efficient .. ik vind het ook niet zo'n goeie oplossing die je aan het maken bent ... :r
Zonder reden waarom je dat vindt is dat niet zo'n zinnige opmerking. Onderbouw een opmerking als deze, zeker als je er een :r bij zet. Als je dat niet kan/wil dan kun je een dergelijke opmerking ook beter niet maken aangezien het niets toevoegt.
djluc schreef op dinsdag 22 november 2005 @ 17:55:
Ik vind het erg jammer dat je niet gewoon wil discussieren over je aanpak.
Ik niet. :P

Die discussie is hier al zò vaak gevoerd, ook recent nog. Ik zou de laatste zijn om je ongelijk te geven, maar als TS meer wil weten over PHP als template parser, dan weet hij de search wel te vinden. :)

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


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Mja, de truuk zit er imho in dat je stackbased aan de gang moet. Dat betekent dat je van voor naar achter de boel doorloopt. Wanneer je een openingstag vindt schuif je de naam van dit block op de stapel. Wanneer je een sluittag tegenkomt check je of de naam in dit block overeenkomt met de naam van het laatst geopende block. Zijn ze hetzelfde dan kun je hem van de stack afhalen, verschillen ze dan is het template inconsistent. Hoe je met een inconsistent template omgaat moet je verder zelf weten, het meest logische zou echter zijn om ofwel de openingstag te negeren ofwel een error te genereren.

Qua PHP als template engine, imho zijn er twee voordelen van een eigen template parser. Ten eerste dat je template code als HTML comment verschijnt en de boel daardoor overzichtelijker wordt (in elk geval voor iemand die alleen HTML'ed). Het tweede voordeel is dat je een eigen namespace creëert. Hierdoor voorkom je botsingen tussen variabelen in je applicatie en de template.
Dat je hiervoor inboet aan flexibiliteit van je uitvoer ten opzichte van PHP als template parser zal allemaal best. Als dat voor een bepaalde situatie niet relevant is, maar een van bovengenoemde (of een andere motivatie) wel belangrijk is, dan is een template engine een goede keuze.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
-NMe- schreef op dinsdag 22 november 2005 @ 18:11:
[...]

Zonder reden waarom je dat vindt is dat niet zo'n zinnige opmerking. Onderbouw een opmerking als deze, zeker als je er een :r bij zet. Als je dat niet kan/wil dan kun je een dergelijke opmerking ook beter niet maken aangezien het niets toevoegt.
Ik dacht in mijn post duidelijk te maken dat de gekozen oplossingsrichting van S_tef niet efficient is (veel preg_replacen). Eerder in de thread zijn al alternatieven aangeboden die handiger en efficienter zijn dan de zooi waar S_tef mee bezig, daar ben ik het mee eens. Tevens heeft hij al blijk gegeven van een zeer sterke eigen wil, en omdat ik hem toch wil bewegen zijn oplossingsrichting te her-evalueren, probeer ik mijn post te versterken met een smiley.
Ik ben van mening dat het belangrijk is om naast technische oplossingen aandragen te sturen op voorkoming van bevuiling van het internet.

Acties:
  • 0 Henk 'm!

  • S_tef
  • Registratie: December 2004
  • Laatst online: 20-09 12:29
Pfff.. hoop reacties ineens :P
De zoekfunctie had ik idd nog niet aangedacht. Sorry.

Met deze reactie's kom ik vast al verder, ik ga ze goed bekijken, ook het artikel.
En jullie horen nog wel ;)

Bedankt igg.

Acties:
  • 0 Henk 'm!

Verwijderd

hmm klinkt als dit

http://www.phpxtemplate.org/

Acties:
  • 0 Henk 'm!

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 20-09 18:24

TheBorg

Resistance is futile.

Ik ben hier begonnen:
Building a Template Parser Class with PHP

Inmiddels is er weinig van het origineel over en kan het ding forms opbouwen en weet ik wat. :)

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Ik zou eens kijken naar Yapter of XTemplate zoals ThaLyric al aangaf. Zelf werk ik sinds n paar maanden met Yapter en dit werkt zo ontzettend goed! Je code is echt volledig gescheiden. Zo kun je iemand anderd je pagina laten bouwen in (x)html terwijl jij de pagina's in mekaar rost in php.
Het grote voordeel van Yapter vind ik dat het enkel 1 class is die je required en je kan ermee aan de slag :)

Linkje naar Yapter : http://yapter.sourceforge.net/

Waarom zou je het helemaal zelf bouwen als er al template engines zijn die dat beter doen?

Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

Als we toch aan het linken zijn, verbaasd het me dat Smarty nog niet genoemd is :) ?

DM!


Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Waarom zou je het helemaal zelf bouwen als er al template engines zijn die dat beter doen?
Als je je php vaardigheden wilt uitbreiden is het erg nuttig om dit soort dingen zelf te bouwen. :)

Systeem | Strava


  • Cartman!
  • Registratie: April 2000
  • Niet online
Brakkie schreef op woensdag 23 november 2005 @ 22:27:
[...]

Als je je php vaardigheden wilt uitbreiden is het erg nuttig om dit soort dingen zelf te bouwen. :)
Maar om dan meteen een hele template parser te schrijven meteen?

Over Smarty : ik heb ermee gewerkt en het heeft me best afgeschrikt. Je moet het echt compilen, anders werkt het niet. TemplateX en Yapter kun je gewoon includen, lekker snel en simpel.

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 19:53

orf

Over Smarty : ik heb ermee gewerkt en het heeft me best afgeschrikt. Je moet het echt compilen, anders werkt het niet. TemplateX en Yapter kun je gewoon includen, lekker snel en simpel.
Smarty kun je ook gewoon includen. Smarty biedt het beste van twee werelden, templates en snelheid. Templates worden geparsed tot PHP code in plaats van dat elke pageview opnieuw te doen

  • TweakBoy
  • Registratie: Augustus 2001
  • Laatst online: 14-09 22:16

TweakBoy

---

g00fy schreef op donderdag 24 november 2005 @ 15:03:
[...]

Maar om dan meteen een hele template parser te schrijven meteen?

Over Smarty : ik heb ermee gewerkt en het heeft me best afgeschrikt. Je moet het echt compilen, anders werkt het niet. TemplateX en Yapter kun je gewoon includen, lekker snel en simpel.
dat verhaal over compilen snap ik niet echt.. smarty is ook lekker includen en aanroepen van functies... owkay.. dat hij wat tmp dirs nodig heeft om wat cachefiles op te slaan is een vereiste. maar is wel tig keer sneller dan bijv Yapter.

---


  • Cartman!
  • Registratie: April 2000
  • Niet online
Mijn ervaring is dat Smarty een stuk omslachtiger is op te zetten dan bijv. Yapter. Is alweer wat jaren geleden dus het kan best dat iets simpelere geworden is, dan neem ik het terug.
Pagina: 1