Konstanten im Text finden?

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

  • Konstanten im Text finden?

    Code:
    Normaler Text<br />
    {_server.DOCUMENT_ROOT}<br />
    {eine_variable}<br />
    Normaler Text<hr />
    Verzeichnisse werden entweder durch \ oder / voneinander getrennt.<br />
    {if _const.DIRECTORY_SEPARATOR = '/'}Hier ist es ein Slash.
    {else}Hier ist es ein Backslash.
    {endif}<br />
    Noch eine Konstante: {_const.__FILE__}<br />
    Fertig
    wird von meiner Templateklasse umgewandelt zu:
    PHP-Code:
    $result 'Normaler Text<br />
    '
    .$_SERVER['DOCUMENT_ROOT'].'<br />
    '
    .$data['eine_variable'].'<br />
    Normaler Text<hr />
    Verzeichnisse werden entweder durch \\ oder / voneinander getrennt.<br />
    '
    .((DIRECTORY_SEPARATOR == '/') ? 'Hier ist es ein Slash.
    'Hier ist es ein Backslash.
    '
    ).'<br />
    Noch eine Konstante: '
    .__FILE__.'<br />
    Fertig'

    Ich habe jetzt zwei Möglichkeiten, die verwendeten Variablen herauszufinden:

    Entweder, ich suche im Template nach irgendwas zwischen { und }, oder ich suche mir aus dem Ergebnis alls, was mit $ anfängt.

    Wenn ich im produzierten Code suche, finde ich $data['eine_variable'] und $_SERVER['DOCUMENT_ROOT'], aber keine der beiden verwendeten Konstanten.

    Wenn ich im Template suche, finde ich $data['eine_variable'], $_SERVER['DOCUMENT_ROOT'] und die Konstante __FILE__, aber nicht die Konstante DIRECTORY_SEPARATOR, da sie nicht als einzelne Variable verwendet wird, sondern in einem if.

    Ich würde aber gern alles finden, da ich vor den gezeigten Codeausschnitt gerne
    PHP-Code:
    if (!isset($_SERVER['DOCUMENT_ROOT'])) $_SERVER['DOCUMENT_ROOT'] = NULL;
    if (!isset(
    $data['eine_variable'])) $data['eine_variable'] = NULL;
    if (!
    defined('DIRECTORY_SEPARATOR')) define('DIRECTORY_SEPARATOR'NULL);
    if (!
    defined('__FILE__')) define('__FILE__'NULL); 
    schreiben würde, um auf keinen Fall Variablen oder Konstanten zu verwenden, die es nicht gibt.

    Wie und wo also finde ich die Konstante DIRECTORY_SEPARATOR?
    Im Template? Wenn ja: Wie?
    Im produzierten Code? Wenn ja: Wie?
    Ich denke, also bin ich. - Einige sind trotzdem...

  • #2
    Im Template? Wenn ja: Wie?
    Mit einem regulären Ausdruck?!?
    Suche alles was evtl. geparsed werden muss;
    Gucke Dir das Gefundene an: Ist es eine Var? Ist es eine Konstante? ist es ein String?
    -> Entsprechend behandeln, und durch bist du Viel Spaß
    h.a.n.d.
    Schmalle

    http://impressed.by
    http://blog.schmalenberger.it



    Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
    ... nur ohne :-)

    Kommentar


    • #3
      Juhu!
      Da freu ich mich doch, dass meine Templateklasse an sich gar nichts kann, außer einer einfachen Variablenersetzung.

      Mit ifs umgehen kann sie nur, wenn sie eine Datei command.if.php im richtigen Verzeichnis findet.

      In der Funktion in der Datei command.if.php, die für das eigentliche Umwandeln zuständig ist, finde ich natürlich auch meine Konstante, aber...
      Woher weiß ich in dieser Funktion, wohin ich das define schreiben soll?

      Kurz zur weiteren Info:
      Code:
      {variable}
      {_const.konstante}
      {loop mitarbeiter}
      {name}
      {_const.konstante2}
      {endloop}
      wird umgesetzt zu:
      PHP-Code:
      function loop_mitarbeiter($content) {
        
      $result '';
        foreach (
      $content as $data)
          
      $result .= $data['name'].konstante2;
        return 
      $result;
      }
      $result $data['variable'].
      konstante.
      loop_mitarbeiter($data['mitarbeiter']); 
      (Pseudocode)

      Ich müsste also das define für konstante2 in die Funktion einbauen, oder irgendwo vor dem Aufruf der Funktion (danach bringt's j anicht wirklich viel)
      Das klappt aber nur, wenn ein loop vor einem if abgearbeitet wird.

      In meiner Klasse gibt es ein Array mit erlaubten "commands" (command.if.php => if, command.loop.php => loop, ...)
      Diese Dateien werden eingelesen, es wird geschaut, ob eine Funktion mit dem richtigen Namen vorhanden ist und wenn ja, wird dem Array ein weiterer Eintrag hinzugefügt.
      Ich kann abe rnicht beeinflussen, in welcher Reihenfolge die erlaubten "commands" im Array stehen und kann also auch nicht festlegen, dass ein loop immer vor einem if abgearbeitet werden muss.
      Habe schließlich auch keine große Lust, mir jedesmal, wenn ich da was neues hinzufüge, mir Gedanken über die nötige Sortierung der "commands" zu machen.


      Da fällt mir ein:
      Spricht etwas dagegen, Konstanten einmal außerhalb aller Funktionen zu definieren?
      Dann könnte ich nämlich die Datei var.const.php (du erkennst ein System?) entsprechend umbauen, statt "konstante" einfach "/*hinter mir steht eine konstante */konstante/*vor mir steht eine konstante */" zurückliefern lassen und dann im prouzierten Code alles zwischen "/*hinter mir steht eine konstante */" und ""/*vor mir steht eine konstante */" suchen lassen
      Oder komme ich damit evtl. in Teufels Küche?
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #4
        Ich hab den letzten Absatz nur überflogen ... Aber das hörte sich mehrt nach Küche ( der von Berni ) an, als nach sinnvollen Konstrukten

        Warum zum Henker machst Du das eigentlich alles so kompliziert?

        - Regulärer ausdruck
        - etwas gefunden
        -- ist es in $tpl->vars
        -- oder _KONSTANT_
        --- ersetze den entsprechenden Wert
        -- ist es ein String ( z.B. weil lustige Quots drum rum sind )
        --- lasse ihn halt stehen
        --- Zahlen dito

        in allen anderen Fällen ersetze mit NULL, false oder 0 ... Je nachdem wie Du es gern hättest.

        Es ist mir zwar nach wie vor ein Rätsel, warum man auf _SERVER oder Konstanten zugreifen muss, wenn man in einem Template ist, aber das musst Du ja issen
        h.a.n.d.
        Schmalle

        http://impressed.by
        http://blog.schmalenberger.it



        Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
        ... nur ohne :-)

        Kommentar


        • #5
          Kompliziert deshalb, weil ich keine Lust habe, die Klasse umbauen zu müssen, nur weil ich neben loops und ifs evtl. noch was anderes zu ermöglichen, z. B.
          Code:
          <ul>
          {loop namen}
          <li color="{alternate "red" "blue"}">{name}</li>
          {endloop}
          </ul>
          So muss ich nicht im PHP-Code rumpfuschen, wenn ich statt blau und rot vielleicht mal rot und schwarz haben will oder, oder grün, rot und #dcf oder oder oder

          Ich habe statt dessen eine Datei (wir erinnern uns?) command.alternate.php, die das für mich erledigt.

          Und kompliziert war's bis jetzt eigentlich nicht:
          1. Template laden
          2. Dateien im Verzeichnis extensions/commands (flexibel) auslesen
          3. Funktion compile_command_<commandname> vorhanden
            Ja? Juhu, in Array ablegen
            Nein? Auch egal
          4. Über Array mit commands iterieren und nacheinander abarbeiten
          5. Variablen parsen
          6. Variable beginnend mit _ gefunden?
            Datei compile_var_<teil nach dem unterstrich>.php vorhanden und darin die Funktion compile_var_<teil nach dem unterstrich>?
            Ja, Juhu, so ersetzen, wie's die Funktion vorsieht
          7. produzierten Code speichern

          Ob es in $tpl->vars ist, weiß ich beim Kompilieren nicht, denn ich verwende in Produktion das kompilierte Template und da sollte nach Möglichkeit alles stehen, was auch im Template steht und eine Initialisierung der Variablen, falls siemal nicht vorhanden sein sollten

          Den Rest von deinen Punkten mache ich ja schon längst, auch das mit den lustigen Quotes.

          Auf $_SERVER muss man vielleicht nicht unbedingt zugreifen, aber ich schreibe lieber
          Code:
          <form method="post">
          Name: <input type="text" name="name" value="{_post.name}" />
          </form>
          als
          Code:
          <form method="post">
          Name: <input type="text" name="name" value="{eingegebener_wert_ins_feld_name}" />
          </form>
          und im Skript dann irgendwo
          PHP-Code:
          $tpl->assign('eingegebener_wert_ins_feld_name',
            empty(
          $_POST['name']) ? '' $_POST['name']); 
          Konstanten habe ich z. B. im Adminbereich, wo bspw. ein Admin die Möglichkeit hat, einem Benutzer Moderator- oder Benutzerstatus zu verleihen bzw. zu nehmen. Ein Moderator soll das aber nicht dürfen.

          Ergo sieht ein Admin nicht einfach nur den Text mit dem Benutzerstatus sondern stat dessen eine select-Box.
          Ein Moderator sieht die select-Box gar nicht erst, da sie ihm ja eh nichts bringt.
          Im Skript selbst prüfe ich die Berechtigung abund verwende dafür Konstanten, warum also sollte ich diese Konstanten nicht auch im template zur Steuerung der Anzeige verwenden?
          Code:
          {loop users}
          ...
          {if _session.level = _const.IS_ADMIN}{listbox userlevels selected=userlevel}
          {else}{userlevel}
          {endif}
          {endloop}
          gefällt mir einfach besser als zwei Templates, die identisch sind bis auf diesen winzigen Teil
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            aha Wenn Du jetzt schon mit solchen mehr oder weniger sinnlosen Dingen anfängst wie alternate bla blub, anstatt einfach if/else zu nutzen, hast Du in 1 Jahr zwar die mächtigste Anwendung Deiner Karriere geschrieben, aber keine kann/will damit arbeiten
            Einfach Strukturen, die auch Hein Blöd versteht sind das A und O ...

            Abkürzung 1: $tpl->assign($_POST);
            -- Ergibt sowas wie $tpl->vars['bla']

            kann man doch ganz einfach über <input value="{bla}"> ansprechen ... oder watt?

            Hast Du loops, baut man halt $tpl->vars['loopname']['bla'], und kann sie wieder über {loop 'name'}{bla}{/loop} auswerten.

            Wenn Konstanten sein müsse bitte ... Eine ( in meinen Augen unnötige if ) mehr.

            Das ganze kann man ganz prima ( sogar ohne Pfusch ) lösen Spart viel Arbeit, und ist Benutzerfreundlich ...
            h.a.n.d.
            Schmalle

            http://impressed.by
            http://blog.schmalenberger.it



            Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
            ... nur ohne :-)

            Kommentar


            • #7
              Original geschrieben von schmalle
              aha Wenn Du jetzt schon mit solchen mehr oder weniger sinnlosen Dingen anfängst wie alternate bla blub, anstatt einfach if/else zu nutzen, hast Du in 1 Jahr zwar die mächtigste Anwendung Deiner Karriere geschrieben, aber keine kann/will damit arbeiten
              Einfach Strukturen, die auch Hein Blöd versteht sind das A und O ...
              du kannst ja gerne if / else benutzen.
              Nur weil es die Möglichkeit gibt, bist du ja nicht gezwungen davon Gebrauch zu machen

              Abkürzung 1: $tpl->assign($_POST);
              -- Ergibt sowas wie $tpl->vars['bla']

              kann man doch ganz einfach über <input value="{bla}"> ansprechen ... oder watt?
              kann man, klar
              Aber mir widerstrebt die Vorstellung, für jedes Element meines Formulars der Templateklasse eine Variable übergeben zu müssen.
              Oder übergibst du deiner assign-Methode nur das Array $_POST und bekommst dann für jeden Eintrag im Array einen Eintrag im Array $tpl->vars?

              Hast Du loops, baut man halt $tpl->vars['loopname']['bla'], und kann sie wieder über {loop 'name'}{bla}{/loop} auswerten.
              Und Verschachtelungen?
              Nur aus reiner Neugier
              Code:
              {loop user}
              {name} besitzt die folgenden Rechte:
              {loop rechte}
                - {recht}
              {endloop}
              {endloop}
              Wie bekommst du das abgebildet?

              Wenn Konstanten sein müsse bitte ... Eine ( in meinen Augen unnötige if ) mehr.
              Oder _const. vornedran schreiben
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar


              • #8
                Original geschrieben von mrhappiness
                Oder übergibst du deiner assign-Methode nur das Array $_POST und bekommst dann für jeden Eintrag im Array einen Eintrag im Array $tpl->vars?
                Meine Assign Methode guckt ob es ein array ist. Wenn es ein Array ist, gehe ich jenes per foreach durch, und lege in $tpl->vars ein Element an. Aus _POST['var'] wird also $tpl->vars['var']
                Und Verschachtelungen?
                Nur aus reiner Neugier
                Code:
                {loop user}
                {name} besitzt die folgenden Rechte:
                {loop rechte}
                  - {recht}
                {endloop}
                {endloop}
                Wie bekommst du das abgebildet?[/b]
                Es gibt eine Methode, die sich da nennt assingn_block ( block = loop ).
                Aufruf: $tpl->assign_block('BLOCKNAME', $array);

                Diese legt entsprechend $tpl->vars['BLOCKNAME']['ELEMENT'] = 'wert' an.

                Ansprechen kann ich die über
                {BLOCK 'NAME'}
                hier kann ich vars aus block NAME verwenden {VAR}. sollte var nicht in dem Block sein, wird geguckt, ob sie evtl. in der "normalen" Ebene vorhanden ist. Wenn nicht, ist sie eben NULL. Man muss schon vorsichtig sein, wenn es um Var- Namen geht, aber das fällt unter sauberes Arbeiten
                Natürlich kann ich auch in dem Block
                {if var == 'hallo'}Er sagt hallo{else}er sagt nicht hallo{endif}
                benutzen. Die Vars werden behandelt wie zuvor. Wenn ich hier einen neuen Block beginne, ist das eben so
                {/BLOCK}
                Soweit verstanden?
                Zuletzt geändert von schmalle; 14.03.2005, 18:19.
                h.a.n.d.
                Schmalle

                http://impressed.by
                http://blog.schmalenberger.it



                Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
                ... nur ohne :-)

                Kommentar


                • #9
                  Im Prinzip ja, bis auf die Sache mit den verschachtelten loops.

                  Du sagst
                  PHP-Code:
                  $tpl->assign_block('USER'$alle_meine_user); 
                  und
                  Code:
                  {BLOCK 'USER'}
                    Der Benutzer {name} hat die folgenden Rechte:
                    {BLOCK 'RIGHTS'}
                      - Recht: {right}
                    {/BLOCK}
                  {/BLOCK}
                  Wie muss das Array $alle_meine_user bei dir aussehen, damit
                  Code:
                  Der Benutzer schmalle hat die folgenden Rechte:
                    - Recht: Beiträge löschen
                    - Recht: Beiträge erstellen
                    - Recht: Beiträge editieren (eigene)
                    - Recht: Beiträge editieren (fremde)
                    - Recht: Benutzer sperren
                    - Recht: Beiträge freischalten
                  Der Benutzer Benny-one hat die folgenden Rechte:
                    - Recht: Beiträge erstellen
                    - Recht: Beiträge editieren (eigene)
                  ausgegeben wird?
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    Wie muss das Array $alle_meine_user
                    PHP-Code:
                    $user = array(
                    'name' => 'happy',
                    'email' => 'kann ere nicht mit umgehen',
                    'rechte' => array('recht1' => 'hat er nicht')
                    ); 
                    h.a.n.d.
                    Schmalle

                    http://impressed.by
                    http://blog.schmalenberger.it



                    Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
                    ... nur ohne :-)

                    Kommentar


                    • #11
                      PHP-Code:
                      $user = array(
                      'name' => 'happy',
                      'email' => 'kann ere nicht mit umgehen',
                      'rechte' => array('recht1' => 'hat er nicht''recht2' => 'ausnahmsweise')
                      );
                      $alleuser[] = $user;
                      $user = array(
                      'name' => 'schmalle',
                      'email' => 'hat er nicht verdient',
                      'rechte' => array('recht1' => 'mitleidsbonus ;)')
                      );
                      $alleuser[] = $user;
                      $tpl->assign_block('USER'$alleuser); 
                      Wenn ich jetzt
                      Code:
                      happy  kann ere nicht mit umgehen
                        hat er nicht
                        ausnahmsweise
                      
                      schmalle   hat er nicht verdient
                        mitleidsbonus
                      haben möchte, wie muss das Template aussehen?

                      Mir fehlt es grad an Vorstellungskraft, wie du das umsetzt
                      Ich denke, also bin ich. - Einige sind trotzdem...

                      Kommentar


                      • #12
                        Mir scheint, wir sind beide noch nicht wach
                        Also ich habe da viele vleie user. Jeder user hat natürlich rechte. Also haben wir folgendens Array:
                        PHP-Code:
                        $user = array(
                        [
                        0] => array('name' => 'schmalle',
                                   
                        'ID' => 1,
                                   
                        'EMAIL' => 'hat er',
                                   
                        'RECHTE' => Array(
                                   [
                        0] => array('NAME' => 'Recht 1',
                                              
                        'WERT' => 'jo ist da'),
                                   [
                        1] => array(
                                              
                        'NAME' => 'Recht 2',
                                              
                        'WERT' => 'Jo gefunden')
                        ),
                        [
                        1] => array('name' => 'happy',
                                            
                        'ID' => 2,
                                            
                        'EMAIL' => 'Kann er nicht mit umgehen',
                                            
                        'RECHTE' => Array(
                                   [
                        0] => array('NAME' => 'Recht 1',
                                              
                        'WERT' => 'jo ist da'),
                                   [
                        1] => array(
                                              
                        'NAME' => 'Recht 2',
                                              
                        'WERT' => 'Jo gefunden')
                        )
                        ); 
                        Jetzt ist die Array Struktur richtig :-)

                        Dann habe ich ein Template. Da will ich die User inkl. ihrer Rechte ausgeben. Das sieht dann so aus:
                        Code:
                        Benutzerliste:
                        {BLOCK 'user'}
                        {name} {EMAIL}<br />
                        <b>Rechte des Users:</b><hr />
                        {BLOCK 'RECHTE'}
                         Recht '{NAME}': {WERT}
                        {/BLOCK}
                        <hr />
                        {/BLOCK}
                        Die entsprechende Ausgabe:
                        Benutzerliste:
                        schmalle schmalle@php-resource.de
                        Rechte des Users:
                        -------------------------------
                        Recht: 'Recht1': jo ist da
                        Recht 'Recht2': auch da
                        -------------------------------
                        happy happy@php-resource.de
                        Rechte des Users:
                        -------------------------------
                        Recht: 'Recht1': jo ist da
                        Recht 'Recht2': auch da
                        -------------------------------
                        Ob das jetzt verständlich ist qweiss ich nicht ... Für Fehler im Array übernehme ich keine Verantwortuing

                        PS um das in die TPL Class zu bekommen mache ich nur folgendes:
                        PHP-Code:
                        $tpl->assign_block('user'$user); 
                        h.a.n.d.
                        Schmalle

                        http://impressed.by
                        http://blog.schmalenberger.it



                        Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
                        ... nur ohne :-)

                        Kommentar


                        • #13
                          Na dann ist es doch garnicht so verschieden zu
                          Code:
                          Benutzerliste:
                          {loop user}
                          {name} {EMAIL}<br />
                          <b>Rechte des Users:</b><hr />
                          {loop rechte}
                           Recht '{NAME}': {WERT}
                          {endloop}
                          <hr />
                          {endloop}
                          und
                          PHP-Code:
                          $tpl->assign('user'$user); 
                          $user sieht genauso aus wie bei dir.

                          Die Probleme habe ich ja auch nicht damit (obwohls gut tut, mit jemandem drüber zu reden... *g*) sondern mit den Konstanten und wie und wo ich die finden soll, damit ich keine unschönen Fehlermeldungen bekomme, wenn ich irgendwas verwenden will, was nicht initialisiert (Variable) oder definiert (Konstante) ist.
                          Aber momentan schriebe ich die defines für die Konstanten an den Anfang des Templates und die Welt ist wieder in Ordnung... denke ich... vorerst

                          Es sei denn, du hast eine bessere Idee?
                          Zuletzt geändert von mrhappiness; 15.03.2005, 10:12.
                          Ich denke, also bin ich. - Einige sind trotzdem...

                          Kommentar


                          • #14
                            damit ich keine unschönen Fehlermeldungen bekomme, wenn ich irgendwas verwenden will, was nicht initialisiert (Variable) oder definiert (Konstante) ist.
                            Diese Fehlermeldungen ( gemeinhin als Notice bekannt ) mag ich auch nicht. Daher überprüfe ich auch alles auf Existenz. Wenn etwas nicht da ist, wird es eben mit NULL ersetzt. Warum sollte ich etwas initialisieren, wenn ich "nicht weiss" welchen Wert es haben soll? Also, gehe ich davon aus, dass es nicht da ist .... NULL eben. Somit gibt es keine Notices.
                            h.a.n.d.
                            Schmalle

                            http://impressed.by
                            http://blog.schmalenberger.it



                            Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
                            ... nur ohne :-)

                            Kommentar


                            • #15
                              Ebend.

                              Und da ich aus einem Template beim Parsen reinen PHP-Code mache und nicht bei jedem einzelnen Aufruf der Seite neu parse, muss ich den Variablen im produzierten Code den Wert NULL zuweisen (is ja auch eine Intialisierung) und zwar bevor sie das erste mal verwendet werden.

                              Für verwendete Konstanten gilt genau das gleiche und da stellte sich mir die Frage, wie ich Konstanten finden soll, deren Wert nicht einfach ausgegeben wird (was recht wenig Sinn machen würde), sondern die in einem if verwendet werden.
                              Ich denke, also bin ich. - Einige sind trotzdem...

                              Kommentar

                              Lädt...
                              X