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?
<?php
define('NL', "\n");
define('XMLB_OUTPUT_XML', 0);
define('XMLB_OUTPUT_HTML', 1);
class xmlb_node
{
private $tagname = '';
private $childnodes = array();
private $attributes = array();
private $parent = 0;
private $template = '';
private $level = 0;
private $output_type = 0;
# $tagname - De root-tag die alle xml-bestanden nodig hebben
# $parent_template = De parenttag, of template
function xmlb_node($tagname, $parent_template = '')
{
$this->tagname = $tagname;
if(is_object($parent_template))
{
$this->parent = $parent_template;
$this->level = $this->parent->get_level() + 1;
}else
{
$this->template = $parent_template;
}
}
# Maakt een childtag aan in deze tag
function create_child($tagname)
{
$this->childnodes[] = new xmlb_node($tagname, $this);
return $this->childnodes[count($this->childnodes) - 1];
}
# Maakt een chidtag, alleen tekst bevattend (en attributes)
function create_text_child($tagname)
{
$this->childnodes[] = new xmlb_text_node($tagname, $this);
return $this->childnodes[count($this->childnodes) - 1];
}
# Maakt childtags aan (en die bevatten weer text-childs) uit een array, bijvoorbeeld vanuit de db
function import_children($childname, $dat)
{
foreach($dat as $d)
{
$child = $this->create_child($childname);
$child->import_text_children($d);
}
}
# Maakt een aantal text-childs aan
function import_text_children($dat)
{
$dat = (array)$dat;
foreach($dat as $k => $d)
{
$child = $this->create_text_child($k);
$child->set_content($d);
}
}
# Set een attribute voor deze tag, dus zo: <$tagname $attribute="$content"...
function set_attribute($attribute, $content)
{
$this->attributes[$attribute] = $content;
}
# Het indent-level van deze tag
function get_level()
{
return $this->level;
}
# Op welke manier outputten? HTML, dus al vooraf getransformed met XSLT, of gewoon XML?
function set_output_type($type = XMLB_OUTPUT_XML)
{
$this->output_type = $type;
}
# Zorgt ervoor dat je echo $xml; kunt doen
# Maakt een xml/html string van de data
function __toString()
{
$attr = '';
foreach($this->attributes as $a => $c)
{
$attr .= ' '.$a.'="'.$c.'"';
}
$contents = '';
foreach($this->childnodes as $node)
{
$contents .= $node->__toString();
}
# Leesbaar?
# Het maakt een ?xml aan als deze tag de root-tag is.
# Als het xml-output is, en als er een template is, zet het er ook nog een xml-stylesheet bij
# Nu komt de indent, met de opentag attributes, inhoud, en sluittag
$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;
if($this->output_type == XMLB_OUTPUT_XML)
{
header('content-type: text/xml');
return $xml;
}else
{
$arguments = array('/_xml' => $xml);
$xsltproc = xslt_create();
xslt_set_encoding($xsltproc, 'ISO-8859-1');
$html = xslt_process($xsltproc, 'arg:/_xml', $this->template, NULL, $arguments);
if (empty($html)) {
die('XSLT processing error: '. xslt_error($xsltproc));
}
xslt_free($xsltproc);
return $html;
}
}
}
class xmlb_text_node
{
private $tagname = '';
private $attributes = array();
private $content = '';
private $parent;
# constructor
function xmlb_text_node($tagname, $parent)
{
$this->tagname = $tagname;
$this->parent = $parent;
$this->level = $this->parent->get_level() + 1;
}
# Set content: <$tagname>$content</$tagname>
function set_content($content)
{
$this->content = $content;
}
# Set een attribute voor deze tag, dus zo: <$tagname $attribute="$content"...
function set_attribute($attribute, $content)
{
$this->attributes[$attribute] = $content;
}
# Maak een xmlstring van deze tag: $indent<$tagname [$attribute="$attr_content]>$content</$tagname>
function __toString()
{
$attr = '';
foreach($this->attributes as $a => $c)
{
$attr .= ' '.$a.'="'.$c.'"';
}
return str_repeat(' ', $this->level).'<'.$this->tagname.$attr.'>'.$this->content.'</'.$this->tagname.'>'.NL;
}
}
?>
<?php define('XMLB_OUTPUT_HTML', 1); class xmlb_node { private $tagname = ''; private $childnodes = array(); private $attributes = array(); private $parent = 0; private $template = ''; private $level = 0; private $output_type = 0; # $tagname - De root-tag die alle xml-bestanden nodig hebben # $parent_template = De parenttag, of template function xmlb_node($tagname, $parent_template = '') { $this->tagname = $tagname; { $this->parent = $parent_template; $this->level = $this->parent->get_level() + 1; }else { $this->template = $parent_template; } } # Maakt een childtag aan in deze tag function create_child($tagname) { $this->childnodes[] = new xmlb_node($tagname, $this); return $this->childnodes[count($this->childnodes) - 1]; } # Maakt een chidtag, alleen tekst bevattend (en attributes) function create_text_child($tagname) { $this->childnodes[] = new xmlb_text_node($tagname, $this); return $this->childnodes[count($this->childnodes) - 1]; } # Maakt childtags aan (en die bevatten weer text-childs) uit een array, bijvoorbeeld vanuit de db function import_children($childname, $dat) { foreach($dat as $d) { $child = $this->create_child($childname); $child->import_text_children($d); } } # Maakt een aantal text-childs aan function import_text_children($dat) { foreach($dat as $k => $d) { $child = $this->create_text_child($k); $child->set_content($d); } } # Set een attribute voor deze tag, dus zo: <$tagname $attribute="$content"... function set_attribute($attribute, $content) { $this->attributes[$attribute] = $content; } # Het indent-level van deze tag function get_level() { return $this->level; } # Op welke manier outputten? HTML, dus al vooraf getransformed met XSLT, of gewoon XML? function set_output_type($type = XMLB_OUTPUT_XML) { $this->output_type = $type; } # Zorgt ervoor dat je echo $xml; kunt doen # Maakt een xml/html string van de data function __toString() { $attr = ''; foreach($this->attributes as $a => $c) { $attr .= ' '.$a.'="'.$c.'"'; } $contents = ''; foreach($this->childnodes as $node) { $contents .= $node->__toString(); } # Leesbaar? # Het maakt een ?xml aan als deze tag de root-tag is. # Als het xml-output is, en als er een template is, zet het er ook nog een xml-stylesheet bij # Nu komt de indent, met de opentag attributes, inhoud, en sluittag $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 ; if($this->output_type == XMLB_OUTPUT_XML) { header('content-type: text/xml'); return $xml; }else { $arguments = array('/_xml' => $xml); $xsltproc = xslt_create(); xslt_set_encoding($xsltproc, 'ISO-8859-1'); $html = xslt_process($xsltproc, 'arg:/_xml', $this->template, NULL, $arguments); die('XSLT processing error: '. xslt_error ($xsltproc)); } xslt_free($xsltproc); return $html; } } } class xmlb_text_node { private $tagname = ''; private $attributes = array(); private $content = ''; private $parent; # constructor function xmlb_text_node($tagname, $parent) { $this->tagname = $tagname; $this->parent = $parent; $this->level = $this->parent->get_level() + 1; } # Set content: <$tagname>$content</$tagname> function set_content($content) { $this->content = $content; } # Set een attribute voor deze tag, dus zo: <$tagname $attribute="$content"... function set_attribute($attribute, $content) { $this->attributes[$attribute] = $content; } # Maak een xmlstring van deze tag: $indent<$tagname [$attribute="$attr_content]>$content</$tagname> function __toString() { $attr = ''; foreach($this->attributes as $a => $c) { $attr .= ' '.$a.'="'.$c.'"'; } return str_repeat(' ', $this->level).'<'.$this->tagname.$attr.'>'.$this->content.'</'.$this->tagname.'>'.NL ; } } ?>
<?php
error_reporting(E_ALL);
include 'XMLBuilder.php';
$dat1 = array('title' => 'dat1 title', 'artist' => 'dat1 artist');
$dat2 = array(array('title' => 'dat1 title', 'artist' => 'dat1 artist'), array('title' => 'dat1 title', 'artist' => 'dat1 artist'), array('title' => 'dat1 title', 'artist' => 'dat1 artist'));
$xml = new xmlb_node('catalog', 'template.xml');
$xml->set_output_type(XMLB_OUTPUT_HTML);
$xml->import_children('cd', $dat2);
$cd = $xml->create_child('cd');
$cd->set_attribute('type', 'dvd');
$cd->import_text_children($dat1);
$title = $cd->create_text_child('title');
$title->set_content('Empire Burlesque');
$title->set_attribute('type', 'dvd');
$artist = $cd->create_text_child('artist');
$artist->set_content('Bob Dylan');
echo $xml;
?>
<?php include 'XMLBuilder.php'; $dat1 = array('title' => 'dat1 title', 'artist' => 'dat1 artist'); $dat2 = array(array('title' => 'dat1 title', 'artist' => 'dat1 artist'), array('title' => 'dat1 title', 'artist' => 'dat1 artist'), array('title' => 'dat1 title', 'artist' => 'dat1 artist')); $xml = new xmlb_node('catalog', 'template.xml'); $xml->set_output_type(XMLB_OUTPUT_HTML); $xml->import_children('cd', $dat2); $cd = $xml->create_child('cd'); $cd->set_attribute('type', 'dvd'); $cd->import_text_children($dat1); $title = $cd->create_text_child('title'); $title->set_content('Empire Burlesque'); $title->set_attribute('type', 'dvd'); $artist = $cd->create_text_child('artist'); $artist->set_content('Bob Dylan'); ?>
Dit maakt deze xmlcode:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="template.xml"?>
<catalog>
<cd>
<title>dat1 title</title>
<artist>dat1 artist</artist>
</cd>
<cd>
<title>dat1 title</title>
<artist>dat1 artist</artist>
</cd>
<cd>
<title>dat1 title</title>
<artist>dat1 artist</artist>
</cd>
<cd type="dvd">
<title>dat1 title</title>
<artist>dat1 artist</artist>
<title type="dvd">Empire Burlesque</title>
<artist>Bob Dylan</artist>
</cd>
</catalog>
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet type="text/xsl" href="template.xml"?> <catalog> <cd> <title>dat1 title</title> <artist>dat1 artist</artist> </cd> <cd> <title>dat1 title</title> <artist>dat1 artist</artist> </cd> <cd> <title>dat1 title</title> <artist>dat1 artist</artist> </cd> <cd type="dvd"> <title>dat1 title</title> <artist>dat1 artist</artist> <title type="dvd">Empire Burlesque</title> <artist>Bob Dylan</artist> </cd> </catalog>
XSLT:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left">Title</th>
<th align="left">Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th align="left">Title</th> <th align="left">Artist</th> </tr> <xsl:for-each select="catalog/cd"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
|