[PHP] OOp HTML en php gescheiden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
ik ben momenteel bezig met het leren van OOP programmeren in PHP.
Nu wil ik graag de HTML en de PHP code zo veel mogelijk gescheiden houden, dus liefst geen echo's in mn class.
hoe kan ik dat het beste doen (zonder frameworks etc)?
als voorbeeld heb ik een reactie class:
html output (dit voor elke reactie):
HTML:
1
2
3
4
5
<p>
BERICHT
<div style="font-size:12px">Reactie door <a href="?page=users&amp;user=USERID">NAAM (van poster)</a> - DATUM </div> 
</p> 
<div id="tussenruimte" style="height:50px;"></div>

(let niet op de html code :P)
ik zou bijvoorbeeld alle reacties in een array terug kunnen sturen en dan met bijv een foreach() elke keer die html kunnen outputten, is dat een goede manier?
edit: oeps, OOP moet het zijn in de titel.

[ Voor 4% gewijzigd door dragontje124 op 03-11-2009 22:09 ]


Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Nu online

orf

Je kunt zoiets doen:

PHP:
1
2
3
4
5
6
7
<?php
$oMessage = new Messages();
$aMessages = $oMessage->getMessages();

require 'template.php';

?>


template.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<html>
....
<body>
<?php foreach($aMessages as $aMessage): ?>

<h1><?php echo $aMessage['titel']; ?></h1>

<p><?php echo $aMessage['bericht']; ?></p>

<?php endforeach; ?>
</body>
</html>


Je kunt ook placeholders gebruiken in een template en die vervangen. Al loop je dan al snel tegen problemen op met loops e.d. Een alernatief is om een template engine te gebruiken. Smarty is een bekende engine.

Op dit forum zijn de meningen nogal verdeeld. Je kunt PHP zelf ook als template engine zien. Persoonlijk gebruik ik liever Smarty.

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
OOP heeft eigenlijk niets te maken met het scheiden van logica en presentatie. Je kan in je logica prima op een OOP manier bezig zijn, maar dat is niet een requirement voor de scheiding.

Een scheiding maak je aan door aparte templates te maken en deze te renderen. Dit kan je doen door een template systeem in te schakelen. Er zijn bestaande (Smarty wordt veel gebruikt), maar php zelf is prima in staat om te gebruiken als template scripttaal (waarbij Smarty voor onnodige overhead zorgt).

Daarnaast kan het gebruik van het MVC pattern je helpen stricter om te gaan met het scheiden van je presentatie. Met MVC wordt je meer gedwongen na te denken over wat nu een "ding" is wat gegevens bevat (model), wat een onderdeel is wat de gegevens bewerkt en/of vergaart (controller) en het onderdeel wat de presentatie verzorgt (view). De view kan je ook gemakkelijker transformeren zodat je snel kan wisselen van html naar xml naar pdf en rtf, bijvoorbeeld :)

Je kan, om concreet op je vraag in te gaan, zoiets al om een heel simpele manier bewerkstelligen door iets als dit te doen:
PHP:
1
2
3
4
5
6
7
$reactions = $article->getReactions();
$template = new TemplateParser();
$template->assign('article', $article);
$template->assign('reactions', $reactions);
$html = $template->render('my-template.php');

ResponseContainer::appendHtml($html);
En dan kan je een template maken als hieronder:
PHP:
1
2
3
4
5
6
7
8
9
10
<? foreach ($this->reactions as $reaction):?>
<p>
  <?= $reaction->getContent()?>
  <div style="font-size:12px">Reactie door 
  <a href="?page=users&amp;user=<?= $reaction->getUser()->getId()?>">
    <?= $reaction->getUser()->getName()?>
  </a>
   - <?= $reaction->getDate?> </div> 
</p>
<? endforeach ?>
Ik zou niet direct includen omdat je zeer snel in de war bent met bestaande variabelen en onderdelen in je template.

En tot slot: wat is dat toch dat iedere php persoon nu ineens die (nofi) :r VB-style notatie gaat gebruiken? $aMessage, $iAantal, $sText. Brrrr....

[ Voor 10% gewijzigd door mithras op 03-11-2009 22:25 ]


Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
@orf
ja daar zat ik inderdaad ook aan te denken, alles in een array returnen en dan gewoon in een foreach loopje.

@mithras
een heel template systeem schrijven is in dit geval denk ik een beetje overkill :P
maar een array returnen is dus toch de goede manier en dan met een foreach

[ Voor 45% gewijzigd door dragontje124 op 03-11-2009 22:30 ]


Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Nu online

orf

mithras schreef op dinsdag 03 november 2009 @ 22:16:
En tot slot: wat is dat toch dat iedere php persoon nu ineens die (nofi) :r VB-style notatie gaat gebruiken? $aMessage, $iAantal, $sText. Brrrr....
Over je punt van direct includen: Volledig mee eens; als snel voorbeeldje vond ik het nog wel geschikt. Over deze notatie: Bedrijfs conventies waar ik volledig achter sta. Juist omdat PHP loosely typed is vind ik het goed om met je variabelnamen aan te geven wat de variabele bevat. Maat laten we daar geen (meta)discussie over beginnen. ;)

Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
orf schreef op dinsdag 03 november 2009 @ 22:30:
[...]


Over je punt van direct includen: Volledig mee eens; als snel voorbeeldje vond ik het nog wel geschikt. Over deze notatie: Bedrijfs conventies waar ik volledig achter sta. Juist omdat PHP loosely typed is vind ik het goed om met je variabelnamen aan te geven wat de variabele bevat. Maat laten we daar geen (meta)discussie over beginnen. ;)
hoe zou ik het dan beter kunnen doen ipv direct includen? toch met een template systeem?

Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Nu online

orf

Dat hoeft niet iets heel ingewikkelds te zijn. Met een vrij simpele class kom je een heel eind. Mithras hierboven heeft een assign functie die variabelen toekent aan de template class. Met output buffering kun je de template inculden en met ob_get_contents() kun je de content uit de template ophalen.

Hier een opzetje uit de losse pols (hier getypt dus niet getest oid):

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
<?php

class template{
    
    public function __construct(){
    }
    
    public function assign($sVarname, $mValue){
        $this->$sVarname = $mValue;
    }
    
    public function fetch($sPath){
        
        ob_start();
        require $sPath;
        
        $sReturn = ob_get_contents();
        
        ob_end_clean();

        return $sReturn;
        
    }
    
    public function output($sPath){
        echo $this->fetch($sPath);
    }   
}

$oTemplate = new template();
$oTemplate->assign('aMessages',  $aMessages);
$oTemplate->assign('aReactions', $aReactions);

Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
ah ok bedankt :)
Pagina: 1