WinFuture-Forum.de: Smarty & Includen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Smarty & Includen


#1 Mitglied ist offline   .indy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 367
  • Beigetreten: 15. November 03
  • Reputation: 0
  • Wohnort:localhost

geschrieben 12. Januar 2005 - 19:25

Hallo ihr lieben,


ich code gerade an meinem CMS und hab mir gedacht, es wär mal an der Zeit, Templates einzubauen. Da ich selbst nicht im Stande bin ein anstendiges Template System auf die Beine zu stellen, habe ich mich entschlossen mit Smarty (dass mir sehr viel empfohlen wurde) zu arbeiten.

Ich hab mir das ganze also runtergeladen und 2 fragen:

1. Ich will mein CMS auf meiner Seite zum DL anbieten, wenn allerdings Bestandteile von Smarty drin sind, weiß ich nicht wie das Copyrightlich geregelt ist... Kann ich das einfach so einbinden oder muss ich irgendwelche Bedingungen erfüllen (Copyright von Smarty einbinden oder so)... oder darf ich das überhaupt?!

2. Ich hab ein Smarty Test gemacht und bemerkt, dass man mit smarty->assign keine Include-Befehle als Templatevariable erstellen kann (z.B. $smarty->assign("content",include("news.php")) ... Gibt es irgendeine Möglichkeit, dass gescheit einzubinden? Dass ich im Template über {$content} die news.php includen kann? (Hab das ganze auch schon mit ' anstatt " & require versucht, aber es geht nicht)


Vielen Dank schonmal für eure Hilfe,
indy
0

Anzeige



#2 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 12. Januar 2005 - 19:30

Zitat (indiana_jones: 12.01.2005, 11:25)

2. Ich hab ein Smarty Test gemacht und bemerkt, dass man mit smarty->assign keine Include-Befehle als Templatevariable erstellen kann (z.B. $smarty->assign("content",include("news.php")) ... Gibt es irgendeine Möglichkeit, dass gescheit einzubinden? Dass ich im Template über {$content} die news.php includen kann? (Hab das ganze auch schon mit ' anstatt " & require versucht, aber es geht nicht)
<{POST_SNAPBACK}>


Ich denke, dass du es folgendermassen machen kannst:

{php}
	// including a php script directly
	// from the template.
	include("/path/to/display_weather.php");
{/php}


php tags allow php to be embedded directly into the template.
http://smarty.php.ne...unction.php.php

PelzigesWaldtier
0

#3 Mitglied ist offline   .indy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 367
  • Beigetreten: 15. November 03
  • Reputation: 0
  • Wohnort:localhost

geschrieben 12. Januar 2005 - 19:40

OK vielen dank ^_^

hm ich wollte das ganze aber nich direkt übers template sondern über smarty->assign...

Dieser Beitrag wurde von indiana_jones bearbeitet: 12. Januar 2005 - 19:43

0

#4 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 12. Januar 2005 - 19:53

PHP-Datei

$handle = fopen('datei.ext', 'r');
$content = fread($handle, filesize('datei.ext'));
fclose($handle);

...

$template->assign('content', $content);


Template

Falls in der datei.ext Code irgendeiner Art steckt, musst du mit literal arbeiten.

{literal}{$content}{/literal}


Literal tags allow a block of data to be taken literally.
http://smarty.php.net/manual/en/language.f...ion.literal.php

PW

Dieser Beitrag wurde von PelzigesWaldtier bearbeitet: 12. Januar 2005 - 19:55

0

#5 Mitglied ist offline   .indy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 367
  • Beigetreten: 15. November 03
  • Reputation: 0
  • Wohnort:localhost

geschrieben 12. Januar 2005 - 21:52

hm da krieg ich nen fehler ^_^
0

#6 _Benjamin_

  • Gruppe: Gäste

geschrieben 12. Januar 2005 - 22:53

Zitat

* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.


stand zufällig in den dateien rum ... dh. wenn du es online stellst musst du es unter der GNU veröffentlichen mit dem gesammten source code (was bei php ja eigentlich eh überflüssig is :) )

zum anderen, das template system ist total überladen, frisst einiges an performance und bietet im umgang mit sonderzeichen (ä,ö,ü, etc) einige probleme mit der ausgabge.

ich würde dir empfehlen ein simples eigenes system zu schreiben ... dauert nichtmal lange :)


Die PHP Datei
<?php
$datei=file_get_contents('template/show_news.html');
  $original[0]="{TITEL}";
  $original[1]="{AUTOR}";

  $neu[0]="Dein eigenes Templatesytem";
  $neu[1]="Dein Name";

$return=str_replace($original,$neu,$datei);
echo $return;
?>


so im prinzip einfach zu erklären. file_get_contents('template/show_news.html'); läd sich die show_news.html datei in die variable $datei ein. dann wird anhand von 2 arrays das template ausgewechselt. $original[] beinhaltet die im template benötigten zeichenketten. $neu[] die die ersetzt werden.

Die HTML Datei
<html>
<body>
{TITEL}<br>
{AUTOR}
</body>
</html>


am ende sagst du der variable $return das die werte nun ausgetauscht werden sollen ... und dann per echo ausgegeben werden. das wars eigentlich auch schon, und schwupps hast du dein eigenes template :) kann man natürlich noch verbessern ... smileys replacen usw ... :) aber das ist dann jedem selbst überlassen ;)
0

