kostenloser Webspace werbefrei: lima-city


Reguläre Ausdrücke / Schleife / Template

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    n********r

    Moin,

    also ich bin gerade dabei meine eigene kleine Template - Klasse zu schreiben.
    Jetzt habe ich ein Template, das folgende Platzhalter besitzt: #platzhalt#

    Mit folgender Funktion ersetze ich sie dann, durch die Variablen:

    preg_replace("/(#)([0-9a-zA-Z]*?)(#)/","ersatz",$text)
    ;


    Jetzt würde ich aber gerne eine Shcleife bauen, also, wenn ich zum Beispiel ein gästebuch habe, habe ich ja nich tnur einen EIntrag sondern gleich mehrere.
    Ich kann ´natürlich eine Schleife bauen mit dem preg_replace was aber sehr Ressource fressend ist, meine Frage ist daher ob es irgendwie sparender geht?
    Vielleicht sogar mit Chache?

    Danke
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Bei komplexeren Templatesytaxten kommst du nicht darum, dir einen eigenen Parser / Lexer / Tokenizer zu schreiben. Könntest du mal genauer erklären wie dein Schleifen-Template-Konstrukt aussieht?
  4. Autor dieses Themas

    n********r

    nikic schrieb:
    Bei komplexeren Templatesytaxten kommst du nicht darum, dir einen eigenen Parser / Lexer / Tokenizer zu schreiben. Könntest du mal genauer erklären wie dein Schleifen-Template-Konstrukt aussieht?


    Also ich würde gern auch so was eigenes Programmieren.
    Dich leider habe ich nicht gerade im Blick, was ich alles brauche.
    Will halt nach dem MVC arbeiten, mein Model habe ich schon und mein Controller auch.

    Mir fehtl halt di eperfekte umsetzung von dem view.
    Aber halt so das ich es verstehe und auch selber erweitern kann.

    Also, ich würde gerne, dass View auch komplette Blöcke ersetzen kann?
    Habe mit dem view nocht nicht angefangen nur ein paar Gedanken dazu gemacht.
  5. Ich habe es so gemacht, dass ich zwei Platzhalter habe.
    Einen direkten und einen Blockplatzhalter.
    Also:
    %platzhalter%
    [block] mit eigenen platzhaltern %block_platzhalter% asdasd [/block]

    Im Skript lese ich alle Blöcke aus und speichere sie in einem Array (z.B. blocks_platzhalter .- Index ist der Blockname).
    Ein weiteres Array (z.B. blocks_fertig mit den gleichen Indizes, wie blocks_platzhalter) erzeuge ich auch, wo der geparste Block ggf. hineinkopiert wird.
    Jetzt habe ich drei Möglichkeiten bei dem Block "block":
    - das Array blocks_fertig['blocks'] bleibt leer, d.h. der Block wird einfach aus dem Dokument entfernt (z.B. für if/else Abfrage)
    - das Array blocks_fertig['blocks'] wird mit dem Inhalt aus blocks_platzhalter['blocks'] gefüllt und die Platzhalter ersetzt
    - es wird eine Schleife durchlaufen und an den Inhalt von blocks_fertig['block'] wird bei jedem Schleifendurchlauf der geparste Inhalt aus blocks_platzhalter['blocks'] angehängt

    Damit konnte ich bisher alles, was ich an Logik in der View brauchte realisieren.

    Viel Erfolg ;)
    Lucas
  6. Autor dieses Themas

    n********r

    Doch, wie liest du die Inhalte ein und speicherst sie in einem Array?
  7. abstrView.php
    <?php
    abstract class abstrView {
      protected $vCache;
      
      public function __construct () {
        $this -> vCache = array ();
        cc_loadExtension (7);
        $this -> autoload ();
        return (true);
      }
      
      protected function autoload () {
        return (true);
      }
      
      public function getFile ($pFile) {
        if (preg_match('/[a-z0-9\-_\/]/i', $pFile)) {
          if (isset ($this -> vCache[$pFile])) {
            return ($this -> vCache[$pFile]);
          } else {
            $path = $GLOBALS['_PATH']['dir']['tpl'].$pFile.'.'.$GLOBALS['_CONF']['tpl-ext'];
            if (file_exists ($path)) {
              $this -> vCache[$pFile] = file_get_contents ($path);
              return ($this -> vCache[$pFile]);
            } else {
              trigger_error ('Die Template-Datei "'.htmlentities ($path).'" existiert nicht');
              return (false);
            }
          }
        } else {
          trigger_error ('Der Name der Template-Datei "'.htmlentities ($pFile).'" enthält nicht zugelassen Zeichen.');
          return (false);
        }
      }
      
      public function getHeader () {
        $data = '';
        foreach ($GLOBALS['_CC']['HTTP_Response'] as $value) {
          $data .= $value."\r\n";
        }
        return ($data);
      }
      
      public function setHeader ($pData) {
        $GLOBALS['_CC']['HTTP_Response'][] = $pData;
        return (true);
      }
      
      public function sendData () {
        return (true);
      }
      
      public function __destruct () {
        return (true);
      }
    }
    ?>




    #########################################################################



    HTML_View.php
    <?php
    class HTML_View extends abstrView {
      
      public function assignString ($pData, $pWildcard, $pOverwrite = false) {
        if (isset ($GLOBALS['_TPL']['wildcards'][$pWildcard]) && $pOverwrite === false) {
          $GLOBALS['_TPL']['wildcards'][$pWildcard] .= $pData;
        } else {
          $GLOBALS['_TPL']['wildcards'][$pWildcard] = $pData;
        }
        return (true);
      }
      
      public function assignArray ($pData) {
        if (is_array ($pData)) {
          $GLOBALS['_TPL']['wildcards'] = array_merge ($GLOBALS['_TPL']['wildcards'], $pData);
          return (true);
        } else {
          trigger_error ('Der übergeben Parameter ist kein Array.');
          return (false);
        }
      }
      
      public function file ($pFile, $pWildcards) {
        return ($this -> replaceArray ($this -> getFile ($pFile), $pWildcards));
      }
      
      public function getBlock ($pString, $pBlock) {
        return (preg_replace ('/(.*?)\['.preg_quote ($pBlock, '/').'\](.*?)\[\/'.preg_quote ($pBlock, '/').'\](.*?)/Usi', '\2', $pString));
      }
      
      public function getBlockFromFile ($pFile, $pBlock) {
        return (preg_replace ('/(.*?)\['.preg_quote ($pBlock, '/').'\](.*?)\[\/'.preg_quote ($pBlock, '/').'\](.*?)/Usi', '\2', $this -> getFile ($pFile)));
      }
      
      public function replaceString ($pData, $pWildcard, $pValue) {
        $pValue = preg_replace ('/[$\x5c]/', '\\\\$0', $pValue);
        $pData = preg_replace ('/'.preg_quote ($GLOBALS['_CONF']['tpl-wc-left-delimiter'].$pWildcard.$GLOBALS['_CONF']['tpl-wc-right-delimiter'], '/').'/Us', $pValue, $pData);
        $pData = preg_replace ('/'.preg_quote ($GLOBALS['_CONF']['tpl-block-left-delimiter'].$pWildcard.$GLOBALS['_CONF']['tpl-block-right-delimiter'], '/').'(.*?)'.preg_quote ($GLOBALS['_CONF']['tpl-block-left-delimiter'].'/'.$pWildcard.$GLOBALS['_CONF']['tpl-block-right-delimiter'], '/').'/Us', $pValue, $pData);
        return ($pData);
      }
      
      public function replaceArray ($pData, $pArray) {
        if (is_array ($pArray)) {
            if (isset ($pArray[0]) && is_array ($pArray[0])) {
            trigger_error ('Der zweite Parameter darf kein mehrdemensionales Array sein');
            return (false);
          } else {
            foreach ($pArray as $wildcard => $value) {
              $pData = $this -> replaceString ($pData, $wildcard, $value);
            }
            return ($pData);
          }
        } else {
          trigger_error ('Der zweite Parameter muss ein Array sein');
          return (false);
        }
      }
      
      public function getData () {
        $data = $GLOBALS['_TPL']['template'];
        if (count ($GLOBALS['_TPL']['local-wildcard']) > 0) {
          $data = $this -> replaceArray ($data, $GLOBALS['_TPL']['local-wildcard']);
        }
        if (count ($GLOBALS['_TPL']['wildcard']) > 0) {
          $data = $this -> replaceArray ($data, $GLOBALS['_TPL']['wildcard']);
        }
        if (count ($GLOBALS['_TPL']['global-wildcard']) > 0) {
          $data = $this -> replaceArray ($data, $GLOBALS['_TPL']['global-wildcard']);
        }
        return ($data);
      }
      
      public function sendData () {
        header ($this -> getHeader ());
        print ($this -> getData ());
        return (true);
      }
    }
    ?>




    #########################################################################



    TView.php
    <?php
    class TView {
      private $vView;
      
      public function __construct () {
        $this -> vView = array ();
        return (true);
      }
      
      public function createView ($pView) {
        $class = $pView.'_View';
        $this -> vView[$pView] = new $class;
        return ($this -> vView[$pView]);
      }
      
      public function getView ($pView) {
        return ((isset ($this -> vView[$pView]) ? $this -> vView[$pView] : false));
      }
      
      public function sendData () {
        foreach ($this -> vView as $index => $value) {
          $this -> vView[$index] -> sendData ();
        }
        return (true);
      }
      
      public function __destruct () {
        unset ($this -> vView);
        return (true);
      }
    }
    ?>





    Die TView.php ist nur der Vollständigkeit. ;-)
    Darüber initialisiere ich die HTML_VIEW.

    Viel Spaß und bei Fragen, schieß los. ;-)
    VG Lucas



    edit:
    Die $_GLOBALS[...] werden vorher definierit. Musste mal schaun, was da so hin müsste.
    In $GLOBALS['_TPL']['template'] kommt das eigentliche (Haupt-)Template mit ein paar Platzhalter, wie z.B. der Seitentitel.
    Lokale Platzhalter ($GLOBALS['_TPL']['local-wildcard'])) werden nur in diesem (Haupt-)Template ersetzt. D.h. in einer lokalen Variable würde ich den Seitentitel speichern.
    Die normalen Platzhalter ($GLOBALS['_TPL']['wildcard'])) sind alle Platzhalter und auch die Blöcke, die bereits mit Inhalt gefüllt wurden (oder eben auch nicht, wenn sie z.B. ausgelassen werden sollen).

    Die globalen Platzhalter ($GLOBALS['_TPL']['global-wildcard'])) ersetzen Platzhalter in dem (Haupt-)Template, wo die lokalen Platzhalter bereits ersetzt wurden (evtl. wurden diese mit einem "Wort + %globaler_Platzhalter%" ersetzt) und wo bereits die normalen Platzhalter auch alle ersetzt wurden. Ergo wird eigentlich das fertige HTML Dokument nach diesen globalen Platzhaltern abgesucht und ggf. ersetzt. Aber vorsicht damit, wenn du Usereingaben auf der Seite hast, da diese auch Platzhalter enthalten könnten (frag z.B. den lord ;-)).

    Beitrag zuletzt geändert: 21.1.2010 4:29:52 von lucas9991
  8. Autor dieses Themas

    n********r

    Cool.
    Könntest du mir vielleicht auch nochmal ein Teil einer deienr Template Dateien posten, dann kann ich das besser in Zusammenhang bringen, ist jetzt alles wein wenig abstrack!

    Achja, deine Klassen sind echt hohe Programmierkunst.
    Ich verstehe mal gerade 5 %, wenn überhaupt.

    Fange ich mal vorne an :

    public function __construct () {
        $this -> vCache = array ();
        cc_loadExtension (7);
        $this -> autoload ();
        return (true);
      }


    $this -> vCache ist klar, deklariest du als array.
    Doch was bedeutet cc_loadExtension (7);?
    Das hier:
    $this -> autoload ();
        return (true);


    Ist auch wieder klar, wieder ein Objekt.
    Und das die Funktion mit true beendet wird.
  9. Hoi,

    vllt schaust du dir mein Framework einfach an: http://download.cycase.de/cyCase_Framework_0.2.0.zip
    Iwie will die Weiterleitung für download.cycase.de nicht so, deshalb gehts im Moment nicht über cycase.de

    "cc_loadExtension (7);" bedeutet einfach nur, dass die Erweiterungen mit Priorität 7 an dieser Stelle geladen werden.
    Für dich also irrelevant.

    "autoload ()" ist einfach eine Funktion die nach dem Aufruf der "__construct ()" aufgerufen wird. So habe ich in jeder Klasse sozusagen einen zweiten Konstruktor, weil "__construct ()" meist in der abstrakten Klasse schon gesetzt ist und ich sie in der Klasse nicht überschreiben möchte, aber trotzdem noch etwas spezielles beim Starten passieren soll. Für dich auch uninteressant.


    Mal generell zum Aufruf:
    // TView initialisieren
    $GLOBALS['_CC']['TView'] = new TView ();
    
    $GLOBALS['_TPL']['template'] = file_get_contents ('tpl.tpl'); // siehe weiter unten
    
    // um HTML_VIEW zu initialisieren
    $GLOBALS['_CC']['TView'] -> createView ('HTML'); 
    
    // ist kürzer als den ganzen aufruf zu schreiben
    $current_view = $GLOBALS['_CC']['TView'] -> getView ('HTML');
    $current_view -> assignString ('content', 'Mein Inhalt <br />'); // hier kannst du natürlich auch den Inhalt einer Datei reinschreiben oder
    $meine_unterseite = $current_view -> file ('pfad/zur/datei.tpl', array ('name_der_unterseite' => 'News', 'datum_der_unterseite' => date ()));
    /* 
    dadurch wird der Platzhalter %name_der_unterseite% und %datum_der_unterseite% in der datei "pfad/zur/datei.tpl" ersetzt
    und der Inhalt der dadurch entsteht wird dann in einer variablen gespeichert */
    $current_view -> assignString ('content', $meine_unterseite); // jetzt kann man natürlich den Inhalt der Unterseite in das Haupttemplate einfügen
    // nachher wird %content% dann durch "'Mein Inhalt <br />' + der ersetzte Inhalt der Datei" ersetzt
    
    $GLOBALS['_TPL']['global-wildcard']['title'] = 'Mein Seitentitel';
    
    // damit wird das Haupttemplate geparst und alles wird zusammengefügt und an den Browser gesendet
    $GLOBALS['_CC']['TView'] -> sendData ();
    // man kann noch header daten etc. setzen, aber das ist jetzt eher uninteressant




    tpl.tpl
    <!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" xml:lang="de" lang="de">
      <head profile="http://dublincore.org/documents/dcq-html/">
        <title>
          cyCase Framework Demo - %title%
        </title>
      </head>
      <body>
        %content%
    
        <br /><br /><hr />
        Parsetime: %cc_parsetime% %cc_name% %cc_version%
      </body>
    </html>


    Beitrag zuletzt geändert: 23.7.2011 13:10:29 von karpfen
  10. Autor dieses Themas

    n********r

    Habe mal folgendes Versucht:

    <?php
    error_reporting(E_ALL);
    
    // TView initialisieren
    $GLOBALS['_CC']['TView'] = new TView ();
    
    $GLOBALS['_TPL']['template'] = file_get_contents ('tpl/overall_header.tpl'); // siehe weiter unten
    
    // um HTML_VIEW zu initialisieren
    $GLOBALS['_CC']['TView'] -> createView ('HTML'); 
    
    $GLOBALS['_TPL']['global-wildcard']['page_name'] = 'Mein Seitentitel';
    
    // damit wird das Haupttemplate geparst und alles wird zusammengefügt und an den Browser gesendet
    $GLOBALS['_CC']['TView'] -> sendData ();
    // man kann noch header daten etc. setzen, aber das ist jetzt eher uninteressant
    ?>


    Und das Template:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>Rock the North &raquo; %page_name%</title>
    <meta name="keywords" content="" />
    <meta name="description" content="" />
    <link href="tpl/css/default.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
    <div id="wrapper">
    	<div id="header">
    		<h1><a href="#">Rock the North</a></h1>
    	</div>
    	<!-- end header -->


    Bekomme folgende Meldungen:

    Notice: Undefined index: HTTP_Response in D:\xampp\xampp\htdocs\rtn3\class\class.abstrView.php on line 38
    
    Warning: Invalid argument supplied for foreach() in D:\xampp\xampp\htdocs\rtn3\class\class.abstrView.php on line 38
    
    Warning: Cannot modify header information - headers already sent by (output started at D:\xampp\xampp\htdocs\rtn3\class\class.abstrView.php:38) in D:\xampp\xampp\htdocs\rtn3\class\class.htmlview.php on line 74
    
    Notice: Undefined index: local-wildcard in D:\xampp\xampp\htdocs\rtn3\class\class.htmlview.php on line 61
    
    Notice: Undefined index: wildcard in D:\xampp\xampp\htdocs\rtn3\class\class.htmlview.php on line 64
    
    Notice: Undefined index: _CONF in D:\xampp\xampp\htdocs\rtn3\class\class.htmlview.php on line 37
    
    Notice: Undefined index: _CONF in D:\xampp\xampp\htdocs\rtn3\class\class.htmlview.php on line 37
    
    Notice: Undefined index: _CONF in D:\xampp\xampp\htdocs\rtn3\class\class.htmlview.php on line 38
    
    Notice: Undefined index: _CONF in D:\xampp\xampp\htdocs\rtn3\class\class.htmlview.php on line 38
    
    Notice: Undefined index: _CONF in D:\xampp\xampp\htdocs\rtn3\class\class.htmlview.php on line 38
    
    Notice: Undefined index: _CONF in D:\xampp\xampp\htdocs\rtn3\class\class.htmlview.php on line 38


    Beitrag zuletzt geändert: 22.1.2010 15:40:58 von newwarrior
  11. Die Arrays musst du natürlich vorher noch anlegen.
    Ich habe die ganzen Konfigurationseinstellungen direkt unter $_GLOBALS in Arrays gespeichert.
    Die verwendeten musst du natürlich n och anlegen. :)
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!