Avatar billede AnyFellow Mester
29. juni 2016 - 13:57 Der er 16 kommentarer og
1 løsning

Opbygning af side der anvender template

Jeg er i gang med at overveje hvordan jeg kan opbygge et system, der anvender templates.

Selve hjemmesiden er forholdsvis kompleks, men jeg ønsker relativt let at kunne skifte udseende, idet systemet anvendes på flere forskellige domæner, der på sigt skal have sit eget layout.

Jeg har tænkt følgende eksempel (total forsimplet):

<?php
// Get header
$page = "http://".$_SERVER['SERVER_ADDR']."/test/header.tmpl";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $page);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$page_header = curl_exec($ch);
curl_close($ch);
$page_header = str_replace("{logo}", "LOGO", $page_header);

// Get content
$page = "http://".$_SERVER['SERVER_ADDR']."/test/test.tmpl";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $page);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$page_content = curl_exec($ch);
curl_close($ch);
// Her genereres content. Det kan godt være f.eks. 500 linjers php-kode der anvendes.
$page_content = str_replace("{title}", "TITLE", $page_content);
$page_content = str_replace("{content}", "CONTENT", $page_content);

// Get footer
$page = "http://".$_SERVER['SERVER_ADDR']."/test/footer.tmpl";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $page);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$page_footer = curl_exec($ch);
curl_close($ch);
$page_footer = str_replace("{company_info}", "COMPANY INFO", $page_footer);

echo $page_header;
echo $page_content;
echo $page_footer;
?>


Er det helt håbløst hastighedsmæssigt, eller er der andet der taler for at jeg skal lave en anden opbygning?

Opbygningen vil blive foretaget efter oop-principper, men hver undersige vil således have 3 curl-kørsler. Er det bedre at gemme header og footer i en sessionsvariabel, idet de ikke vil ændre sig for alle undersider, efter de er hentet første gang?
Avatar billede Slater Ekspert
29. juni 2016 - 14:09 #1
Det virker lidt bizart at bruge HTTP i den situation. Filerne ligger vel på samme maskine? Hvad er der galt med bare file_get_contents() ?
Avatar billede AnyFellow Mester
29. juni 2016 - 14:20 #2
Den blev fravalgt på baggrund af at mange webhoteller ikke tillader den.
Avatar billede Slater Ekspert
29. juni 2016 - 14:24 #3
Nogle tillader den ikke med URL'er i, men det er jo også netop det du skal undlade at bruge, men i stedet bruge lokale stier til filerne.

Hvis et webhotel ikke tillader dig at gøre det, så løb skrigende væk og find et andet hotel. Men det har jeg heller ikke hørt om nogen der ikke gør.
Avatar billede AnyFellow Mester
29. juni 2016 - 14:31 #4
Okay, har heller ikke selv de store erfaringer med hvad alle mulige webhoteller gør. Har læst en del artikler omkring at bruge file_get_contents vs cURL og der står det ofte nævnt.

De websites jeg har besøgt skriver også at hastigheden er stort set identisk.

Derfor faldt valget på cURL.

Hvis hastigheden er forholdsvis ens, er det afgørende ikke hvilken der anvendes, men om det generelt er en fornuftig måde at opbygge siden på, eller strukturen skal være helt anderledes?
Avatar billede Slater Ekspert
29. juni 2016 - 14:37 #5
Hastigheden er ens hvis du henter en URL. Men du skal ikke hente en URL, du skal hente lokale filer. Der er hastigheden 10-20 gange hurtigere, og bruger langt færre systemressourcer.

Det er klart, at når du slår op på cURL (som kun kan hente over internet) vs. file_get_contents() (som kan begge dele), så vil du finde folk der sammenligner dem mht. at hente en URL, ikke en lokal fil. Men det er altså ikke det relevante her.

Der er intet galt i at hente 3 filer ved hver kørsel. Men er du nødt til at hente 3 filer via HTTP i din kode alene, så vil jeg sige der er noget helt galt med strukturen.
Avatar billede AnyFellow Mester
29. juni 2016 - 14:42 #6
Okay, filerne der hentes vil altid ligge lokal.