#7 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 13. Januar 2005 - 05:02

Zitat (indiana_jones: 12.01.2005, 13:52)

hm da krieg ich nen fehler :)
<{POST_SNAPBACK}>


Mehr Informationen waeren hilfreich.

PW
0

#8 Mitglied ist offline   Ich 

  • Gruppe: aktive Mitglieder
  • Beiträge: 287
  • Beigetreten: 11. März 02
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 13. Januar 2005 - 07:36

So, sorry, dass ich das so sage, aber bitte vergiss alles was bisher gesagt wurde... :)

Um mal einiges richtig zu stellen:

Unter Verwendung einer Templateengine den Befehl fopen für ein Template benutzen zu müssen liegt außerhalb meines geistigen Fassungsvermögens, weil sowas die Engine macht und nicht der User.

GNU LESSER General Public License kurz LGPL sagt aus, dass der Code frei verwendet werden darf, du aber deine Software mit nichten wieder freigeben musst... Die lesser General Public License erfordert ausschließlich den Hinweis im Quellcode auf eben diese Lizenz und ein beilegen selbiger im Verzeichniss wo deine Software liegt.

Smarty ist keine Templateengine mehr... Das Teil ist ein Speichermonster und dient mehr dazu statischen Content zu generieren anstatt ihn dynamisch zu bauen.... ist aber Einstellungssache....

Wenn du eine gute Engine verwenden willst, bzw. dein CMS allgemein auf Basis guter Komponenten aufbauen möchtest, dann solltest du dir einmal PEAR http://pear.php.net anschauen. PEAR ist eine Sammlung von Klassen, die alle nach dem selben Schema gecodet wurden und bestimmten Richtlinien in coding standard und Dokumentation unterliegen. Viele davon bauen aufeinander auf und stellen so eine mächtige Umgebung von vorgefertigten Klassen dar... Das beste daran ist, dass alle Scripte in PEAR unter Lizenzen stehen, die keine Freigabe erfordern, wenn du das nicht explizit möchtest.

In PEAR existiert zum Beispiel eine sehr einfache Templateklasse namens HTML_Template_Sigma, mit der man so ziemlich alles machen kann was man braucht um den Code vom Design zu trennen....

Hier ein kleines Beispiel:

<?php
// include pfad umbiegen, sodass PEAR als standard Pfad 
// includet wird wo auch immer es liegt
ini_set('include_path','.:/var/www/PEAR');
include_once('HTML/Template/Sigma.php');

//so, objekt initialisieren und den Pfad zu deinem Template angeben
$tpl = new HTML_Template_Sigma('meintemplate.tpl');

// platzhalter1 und platzhalter2 im Template werden durch Text ersetzt
$tpl->setVariable('platzhalter1','Ich bin der Text für Platzhalter 1');
$tpl->setVariable('platzhalter2','Ich bin der Text für Platzhalter 2');

// Es sind auch loops möglich um komplette arrays in eine
// Tabelle zu übertragen z.B.
// Hierzu musst du im Template einen Block definieren... dies geschieht
// durch das einfügen eines Kommentares, der das Wort BEGIN  am anfang 
// und darauf folgend den Namen des Blockes. beendet wird der Block mit END
// Beispiel siehe unten

// setzen welchen Block ich loopen will
$tpl->setCurrentBlock('meinblock');

