CSS class name template parser

Door Hendel Berg, 17 jaar geleden, 4.498x bekeken

Al langere tijd wilde ik een template parser, welke door middel van de CSS class names in de HTML pagina zou moeten werken. De tijd -en ook de kennis- ontbrak mij om dit te ontwikkelen. Op PHP Classes kwam ik vervolgens een class tegen welke bijna geheel naar mijn zin was, namelijk 'Separated Template' geschreven door Sebastian Potasiak uit Polen.

De class van Sebastian heb ik wat verbouwd, zodat er ook losse tags parsen. Dit gebruik ik zelf voor tweetal doeleinden:

  • Instellingen
  • Eigenschappen aan HTML elementen toewijzen


Voorbeelden worden in het script zelf weergegeven.

Gesponsorde koppelingen

PHP script bestanden

  1. css-class-name-template-parser

 

Er zijn 5 reacties op 'Css class name template parser'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Toby hinloopen
toby hinloopen
17 jaar geleden
 
0 +1 -0 -1
$arrConfig[module][copyright][year]

Dit is ver weg van netjes. Hiermee spuug je errors uit.
Vervang dit door:

$arrConfig['module']['copyright']['year']
Hendel Berg
Hendel Berg
17 jaar geleden
 
0 +1 -0 -1
@toby hinloopen
Je hebt inderdaad helemaal gelijk. Heb het meteen aangepast.
Toby hinloopen
toby hinloopen
17 jaar geleden
 
0 +1 -0 -1
Wel veel reacties hier. Je code is zo goed dat niemand wat slechts weet te vertellen :')
Jelmer -
Jelmer -
17 jaar geleden
 
0 +1 -0 -1
Enige commentaar wat ik heb is dat ik de method parse wat vreemd vind. Bestanden inladen kan gemakkelijker met file_get_contents sinds PHP 5, maar wat ik vreemder vind is die reference tussen $result en $content. Volgens mij is hij vrijwel nutteloos, behalve dat hij voor de goeie werking van regel 69 en 70 dan weer essentieel is. Maar waarom niet "gewoon" template in variabele laden, inhoud vervangen door resultaat van $this->settings, en dan vervangen door resultaat van $this->loop?

Een ander iets is dat als gevolg van dit alles los van elkaar uitvoeren je bijvoorbeeld dit kan doen:
$arrConfig['application']['name'] = "{module:version}";
Binnen de loops zou dat een veiligheidsprobleem kunnen zijn met user input.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$data
= array(
    "users" => array(
        array(
            "username" => "Jan {password}",
            "password" => "henk24",
            "email" => "[email protected]"
        ),
        array(
            "username" => "Zwarte Piet",
            "password" => "Frits",
            "email" => "[email protected]"
        )
    )
);


$template = <<<END
<div class="menu">
    <!-- loop users start -->
        <p>Ik ben {username} en ben te bereiken op {email}</p>
    <!-- loop users end -->
</div>
END
;
?>


Verder is het jammer dat de settings functie maar beperkt is tot 3 niveaus. Ik weet niet of je in praktijk dieper zal gaan, maar als je preg_replace_callback had gebruikt zou je vrij gemakkelijk onbeperkt diep kunnen gaan. Ook de loops zijn maar maximaal 2 niveaus?

Persoonlijk mis ik de if-else blokken nog een beetje (bijv. een for-loop met een else-clause voor wanneer de loop leeg is, een if-blok voor wanneer iemand wel of niet is ingelogd) en het automatisch escapen van output (zodat gebruikers niet zomaar HTML ergens tussen kunnen zetten) maar daarbuiten is hij best mooi voor kleine sites!

Wat ik vooral leuk vind is dat de syntax mooi mixt met HTML. Volgens mij kan je deze HTML ook gewoon weergeven als statische pagina, wat soms wel zo handig is wanneer je je templates aan het ontwerpen bent.

Tot slot, er gaat nog iets mis wanneer je cijfers wilt laten vullen via dat op-basis-van-$atr-toevoegen-van-inhoud:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$data
= array(
    "users" => array(
        array('test' => 'abcd'),
        array('test' => '1234')
    )
);


$template = <<<END
<div class="menu">
    <!-- loop users start -->
        <span class="test">Hoi-</span>
    <!-- loop users end -->
</div>
END
;
/* geeft:
<div class="menu">
    <span class="test">Hoi-abcd</span>
    <span class="test">234</span>    
</div>
*/

?>
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Hendel Berg
Hendel Berg
17 jaar geleden
 
0 +1 -0 -1
@toby hinloopen
Het is inderdaad -helaas- erg stilletjes. Ben meer feedback gewend.

@Jelmer
Bedankt voor je uitgebreide reactie! Het ging mij inderdaad ook voornamelijk om de mix met HTML. Volgende week ga ik aan de slag met de feedback die je hebt gegeven.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. css-class-name-template-parser

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.