Übergabe Problem

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Übergabe Problem

    Hallo zusammen..

    Ich habe mal bisschen OOP gelern und meiner 1. kleiner Parser geschrieben. Beim Testen hab ich jedoch ein Fehler Festgestellt.

    Wie ihr hier sehen könnt:
    http://andys-tools.ch/cms/admin/index.php?page=12
    -> Der Error wird nach dem Header und vor dem body ausgegeben, wie ihr dem Quellcode entnehmen könnt.

    Ich habe sehr lange gesucht woran das es liegt, biss ich jetzt eignedlich weiss was genau passiert aber nicht wiso, darum konnte ich den fehler aucxh noch nicht beheben.

    PHP-Code:
    class Parser
    {
    // ...
    // Platzhalter zufügen
    function add($ph$es)
    {
    // Platzhalten zufügen
    $this->arr[$ph] = $es;
    }
    // ...
    // Content Parsen
        
    function tpl($tpl)
        {
            
    // tpl holen
            
    $tpl file_get_contents($tpl);
            
            
    // prüfen ob normales add oder add_array
            
    if(count($this->arr) > 0) {
            
    // add -> arr
            
                // Platzhalter ersetzen
                
    foreach ($this->arr as $ph => $es)
                {
                    
    // Platzhalter ersetzen
                    
    $tpl str_replace('{'.$ph.'}'$es$tpl);
                    
                }
            
            } elseif(
    count($this->while) > 0) {
            
    // add_array -> while
                
                // inhalt zwischen {while} und {/while} suchen
                
    $dat split('{while}'$tpl); 
                
    $dat split('{/while}'$dat[1]); 
                
    $dat[0] = $tpl;
                
                
                
    // Platzhalter ersetzen
                
    foreach ($this->while as $ph => $es)
                {
                    
    // Platzhalter ersetzen
                    
    $tpl str_replace('{'.$ph.'}'$es$tpl);
                    
                }
            } else {
                
    // Platzhalter ersetzen
                
    foreach ($this->arr as $ph => $es)
                {
                    
    // Platzhalter ersetzen
                    
    $tpl str_replace('{'.$ph.'}'$es$tpl);
                    
                }
            }
    //..
    // Content Template
        
    function getContent()
        {
            return 
    $this->content;
        }

    Das sind eigendlich die drei funktionen die ich verwende.

    Auf der Index.php parse ich nun das Hauptdesign.
    da wird ist ein include, der die jeweilige seite includiert, je nach $_GET übergabe.
    Jede dieser Seite ist ca. folgend aufgebaut:
    PHP-Code:
    // ...
    $Pars->add('platzhalter1'$ph1);
    $Pars->add('platzhalter2'$ph2);
    $Pars->tpl('template.tpl')
    //.. 
    Der Fehler entsteht nun in der index.php
    PHP-Code:
    //prüfen ob $_get[page] übergeben wurde
        
    if(isset($_GET['page'])) {
            include(
    'page.php');
            
    $Pars->add('content'$Pars->getContent());
            
    $Pars->setTitel('Admin Panel :: Startseite');
        } else {
            
    // content Startseite
            
    $Pars->add('content''Admin Panel Startseite');
            
    $Pars->setTitel('Admin Panel :: Startseite');
        }
        
    $Pars->tpl('../templates/admin/index_body.tpl'); 
    Jetzt wird der Content das erste mal direkt beim include der page.php ausgegeben, das 2. mal am richtigen ort: $Pars->add('content', $Pars->getContent());


    Frage:
    Wiso wird der Content schon beim include ausgegeben, wenn ich gar nirgens (ob klasse oder code) ein echo oder ein print hab?
    Bücher für Programmierer

  • #2
    Re: Übergabe Problem

    So macht es irgendwie mehr Sinn, meinst du nicht?
    PHP-Code:
    // Auszug aus Parser::tpl()
    foreach ($this->arr as $ph => $es) {
        if (
    is_array($es)) {
            foreach (
    $es as $ph => $value) {
                
    $tpl str_replace('{'.$ph.'}'$value$tpl);
            }
        } else {
            
    $tpl str_replace('{'.$ph.'}'$es$tpl);
        }

    Allerdings würde ich in Parser::add_array() dafür sorgen, dass Parser::arr flach ist, d.h. ich würde es z.B. so implementieren:
    PHP-Code:
    function add_array($arr) {
        
    $this->arr array_merge($this->arr$arr);

    Parser::tpl() sähe dann so aus:
    PHP-Code:
    foreach ($this->arr as $ph => $es) {
        
    $tpl str_replace('{'.$ph.'}'$es$tpl);

    Der Ansatz für while-Schleifen sieht leider so aus, als könne man nur eine einzige pro Template haben. Ist das korrekt? Ist das gewollt?


    BTW: Kennst du Smarty?
    Zuletzt geändert von onemorenerd; 01.01.2008, 18:42.

    Kommentar


    • #3
      Erstmal danke für deine Antwort.

      Allerdings fehler mir irgendwie die kenntnisse um bei deinem Versuch draus zu kommen, und wenn ich das richtig verstanden habe, wurde meine frage nicht beantwortet.

      Ich Programmiere halt noch wie ein Anfänger, da ich es so einfach verstehe.

      Nein, Smarty kenn ich ned. Ich glaube aber es ist ne Opensource Klasse für nen Parser. Allerdings möchte ich selber einen schreiben, ist einfahc nicht das gleiche.
      Bücher für Programmierer

      Kommentar


      • #4
        Du solltest zunächst deine Klasse ein wenig aufräumen.
        PHP-Code:
        class Parser {
            function 
        getContent() {
                return 
        $this->content;
            }

            function 
        tpl($tpl) {
                
        $this->content str_replace(
                    
        array_keys($this->arr), $this->arrfile_get_contents($tpl));
            }

            function 
        add_array($arr) {
                
        $this->arr array_merge($this->arr$arr);
            }

            function 
        add($ph$es) {
                
        $this->arr[$ph] = $es;
            }

        Den While-Kram habe ich weggelassen, weil der total kaputt ist.
        Fehlebehandlung mußt du selbst einbauen. Dieses minimale Beispiel, soll nur zeigen, wie einfach Parser::tpl() aussehen kann, wenn man Parser::arr eindimensional hält.

        Deine Frage kann man übrigens kaum beantworten, ohne deine .tpl-Dateien zu kennen. Ich vermute einfach mal: Parser::getContent() wird mehrmals aufgerufen.

        Kommentar


        • #5
          Danke.

          Ich hab jetzt deine Version mal gemacht, abe rnoch etwas ausgebaut. Jedohc kommt bei mir ein Fehler und zwar hier:
          PHP-Code:
          $this->content str_replace(array_keys($this->arr), $this->arrfile_get_contents($tpl)); 
          Da kommt immer der Fehler:
          Code:
          Notice: Array to string conversion in ...
          Ich habs dan mal folgendermassen versucht:
          PHP-Code:
          $this->content str_replace(array_keys($this->arr), array_values($this->arr), file_get_contents($tpl)); 
          Sollte man denn da nicht noch ein foreach schleife machen? Die funktion array_keys erziehlt doch lange nicht dasselbe?
          Bücher für Programmierer

          Kommentar


          • #6
            Foreach brauchst du nicht. array_keys($this->arr) liefert alle Schlüssel (ph's) als Array. Wenn deine PHP-Version mindestens 4.0.5 ist, kann str_replace() damit umgehen. Prüfe das mal!
            Zuletzt geändert von onemorenerd; 02.01.2008, 10:57.

            Kommentar


            • #7
              Also die PHP Version auf meinem Host ist 5.2.0.
              ich hab mal ein kleines Test-Skript gemacht:
              PHP-Code:
              <?php
              $arr 
              = array();
              $arr['x'] = 'xyz';
              $arr['a'] = 'abc';

              echo 
              str_replace('{'.array_keys($arr).'}'$arr'skdafjkasfjkl-->{x}<--aslfasdhasihdasi-->{a}<--asfhdll');
              ?>
              Aber auch da kommt folgender fehler:
              Code:
              Notice: PHPDocument2 line 6 - Array to string conversion
              Bücher für Programmierer

              Kommentar


              • #8
                Na ist doch klar: array_keys() gibt ein Array zurück, das PHP in einen String umwandeln muß, weil du es wie einen String behandelst, nämlich konkatenierst.

                PHP-Code:
                // Notice: Array to string conversion ...
                str_replace('{'.array_keys(...).'}', ...);

                // so funktioniert es
                str_replace(array_keys(...), ...); 

                Kommentar


                • #9
                  Ausgabe verhindern

                  Ok..
                  Ich hab die Klasse nochmals bisschen umgeschrieben


                  Alles was ich jetzt bräuchte die Funktion die folgendes macht:
                  Wenn ich eine datei includen will in der ein echo steht, aber ich will nicht das dieses echo ausgeführt wird! Ein kolleg meinte, dass es eine solche Funktion gäbe.
                  Ich hoffe jemand kennt diese Funktion
                  Bücher für Programmierer

                  Kommentar


                  • #10
                    Du meinst Ausgabesteuerung?
                    Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                    Kommentar


                    • #11
                      Ich Programmiere halt noch wie ein Anfänger
                      So schreibst du auch. -)

                      Kommentar


                      • #12
                        @tontechnicker: Danke, die meinte ich wohl

                        @Sandman: Ja, ich weiss das in diesem Forum die Anfänger "Herzlich willkommen sind" -.-

                        Leider bringen mir die Output funktionen auch nichts, da der Falsch geparste Content wirklich durch das getTpl() durchgeht..
                        Bücher für Programmierer

                        Kommentar


                        • #13
                          Original geschrieben von andygyr
                          Leider bringen mir die Output funktionen auch nichts, da der Falsch geparste Content wirklich durch das getTpl() durchgeht..
                          Äh, wie meinen der Herr?

                          Kommentar

                          Lädt...
                          X