Hinrich: JavaScript und Arrays, ein Anfängerproblem

Hallo,

ich verstehe das nicht:

Ich habe ein Template, in diesem assigne ich einer JavaScript Variablen ein Objekt mit mehreren Arrays zu (über Smarty, einer Template Engine). Der Sinn ist, dass JS auf das PHP generierte Array zugreifen kann. Das sieht so aus:

var jsforms={$sm_model->forms};

forms ist dabei ein array in der Form

"step1","step2","step3a,"..." die jeweils noch weitere Werte haben.

Mein Problem nun ist, ich möchte JS gerne das ganze Array forms übergeben, wie oben beschrieben.

Aber wenn ich nun in JS versuche auf die Unterobjekte zuzugreifen bekomme ich nur ein undefined:

var step1 = jsforms.step1;

Wenn ich aber vorher den genauen Wert setze klappt es:

var jsforms={$sm_model->forms.step1};
var step1=jsforms;

Was mache ich falsch? Ist bestimmt nur ein Anfängerfehler, vermute ich. Danke für Eure Hilfe!

Hinrich

  1. Ich habe ein Template, in diesem assigne ich einer JavaScript Variablen ein Objekt mit mehreren Arrays zu (über Smarty, einer Template Engine). Der Sinn ist, dass JS auf das PHP generierte Array zugreifen kann. Das sieht so aus:

    var jsforms={$sm_model->forms};

    Das kann zu Mißverständnissen führen

    In JS werden so Objekte erzeugt.

    var o = {eigenschaft: 'wert'};

    forms ist dabei ein array in der Form

    "step1","step2","step3a,"..." die jeweils noch weitere Werte haben.

    Mein Problem nun ist, ich möchte JS gerne das ganze Array forms übergeben, wie oben beschrieben.

    Es gibt zwei Möglichkeiten um Array in JS zu erzeugen, entweder:
    var arr = new Array( a, b, c, d );
    oder
    var arr = [ a, b, c, d ]

    Welche du davon nimmst bleibt dir überlassen.

    Struppi.

    1. @cheetah

      Ich benutze eine Template Engine und damit klappt es sehr wohl. Ich bekomme ja schliesslich den korrekten Wert, wenn ich das Array über Smarty übergebe.

      var jsforms={$sm_model->forms}

      Hier ist der Teil in {} der Teil, in dem Smarty den von PHP assignten Wert übergibt.

      {$sm_model->forms} liefert als Ergebnis das Array, doch kann ich nicht über

      jsforms.step1 auf step1 zugreifen.

      Sehr wohl jedoch, wenn ich über Smarty

      var jsforms={$sm_model->forms.step1} übergebe, dann ist jsforms korrekt step1.

      1. Ich benutze eine Template Engine und damit klappt es sehr wohl. Ich bekomme ja schliesslich den korrekten Wert, wenn ich das Array über Smarty übergebe.

        Aber welchen? Uns (bzw. JS) interessiert weder dein PHP Code noch der vom Template, einzig und allein was beim Browser ankommt zählt erstmal und ist die einzige Möglichkeit bei deinem offensichtlich doch nicht funktionierenden Skript zu helfen.

        var jsforms={$sm_model->forms}

        Hier ist der Teil in {} der Teil, in dem Smarty den von PHP assignten Wert übergibt.

        Was immer das heißen mag, nur wenn du in JS ein Objekt deinieren möchtest:
        var obj = { attr: 'wert' };

        was macht Smarty dann?

        {$sm_model->forms} liefert als Ergebnis das Array, doch kann ich nicht über

        Ein PHP Array, du brauchst aber ein JS Array, wie man die definiert hab ich dir ja schon gezeigt (kann man aber auch in selfhtml nachlesen)

        jsforms.step1 auf step1 zugreifen.

        So greift man auch nicht auf ein Array zu, weder in PHP noch in JS.

        Sehr wohl jedoch, wenn ich über Smarty

        var jsforms={$sm_model->forms.step1} übergebe, dann ist jsforms korrekt step1.

        Allerdings nur wenn der ersetzte Wert eine Zahl ist.

        Struppi.

      2. Hi,

        @cheetah

        unabhängig vom Tippfehler: Wenn Du auf meine Antwort reagieren möchtest, dann antworte doch einfach auf meinen Artikel. Das hat auch den entscheidenden Vorteil, dass ich mich angesprochen fühle, anstatt zu vermuten, dass Du mit jemand anders sprichst.

        Ich benutze eine Template Engine

        Nicht in JavaScript. Daher ist das vom selben Belang wie die Frage, welche Farbe Dein Netzwerkkabel hat.

        var jsforms={$sm_model->forms}

        Wenn dieser Teil beim Client ankommt, dann hast Du ein sehr, sehr großes Problem. Kommt er nicht an, hat dieser Code nicht den geringsten Zusammenhang zu Deiner Frage.

        Sehr wohl jedoch, wenn ich über Smarty
        var jsforms={$sm_model->forms.step1} übergebe,

        Wie lautet der hieraus resultierende JavaScript-Code?

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
  2. Hi,

    Der Sinn ist, dass JS auf das PHP generierte Array zugreifen kann.

    kann es nicht. Wenn clientseitiges JavaScript ins Spiel kommt, ist serverseitiges PHP schon lange nicht mehr existent. Diese zwei Welten sind absolut voneinander getrennt.

    Das sieht so aus:
    var jsforms={$sm_model->forms};

    Tut es nicht. Der Client wird niemals irgendwelchen PHP-Code zu Gesicht bekommen. Deswegen ist bei clientseitigen Problemen jedweder serverseitiger Code auch vollständig zu eliminieren.

    Aber wenn ich nun in JS versuche auf die Unterobjekte zuzugreifen bekomme ich nur ein undefined:

    Ja. Schaue Dir den Quellcode im Client an.

    Was mache ich falsch? Ist bestimmt nur ein Anfängerfehler, vermute ich.

    Korrekt. Dein Fehler ist, Client und Server nicht absolut strikt voneinander getrennt zu betrachten. Gehe jeweils davon aus, dass die andere Seite überhaupt nicht existiert.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  3. Hallo,

    ich verstehe das nicht:

    Ich habe ein Template, in diesem assigne ich einer JavaScript Variablen ein Objekt mit mehreren Arrays zu (über Smarty, einer Template Engine). Der Sinn ist, dass JS auf das PHP generierte Array zugreifen kann. Das sieht so aus:

    var jsforms={$sm_model->forms};

    forms ist dabei ein array in der Form

    "step1","step2","step3a,"..." die jeweils noch weitere Werte haben.

    Mein Problem nun ist, ich möchte JS gerne das ganze Array forms übergeben, wie oben beschrieben.

    Aber wenn ich nun in JS versuche auf die Unterobjekte zuzugreifen bekomme ich nur ein undefined:

    var step1 = jsforms.step1;

    Wenn ich aber vorher den genauen Wert setze klappt es:

    var jsforms={$sm_model->forms.step1};
    var step1=jsforms;

    Was mache ich falsch? Ist bestimmt nur ein Anfängerfehler, vermute ich. Danke für Eure Hilfe!

    Hinrich

    Das ist ein einfaches JS und PHP zu verbinden
    <input type="button" value="Datum" onClick="alert('<?php echo date("d.m.Y",time()); ?>')">