// ich definiere einfach mal ein blödes array
$array = array('Mose','Josuah','Richter','Ruth','Samuel','Könige','Chronik');
foreach ($array as $key => $value) {
    // so, da wir uns im Block "meinblock" befinden, werden jetzt
    // Platzhalter innerhalb des Blockes ersetzt.
    $tpl->setVariable('platzhalterimblock',$value);
    
    // um der Templateengie zu sagen, dass der Block nun beendet ist und es
    // das HTML erzeugen kann, beenden wir den Block, bevor er gleich erneut
    // durchlaufen wird und der näxte Eintrag geparst wird.
    $tpl->parseCurrentBlock();
}

// So, das wars... Template parsen und ausgeben
// Optional könntest du dir statt show auch das template per $var = $tpl->get();
// in eine Variable schreiben und so den kompletten Inhalt wiederum in einem
// anderen Script in ein Template einfügen. 
$tpl->parse();
$tpl->show();
?>


Und nun das passende Template (meintemplate.tpl)
<html>
<body>
Dies ist ein Template zum testen und hier werden erstmal zwei Platzhalter gefüllt
<p>
Platzhalter1: <b>{platzhalter1}</b><br>
Platzhalter2: <b>{platzhalter2}</b>
</p>
<p>
Hier nun ein Beispiel für einen Block:<br><br>

<table>
  <tr>
    <td>Ich bin eine Überschrift</td>
  </tr>

  <!-- BEGIN meinblock -->
  <tr>
    <td>{platzhalterimblock}</td>
  </tr>
  <!-- END meinblock -->

</table>

</body>
</html>


So, das sollte eigentlich klappen... wie man Blöcke verschachtelt darfst du selber rausfinden, das geht nämlich auch alles... Ebenso callback Funktionen, die aus dem HTML Code aufgerufen werden können... Aber erstmal langsam mit den jungen Pferden :)

Der Code ist natürlich von mir nicht getestet worden... Hab den jetzt einfach hier runtergetippelt, insofern bitte ich um Nachsicht, wenn ein parse error auftritt... Alles was noch zu tun ist, ist HTML_Template_Sigma zu besorgen und die beiden Sachen in zwei Files zu schreiben :)

Viel erfolg
Fatal error: Call to undefined function: brain() in head.php on line 2
0

#9 _Benjamin_

  • Gruppe: Gäste

geschrieben 13. Januar 2005 - 08:59

Zitat (Ich: 13.01.2005, 07:36)

So, sorry, dass ich das so sage, aber bitte vergiss alles was bisher gesagt wurde... :)

mag sein das ich mit der GNU falsch lag - aber dein code is fürn ... naja egal ... das ding ist viel zu überladen ... und bei allem verständniss der programmierung - wenn ein templäte keine sonderzeichen ausgeben kann, dann ist es für mich kein template mehr (getestet mit einer etwas älterin version -> ka ob der bug imma noch in der neuen is)

zumal das template system was ich oben angesprochen habe leicht zu verstehen und schnell einzusetzten ist ... selbst ist der coder :)
0

#10 Mitglied ist offline   Ich 

  • Gruppe: aktive Mitglieder
  • Beiträge: 287
  • Beigetreten: 11. März 02
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 13. Januar 2005 - 11:01

Zitat

mag sein das ich mit der GNU falsch lag - aber dein code is fürn ... naja egal ... das ding ist viel zu überladen ... und bei allem verständniss der programmierung - wenn ein templäte keine sonderzeichen ausgeben kann, dann ist es für mich kein template mehr (getestet mit einer etwas älterin version -> ka ob der bug imma noch in der neuen is)

Tschuldigung, aber mein Text geht komplett um HTML_Template_Sigma, eine der schlankesten Template Engines die es im PHP Bereich gibt und eine neu Implementation von HTML_Template, welche ihrerseits schon recht fluchs ist. Wenn du schon nicht kapiert hast, dass es sich nicht um Smarty handelt, dann will ich garnicht wissen, wo dein know how über Smarty herkommt, denn das look and feel ist dabei _vollkommen_ anders.

Ich entwickele schon seit Jahren Applikationen auf Business Level in PHP und wenn man jede Kleinigkeit selber implementieren darf, wie dein rudimentäres "suchen und ersetzen", dann dauert es ewig, bis man überhaupt zu Ergebnissen kommt. Oder wie behandelt dein "Arraytauscher" verschachtelte Blöcke, oder komplett aus der DB ausgelesene Tabellen? Dynamisch generierte Sachen ganz zu schweigen.

