HTML Helper
Met deze html helper genereert u makkelijk uw html tags.
De uitleg staat in de class zelf, en in index.php is een voorbeeld pagina gegeven, waar gebruik word gemaakt van alle tags van de helper.
Nu biedt de helper ondersteuning aan de volgende tags:
- Document type
- Meta tags (inclusief title tag)
- Link tags (hiermee word de <link> tag in de head van de pagina bedoelt, en niet de <a> tag)
- Anchor tags
- Image tags
- BR tags (enters)
- Heading tags (h1,h2,h3 enz)
- Paragrafen
- Diversen
- Ongeordende, geordende en defenitie lijsten
Later zullen meer tags volgen. Opmerkingen altijd welkom.
Veranderingen :
- Broncode van index.php toegevoegd
- \n variabele veranderd in PHP_EOL
- var veranderd in private
- public voor function toegevoegd
- '' en ' worden nu veranderd in " en '
- het stukje code voor de overige attributen staat nu in een functie
Gesponsorde koppelingen
PHP script bestanden
25 reacties op 'HTML Helper'
Gesponsorde koppelingen
Ik heb net even de html die index.php geeft eronder gezet. Lijkt mij netzo handig als online demo.
En waarom ik var gebruik? Ik weet niet beter. Wat is beter om te gebruiken?
En ook van de PHP_EOL had ik nog nooit van gehoord, maar die kan ik inderdaad beter gebruiken. Heb het aangepast.
EDIT: Heb even gegoogled, ik zou private moeten gebruiken ipv var. Heb ook dat aangepast.
Zie PHP_EOL, erg handig ;-)
Makkelijk betwijfel ik ook, beter is het gebruik maken van templates als je te lui bent om die DOCTYPE en al te echo-en.
Bovendien is het script foutengevoelig: in attributen moet de HTML escaped worden:
Bij de tekst zou je dat ook moeten doen met een extra argument als je echt HTML wilt ('innerHTML')
htmlspecialchars gebruiken om SQL-injecties te voorkomen? Nee, daar gebruik je prepared statements voor of mysql_real_escape_string (of een variant) voor.. Je moet je data namelijk altijd puur houden en niet aanpassen als het de database in gaat, maar als het de database uit gaat..
Bij een link kun je bijvoorbeeld iets hebben als:
Voor alle 'grote' apen
Als je dat met jouw functie wilt verwerken, dan krijg je zoiets:
Je moet niet achteraf komen met veiligheid.
Als je dus iets tussen enkele aanhalingsteken wilt zetten, gaat alles goed, en is de pagina zelfs xhtml valid.
Wanneer je dubbele aanhalingstekens wilt gebruiken, weergeeft je browser dit gewoon goed, alleen is het niet xhtml valid, en dus niet aan te raden.
Als je dan toch een keer een titel met dubbele aanhalingstekens wilt, wat ook gewoon tussen enkele aanhalingstekens kan, moet je het volgende doen:
Je hebt trouwens overal dezelfde code staan om je 'overige attributen' te genereren, dat zou je ook in een interne (private, protected?) functie kunnen doen. En diezelfde methode zou je ook kunnen gebruiken voor je verplichte attributen door bijv. array_merge($overige_attributen, array('name' => $name)) te gebruiken.
Je naamgeving is niet zo mooi. Wees consistent: niet par en br, maar par(of paragraph) en break of p en br.
Dit is meer een string generator, terwijl een goede klasse een document(-part) generator zou moeten zijn. Ik had liever een OOP systeem gezien met objecten voor documenten (kan ook de HTML tag zijn), tags en attributen en instructies (doctype). Je kan dan voor elke HTML tag een abstracte klasse uitbreiden en dan bijvoorbeeld mogelijke attributen en kinderen in een protected var. Je kan dan ook heel mooi gepast escapen, dus met of niets, of htmlentities, of urlencode.
Dit had ik liever gezien, je had dan met php een node structuur kunnen bouwen en dan in een keer de root node echoën en je hebt je HTML. Maar dit alles kan ook niet je opzet zijn geweest, in dat geval heb je het netjes gedaan ;).
Ik begrijp het principe wel wat je bedoelt, maar hoe ik het zou moeten uitvoeren weet ik niet. Ik denk dat ik nog niet genoeg over OOP in php weet daarvoor.
@Niels Kieviet
Wat zou het voordeel van het gebruiken van interfaces zijn? Kende het verder niet echt, heb het opgezocht, maar ik begrijp het voordeel niet helemaal van zoiets.
Komt er wel opneer dat ik me maar eens even moet verdiepen in php5 denk ik xD
Een serieus probleem is dat je in HTML text met nodes mag mixen. De makkelijkste oplossing is de text in een aparte node te stoppen.
Een opzetje:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
abstract class HTML_Abstract
{
abstract public function generate();
public function __toString()
{
return $this->generate();
}
}
abstract class HTML_Node extends HTML_Abstract {}
class HTML_Tag extends HTML_Node
{
protected $_name;
protected $_attributes = array();
protected $_children = array();
public function __construct($name)
{
$this->_name = $name;
}
public function getName()
{
return $this->_name;
}
pubilc function getChildren()
{
return $this->_children;
}
public function appendChild(HTML_Node $child)
{
$this->_children[] = $child;
}
public function prependChild(HTML_Node $child)
{
array_unshift($this->_children, $child);
}
public function getAttributes()
{
return $this->_attributes;
}
public function addAttribute(HTML_Attribute $attr)
{
$this->_attributes[] = $attr;
}
public function generate()
{
$return = '<'.$this->_name;
foreach($this->_attributes as $attr)
$return .= ' '.$attr->generate();
$return .= '>';
foreach($this->_children as $child)
$return .= $child->generate();
$return .= '</'.$this->_name.'>';
return $return;
}
}
class HTML_Text extends HTML_Node {}
class HTML_Attribute extends HTML_Abstract {}
Bedankt voor het script. Ik heb hem goed bekeken, heb het principe nu wel door. Maar ik denk dat het niveau te hoog voor mij ligt. Ik heb geen idee hoe ik het verder zou moeten uitbreiden om hem de zelfde functionaliteit te geven als mijn class.
Ik heb wel wat aanpassingen gemaakt:
En op lijn 30 staat pubilc ipv public. Maar verder kom ik echt niet.
Een voorbeeldje:
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
33
34
35
36
37
38
39
40
<body>
<p>Par 1</p>
<p>Par 2</p>
</body>
</html>
// Wordt nu
<?php
$html = new HTML_Tag('html');
$body = new HTML_Tag('body');
$p1 = new HTML_Tag('p');
$p2 = new HTML_Tag('p'); // Of evt $p2 = clone $p1;
$p1->appendChild(new HTML_Text('Par 1')); // Maak een text node aan en voeg deze achteraan de kinderen van p1 toe (append = achteraan toevoegen)
$p2->appendChild(new HTML_Text('Par 2'));
$body->appendChild($p1); // Voeg de paragrafen aan de body toe
$body->appendChild($p2);
$html->appendChild($body); // Spreekt nu hopelijk voor zich
echo $html->generate(); // Of echo $html, de __toString() method van HTML_Abstract zorgt hiervoor, vandaar die klasse, zie http://php.net/manual/en/language.oop5.magic.php
// Dit geeft als het goed is hetzelfde resultaat
// HTML_Text is als volgt
class HTML_Text extends HTML_Node
{
protected $_value;
public function __construct($value = '')
{
$this->_value = $value;
}
public function getValue()
{
return $this->_value;
}
public function generate()
{
return $this->_value;
}
}
?>
Zo werkt het dus. Wanneer de nodes opgebouwd zijn moeten ze weergegeven worden. Als je even over dit node-systeem nadenkt, komt het erop neer dat je de begin-tag hebt, inclusief eventuele attributen, dan de inhoud, in dit geval de inhoud van de kinderen, en dan de sluit-tag. Dit wordt gedaan bij HTML_Tag::generate(). Dit werkt omdat deze methode herhaald wordt opgeroepen. Je begint bij de bovenste node (de html-tag in het voorbeeld), deze doet dat bij haar kinderen (de body-tag), die bij haar kinderen (de p-tags) en die bij haar kinderen (de tekstjes in dit geval). (Wat is het geslacht van 'tag'? ;-) ). Zo wordt de HTML structuur dus weergegeven.
Duidelijker zo? En de stukjes kunnen inderdaad vol schrijffouten zitten, ze zijn ongetest en op een heel vervelend laptoptoetsenbord geschreven.
Om te reageren heb je een account nodig en je moet ingelogd zijn.
- Details
Door:
Bart Smit- 2 jaar geleden
- 1.141 x bekeken
- PHP scripts opties
- Classes
- Nieuwste PHP scripts
- PHP script toevoegen

PHP hulp
0 seconden vanaf nu