Jeg vil kigge på file_get_contents så.
Avatar billede AnyFellow Mester
29. juni 2016 - 14:46 #7
Et alternativ kunne være at inkludere f.eks. footer som footer.php.

Indholdet der skal outputtes kan så gemmes i en variabel, på samme måde som f.eks. $page_footer ovenfor.

Det ville give nogle fordele i forhold til at kunne implementere demodata i hver template, men hvilke ulemper det vil give kan jeg ikke gennemskue.

Man må næste tro at hastigheden er dårligere, idet der skal parses ved hver fil.
Avatar billede arne_v Ekspert
29. juni 2016 - 14:48 #8
Foerste spoergsmaal: har du kigget paa nogle af de mange eksisterende template systemer og set om de kunne opfylde dine behov?

http://www.smarty.net/
http://twig.sensiolabs.org/
http://platesphp.com/
http://dwoo.org/
https://laravel.com/docs/5.1/blade
etc.
Avatar billede arne_v Ekspert
29. juni 2016 - 14:49 #9
Bemaerk at jeg ikke kender nogle af disse personligt. Men der er sjaeldent grund til at genopfinde hjulet.
Avatar billede AnyFellow Mester
29. juni 2016 - 14:56 #10
Jeg har kigget på dem og også muligheden for at anvende et open source system og så lave en template + et plugin til at håndtere systemet på min side, men det er min oplevelse at det er alt for omstændigt at lave ændringer i de ting systemet standard har bestemt.

Det hænger selvfølgelig sammen med at jeg ikke er ekspert i de nævnte systemer, men den tid vil jeg hellere bruge på at videreudvikle min egen base, idet den anvendes på en del hjemmesider, der kræver hurtig respons ved fundne fejl.
Avatar billede arne_v Ekspert
29. juni 2016 - 17:04 #11
Jeg er stadig skeptisk. NIH syndrom og alt det der.
Avatar billede arne_v Ekspert
29. juni 2016 - 17:07 #12
Men lad os nu antage at du har brug for dit eget.

Saa gaar mine tanker i retning af:
- externalisere de faste erstatninger i konfig fil saaledes at samme PHP kode kan processe samme templates med forskellige konfig fil
- suppler med en dynamisk erstatning hvor placeholder erstattes af PHP kode output
Avatar billede AnyFellow Mester
29. juni 2016 - 19:33 #13
Den dynamiske erstatning af placeholders er nok det optimale alle steder, idet alt der ændrer sig fra domæne til domæne hentes fra databasen.
Avatar billede arne_v Ekspert
29. juni 2016 - 19:43 #14
Databaser er gode til data, men ikke noedvendigvis gode til konfiguration. Dine eksempler ovenfor lyder som konfiguration.

Men lad os antage database.

Saa en simpel mapning fra tag til PHP funktion.

{php:foobar} erstattes med retur vaerdi fra funktionen foobar.

Eller en anden konvention.

Men i.s.f. soeg og erstat, saa parser du template og processer alle placeholders.
Avatar billede arne_v Ekspert
29. juni 2016 - 20:06 #15
Eksempel:


<?php
function worktype() {
    return 'demo';
}

function apptype() {
    return 'template';
}

function dyn_replace($s) {
    $res = $s;
    preg_match_all('/{php:(\S+)}/is', $s, $matches);
    for($i = 0; $i < count($matches[0]); $i++) {
        $placeholder = $matches[0][$i];
        $func = $matches[1][$i];
        $res = str_replace($placeholder, $func(), $res);
    }
    return $res;
}

$template = 'This is just a {php:worktype} of {php:apptype}';

echo dyn_replace($template);
?>
Avatar billede arne_v Ekspert
31. juli 2016 - 01:00 #16
kfisker?
Avatar billede AnyFellow Mester
01. august 2016 - 09:37 #17
Hov, beklager jeg ikke fik vendt tilbage med resultatet.

Jeg endte med at bruge din skitserede løsning, om end i en tilpasset udgave.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester