Sprachdateien, Templates und globale Daten

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

  • Sprachdateien, Templates und globale Daten

    Hallöchen liebe Devs =)

    Ich habe mal wieder eine halbwegs blöde Frage; Es geht darum, wie man mit den oben genannten Problemen am besten umgeht.

    Eins vorweg: Ich habe ein Projekt, das nur ich selbst verwalte, und damit ich dabei etwas lerne, möchte ich versuchen, auf vorgefertigte Sachen zu verzichten (a.k.a. SMARTY und Konsorten) - ich will zumindest versuchen, es selbst zu schaffen.

    Die Fragen nun; Ich möchte mein Projekt komplett lokalisierbar machen - wie stell ich das am dümmsten an? Ich habe bereits eine große Sprachdatei erstellt, in der ich die Variablen einfach in Arrays schreibe, die dann auf der Seite verwendet werden können.

    Irgendwie misfällt mir aber der Gedanke, dass bei jedem Seitenaufruf die komplette Seite (immerhin über 1000 Zeilen) geparsed und interpretiert wird. Gibts da ne einfachere Methode für?

    Weiter will ich meine Templates ein bisschen besser strukturieren. Bisher hatte ich einfach eine Funktion "showTemplate($tpl)", die das angeforderte Template per "require" einbindet.

    Dabei hat sich aber das Problem ergeben, dass ich die Variablen, die ich in den Templates benötige, stehts als "global" definieren musste, damit sie überall verfügbar sind. Das gleiche auch mit den Sprachvariablen.

    Wie kann ich das besser gestalten? Kann man dafür das $GLOBALS-Array gebrauchen oder sollte man davon die Finger lassen? Oder $_SESSION?

    Erneut; ich möchte möglichst vermeiden, auf vorgefertigte Lösungen umsteigen zu müssen, da ich gerne selbst verstehen möchte, was da genau passiert und warum es so funktioniert und anders nicht.
    This is what happens when an unstoppable force meets an immovable object.

  • #2
    Zitat von ApoY2k Beitrag anzeigen
    Ich möchte mein Projekt komplett lokalisierbar machen - wie stell ich das am dümmsten an?
    gettext

    Bisher hatte ich einfach eine Funktion "showTemplate($tpl)", die das angeforderte Template per "require" einbindet.
    Dabei hat sich aber das Problem ergeben, dass ich die Variablen, die ich in den Templates benötige, stehts als "global" definieren musste, damit sie überall verfügbar sind. Das gleiche auch mit den Sprachvariablen.
    Die Variablen müssen nicht global verfügbar sein. Ein Template wird in der Funktion showTemplate() inkludiert. Es genügt also, wenn die Variablen nur im Scope dieser Funktion existieren. Du musst nur einen Weg finden, die Variablen in diese Funktion hinein zu bekommen, z.B. als Parameter.

    Kommentar


    • #3
      Zitat von ApoY2k Beitrag anzeigen
      Wie kann ich das besser gestalten? Kann man dafür das $GLOBALS-Array gebrauchen oder sollte man davon die Finger lassen? Oder $_SESSION?
      Von $GLOBALS sollte man immer die Finger lassen und $_SESSION ist nur für sitzungsbezogene Daten gedacht und sollte nicht als globaler Datenspeicher missbraucht werden.

      Kommentar


      • #4
        Zitat von onemorenerd Beitrag anzeigen
        Hm, das ist ne schöne Sache, aber wenn ich mein Projekt jemandem geben möchte, muss er das ja auch auf seinem Server installiert haben, richtig? :-/
        This is what happens when an unstoppable force meets an immovable object.

        Kommentar


        • #5
          Richtig.

          Kommentar


          • #6
            Alternative:

            Zend Framework: Documentation: Zend_Translate - Zend Framework Manual

            Kommentar


            • #7
              Hm okay, aber wie mach ichs am besten mit den Daten?

              Also wie ist es am besten, global verfügbare Daten zu speichern, d.h. dass ich aus jeder Datei im Skript darauf schreiben und zugreifen kann, egal wo sie im Ablauf erscheint...?

              Wäre "global $var;" dafür geeignet? Aber das muss ich ja dann in jede Datei schreiben, wo ich das benutzen möchte, ist ja auch ein riesen Aufwand...
              This is what happens when an unstoppable force meets an immovable object.

              Kommentar


              • #8
                global ist böse. Globale Daten sind böse.

                Daten gehören immer zu einem bestimmten Zweck, und für jeden Zweck gibt es eine Klasse oder eine Funktion. Da her bekommst du dann die Daten.

                Vereinfachtes, prozedurales Beispiel:
                PHP-Code:
                function render_template($template_file, array $vars = array()) {
                    
                extract($vars);
                    include 
                $template_file;
                }

                $vars = array(
                    
                'variable1' => 'foo',
                    
                'variable2' => 'bar'
                );

                // template rendern und ausgeben
                render_template('mein_template.php'$vars); 
                mein_template.php
                PHP-Code:
                <h2>Das ist ein Template</h2>
                <p>Wert 1: <?php echo htmlspecialchars($variable1); ?></p>
                <p>Wert 2: <?php echo htmlspecialchars($variable2); ?></p>
                Zuletzt geändert von h3ll; 01.07.2010, 17:47.

                Kommentar


                • #9
                  Habe gerade etwas über Singelton-Muster gelesen, das wäre doch eine adäquate Möglichkeit, dafür?

                  Templatedaten über Template::$vars['blub'] = 'bla'; speichern, und in einer funktion Template::showTemplate('test'); dieser klasse dann die templates einbinden, die dann auf diese $vars zugreifen.

                  Oder bin ich da auf einem Holzweg?


                  Edit: Dein Beispiel habe ich momentan genau so eingebunden, aber mir war es irgendwie zu blöd, immer die Arrays mitzugeben, da es sowieso immer die gleichen sind. Deshalb bin ich auf der Suche nach einer Möglichkeit, das zu vermeiden.
                  This is what happens when an unstoppable force meets an immovable object.

                  Kommentar


                  • #10
                    Zitat von ApoY2k Beitrag anzeigen
                    Habe gerade etwas über Singelton-Muster gelesen, das wäre doch eine adäquate Möglichkeit, dafür?

                    Templatedaten über Template::$vars['blub'] = 'bla'; speichern, und in einer funktion Template::showTemplate('test'); dieser klasse dann die templates einbinden, die dann auf diese $vars zugreifen.

                    Oder bin ich da auf einem Holzweg?
                    Du bist auf dem Holzweg. Wie willst du so einzelne Templates unterscheiden, wenn es nur ein Singleton gibt? Nicht überall soll es schließlich die selben Werte geben.

                    Kommentar


                    • #11
                      Okay, ein echtes Singelton nicht, das war nur der Anstoß für die Idee - Zumal Singeltons ja auch nicht so richtig schön OOP sind.

                      Ich dachte mehr an ein solches Konstrukt:

                      PHP-Code:
                      class Template
                      {
                          public static 
                      $vars;
                          
                          public static function 
                      showTemplate($template)
                          {
                              
                      $tpl self::$vars;
                              require_once(
                      BASEDIR_TPL.$template.'.tpl.php');
                              return 
                      true;
                          }

                      PHP-Code:
                      // Index
                      Template::$vars['hello'] = 'Hello world';
                      Template::showTempate('index'); 
                      PHP-Code:
                      // index.tpl.php
                      echo '<h1>'.$tpl['hello'].'</p>'
                      This is what happens when an unstoppable force meets an immovable object.

                      Kommentar


                      • #12
                        Das ist doch ein "echtes" Singleton und deswegen ungeeignet.

                        Kommentar


                        • #13
                          Schade, das funktioniert nämlich perfekt Aber wieso genau ist es ungeeignet?

                          Ich fülle im Ablauf des Programms das Template::$vars-Array. Da ich nicht weiß, in welcher "require"-Stufe Daten hinzukommen, muss es entweder Global sein oder Statisch.

                          Am ende binde ich das Haupttemplate ein. Aber jedes Template kann von sich aus ja wieder neue Templates einbinden, die möglicherweise andere Daten brauchen als das übergeordnete...


                          Sorry wenn ich dumm frage, vielleicht rede ich auch am Thema vorbei oO"
                          This is what happens when an unstoppable force meets an immovable object.

                          Kommentar


                          • #14
                            Als Beispiel kannst du dir ja mal Zend_View anschauen.

                            Üblicherweise hast du einen Controller, der sich um die Daten kümmert und diese dann dem View zuweist. Wozu du da globale Daten brauchst, versteh ich nicht wirklich.

                            Kommentar


                            • #15
                              Okay, im Grunde ist das ja sowas ähnliches, nur dass es nicht static ist, seh ich das richtig?

                              Man weißt der View bestimmte Daten zu, die wichtig dafür sind und beim rendern wird eben das "Template" (wie auch immer Zend es nennt), eingebunden und es holt sich die Daten eben aus seinem eigenen Objekt...

                              Aber was passiert, wenn ein Template ein neues Template einbinden möchte?
                              This is what happens when an unstoppable force meets an immovable object.

                              Kommentar

                              Lädt...
                              X