selfmade01: JS Schrebweise Funktionsaufruf

Hallo,

habe hier einen Beispielcode dessen Schreibweise ich nicht verstehe.
Hier ein Ausschnitt des  Beispiels:

// Aufruf der Javascriptfunktion in PHP
$grid->setNavEvent('add', 'beforeShowForm', $beforeshowadd);

ohne jegliche <script></script> Anweisung steht dann in der PHP-Seite diese Funktionsdefinition

  
$beforeshowadd = <<< BEFORESHOW  
  
function(formid)  
{  
 // hier dann der Javavscriptcode  
}  
BEFORESHOW;  

kann mir das jemand kurz erklären was diese Definition "$beforeshowadd = <<< BEFORESHOW" bedeutet ?

ich kannte eine js-Definition bis jetzt so, dass man mit einem <script></script> diese definieren muss, hier in diesem Beispiel wohl nicht. Wieso?

Wenn ich nun innerhalb dieser "$beforeshowadd = <<< BEFORESHOW" eine andere js-Funktion aufrufen möchte die ausserhalb steht also mit in einem <script> dann funktioniert das nicht.

Hat jemand dazu eine Erklärung oder einen Link zu einer deutschen Seite in der diese Programmiertechnik erklärt wird?

danke
Grüße Jürgen

  1. Hi,

    habe hier einen Beispielcode dessen Schreibweise ich nicht verstehe.

    ja, aber es ist der PHP-Code, den du nicht verstehst.

    ohne jegliche <script></script> Anweisung steht dann in der PHP-Seite diese Funktionsdefinition

    $beforeshowadd = <<< BEFORESHOW

    function(formid)
    {
    // hier dann der Javavscriptcode
    }
    BEFORESHOW;

    
    >   
    > kann mir das jemand kurz erklären was diese Definition "$beforeshowadd = <<< BEFORESHOW" bedeutet ?  
      
    Das ist die sogenannte HEREDOC-Notation, eine der vielen Möglichkeiten von PHP, eine Stringkonstante zu notieren. Die Stringkonstante wird dabei mit <<<Bezeichner eingeleitet, und mit demselben Bezeichner ohne Einrückung am Zeilenanfang beendet. Nachzulesen [im PHP-Manual](http://php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc), wo sonst?  
      
    Ciao,  
     Martin  
    
    -- 
    Ungeschehene Ereignisse können einen katastrophalen Mangel an Folgen nach sich ziehen.  
      (Unbekannter Politiker)  
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
    1. Hallo,

      klar wenn man weiss das man nach HEREDOC-Notation suchen muss ist das eine leichte Angelegenheit.
      Genau aus diesem Grund fragte ich hier da ich diese Notation oder deren Bezeichnung gar nicht kannte,

      Vielen Dank für den Link, den ich mir gleich durchlesen werde.

      Trotzdem noch eine Frage

      wie kann man in dieser notation eine andere JS-Funktion aufrufen?

      die andere JS-Funktion wurde dabei in der normalen Schreibweise geschrieben also mit <script></script>
      ?

      Grüße Jürgen

      1. Hi,

        wie kann man in dieser notation eine andere JS-Funktion aufrufen?

        die andere JS-Funktion wurde dabei in der normalen Schreibweise geschrieben also mit <script></script>
        ?

        Diese Notation tut in Bezug auf JavaScript absolut gar nichts besonderes – sie ist nur eine Möglichkeit, in PHP eine Zeichenkette zu notieren, die dann hier einer PHP-Variablen zugewiesen wird.

        Erst wenn der Inhalt dieser Varaiblen irgendwo in einem JavaScript-Kontext ausgegeben wird – also entweder als Inhalt eines Script-Elementes, oder als Bestandteil einer externen Script–Resource – kommt JS überhaupt ins Spiel; und dann wieder auf die absolut stinknormale Art und Weise. Diese PHP-Syntax hat Nullkommanullgarnichts besonderes an sich in Bezug auf JavaScript.

        MfG ChrisB

        --
        Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
        1. Hallo Chris,

          ok, jetzt wird es etwas klarer,

          das bedeutet also, wenn ich auf meiner Seite irgend eine Aktion durchführe die im Hintergrund etwas ausführen soll was in einer Herodec-Notation aufgeführt ist, dann kommt diese ins Spiel.

          Kann ich dann überhaupt innerhalb dieser Herodec-Notation eine Js-Funktion aufrufen?

          Grüße Jürgen

          1. Hallo,

            ok, jetzt wird es etwas klarer,

            nein, anscheinend doch nicht.

            das bedeutet also, wenn ich auf meiner Seite irgend eine Aktion durchführe die im Hintergrund etwas ausführen soll was in einer Herodec-Notation aufgeführt ist, dann kommt diese ins Spiel.

            Nein. Heredoc ist PHP-Syntax - es ist eine Möglichkeit, in PHP einen String zu notieren. Das hat mit Javascript exakt gar nichts zu tun, auch wenn der so zugewiesene String in deinem Beispiel Javascript-Code enthält.

            Kann ich dann überhaupt innerhalb dieser Herodec-Notation eine Js-Funktion aufrufen?

            Du kannst alles tun, was du mit jedem anderen String in PHP auch tun könntest.

            Ciao,
             Martin

            --
            Die Zeit, die man zur Fertigstellung eines Projekts wirklich braucht, ist immer mindestens doppelt so lang wie geplant.
            Wurde dieser Umstand bei der Planung bereits berücksichtigt, gilt das Prinzip der Rekursion.
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. Hallo,

              ok ich habe mir nun Beispiele von PHP-Herodec angesehen.
              ich denke jetzt leuchtet es mir ein

              ja in meinem Fall besteht der String aus Javascript-Code bzw. aus Code des jQuery-frameworks.

              Ich habe auch schon einige Dinge versucht umzusetzen was auch funktionierte.
              Bei mir es es so. Ich muss aus einem CSS-Template in dem javascript-Funktionen verwendet wurden, diese in Herodec-Strings packen damit meine PHP-jqgrid-tabelle funktioniert bzw. das Design dort entsprechend dem Design des Templates angepasst wird.
              Das meiste geht nun schon wie gesagt.

              Ein Problem habe ich noch.

              In dem CSS-Template gibt es eine Javascript-Funktion in der eine Klasse erzeugt wird
              mit
              var $class = $.trim(icon.attr('class').replace('ui-icon', ''));
              unter Herodec wird mir aber diese Schreibweise "var $class" nicht akzeptiert

              Wie kann ich das umgehen bzw. in PHP-Herodec schreiben das es klappt?

              Grüße
              Jürgen

              1. Hi,

                Ein Problem habe ich noch.

                nur eins? Du kannst dich glücklich schätzen. ;-)

                var $class = $.trim(icon.attr('class').replace('ui-icon', ''));
                unter Herodec wird mir aber diese Schreibweise "var $class" nicht akzeptiert

                Ja klar. Siehe Punkt c.
                Die Kombination $class wird von PHP aufgelöst und ergibt den Wert der PHP-Variablen $class. Nun hast du vermutlich keine solche Variable, also gibt's eine Notice und einen leeren String anstatt $class.

                Du willst, dass das Zeichen '$', das in PHP eine spezielle Bedeutung hat (es markiert den Bezeichner einer Variablen), wörtlich genommen wird und nicht in seiner Sonderbedeutung interpretiert wird. Also musst du es kontextspezifisch maskieren. In diesem konkreten Fall, indem du ihm einen Backslash voranstellst.

                So long,
                 Martin

                --
                Ich wollt', ich wär ein Teppich.
                Dann könnte ich morgens liegenbleiben.
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                1. Hallo,

                  danke funktioniert nun alles

                  Grüße Jürgen

                2. Tach!

                  Du willst, dass das Zeichen '$', das in PHP eine spezielle Bedeutung hat (es markiert den Bezeichner einer Variablen), wörtlich genommen wird und nicht in seiner Sonderbedeutung interpretiert wird. Also musst du es kontextspezifisch maskieren. In diesem konkreten Fall, indem du ihm einen Backslash voranstellst.

                  Wenn man die Variablenauflösung gar nicht braucht, dann wäre es wohl besser *) von Heredoc- auf Nowdoc-Syntax umzusteigen.

                  *)

                  • lesbarer, weil ohne Maskierzeichen
                  • weniger fehleranfällig, weil man auf keine $ aufpassen muss

                  dedlfix.

      2. Hi,

        Trotzdem noch eine Frage
        wie kann man in dieser notation eine andere JS-Funktion aufrufen?

        gar nicht. Bitte mach dir die Trennung zwischen PHP und Javascript klar: PHP schreibt nur ein Dokument, das eventuell Javascript-Code enthalten kann. Du darfst also alles das ausgeben, was im fertigen Dokument, das der Browser bekommt, stehen soll.

        Also rückwärts denken:
         a) Was soll der Browser sehen?
         b) Wie muss ich es in PHP formulieren, damit genau das herauskommt?
         c) Dabei nicht vergessen, ggf. kontextspezifisch zu maskieren.

        die andere JS-Funktion wurde dabei in der normalen Schreibweise geschrieben also mit <script></script>

        Je nachdem, an welcher Stelle im Dokument die nachher stehen wird, mag das wohl richtig sein. Wenn die andere Funktion in einem Abschnitt ausgegeben wird, der sowieso schon als Javascript ausgezeichnet ist, wäre das Wiederholen der script-Tags ja sogar falsch.

        So long,
         Martin

        --
        Verliebt:    Er spricht, sie lauscht.
        Verlobt:     Sie spricht, er lauscht.
        Verheiratet: Beide sprechen, und die Nachbarn lauschen.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hallo,

          ok.
          Für mich war es verwirrend da in der Herodec-Notation  in meinem Beispiel aus dem Netz, eine Ajax-Aktion durchgeführt wird und ich dachte dann müsste auch in dieser Herodec-Anweisung auch eine JS-Funktion aufrufbar sein.

          Gut wenn das nicht geht muss ich alles in diese Herodec-Anweisungen packen.

          Grüße Jürgen

  2. Lieber selfmade01,

    Du kennst wohl die Heredoc-Syntax noch nicht.

    Liebe Grüße,

    Felix Riesterer.

    --
    "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)