php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack (1) Themen-Optionen Thema bewerten
  1 links from elsewhere to this Post. Click to view. #1 (permalink)  
Alt 11-04-2013, 05:08
Fransisco
 Registrierter Benutzer
Links : Onlinestatus : Fransisco ist offline
Registriert seit: Apr 2013
Beiträge: 7
Fransisco befindet sich auf einem aufstrebenden Ast
Question Klassen und Templates

Hallo!

Ich versuche mich jetzt doch endlich in OOP einzuarbeiten. Vieles hilft im Web, wie Tutorials auf YT oder auch schriftliches in Blogs. Foren und Büchern.
Dennoch hab ich das eine oder andere Problem und frage dann jetzt einmal gezielt hier in einem Forum nach. Vielleicht kann mir der eine oder andere ein paar Hinweise geben?

Um mit der OOP einigermaßen klar zu kommen, versuche ich das anhand eines kleinen CMS. So habe ich auch mit 'normalen' PHP lernen angefangen, was so ganz gut klappte. Bin aber überhaupt kein Profi, um das noch zu erwähnen.

Was ich bisher gemacht habe ist folgendes: Ich habe eine Klasse (pages) erstellt, die mir die Inhalte von den einzelnen Seiten zusammenbaut. Später kommt das dann auch einer Datenbank.
Diese Inhalte übergeben ich an ein Template, was mir die HTML-Seite aufbaut. Ja und das klappt eigentlich auch ganz gut bisher.
Aber... für diverse Kontentelemente möchte ich eigene Klassen haben und dieses dann in die Pages-Klasse einbinden und entsprechend mit an das Template senden. Da habe ich schon ein erstes Problem. Zusätzlich würde ich gerne noch zu jeder eigenen Kontent-Klasse ein seperates Template erstellen, was auch nur den Inhalt dieses Kontentelementes ausgibt. Ich bekomme das zwar hin, aber leider auch mit einem Problem.

Hier mal die pages-Klasse:
PHP-Code:
class Pages {

    public 
$template;
    public 
$header;
    public 
$footer;
    public 
$content;
    public 
$navi;


    public function 
__construct () {

        
$this->header "HEADER";
        
$this->footer "FOOTER";
        
$this->template $GLOBALS['CONFIG']['TMP_FILE'];

    }

    public function 
getTemplate () {

        (isset(
$_GET['pageID'])) ? $pageID $_GET['pageID'] : $pageID 1;

        switch (
$pageID) {
            case 
1:
                
$hx 1;
                
$class "home";
                
$headline "Home";
                
$page_content 'Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis,
                                feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel
                                augue. Curabitur ullamcorper ultricies nisi.'
;
                break;

            case 
2:
                
$hx 1;
                
$class "about";
                
$headline "About";
                
$page_content 'Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel
                                augue. Curabitur ullamcorper ultricies nisi.'
;
                break;

            case 
3:
                
$hx 1;
                
$class "contact";
                
$headline "Contact";
                
$page_content 'Porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis,
                                feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel
                                augue. Curabitur ullamcorper ultricies nisi.'
;
                break;
        }

        
$content '<h' $hx ' class="' $class '">' $headline '</h' $hx '>';
        
$content .= $page_content;

        
$this->content $content;

        
/**
         * Methode 1
         */
        
$navi '<a href="index.php?pageID=1">Home</a> | <a href="index.php?pageID=2">About</a> | <a href="index.php?pageID=3">Contact</a>';
        
$this->navi $navi;

        
/**
         * Methode 2
         */
        
$navigation = new navigation();
        
$this->navi $navigation->getNavi($pageID);

        require_once 
'templates/' $this->template '.php';

    }


Wie man sieht noch ohne Datenbank, aber zum ersten testen geht das auch so.
Ich habe hier zwei Methoden die zwar beide funktionieren, aber nur die ertse so wie es sein sollte. Der Grund ist, daß ich die Navigation hier direkt einbinde und nicht wie in der zweiten Methode über eine andere Klasse.
Diese sieht so aus:

PHP-Code:
class navigation {

