Ankündigung

Einklappen
Keine Ankündigung bisher.

php Template mit Feldern

Einklappen

Neue Werbung 2019

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

  • php Template mit Feldern

    Hallo,

    um eine Webseite mit php erstellen zu können, wird zunächst eine fertiges Template-Datei eingelesen:

    PHP-Code:
    $page file_get_contents($layouttemplate); 
    Felder sin alle im Format __FELD__ vorhanden.

    Im Folgenden sollen alle Felder durch entsprechene Inhalte ersetzt werden.

    Bislang wurde hier der preg_replay-Befehl eingesetzt:

    PHP-Code:
    $page preg_replace("/__TITLE__/i""Demo Titel"$page); 
    Falls allerdings innerhalb eines eingesetzten Inhalts wieder ein Feld-Kennzeichen (z.B. __MAIN__ ) vorhanden ist, wird dieses wieder ersetzt.

    Gibt es eine Methode, um das ungewollte Ersetzen von eingesetzten Content-Inhalten zu vermeiden?

    Beispiel-Szenario:

    Felder:
    $myCONTENT = "Im Bericht-A ist ein Kürzel "__FOOTER__" vorhanden, der im Buch A verwendet werden soll. ..."
    $myHEADER = "Diskussion um Buch A, Ausgabe 2016"
    $myFOOTER = 2017

    PHP-Code:
    $page file_get_contents($layouttemplate);
    $page preg_replace("/__CONTENT__/i"$myCONTENT$page);
    $page preg_replace("/__HEADER__/i"$myHEADER$page);
    $page preg_replace("/__FOOTER__/i"$myFOOTER$page);
    echo 
    $page
    In diesem Fall würde der Befehl preg_replace zwei __FOOTER__ finden und ersetzen.

    Es sollen allerdings nur die Felder ersetzt werden, die zuvor in der $layouttemplate-Datei vorhanden sind.

    -----
    Ist dies lösbar?

    Die naheliegendste Lösung wäre, den Feldinhalt CONTENT zum Schluss einzusetzen. Dadurch wäre das Problem allerdings nur auf später verschoben, in der doch wieder in einem der Felder zufällig ein Feldkennzeichen verwendet wurde, welches im Php-Script durch ein Inhalt ersetzt wird.

    LG, Ben

  • #2
    Warum verwendest du nicht einfach eine der zahlreich verfügbaren Template-Engines?

    z.B. https://mustache.github.io/

    Kommentar


    • #3
      Hi Hellbringer,

      grandioser Tip.

      Das ist genau das richtige, was ich gesucht habe. Vielen Dank nochmals.

      LG, Ben

      Kommentar


      • #4
        Für einfaches Ersetzen von Maskierungen nehm ich immernoch str_replace. Das hat auch kein copyright wie das zugedonnerte Framework.
        Reguläre Ausdrücke sind fürs Ersetzen von festen Strings ebenso Sinnfrei, da je offenbar keine Variationen berücksichtigt werden sollen.
        bitcoin.de <- Meine Freelancerwährung

        Kommentar


        • #5
          Habe eine Lösung gefunden:
          1. Alle Felder werden im Array gemäß strrpos sortiert. Ergebnis: Im Ersten Eintrag steht das von der Position her letzte Feld
          2. Beim Ersetzen aller Felder wird nur ein Vorkommen ersetzt. Falls mehrere Vorhanden sind, bleiben di anderen unverändert.

          Hier der PHP 7 Code für diejenigen, die es auch brauchen sollten:
          PHP-Code:
              class clsFields
              
          {
                  const 
          fieldsMarkChars="__";

                  public function 
          SearchFieldsInText(&$text) :array {
                      
          # Durchsuche einen $text - String nach Feldern und liefert die Felder als Array aus
                      # Parameter
                      # $text : Zu durchsuchender Text-String
                      # Rückgabe:
                      # Array mit allen Feldern
                      
          settype($pos"int");
                      
          settype($out"array");
                      
          # Liefert ein Array mit allen Feldnamen zurück, die im Text enthalten sind.
                      
          $pattern='/' $this::fieldsMarkChars '(\w+)' $this::fieldsMarkChars '/';
                      
          preg_match_all($pattern,$text,$matchesPREG_SET_ORDER,0);
                      foreach(
          $matches as $item) {
                          
          $out[$pos] = $item[1];
                          
          $pos++;
                      }
                      
          $this->sortArryItemByString($text,$out);
                      return 
          $out;
                  }

                  private function 
          formatField($name) :string {
                      
          # Formatiert ein Feld: __Feldname__
                      # Parameter:
                      # $name: Feldname
                      # Rückgabewert:
                      # Feldname mit Feld-Markierungs-Kennzeichen "__"
                      
          if ( ! isset($name) ) {
                          
          $name="NULL";
                      }
                      return 
          $this::fieldsMarkChars $name $this::fieldsMarkChars;
                  }

                  public function 
          sortArryItemByString(&$text, &$fields) :void {
                      
          # Sortiert ein Array in Abhänigkeit von der Position im $text.
                      # Die erste Positin enthält die letzte Position
                      # Hintergrund: Feldinhalte können sicher beginnend von der letzten Position eingesetzt werden
                      
          settype($pos"int");
                      
          settype($textpos1"int");
                      
          settype($textpos2"int");
                      
          $pos=0;
                      while (
          $pos array_count_values $fields ) ) {
                          if (
          $pos array_count_values $fields ) ) {
                              if ( isset(
          $fields[$pos +]) && isset($fields[$pos]) ) {
                                  
          $textpos1 strrpos($text$this->formatField($fields[$pos]),0);
                                  
          $textpos2 strrpos($text$this->formatField($fields[$pos 1]),0);
                                  if ( 
          $textpos1 $textpos2 ) {
                                      
          $this->ChangeArrayItem($fields[$pos],$fields[$pos+1]);
                                      if ( 
          $pos ) { $pos--; }
                                  } else { 
          $pos++; }
                              } else { break; }
                          } else { 
          $pos++; }
                      }
                  }

                  private function 
          ChangeArrayItem(&$arrValue1, &$arrValue2) : void {
                      
          # Tauscht Inhalte der beiden Variablen aus.
                      # Parameter:
                      # $arrValue1 : Erster Inhalt
                      # $arrValue2 : Zweiter Inhalt

                      
          $tmp=$arrValue2;
                      
          $arrValue2=$arrValue1;
                      
          $arrValue1=$tmp;
                  }

                  public function 
          fillFields(&$template, &$values) :void {
                      
          # Füllt Felder mit Inhalten aus dem Array $values

                      # Parameter:
                      # $template : String-Type von einem Inhalt mit Feldern
                      # $values   : Array mit Werten für Felder
                      #                Key = Feldname

                      
          settype($pos"double");

                      foreach (
          array_keys($values) as $key) {
                          
          $pos strpos($template$this->formatField$key ) );
                          if (
          $pos != false ) {
                              
          $template substr_replace($template$values[$key], $posstrlen($this->formatField$key )));
                          }
                      }
                  }
              } 

          Kommentar


          • #6
            .. Gott bewahre...

            Kommentar


            • #7
              PHP-Code:
                          while ($pos array_count_values $fields ) ) {
                              if (
              $pos array_count_values $fields ) ) { 
              Whaddup^^

              Dein Code wäre besser lesbar wenn du dich bei den Kommentaren an phpdocs orientierst. https://docs.phpdoc.org/references/p...-is-a-docblock
              PHP-Code:

                  
              private function ChangeArrayItem(&$arrValue1, &$arrValue2) : void {
                      
              # Tauscht Inhalte der beiden Variablen aus.
                      # Parameter:
                      # $arrValue1 : Erster Inhalt
                      # $arrValue2 : Zweiter Inhalt

                      
              $tmp $arrValue2;
                      
              $arrValue2 $arrValue1;
                      
              $arrValue1 $tmp;
                  } 
              vs
              PHP-Code:

                  
              /**
                   * Tauscht Inhalte der Parameter aus.
                   *
                   * @param mixed $arrValue1
                   * @param mixed $arrValue2
                   */
                  
              private function ChangeArrayItem(&$arrValue1, &$arrValue2) : void {
                      
              $tmp $arrValue2;
                      
              $arrValue2 $arrValue1;
                      
              $arrValue1 $tmp;
                  } 
              Dinge wie
              PHP-Code:
                          while ($pos array_count_values $fields ) ) {
                              if (
              $pos array_count_values $fields ) ) {
                                  if ( isset(
              $fields[$pos +]) && isset($fields[$pos]) ) {
                                      
              $textpos1 strrpos($text$this->formatField($fields[$pos]),0);
                                      
              $textpos2 strrpos($text$this->formatField($fields[$pos 1]),0);
                                      if ( 
              $textpos1 $textpos2 ) {
                                          
              $this->ChangeArrayItem($fields[$pos],$fields[$pos+1]);
                                          if ( 
              $pos ) { $pos--; }
                                      } else { 
              $pos++; }
                                  } else { break; }
                              } else { 
              $pos++; }
                          }
                      } 
              sind auch ziemlich krass für die Augen.
              Wenn du Kontrollstrukturen umkehrst kannst du ab und zu else-Blöcke vermeiden. Dazu noch die Leerzeichen-Setzung konsequent durchziehen und nicht durchmischen.
              PHP-Code:
                  /**
                   * Sortiert ein Array in Abhänigkeit von der Position im $text.
                   * Die erste Positin enthält die letzte Position
                   * Hintergrund: Feldinhalte können sicher beginnend von der letzten Position eingesetzt werden
                   *
                   * @param string $text
                   * @param array $fields
                   */
                  
              public function sortArryItemByString(&$text, &$fields) :void {
                      
              $pos 0;
                      
              $textpos1 0;
                      
              $textpos2 0;
                      while (
              $pos array_count_values ($fields)) {
                          if (!isset(
              $fields[$pos 1]) || !isset($fields[$pos])) {
                              break;
                          }
                          
              $textpos1 strrpos($text$this->formatField($fields[$pos]), 0);
                          
              $textpos2 strrpos($text$this->formatField($fields[$pos 1]), 0);
                          if (
              $textpos1 $textpos2) {
                              
              $this->ChangeArrayItem($fields[$pos], $fields[$pos 1]);
                              if (
              $pos 0) {
                                  
              $pos--;
                              }
                          } else {
                              
              $pos++;
                          }
                      }
                  } 
              [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
              [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

              Kommentar


              • #8
                Hallo,

                vielen Dank für die Infos...

                Ich muss mich auch erst wieder einarbeiten in php.

                Mein php-Debugger hat auch die Kommentar-Funktion. Man braucht nur über einer Code-Zeile /** eingeben. und schon wird der Rest automatisch ergänzt.

                Mit der Umkehrung von Kontrollstrukturen habe ich auch so meine Probleme. Oft sieht man den Wald vor lauter Bäume nicht mehr.

                In dem Fall saß ich schon eine ganze Weile vor der Aufgabe und war einfach nur froh, dass es einigermaßen gut funktioniert hat.

                Die vorgestellte Lösung der sortArryItemByString Funktion lässt sich viel besser lesen als meine Version.

                Kommentar

                Lädt...
                X