Portal > Foren > PHP > PHP-Programmierung > Templatesystem erweitern
Antwort
 
Themen-Optionen
Alt 04.10.2006, 13:44 Nach oben    #1
Benutzer
 
Registriert seit: 18.06.2006
Ort: Straubing
Beiträge: 85
Standard Templatesystem erweitern

Hallo ich habe mir mal das Templatesystem von Corvin heruntergeladen und hab aber jetzt eine Frage.

Auf meiner alten Seite habe ich die Seiten immer includet damit ich einen Link wie index.php?site=123 bekomme. Dazu habe ich folgenden Code benutzt!
PHP-Code:
<?php
    
if(isset($_GET['itemid']) && isset($files[$_GET['itemid']])) {
        include 
$files[$_GET['itemid']];
    } else {
        include 
$files['home'];
    }
?>
Wo muss ich diesen Code nun plazieren, wenn ich bei dem Templatetsystem auch wieder mit diesem Include arbeiten möchte? Ich hoffe, dass ich es so erklärt habe, dass man es verstehen kann!

Mfg. Berti
Berti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.10.2006, 14:10 Nach oben    #2
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

hm... kleiner Trick mit dynamischen Content:
Code:
// template....
{include file="{$content}"}
// template
Nun musst du anhand deiner URL festlegen, was $content für ein Dateiname sein soll...
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.10.2006, 15:02 Nach oben    #3
Benutzer
 
Registriert seit: 18.06.2006
Ort: Straubing
Beiträge: 85
Standard

Mh, funktiniert noch nicht ganz. Ich habe jetzt mal die index.php wie folgt verändert:
PHP-Code:
<?php
   error_reporting
(E_ALL E_NOTICE);

   
// Das Templatesystem einbinden
   
include("template.class.php");
   
   include(
"inc/config.php");

   
// Eine neue Instanz der Template Klasse erzeugen
   
$tpl = new Template();

   
// Das Template laden
   
$tpl->load("index.tpl");

   
// Die Sprachdatei laden
   
$langs[] = "de/lang_main.php";
   
$lang $tpl->loadLanguage($langs);

   if(isset(
$_GET['itemid']) AND isset($files[$_GET['itemid']])) {
      
$tpl->assign("content", include $files[$_GET['itemid']]);
   } else {
      
$tpl->assign("content", include $files['home']);
   }

   
$tpl->assign("title""Willkommen");
   
$tpl->assign("date"date('d.m.Y'));

   
// Und das fertige Template ausgeben
   
$tpl->out();
?>
Und in der Datei /templates/index.tpl steht nun folgendes:
HTML-Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd">
<html lang="de">
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

   <title>{$title}</title>
   <link rel="stylesheet" type="text/css" href="{L_CSS_SCREEN}">
</head>

<body>
{* Ein Template einbinden *}
{include file="{$content}"}
</body>
</html> 
in der Datei config.php werden in einem Array die Seiten definiert. Aber wenn ich nun die index.php öffne wird mit zwar der Inhalt der eingebundenen Datei angezeigt, dahinter aber noch "{include file="1"}". Was könnt man da noch verändern, dass es geht?

Kann es sein, dass man keine 2 Templates in einander schreiben darf. Also kein {include file="{$content}"}?

Geändert von Berti (04.10.2006 um 15:15 Uhr).
Berti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.10.2006, 10:44 Nach oben    #4
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Hi.

Ich kenn das Template-System zwar nicht, aber wenn du {$content} bereits mit dem Inhalt belegst (und nicht mit dem Namen der einzubindenden Datei), dann sollte diese Variable dann doch nicht als file-Attribut einer {include} -Anweisung übergeben werden, sonden direkt ausgegeben werden.

Also entweder machst du den Include aus dem Template heraus (was ja nicht zu functionieren scheint) oder du machst ihn direkt in PHP und schreibst das Ergebnis in eine Variable {$content}, die du dann eben direkt ausgibst.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.10.2006, 14:34 Nach oben    #5
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

{$content} soll nicht den inhalt der Datei bekommen, sondern, wie Basti meint, den Namen der Datei!
Allerdings empfehle ich noch eine Anpassung des Templates...
PHP-Code:
    public function assign($replace$replacement)
    {
        
$this->template str_replace($this->leftDelimiter.$replace.$this->rightDelimiter$replacement$this->template);
        
// die änderung:
        
$this->replaceFunctions();
        return  
true;
    } 
