login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Goede code

Offline Fenrir - 29/05/2005 20:24 (laatste wijziging 29/05/2005 20:25)
Avatar van FenrirPHP expert Wat is goede code?

1.
  1. <?php
  2. $tpl->CreateNewBlock1($block1);
  3. $block1->assigntitle('de titel');
  4. ?>

of:
2.
  1. <?php
  2. $block1 = $tpl->CreateNewBlock('Block1');
  3. $block1->assign('title', 'de titel');
  4. ?>


Dus bij 1 is er een class tpl met een magische __call() methode, die met een reference een nieuw block-object maakt.
Of bij 2 dat tpl::CreateNewBlock(str $s) een block-object teruggeeft, van het type $s?

Duidelijk?

Alvast bedankt!

Jules

4 antwoorden

Gesponsorde links
Offline Thomas - 29/05/2005 20:35
Avatar van Thomas Moderator #2 lijkt mij minder verwarrend.
Je beschouwt $block1 als apart object, dus behandel het ook als zodanig.
Bij #1 zou je $block1 via $tpl moeten aanspreken lijkt mij, maar $tpl spuugt weer een nieuw object uit... verwarrend.
Offline Rens - 29/05/2005 20:43
Avatar van Rens Gouden medaille

Crew algemeen
Ik ben het met FangorN eens.
Je gebruikt eerst $tpl, en gaat dan opeens een ander object gebruiken.
Dit kan inderdaad verwarring veroorzaken, en zeker voor mensen die minder ver zijn met OOP...
Ik zou $tpl blijven gebruiken:).
Offline Fenrir - 29/05/2005 20:49 (laatste wijziging 29/05/2005 20:54)
Avatar van Fenrir PHP expert
Citaat:
Ik zou $tpl blijven gebruiken.
Dat kan, maar dan moet ik er een $tpl->closeblock() voor maken, want anders weet $tpl niet wanneer block1 ophoudt.