Was ich über "selbst ist der Coder" Als Programmierer von CRM, ERP und CMS Umgebungen halte, kannst du dir sicher vorstellen und ich finde es mehr als unsinnig, bei einem CMS auf jeden Furz an Performance zu achten. Wenn dem so ist, dann darf man keine relationalen Datenbanken verwenden und keine Datenbankabstraktionlayer und Geschichten wie ODBC gehören sowieso verboten.... alles böse. Wobei ich das bei ODBC wirklich ernst meine :)
Fatal error: Call to undefined function: brain() in head.php on line 2
0

#11 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 13. Januar 2005 - 17:51

Zitat

Unter Verwendung einer Templateengine den Befehl fopen für ein Template benutzen zu müssen liegt außerhalb meines geistigen Fassungsvermögens, weil sowas die Engine macht und nicht der User.


Wenn du die Beitraege genau gelesen haettest, dann wuestest du, warum ich das so gemacht habe und nicht anders. Er will auch uebrigens kein Template damit einbinden sondern eine PHP-Datei (siehe erster Post).

indiana_jones will nicht die einfache Mehtode, die wie folgt aussieht:

{php}
// including a php script directly
// from the template.
include("/path/to/display_weather.php");
{/php}


sondern er moechte assign() verwenden. Und bitte lasst ihn doch. Er hat sich fuer Smarty entschieden und will vermutlich nichts anderes. Koennen wir ihm nicht einfach helfen sein Problem zu loesen?

indiana_jones:
Warum denn nicht wie oben beschrieben mit {php} machen? Das ist doch der einfachste Weg.

PW

Dieser Beitrag wurde von PelzigesWaldtier bearbeitet: 13. Januar 2005 - 17:52

0

#12 Mitglied ist offline   Ich 

  • Gruppe: aktive Mitglieder
  • Beiträge: 287
  • Beigetreten: 11. März 02
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 13. Januar 2005 - 18:42

Zitat

Wenn du die Beitraege genau gelesen haettest, dann wuestest du, warum ich das so gemacht habe und nicht anders. Er will auch uebrigens kein Template damit einbinden sondern eine PHP-Datei (siehe erster Post).

Und eben genau das macht eine template engine alleine... wenn sie das nicht tut ist es keine, sondern ein script, aber keinesfalls eine komplette engine, denn eine engine (englisch für Motor) funktioniert nicht ohne Pleul oder Zylinder :( Insofern ist es mir immernoch nicht begreiflich....

Desweiteren hat er sich grade erst für Smarty entschieden und ich versuche nur eine Alternative mit Komplettlösung aufzuzeigen, weil Smarty im eigentlichen Sinne nur eine Template Sprache für eine Templatesprache ist, da Smarty eigener Templatecode in PHP übersetzt wird und man im Endeffekt so php und HTML Code nicht voneinander trennt, da am Ende wieder ein gemischtes Script aus dem Prozess entsteht.

Eine richtige Templateengine zur Trennung von Code und Design ist das also nicht, wobei sich darüber allerdings streiten lässt....

Fakt an der Sache ist allerdings, dass der Smarty Dialekt einen erhöhten Lernaufwand erfordert, obwohl dieser nicht sein müsste. Schließlich muss der Smarty Template Dialekt auch erst gelernt werden, während eine TE wie Sigma nur eine Handvoll Funktionen beinhaltet, deren Hauptanwendungsbereiche ich mit meinem Beispiel bereits abgedeckt habe...

Wo liegt also das Problem? schließlich bringt jeder hier Alternativen mit ein...
Fatal error: Call to undefined function: brain() in head.php on line 2
0

#13 Mitglied ist offline   Dagar888 

  • Gruppe: Mitglieder
  • Beiträge: 1
  • Beigetreten: 18. Januar 05
  • Reputation: 0

geschrieben 18. Januar 2005 - 16:10

Zitat

Warum denn nicht wie oben beschrieben mit {php} machen? Das ist doch der einfachste Weg.


Also ich hab mir auch die gleiche Frage wie indiana_jones gestellt.
Es wäre halt praktisch, weil man dann nur noch eine template datei braucht, die php elemte nicht im template selber geschrieben werden müssen.
0

#14 _Benjamin_

  • Gruppe: Gäste

geschrieben 19. Januar 2005 - 12:22

nur mal zur klärung

template system = ein haufen von html templates die mit einem code ausgeben werden, oda ?
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0