ERLEDIGT
NEIN
NEIN
ANTWORTEN
13
13
ZUGRIFFE
473
473
EMPFEHLEN
-
21.11.11 20:10 #1
Hallo,
ich habe eine kleine Templateklasse geschrieben für meine eigene Projekte. Ja ich weiß es gibt sehr gute andere Projekte, doch sind diese mir meistens zu groß bzw. einfach nicht mein Ding und ich lerne ja auch noch dabei.
Also wie folgt sieht sie aus:
Aktuell arbeite ich noch ein Cache Verfahren ein.PHP-Code:<?php
error_reporting(E_ALL);
class template {
/*
Variables that be use in that class
and their content
*/
private $templateDIR = 'templates/';
private $templateName = '';
private $templateFile = '';
private $template = '';
private $leftborderF = '{';
private $rightborderF = '}';
private $leftborderVAR = '{$';
private $rightborderVAR = '$}';
public function __construct($tpl_dir = '', $lang_dir = '')
{
if(!empty($tpl_dir))
$this->templateDIR = $tpl_dir;
if(!empty($lang_dir))
$this->languageDIR = $lang_dir;
}
public function load($file)
{
$this->templateName = $file;
$this->templateFile = $this->templateDIR.$file;
if( !empty($this->templateFile) ) {
if( file_exists($this->templateFile) ) {
$this->template = file_get_contents($this->templateFile);
} else {
return false;
}
} else {
return false;
}
$this->parseTemplate();
}
public function assign($replace, $replacement)
{
$this->template = str_replace($this->leftborderVAR.$replace.$this->rightborderVAR, $replacement, $this->template);
}
private function parseTemplate() {
while( preg_match( "/" .$this->leftborderF ."include file=\"(.*)\.(.*)\""
.$this->rightborderF ."/isUe", $this->template) )
{
$this->template = preg_replace( "/" .$this->leftborderF ."include file=\"(.*)\.(.*)\""
.$this->rightborderF."/isUe",
"file_get_contents(\$this->templateDIR.'\\1'.'.'.'\\2')",
$this->template );
}
}
public function display() {
echo $this->template;
}
}
?>
Was kann ich noch verbessern?
Hatte überlegt noch mit Blöcken zu arbeiten, weiß aber noch nicht so wirklich wie ich das am besten machen soll.
Danke für die Hilfe.
NW
-
21.11.11 20:27 #2
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.521
Wenn du bequem bist, kannst du noch die magische Methode __set() implementieren.
Hast du einen Unit-Test dafür?Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
21.11.11 20:39 #3
Klar.
Klick hier
Die Templatedateien liegen unter: klick hier
Ich weiß wofür __set() genutzt wird, allerdings verstehe ich hier noch nicht ganz den Vorteil zur meiner benutzten Methode.
-
21.11.11 20:52 #4
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.521
Ich meinte einen Unit-Test im Sinne von PHPUnit oder etwas ähnliches.
Der Vorteil von Unit-Tests mittels Test-Klasse ist offensichtlich: "Führt meine Änderung oder mein neues Feature XYZ dazu, das meine bisherige Implementierung noch funktioniert?"
Es im Browser ausgeben zu lassen ist IMHO kein Unit-Test.
Die __set()-Methode bringt keine Verbesserung gegenüber deiner Implementierung. Außer vielleicht der Lesbarkeit. Was schön wäre, wenn deine assign-Methode eine Back-Reference auf sein eigenes Objekt zurück geben würden, denn dann könnte man so was machen:
Code php:1 2 3 4 5
$o = new template('directory', 'de'); $o->assign('foo', 'bar') ->assign('xyz', 'abc') ->assign('price', PriceHelper::Calculate($singleNet, $amountOfGoods, $vatRate) // weitere assigns....
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
22.11.11 06:12 #5Darunter kann ich mir jetzt leider mal absolut nichts vorstellen.Was schön wäre, wenn deine assign-Methode eine Back-Reference auf sein eigenes Objekt zurück geben würden, denn dann könnte man so was machen:
-
22.11.11 07:33 #6
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.521
Deswegen habe ich ein Beispiel hin geschrieben. Normalerweise dürfte es genügen, wenn du in assign() einfach $this returnierst.
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
22.11.11 13:02 #7
Mit dem Beispiel, verstehe ich so :
Calculate ist eine Funktion in der Klasse PriceHelper und du übergibst die werte.PriceHelper::Calculate($singleNet, $amountOfGoods, $vatRate)
Und das Ergebnis soll dann ausgeben werden, ist doch richtig.
Müsste doch auch so funktionieren.
Habe es jetzt mal so gemacht:
PHP-Code:public function assign($replace, $replacement)
{
$this->template = str_replace($this->leftborderVAR.$replace.$this->rightborderVAR, $replacement, $this->template);
return $this->template;
}
Geändert von newwarrior (22.11.11 um 13:44 Uhr)
-
22.11.11 13:54 #8
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.521
Das war nur ein Beispiel. Ich denke mal, das es bei dir keine Klasse PriceHelper mit einer statischen Methode Calculate gibt. Es ging mir nur um das assign(), was machen an ein assign() hängen kann.
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
22.11.11 14:00 #9
Ich denke was dir Saftmeister sagen will ist folgendes:
Eine Assign-Methode welches ein internes Array befüllt mit der magischen Setter-Methode. Welches "Method-Chaning" beinhaltet, so das du das du mehrere "Assigns" in einem Aufwasch erledigen kannst.
Ich persönlich würde es auch so machen, das parsen des Templates und ersetzen mit den Variablen aus dem internen Array dann in der Display-Methode.Die Schweine von heute sind unsere Schnitzel von morgen!
-
27.11.11 07:04 #10
Ok, jetzt habe ich es verstanden

siehe hier:
Ähm, eine andere Frage habe ich allerdings noch, und zwar habe ich ein kleines Problem.PHP-Code:<?php
error_reporting(E_ALL);
class template {
/*
Variables that be use in that class
and their content
*/
private $templateDIR = 'layout/templates/white/';
private $languageDIR = 'lang/';
private $templateName = '';
private $templateFile = '';
private $template = '';
private $leftborderF = '{';
private $rightborderF = '}';
private $leftborderVAR = '{$';
private $rightborderVAR = '$}';
public function __construct($tpl_dir = '', $lang_dir = '')
{
if(!empty($tpl_dir))
$this->setTemplateDIR($tpl_dir);
if(!empty($lang_dir))
$this->setLanguageDIR($lang_dir);
}
public function setTemplateDIR($dir)
{
$this->templateDIR = $dir;
return $this;
}
public function setLanguageDIR($dir)
{
$this->languageDIR = $dir;
return $this;
}
public function setTemplateName($name)
{
$this->templateName = $name;
return $this;
}
public function setTemplateFile($file)
{
$this->templateFile = $file;
return $this;
}
public function setTemplate($template)
{
$this->template = $template;
return $this;
}
public function load($file)
{
$this->setTemplateName($file);
$this->setTemplateFile($this->templateDIR.$file);
if( !empty($this->templateFile) ) {
if( file_exists($this->templateFile) ) {
$this->setTemplate(file_get_contents($this->templateFile));
} else {
return false;
}
} else {
return false;
}
$this->parseTemplate();
}
public function assign($replace, $replacement)
{
$this->setTemplate(str_replace($this->leftborderVAR.$replace.$this->rightborderVAR, $replacement, $this->template));
}
private function parseTemplate() {
while( preg_match( "/" .$this->leftborderF ."include file=\"(.*)\.(.*)\""
.$this->rightborderF ."/isUe", $this->template) )
{
$this->setTemplate(preg_replace( "/" .$this->leftborderF ."include file=\"(.*)\.(.*)\""
.$this->rightborderF."/isUe",
"file_get_contents(\$this->templateDIR.'\\1'.'.'.'\\2')",
$this->template ));
}
}
public function display() {
echo $this->template;
}
}
?>
Folgender Codeabschnitt ist vorhanden, wo ich jetzt gerne Code von HTML trennen würde. Doch ich sehe jetzt nur die einzige Möglichkeit darin, dass ich jetzt die Tabelle in eine tpl Datei packe und diese immer wieder in der Schleife lade. Für das IF und ELSE muss ich das gleich dann auch noch mal machen.PHP-Code:$blog_obj= new blog($dbh);
$data_blog = $blog_obj->getAll();
foreach($data_blog as $value)
{
if($value->blog_published == 1)
$world = "<a href='operation/no_published.php?blog_id=$value->blog_id' class='ask_published_yes'><img src='img/world.png' title='published' /></a>";
else
$world = "<a href='operation/published.php?blog_id=$value->blog_id' class='ask_published_no'><img src='img/world_delete.png' title='not published' /></a>";
$content_var .= "
<table class='videos'>
<tr>
<td style='text-align:right;font-size:9px;'>".date("h:i a || l dS F Y", $value->blog_date)."</td>
</tr>
</table><br />
";
}
Kann ich so was umgehen?
Also beim Daten ausgeben?Geändert von newwarrior (27.11.11 um 07:14 Uhr)
-
27.11.11 10:26 #11
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.521
Grundsätzlich könntest du es umgehen, in dem du Kontroll-Strukturen in die Templates einbaust. Kennst du Smarty?
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
27.11.11 11:05 #12
Ja kenne ich, warum?
-
27.11.11 11:08 #13
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.521
Nun damit wollte ich darauf hindeuten, wie man Kontroll-Strukturen in Templates einbaut. Also if-Konditions, Schleifen, etc. Deine Tabelle könntest du so abbilden:
- Füge in deinem Template die Kopf-Zeile für eine Tabelle ein.
- Schleife über eine assignte Variable (welche ein Array ist) und bei jedem Schleifen-Durchlauf fügst du eine Tabellen-Zeile hinzu.
- Assigne im PHP-Code deinem Template-Objekt ein Array.Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
Hi,
es gibt zwei bessere Template-Engines als Smarty:
1. PHP selbst
2. Twig
Gruß Kyoya StefanOracle Certified MySQL 5 Professional Developer
Zend Certified PHP 5.3 Engineer
Vorträge, Webinare, etc im Mayflower - Blog
Ähnliche Themen
-
iterator an templateklasse übergeben
Von Nukleo im Forum C/C++Antworten: 3Letzter Beitrag: 03.11.09, 12:49 -
einfache Templateklasse? Tutorial?
Von soyo im Forum PHPAntworten: 2Letzter Beitrag: 19.09.06, 15:37 -
Templateklasse liefert Fehler
Von StefanR im Forum PHPAntworten: 1Letzter Beitrag: 29.11.03, 00:19 -
Verbesserungsvorschläge
Von AnonymerSurfer im Forum PhotoshopAntworten: 3Letzter Beitrag: 28.11.01, 23:32





Zitieren

Login






[PHP][Snippet] Array zu XML konvertieren