$tpl maakt dus een object, en behoudt een reference daarvan. Dit is mijn xml-maak class, en het moet een soort template-engine worden. Manier #2 is korter, maar #1 is normaler denk ik. Nu gebruikt het manier #1, maar misschien is #2 beter?

  1. <?php
  2.  
  3. define('NL', "\n");
  4. define('XMLB_OUTPUT_XML', 0);
  5. define('XMLB_OUTPUT_HTML', 1);
  6.  
  7. class xmlb_node
  8. {
  9. private $tagname = '';
  10. private $childnodes = array();
  11. private $attributes = array();
  12. private $parent = 0;
  13. private $template = '';
  14. private $level = 0;
  15. private $output_type = 0;
  16.  
  17. # $tagname - De root-tag die alle xml-bestanden nodig hebben
  18. # $parent_template = De parenttag, of template
  19. function xmlb_node($tagname, $parent_template = '')
  20. {
  21. $this->tagname = $tagname;
  22.  
  23. if(is_object($parent_template))
  24. {
  25. $this->parent = $parent_template;
  26.  
  27. $this->level = $this->parent->get_level() + 1;
  28. }else
  29. {
  30. $this->template = $parent_template;
  31. }
  32. }
  33.  
  34. # Maakt een childtag aan in deze tag
  35. function create_child($tagname)
  36. {
  37. $this->childnodes[] = new xmlb_node($tagname, $this);
  38. return $this->childnodes[count($this->childnodes) - 1];
  39. }
  40.  
  41. # Maakt een chidtag, alleen tekst bevattend (en attributes)
  42. function create_text_child($tagname)
  43. {
  44. $this->childnodes[] = new xmlb_text_node($tagname, $this);
  45. return $this->childnodes[count($this->childnodes) - 1];
  46. }
  47.  
  48. # Maakt childtags aan (en die bevatten weer text-childs) uit een array, bijvoorbeeld vanuit de db
  49. function import_children($childname, $dat)
  50. {
  51. foreach($dat as $d)
  52. {
  53. $child = $this->create_child($childname);
  54. $child->import_text_children($d);
  55. }
  56. }
  57.  
  58. # Maakt een aantal text-childs aan
  59. function import_text_children($dat)
  60. {
  61. $dat = (array)$dat;
  62. foreach($dat as $k => $d)
  63. {
  64. $child = $this->create_text_child($k);
  65. $child->set_content($d);
  66. }
  67. }
  68.  
  69. # Set een attribute voor deze tag, dus zo: <$tagname $attribute="$content"...
  70. function set_attribute($attribute, $content)
  71. {
  72. $this->attributes[$attribute] = $content;
  73. }
  74.  
  75. # Het indent-level van deze tag
  76. function get_level()
  77. {
  78. return $this->level;
  79. }
  80.  
  81. # Op welke manier outputten? HTML, dus al vooraf getransformed met XSLT, of gewoon XML?
  82. function set_output_type($type = XMLB_OUTPUT_XML)
  83. {
  84. $this->output_type = $type;
  85. }
  86.  
  87. # Zorgt ervoor dat je echo $xml; kunt doen
  88. # Maakt een xml/html string van de data
  89. function __toString()
  90. {
  91. $attr = '';
  92. foreach($this->attributes as $a => $c)
  93. {
  94. $attr .= ' '.$a.'="'.$c.'"';
  95. }
  96.  
  97. $contents = '';
  98. foreach($this->childnodes as $node)
  99. {
  100. $contents .= $node->__toString();
  101. }
  102.  
  103. # Leesbaar?
  104. # Het maakt een ?xml aan als deze tag de root-tag is.
  105. # Als het xml-output is, en als er een template is, zet het er ook nog een xml-stylesheet bij
  106. # Nu komt de indent, met de opentag attributes, inhoud, en sluittag
  107. $xml = ($this->parent === 0 ? '<?xml version="1.0" encoding="ISO-8859-1"?>'.NL.($this->output_type == XMLB_OUTPUT_XML && $this->template != '' ? '<?xml-stylesheet type="text/xsl" href="'.$this->template.'"?>'.NL : '') : str_repeat(' ', $this->level)).'<'.$this->tagname.$attr.'>'.NL.$contents.str_repeat(' ', $this->level).'</'.$this->tagname.'>'.NL;
  108.  
  109. if($this->output_type == XMLB_OUTPUT_XML)
  110. {
  111. header('content-type: text/xml');
  112. return $xml;
  113. }else
  114. {
  115. $arguments = array('/_xml' => $xml);
  116. $xsltproc = xslt_create();
  117. xslt_set_encoding($xsltproc, 'ISO-8859-1');
  118. $html = xslt_process($xsltproc, 'arg:/_xml', $this->template, NULL, $arguments);
  119.  
  120. if (empty($html)) {
  121. die('XSLT processing error: '. xslt_error($xsltproc));
  122. }
  123.  
  124. xslt_free($xsltproc);
  125. return $html;
  126. }
  127. }
  128. }
  129.  
  130. class xmlb_text_node
  131. {
  132. private $tagname = '';
  133. private $attributes = array();
  134. private $content = '';
  135. private $parent;
  136.  
  137. # constructor
  138. function xmlb_text_node($tagname, $parent)
  139. {
  140. $this->tagname = $tagname;
  141. $this->parent = $parent;
  142. $this->level = $this->parent->get_level() + 1;
  143. }
  144.  
  145. # Set content: <$tagname>$content</$tagname>
  146. function set_content($content)
  147. {
  148. $this->content = $content;
  149. }
  150.  
  151. # Set een attribute voor deze tag, dus zo: <$tagname $attribute="$content"...
  152. function set_attribute($attribute, $content)
  153. {
  154. $this->attributes[$attribute] = $content;
  155. }
  156.  
  157. # Maak een xmlstring van deze tag: $indent<$tagname [$attribute="$attr_content]>$content</$tagname>
  158. function __toString()
  159. {
  160. $attr = '';
  161. foreach($this->attributes as $a => $c)
  162. {
  163. $attr .= ' '.$a.'="'.$c.'"';
  164. }
  165.  
  166. return str_repeat(' ', $this->level).'<'.$this->tagname.$attr.'>'.$this->content.'</'.$this->tagname.'>'.NL;
  167. }
  168. }
  169.  
  170. ?>


  1. <?php
  2.  
  3.  
  4. include 'XMLBuilder.php';
  5.  
  6. $dat1 = array('title' => 'dat1 title', 'artist' => 'dat1 artist');
  7. $dat2 = array(array('title' => 'dat1 title', 'artist' => 'dat1 artist'), array('title' => 'dat1 title', 'artist' => 'dat1 artist'), array('title' => 'dat1 title', 'artist' => 'dat1 artist'));
  8.  
  9. $xml = new xmlb_node('catalog', 'template.xml');
  10.  
  11. $xml->set_output_type(XMLB_OUTPUT_HTML);
  12.  
  13. $xml->import_children('cd', $dat2);
  14.  
  15. $cd = $xml->create_child('cd');
  16. $cd->set_attribute('type', 'dvd');
  17.  
  18. $cd->import_text_children($dat1);
  19.  
  20. $title = $cd->create_text_child('title');
  21. $title->set_content('Empire Burlesque');
  22. $title->set_attribute('type', 'dvd');
  23.  
  24. $artist = $cd->create_text_child('artist');
  25. $artist->set_content('Bob Dylan');
  26.  
  27. echo $xml;
  28.  
  29. ?>

Dit maakt deze xmlcode:
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <?xml-stylesheet type="text/xsl" href="template.xml"?>
  3. <catalog>
  4. <cd>
  5. <title>dat1 title</title>
  6. <artist>dat1 artist</artist>
  7. </cd>
  8. <cd>
  9. <title>dat1 title</title>
  10.  
  11. <artist>dat1 artist</artist>
  12. </cd>
  13. <cd>
  14. <title>dat1 title</title>
  15. <artist>dat1 artist</artist>
  16. </cd>
  17. <cd type="dvd">
  18.  
  19. <title>dat1 title</title>
  20. <artist>dat1 artist</artist>
  21. <title type="dvd">Empire Burlesque</title>
  22. <artist>Bob Dylan</artist>
  23. </cd>
  24. </catalog>

XSLT:
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2.  
  3. <xsl:stylesheet version="1.0"
  4. xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  5.  
  6. <xsl:template match="/">
  7. <html>
  8. <body>
  9. <h2>My CD Collection</h2>
  10. <table border="1">
  11. <tr bgcolor="#9acd32">
  12. <th align="left">Title</th>
  13. <th align="left">Artist</th>
  14. </tr>
  15. <xsl:for-each select="catalog/cd">
  16. <tr>
  17. <td><xsl:value-of select="title"/></td>
  18. <td><xsl:value-of select="artist"/></td>
  19. </tr>
  20. </xsl:for-each>
  21. </table>
  22. </body>
  23. </html>
  24. </xsl:template>
  25.  
  26. </xsl:stylesheet>
Offline Thomas - 29/05/2005 20:59
Avatar van Thomas Moderator Je kan binnen $tpl prima een array van blocks bijhouden hoor. Blocks horen toch bij een template ?
Alles in classes stoppen maakt iets nog niet object-georiënteerd .
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.241s