Damit wird nach jedem assign() das Template nochmals durchsucht.
Ich habe z.b. einfach nur den Kontent über eine Variable festgelegt.
{$content} wurde per assign() mit '{include file="templatename.tpl"}' eingebunden. Das sollte mit der Erweitung klappen.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.10.2006, 00:09 Nach oben    #6
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Hi.

Da ich dem Template-Tutorial nicht schreiben darf, hier mal noch ein Anregung (abgesehen davon, dass ich den Anstatz, Werte innerhalb von Templates zu erstezen, anstatt Templates in PHP umzuschreiben an sich ungünstig finde).

Ich finde es ungeschickt, das Template- (und Sprachdateien-) Verzeichnis beim bauen des Templates angeben zu müssen, denn diese Werte ändern sich ja nicht von Template zu Template:

PHP-Code:
<?php

$TemplateFactory 
= new TemplateFactory('templates/','langfiles/');

...

$View $this->TemplateFactory->create('LoginForm');

oder

$View 
$this->createView('LoginForm');

und dort eben

return $this->TemplateFactory->create($sView);
Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.11.2006, 22:31 Nach oben    #7
Neuer Benutzer
 
Registriert seit: 26.11.2006
Beiträge: 1
Standard

Zitat:
Zitat von WarrenFaith Beitrag anzeigen
{$content} soll nicht den inhalt der Datei bekommen, sondern, wie Basti meint, den Namen der Datei!
Allerdings empfehle ich noch eine Anpassung des Templates...
PHP-Code:
    public function assign($replace$replacement)
    {
        
$this->template str_replace($this->leftDelimiter.$replace.$this->rightDelimiter$replacement$this->template);
        
// die änderung:
        
$this->replaceFunctions();
        return  
true;
    } 
Damit wird nach jedem assign() das Template nochmals durchsucht.
Ich habe z.b. einfach nur den Kontent über eine Variable festgelegt.
{$content} wurde per assign() mit '{include file="templatename.tpl"}' eingebunden. Das sollte mit der Erweitung klappen.

Hallo Warren,