    public function 
getNavi ($pageID) {

//        require_once 'templates/tmp_navigation.php';
        
echo '<a href="index.php?pageID=1">Home</a> | <a href="index.php?pageID=2">About</a> | <a href="index.php?pageID=3">Contact</a>';

    }


zusätzlich noch das Navigations-Templates, was aber bei Methode 2 den selben Effekt hat, als wenn ich es ohne mache. Ich dachte ja erst, daß es am Template liegt, doch dem ist nicht so.

Das Haupttemplate schaut bisher ganz einfach so aus:
HTML-Code:
<!DOCTYPE html>
<html lang="de">

<head>
    <title><?php echo $GLOBALS['CONFIG']['PROJECT_NAME']; ?></title>
    <meta charset="<?php echo $GLOBALS['CONFIG']['CHARSET']; ?>">
</head>
<body>

<div style="border: 1px green solid; padding: 10px;"><?php echo $this->header; ?></div><br>
<div style="border: 1px gold solid; padding: 10px;"><?php echo $this->navi; ?></div><br>
<div style="border: 1px red solid; padding: 10px;"><?php echo $this->content; ?></div><br>
<div style="border: 1px blue solid; padding: 10px;"><?php echo $this->footer; ?></div>

</body>
</html>
Wie man erkennen kann, werden dann später auch noch der Header, der Footer und auch noch linke und rechte Spalten erstellt.

Hier habe ich jetzt erstmal zwei Fragen dazu:
1. Ist der komplette Ansatz schon einmal so brauchbar? Baut man so, oder so ähnlich, ein kleines CMS mit Templates auf?
2. Wie kann ich erreichen, daß in der Pages-Klasse die zweite Methode so funktioniert, wie es sein soll. Die Navigation wird nicht da ausgegeben, wo sie im Template ausgegeben werden sollte. Sie wird nach ganz oben gesetzt, über den <head>-Bereich. Funktionieren tut sie aber.

Ich habe zwar schon auf ein paar Seiten etwas über Vererbung gelesen, aber leider bin ich da noch nicht so richtig draus schlau geworden.

Ich hoffe ich konnte mein Problem halbwegs gut erläutern und freue mich auf den einen oder anderen Tipp von euch!


Danke und Gruss
Fransisco

Geändert von Fransisco (11-04-2013 um 14:58 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 11-04-2013, 09:23
UzumakiNaruto
 Registrierter Benutzer
Links : Onlinestatus : UzumakiNaruto ist offline
Registriert seit: Nov 2004
Beiträge: 642
UzumakiNaruto befindet sich auf einem aufstrebenden Ast
Standard

ich nutze seit langem diese variante, ist definitiv nicht die beste aber liefert dir vielleicht ein paar ansätze wie man es umsetzen kann.

template klasse
PHP-Code:
/**
 * Template-Engine
 */
class template {
   var 
$path;
   var 
$content;

   
/**
    * open the file if exists
    * @param String $file
    */
   
public function __construct($file) {
       
$this->path $file;
      if (
file_exists($this->path)) {
         
$file = @fopen($this->path"r");
      } else {
         die (
$this->path." not found");
      }
      while(!
feof($file)) {
         
$temp fgets($file4096);
         
$this->content .= $temp;
      }
   }

   
/**
    * replace the placeholder with the right content
    * @param String $placeholder
    * @param Strng $value
    */
   
function replace($placeholder$value) {
      
$this->content str_replace("{" $placeholder "}"$value$this->content);
   }

   
/**
    * @return the template
    */
    
function echo_template() {
        return 
$this->content;
    }

aufruf der Klasse um das Template zu füllen
PHP-Code:
$template_design = new template('design.html');
$template_design->replace("title",            $this->title);
$template_design->replace("head",             $this->header);
$template_design->replace("navi",             $this->navi);
$template_design->replace("cont",             $this->content);
$template_design->replace("foot",             $this->footer);
return 
$template_design->echo_template(); 
design.html
HTML-Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>{title}</title>
</head>
<body>
	<div id="rahmen">
		<div id="head">{head}</div>
		<div id="navi">{navi}</div>      
		<div id="cont">{cont}</div>
		<div id="foot">{foot}</div>
	</div>
</body>
</html>
__________________
Gruß
Uzu

private Homepage
Mit Zitat antworten
  #3 (permalink)  
Alt 11-04-2013, 10:41
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von UzumakiNaruto Beitrag anzeigen
ich nutze seit langem diese variante
Merkt man. "var" stammt noch aus PHP 4, das schon über 10 Jahre auf dem Buckel hat
Mit Zitat antworten
  #4 (permalink)  
Alt 11-04-2013, 15:10
Fransisco
 Registrierter Benutzer
Links : Onlinestatus : Fransisco ist offline
Registriert seit: Apr 2013
Beiträge: 7
Fransisco befindet sich auf einem aufstrebenden Ast
Standard

Danke erstmal, aber ich muß dich noch fragen, von wo aus du die Klasse aufrufst? Ich hab das bei mir (erstmal) in meiner index.php eingebunden, bekomme aber einen
Code:
Fatal error:  Using $this when not in object context in
PHP-Code:
$template_design = new Pages("templates/html.php");
$template_design->replace("cont"$this->content);
return 
$template_design->echo_template(); 
Ich verstehe wie du das machst, aber ein require sollte es doch auch tun. Oder?
Auch habe ich selbst die 'normalen' PHP-Tags im Template lieber, weil ich denke, später, wenn noch andere Templates gefüllt werden sollen, es mit Platzhaltern Probleme geben könnte. Ich denke da nur an eine Foreach-Schleife...

Dennoch würde ich deinen Vorschlag genauer unter die Lupe nehmen, doch der Fehler erlaubt es noch nicht.

$this->content kann ich ja auch nicht so von ausserhalb aufrufen, das bezieht sich ja nur direkt auf die Klasse. ...wenn ich das alles bisher so richtig verstanden habe.


Gruss, Fransisco
Mit Zitat antworten
  #5 (permalink)  
Alt 11-04-2013, 15:51
UzumakiNaruto
 Registrierter Benutzer
Links : Onlinestatus : UzumakiNaruto ist offline
Registriert seit: Nov 2004
Beiträge: 642
UzumakiNaruto befindet sich auf einem aufstrebenden Ast
Standard

ich habe die template klasse mit einer anderen klasse aufgerufen und da war die variable $content die ich natürlich mit $this->content ansprechen musste.

PHP-Code:
include "template.php";

$content "das ist mein test content";

$template_design = new Pages("templates/html.php");
$template_design->replace("cont"$content);
$temp_content $template_design->echo_template(); 

echo 
$temp_content
wieso sollte es mit anderen templates probleme geben?

PHP-Code:
include "template.php";

# kann man auch über eine funktion/methode mit links befüllen, soll das hier aber nur veranschaulichen
# kannst auch aus einer config tabelle der DB holen
$header "meine webseiten header";
$footer " copyright &copy; mein_name ";

$navi '<a href="link_1.html">link 1</a><br /><a href="link_2.html">link 2</a><br />';
$content 'test content';

#navi template laden, mit den links füllen und "speichern"
$template_navi = new Pages("templates/navi.html");
$template_navi->replace("navi"$navi);
$temp_navi $template_navi->echo_template(); 

$template_design = new Pages("templates/design.html");
$template_design->replace("head"$header);
$template_design->replace("navi"$temp_navi);
$template_design->replace("cont"$content);
$template_design->replace("foot"$footer); 
$temp_design $template_design->echo_template(); 

echo 
$temp_design 
navi.html
HTML-Code:
<div id="navi">
   <h2>navigation</h2>
   <p>{navi}</p>
</div>
design.html
HTML-Code:
...
<body>
	<div id="rahmen">
		<div id="head">{head}</div>
		<div id="navi">{navi}</div>      
		<div id="cont">{cont}</div>
		<div id="foot">{foot}</div>
	</div>
...
wie die ausgabe am ende aussiehst kannst du dir selber ausmalen/testen.

und es macht schon sinn bei templates auf php code zu verzichten, so trennst du das ganze viel besser.

html kümmert sich um die darstellung
css (was du ja sicherlich einbindest) kümmert sich um farben und aussehen/positionierung, usw
php um die eigentliche programmierung ... daten aus der db holen und reinschreiben, usereingaben überprüfen ... daten zum template-system zu senden.

Zitat:
Zitat von h3ll Beitrag anzeigen
Merkt man. "var" stammt noch aus PHP 4, das schon über 10 Jahre auf dem Buckel hat
ist halt in die jahre gekommen und hatte keine lust es zu ändern.
als var deklarierte variablen werden ja automatisch als public angesehen.
natürlich sollte man es ändern damit es einheitlich ist wenn man schon mit php5+ oop bestreiten will.
__________________
Gruß
Uzu

private Homepage
Mit Zitat antworten
  #6 (permalink)  
Alt 11-04-2013, 17:47
Fransisco
 Registrierter Benutzer
Links : Onlinestatus : Fransisco ist offline
Registriert seit: Apr 2013
Beiträge: 7
Fransisco befindet sich auf einem aufstrebenden Ast
Standard

Also erstmal großer Dank an dich. Hat mir in vielerlei Hinsicht etwas gebracht.
Entsprechend sieht meine Klasse pages jetzt so aus:
PHP-Code:
<?php

class Pages {

    public 
$header;
    public 
$navigation;
    public 
$content;
    public 
$footer;


    public function 
createTemplates () {

        
/**
         * Header
         */
        
$template_header = new Templates("templates/tmp_header.php");
        
$template_header->replace("header"$this->getHeader());
        
$temp_header $template_header->echo_template();

        
/**
         * Navigation
         */
        
$template_navi = new Templates("templates/tmp_navigation.php");
        
$template_navi->replace("navigation"$this->getNavigation());
        
$temp_navi $template_navi->echo_template();

        
/**
         * Content
         */
        
$template_content = new Templates("templates/tmp_content.php");
        
$template_content->replace("content"$this->getContent());
        
$temp_content $template_content->echo_template();

        
/**
         * Footer
         */
        
$template_footer = new Templates("templates/tmp_footer.php");
        
$template_footer->replace("footer"$this->getFooter());
        
$temp_footer $template_footer->echo_template();


        
$template_design = new Templates("templates/html5.php");
        
$template_design->replace("project_title"$GLOBALS['CONFIG']['PROJECT_NAME']);
        
$template_design->replace("charset"$GLOBALS['CONFIG']['CHARSET']);
        
$template_design->replace("header"$temp_header);
        
$template_design->replace("navigation"$temp_navi);
        
$template_design->replace("content"$temp_content);
        
$template_design->replace("footer"$temp_footer);
        
$temp_content $template_design->echo_template();

        echo 
$temp_content;

    }


    public function 
getHeader() {

        
$header '<h1>HEADER</h1>';
        return 
$header;

    }


    public function 
getNavigation() {

        
$navigation '<a href="index.php?pageID=1">Home</a> | <a href="index.php?pageID=2">About</a> | <a href="index.php?pageID=3">Contact</a>';
        return 
$navigation;

    }


    public function 
getContent() {

        (isset(
$_GET['pageID'])) ? $pageID $_GET['pageID'] : $pageID 1;

        switch (
$pageID) {
            case 
1:
                
$hx 3;
                
$class "home";
                
$headline "Home";
                
$page_content 'Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis,
                                feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel
                                augue. Curabitur ullamcorper ultricies nisi.'
;
                break;

            case 
2:
                
$hx 3;
                
$class "about";
                
$headline "About";
                
$page_content 'Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel
                                augue. Curabitur ullamcorper ultricies nisi.'
;
                break;

            case 
3:
                
$hx 3;
                
$class "contact";
                
$headline "Contact";
                
$page_content 'Porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis,
                                feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel
                                augue. Curabitur ullamcorper ultricies nisi.'
;
                break;
        }

        
$content '<h' $hx ' class="' $class '">' $headline '</h' $hx '>';
        
$content .= $page_content;

        return 
$content;

    }


    public function 
getFooter() {

        
$footer '<span style="font-size: smaller;">FOOTER</span>';
        return 
$footer;

    }

}
Wie du siehst, habe ich einzelnen Bereiche in eigene Funktionen gelegt. Dank deines Beispiels klappt das auch so sehr gut.

Aufgerufen werden die Klassen in meiner index.php.
PHP-Code:
require_once 'system/core/classes/templates.php';
require_once 
'system/core/classes/pages.php';
$pages = new Pages();
$pages->createTemplates(); 
Zum Schluß noch die Klasse template, die jetzt so ausschaut:
PHP-Code:
<?php

class Templates {

    public 
$path;
    public 
$content;

    
    public function 
__construct ($file) {

        
$this->path $file;

        if (
file_exists($this->path))
        {
            
$file = @fopen($this->path"r");
        }
        else
        {
            die (
$this->path." not found");
        }

        while(!
feof($file))
        {
            
$temp fgets($file4096);
            
$this->content .= $temp;
        }

    }


    public function 
replace($placeholder$value) {

        
$this->content str_replace("{" $placeholder "}"$value$this->content);

    }


    public function 
echo_template() {

        return 
$this->content;

    }

}
Alles wunderbar!

Das dein Code älter ist habe ich auch gesehen. Aber macht ja nichts, daß kann man ja anpassen, was ich ja auch gemacht habe.


Zitat:
und es macht schon sinn bei templates auf php code zu verzichten, so trennst du das ganze viel besser.

html kümmert sich um die darstellung
css (was du ja sicherlich einbindest) kümmert sich um farben und aussehen/positionierung, usw
php um die eigentliche programmierung ... daten aus der db holen und reinschreiben, usereingaben überprüfen ... daten zum template-system zu senden.
Naja, meiner Meinung nach kann man PHP auch direkt als Template-System nutzen. Ein <?php echo $this->content; ?> ist auch nicht schlimmer als ein {content}.
Aber wie ich oben schon erwähnte, denke ich, daß es mit Schleifen und Abfragen schwierig werden könnte. Ok, ich hab mich damit noch nicht weiter beschäftigt, aber If-Anweisungen in einem Template können auch manchmal sinnvoll sein. Oder eben eine foreach-Schleife. So habe ich das zum Bsp. bisher:
PHP-Code:
<?php foreach ($arrNewslist as $news): ?>
    <h1 class="articlename"><?php echo $news['headline']; ?></h1>
    <div class="">Autor: <?php echo $news['author']; ?> | <?php echo $news['tstamp']; ?></div>
    <div class=""><?php echo $news['teaser']; ?></div>
    <?php if ($news['link_more'] == 1): ?>
        <p><a href="#">Weiter...</a></p>
    <?php endif; ?>
<?php 
endforeach; ?>
Wie könnte ich diesen Code über dein Template-System einbinden?


Gruss, Fransisco
Mit Zitat antworten
  #7 (permalink)  
Alt 12-04-2013, 00:04
Fransisco
 Registrierter Benutzer
Links : Onlinestatus : Fransisco ist offline
Registriert seit: Apr 2013
Beiträge: 7
Fransisco befindet sich auf einem aufstrebenden Ast
Standard

Ich zitiere mich mal selber...

Zitat:
Wie könnte ich diesen Code über dein Template-System einbinden?
Was mir so die Recherchen der letzten Stunden gebracht haben, war nur eine Bestätigung, wie ich es anfangs schon erwähnte. Es wird wohl keine Möglichkeit geben, so das Template-System zu nutzen, daß man auch Array im Template ausgegen kann. Selbst bei Smarty wird in den Templates mit foreach-Schleifen hantiert.

Jetzt habe ich dieses Script im Netz gefunden, was zwar auch schon alt ist, aber wahrscheinlich funktionieren wird, um Array zu übergeben.

Tutorials | PHP : Fortgeschrittene | eigenes Template-System

Das wird wohl meine Nachtschicht werden, dieses in mein System einzubinden. ;-)
Nebenbei wird da auch noch genau das wieder gegeben, was ich selbst zu Templatesystemen denke und hier auch schon geschrieben habe. PHP kann das alles selbst und das bestimmt auch noch besser und ressourcenschonender.

Allerdings hätte es am allerliebsten, wenn ich gar nicht eine neue Klasse einbinden müsste, um Arrays auszugeben.
So wie die Klasse noch in meinem ersten Posting funktionierte, konnte ich ja mit require auf mein Template zugreifen. Nur wenn ein anderes Template über eine andere Klasse eingebunden wird, wird die HTML-Struktur zurschossen. Leider weiß ich nicht warum?! Daher versuche ich mal den Thread hier am Leben zu erhalten und würde mir noch mehr Anregungen und Tipps wünschen.

@UzumakiNaruto: Dennoch finde ich dein 'altes' System hier gut und es hat mir auch grundsätzlich weitergeholfen, noch mehr die OOP zu kapieren. Ist zwar dennoch ein weiter Weg für mich, aber jetzt will ich es einfach wissen!


Gruss, Fransisco
Mit Zitat antworten
  #8 (permalink)  
Alt 12-04-2013, 09:56
UzumakiNaruto
 Registrierter Benutzer
Links : Onlinestatus : UzumakiNaruto ist offline
Registriert seit: Nov 2004
Beiträge: 642
UzumakiNaruto befindet sich auf einem aufstrebenden Ast
Standard

wenn du jetzt aber weiter denkst und du nicht mehr alleine was machst sondern in einem team könnte es schwierig werden ;-)

da hast du den typen der super html, css und js kann .. aber von php keine ahnung hat ... aber DU.

er gibt dir einfach html templates mit variablen a'la {content} und DU füllst die nur noch.

ich habe mit dem template system schon so einiges angestellt (z.B. news modul).

und was macht es für einen unterschied ob die php datei die das template system befüllt dein array verarbeitet oder ob es deine template datei selber ist?
du könntest auch die template klasse erweitern um eine methode die sich um arrays kümmert (auch wenn ich arrays einfach in der datei abarbeiten würde die auch das template lädt, füllt und speichert/ausgibt.

module_news.html
HTML-Code:
<div id="news"> <!-- in html5 könnt das auch <section> sein-->
   <h2>{news_title}</h2>
   <p>{news_content}</p>
   <p>von: {news_author} am {news_date} {news_comments} {news_readmore}</p>
</div>
PHP-Code:
# includes der module, db connect usw

$sql "SELECT * FROM news"#vllt mit WHERE news_date > $time -  (vor 7 tagen)
$result mysql_query($sql);

$while ($row mysql_fetch_assoc($result)) {

   if (
strlen($row['content']) > 200) { #mehr als 200 zeichen im content
      
$news_content substr($row['news_content'],0,199); #speicher 200 zeichen in $news_content
      
$news_readmore '<a href="news.php?id='.$row['news_id'].'">... mehr</a>'# erstelle einen link um alles zu lesen
   
} else {
      
$news_content $row['news_content'];
      
$news_readmore '';
   }

   
$template_news = new Templates("module_news.html");
   
$template_news->replace("news_title"$row['news_title']);
   
$template_news->replace("news_content"$news_content);
   
$template_news->replace("news_author"$row['news_author']);
   
$template_news->replace("news_date"$row['news_date']);
   
$template_news->replace("news_readmore"$news_readmore);
   
$temp_news .= $template_news->echo_template();

das script rattert durch und baut dir dein template system news für news ... und je nachdem ob die news 201 zeichen hat oder nur 100 .. sie sieht anders aus.

da kannst du auch locker noch kommentare einbauen

PHP-Code:
# sql abfrage nach den comments für die $row['news_id']
# while schleife, template laden und variablen ersetzen
# in $temp_comments speichern und der news seite mitgeben
# {news_comments} kann in module_news.html einfach ein <div class="comments">{news_comments}</div> sein und du baut da mit dem template system den richtigen inhalt rein.
$template_news->replace("news_comments"$temp_comments); 
du siehst, deine "html dateien" können ruhig strohdumm sein und sich wirklich NUR um die positionierung und das aussehen kümmern ohne das dort eine zeile php code drin ist.
__________________
Gruß
Uzu

private Homepage

Geändert von UzumakiNaruto (12-04-2013 um 10:03 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 12-04-2013, 13:28
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Fransisco Beitrag anzeigen
Was mir so die Recherchen der letzten Stunden gebracht haben, war nur eine Bestätigung, wie ich es anfangs schon erwähnte. Es wird wohl keine Möglichkeit geben, so das Template-System zu nutzen, daß man auch Array im Template ausgegen kann. Selbst bei Smarty wird in den Templates mit foreach-Schleifen hantiert.
Smarty ist ja auch kein ordentliches Template-System sondern (IMHO) Müll.

Mann kann Arrays auch "in HTML" ausgeben, ohne Schleifen basteln zu müssen.

Beispiel:
HTML-Code:
<table>
  <thead>
    <tr>
      <th>Position</th>
      <th>Player</th>
      <th>Score</th>
    </tr>
  </thead>
  <tbody>
    <tr tal:repeat="ranking playersRanking">
      <td tal:content="ranking/position"/>
      <td tal:content="ranking/player"/>
      <td tal:content="ranking/score"/>
    </tr>
  </tbody>
</table>
tal:repeat

Geändert von h3ll (12-04-2013 um 13:31 Uhr)
Mit Zitat antworten
  #10 (permalink)  
Alt 12-04-2013, 23:27
Fransisco
 Registrierter Benutzer
Links : Onlinestatus : Fransisco ist offline
Registriert seit: Apr 2013
Beiträge: 7
Fransisco befindet sich auf einem aufstrebenden Ast
Standard

PHPTAL ist aber auch eine ex. Erweiterung. Auf sowas möchte ich eigentlich verzichten.
Grundsätzlich baue ich mir hier schon eine Art CMS auf, das aber nur für mich alleine, ohne Team, nur zum lernen. Normal brauche ich das ja nicht, gibt ja schon genug.
Ich finde es schon gut, daß man sich selber sein eigenen Template-System erstellen kann, doch wie gesagt, finde ich es es eigentlich überflüssig, daß ich dies alles schon direkt mit PHP machen kann.
So habe ich auch weiter an meiner ersten Klasse gehalten und doch eine Lösung gefunden, meine Template-Dateien mit require einzubinden. Ich mußte nur ein paar mehr Funktionen erstellen. Also für jedes Template eine. Da finde ich so in Ordnung, denn dann kann ich da auch gleich die Datenbank-Abfragen mit einbinden und diese werden dann ja auch sofort ans Template übergeben.

Im Groben sieht das Haupttemplate jetzt so aus:
PHP-Code:
<body>
<header style="border: 1px red solid; padding: 10px; margin-bottom: 5px;"><?php $this->getHeader(); ?></header>
<nav style="border: 1px green solid; padding: 10px; margin-bottom: 5px;"><?php $this->getNavigation(); ?></nav>
<div id="content" style="border: 1px blue solid; padding: 10px; margin-bottom: 5px;"><?php $this->getContent(); ?></div>
<footer style="border: 1px orange solid; padding: 10px;"><?php $this->getFooter(); ?></footer>
</body>
Aufruf des Haupttemplates und der Navigation:
PHP-Code:
    public function getTemplate()
    {
        require 
'templates/frontend.php';
        return;
    }


    public function 
getNavigation()
    {

        
$mysqli = new mysqli ($this->db_host$this->db_user$this->db_pass$this->db_base);
        
$query "SELECT * FROM pages WHERE menu = 1 AND lang = '" $GLOBALS['CONFIG']['lang'] . "' AND activ = 1";
        
$result $mysqli->query($query);

        
$navigation = array();
        while(
$row $result->fetch_array(MYSQLI_ASSOC))
        {

            
$navi = array
            (
                
'id'  => $row['id'],
                
'name' => $row['name']
            );

            
$navigation[] = $navi;

        }

        
$result->free();
        
$mysqli->close();

        
$this->navigation $navigation;

        require 
'templates/navigation.php';
        return;
    } 
Und das Navi-Template selbst so:
PHP-Code:
<div class="navigation inside">
    <ul>
    <?php foreach ($this->navigation as $navi): ?>
        <li><a href="index.php?pageID=<?php echo $navi['id']; ?>"><?php echo $navi['name']; ?></a></li>
    <?php endforeach; ?>
    </ul>
</div>
Wie ich als Leie finde, auch eine saubere Lösung.


Gruss, Fransisco
Mit Zitat antworten
  #11 (permalink)  
Alt 13-04-2013, 09:26
UzumakiNaruto
 Registrierter Benutzer
Links : Onlinestatus : UzumakiNaruto ist offline
Registriert seit: Nov 2004
Beiträge: 642
UzumakiNaruto befindet sich auf einem aufstrebenden Ast
Standard

man nutzt aber template-systeme um gerade code und darstellung zu trennen. du bringst es wieder zusammen ;-)

auch solltest du lieber mit externen css dateien arbeiten und die im html head einbinden und dafür dein html code css frei halten.

CSS - Überblick
__________________
Gruß
Uzu

private Homepage
Mit Zitat antworten
  #12 (permalink)  
Alt 13-04-2013, 09:49
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Zitat:
Zitat von UzumakiNaruto Beitrag anzeigen
man nutzt aber template-systeme um gerade code und darstellung zu trennen. du bringst es wieder zusammen ;-)
Da bin ich so nicht mit einverstanden.
Man benutzt Templatesysteme um Verarbeitung und Präsentation zu trennen.

Um Templates frei von Code zu halten müssen fürchterliche Verrenkungen vorgenommen werden.

Die Trennung von PHP und HTML zwingt zur Einführung einer Zwischensprache.
Zum Beispiel ist das bei der Template Engine Fluid ganz gut gemacht. Bei Smarty eher weniger schön.

Auch sehr konsequent: XSL Transformation ? Wikipedia
__________________
Wir werden alle sterben
Mit Zitat antworten
  #13 (permalink)  
Alt 13-04-2013, 14:30
Fransisco
 Registrierter Benutzer
Links : Onlinestatus : Fransisco ist offline
Registriert seit: Apr 2013
Beiträge: 7
Fransisco befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von UzumakiNaruto Beitrag anzeigen
man nutzt aber template-systeme um gerade code und darstellung zu trennen. du bringst es wieder zusammen ;-)
Naja, ein echo als Ausgabe in einem Template sehe ich jetzt nicht im Sinne von Code. Aber wie vieles auch: Ansichtssache. Ich denke, beide Systeme haben ihre Vor- und Nachteile. Für eines muß man sich aber nunmal entscheiden.

Zitat:
auch solltest du lieber mit externen css dateien arbeiten und die im html head einbinden und dafür dein html code css frei halten.
Das ist schon klar und dient ja auch erstmal nur für die schnelle Optik. Im Code vom Navi-Template siehst du ja auch, daß ich mir schon DIVs und Klassen erstelle.


Gruss, Fransisco

Geändert von Fransisco (13-04-2013 um 14:34 Uhr)
Mit Zitat antworten
  #14 (permalink)  
Alt 13-04-2013, 14:33
Fransisco
 Registrierter Benutzer
Links : Onlinestatus : Fransisco ist offline
Registriert seit: Apr 2013
Beiträge: 7
Fransisco befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von combie Beitrag anzeigen
Die Trennung von PHP und HTML zwingt zur Einführung einer Zwischensprache.
Genau das meine ich ja auch. Gut und danke, ich fühle mich etwas mehr bestätigt. ;-)


Gruss, Fransisco
Mit Zitat antworten
Antwort

Lesezeichen


LinkBacks (?)
LinkBack to this Thread: https://www.php-resource.de/forum/php-developer-forum/103931-klassen-und-templates.html
Erstellt von For Type Datum
klamm-Forum - RSS Feed URL - Blog RSS Feed This thread Refback 11-04-2013 14:36

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Index und Templates DeadNovum PHP Developer Forum 7 01-06-2007 13:09
ajax und templates ? ripper BRAINSTORMING PHP/SQL/HTML/JS/CSS 5 25-06-2006 15:32
templates und schleife schnidelwutz PHP Developer Forum 7 14-12-2004 17:42
Probleme mit Klassen und Objekten und statischen Funktionen innerhalr der Klasse glombi BRAINSTORMING PHP/SQL/HTML/JS/CSS 1 17-10-2004 01:09
klassen innerhalb von klassen verwenden rythms BRAINSTORMING PHP/SQL/HTML/JS/CSS 14 07-11-2003 09:19

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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 an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:07 Uhr.