bei mir "zu Hause" klappt das leider nicht so richtig. Fehlermeldung:
Zitat:
Warning: file_get_contents(template/_default/{$htmlcontent}. failed to open stream: No such file or directory in G:\alocalhost\TSW\Apache2\htdocs\projekte\1portal\ class\tpl.class.php(260) : regexp code on line 1
Sprich, der Platzhalter {$htmlcontent} wird NICHT ersetzt.

Ich habe Corvins Klasse etwas modifieziert, an PHP 4 angepasst und diese
Funktion verändert:

PHP-Code:
    function replaceFunctions()
    {
        
// Includes ersetzen ( {include file="..."} ) 
        
while(preg_match("/".$this->leftDelimiterF."include file=\"(.*)\"".$this->rightDelimiterF."/isUe"$this->template)) { 
            
$this->template preg_replace("/".$this->leftDelimiterF."include file=\"(.*)\"".$this->rightDelimiterF."/isUe""file_get_contents(\$this->templateDir.'\\1'.'.'.'\\2')"$this->template); 
        } 
 
        
// Kommentare löschen 
        
$this->template preg_replace("/".$this->leftDelimiterC."(.*)".$this->rightDelimiterC."/isUe"""$this->template); 
 
        return  
true;
    } 
Der Unterschied ist - in Corvins Originalklasse steht
Zitat:
include file=\"(.*)\.(.*)\"
Bei mir steht
Zitat:
include file=\"(.*)\"
Warum? Benutze ich einen Platzhalter, dann gibt´s da keinen Punkt drin

Die index.php, die ich verwende, sieht so aus:

PHP-Code:
<?
 
  /**
  * pfade festlegen für
  * template-dateien
  * sprach-dateien
  * grafik-dateien
  */
  $templatepath = 'template/_default/';
  $languagepath = $templatepath.'language/';
  $graphicspath = $templatepath.'gfx/';
  $mainpath  = 'incs_folding/portal/';
 
  /**
  * neue TCN-instanz
  * template laden
  * sprache festlegen
  */
  $TCN_tpl = new template($templatepath, $languagepath);
  $TCN_tpl->load('index.tpl');
  $language = array('de_lang.php');
  $lang  = $TCN_tpl->loadLanguage($language);
 
  /**
  * design-elemente festlegen
  */
  $TCN_tpl->assign('css_file', $templatepath.'css_portal.css');
  $TCN_tpl->assign('gfx_header', $graphicspath.'logo_tcn_praes_small.jpg');
 
  /**
  * inhalte erstellen
  */
  $actual_content = 'main_content.tpl';
 
  /**
  * inhalte einbauen
  */
  $TCN_tpl->assign('htmlcontent', $actual_content);
  $TCN_tpl->assign('html_copyright',"Copyright 2006 by Udo Kupsch");
 
  include $mainpath.'build_links.php';
?>
$TCN_tpl->out(); benutze ich nicht, ich will nix ausgeben

Doch, klar benutze ich die - diese index.php wird includet, die Ausgabe
erfolgt in einem anderen Skript.

Im Template selbst sieht´s so aus:
Code:
{include file="header.tpl"}
<div id="box_left">
{include file="box_left.tpl"}
</div>
<div id="box_right">
{include file="box_right.tpl"}
</div>
<div id="box_center">
{include file="{$htmlcontent}"}
</div>
 
 
{include file="footer.tpl"}
Gibt´s da noch irgendein Zauberwort, das ich dazu sagen oder dazu schreiben
muss? Ich habe jetzt alles ausprobiert, was mir dazu eingefallen ist, und
jetzt weiss ich wirklich nicht weiter.

Ausser selber eine komplett neue Funktion zu schreiben für den Include,
aber das würde ich mir gerne als allerletzte Option offenhalten

Gruss

Udo
hitmaster ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.12.2006, 14:53 Nach oben    #8
Jan
Erfahrener Benutzer
 
Benutzerbild von Jan
 
Registriert seit: 08.01.2006
Ort: Mannheim
Beiträge: 483
Standard

Ja, des Problem liegt ja daran, das beim ersten Aufruf schon versucht wird das Template {$htmlcontent} zu laden.

Da es das Template nicht gibt kommt der fehler.

Man müsste also noch die Funktion replacefunctions() so anpassen, das wenn der Dateiname mit "{" er die Funktion überspringt.

Weiter weiß ich selber allerdings auch gerade nicht. Würde mich aber auch freuen, wenn es dafür eine Lösung gäbe.
__________________
Jan
info.malte-gerth.de
=================================
Nutzt bitte lieber Jabber statt ICQ:
malte.gerth@jabber.cz
Jan ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.12.2006, 15:43 Nach oben    #9
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

Zitat:
Zitat von hitmaster Beitrag anzeigen
Der Unterschied ist - in Corvins Originalklasse steht
Zitat:
include file=\"(.*)\.(.*)\"
Bei mir steht
Zitat:
include file=\"(.*)\"
Warum? Benutze ich einen Platzhalter, dann gibt´s da keinen Punkt drin
Wenn du allerdings den Platzhalter ersetzt, dann hast du da wieder "irgendwas.tpl" stehen und damit den Punkt.
So sollte die Engine arbeiten:
  1. tpl laden
  2. alle includes mit "*.tpl"-Inhalt ersetzen
  3. nach jedem ersetzten platzhalter nach neuen includes mit "*.tpl" suchen gegebenenfalls bei schritt 2 weitermachen
  4. html ausgeben
Wichtig dabei ist halt, dass aufgepasst werden muss, wenn in einem includierten tpl noch platzhalter sind. diese können natürlich nur ersetzt werden wenn der inhalt schon includiert wurde.
ist halt etwas tricky und daher nur eine einfache engine die einem mehr das grundverständnis beibringen soll und so noch nicht für den großeinsatz gedacht ist
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[PHP] Ein eigenes Templatesystem schreiben Corvin Tutorials 42 19.03.2008 17:58
Schleifen im Templatesystem Stefan125 PHP-Programmierung 4 19.07.2007 02:36
Templatesystem von Corvin in PHP4? bl-25 PHP-Programmierung 9 04.04.2007 14:54
Templatesystem - Foreach-Schleifen ex³ PHP-Programmierung 9 23.04.2006 13:52
Templatesystem Alpha Centauri PHP-Programmierung 2 09.04.2006 19:35


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:14 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 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