Mit $javascript->codeBlock lässt sich recht elegant Javascript-Code einbetten (vor allem interessant, wenn man die ein oder andere Referenzinformation für eine JS-Funktion zur Verfügung stellen will – und das ohne AJAX).
$javascript->codeBlock(“alert(‘hallo’);”, array(‘inline’ => false));
Das ‘inline’ => false ist Gold wert. Hat man in seinem default.ctp schön brav <?php echo $scripts_for_layout ?> in den <head> geschrieben, dann wird der JS-Code nicht mitten in die Seite “geschmiert”, sondern schön in den <head>-Bereich des Dokuments platziert. Sowas sorgt für Ordnung.
$javascript->object($this->viewVars['adressenstatus'], false, ‘adressenstatus = ‘, ‘;’);
Die object-Funktion macht aus einem Array entsprechend JSON – mit allem was dazugehört. In diesem Fall beziehe ich mich auf ein zweidimensionales Array, welches ich sowieso für die Ausgabe eines Popups brauche. Das $this->viewVars['adressenstatus'] wird mit einem Präfix ‘adressenstatus = ‘ und einem Suffix ‘;’ versehen. Und schon habe ich ein schönes Javascript-Objekt. Das sieht dann in etwa so aus:
adressenstatus = {"Mitgliedschaft":{"1":"Plus-Mitgliedschaft","2":"Standard-Mitgliedschaft","3":"Gruppen-Mitgliedschaft"},"sonstiges":{"0":"Neuanmeldung","4":"Interessent","5":"Multiplikator","6":"Referent","7":"ruhende Mitgliedschaft","8":"Presse\/ \u00d6ffentlichkeitsarbeit\n"}};
Jetzt kombiniere ich beides und schwups hängt das ganze im <head>-Bereich meiner Seite:
$javascript->codeBlock($javascript->object($this->viewVars['adressenstatus'], false, 'adressenstatus = ', ';'), array('inline' => false));
Die Funktion $javascript->object werde ich wohl noch recht oft einsetzen. Vor allem auch in Zusammenhang mit AJAX.
Ziel der Übung von oben ist es bei einem onchange-Event eines Popups entsprechende Formularteile ein- oder auszublenden. Hier macht es imho wenig Sinn mit einem XHTTP-Request zu arbeiten, wenn der Datenumfang des Popups klein ist (in diesem Fall ja nur 9 Datensätze). Da liefert man das Objekt für Javascript einmal im <head> und bezieht sich dann entsprechend darauf.
Tags: $javascript->codeBlock, $javascript->object, PHP/ PHP-Frameworks/ CakePHP
This entry was posted on Wednesday, October 15th, 2008 at 17:56 and is filed under PHP/ PHP-Frameworks/ CakePHP. You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.
February 13th, 2009 at 09:57
json_encode:
Das gibt es seit PHP5 und da ich in vielen Bereichen bislang immer noch mit PHP4 umgeben bin, war mir das erstmal gar nicht bekannt.
Aber das Teil in CakePHP ist auf jeden fall auch ganz ok ;-)
March 11th, 2009 at 16:45
Also dazu muss ich leider wiedersprechen: “Hat man in seinem default.ctp schön brav in den geschrieben, dann wird der JS-Code nicht mitten in die Seite “geschmiert”, sondern schön in den -Bereich des Dokuments platziert. Sowas sorgt für Ordnung.”
Es sollte immer vermieden werden Javascript im Bereich einzubinden! Das macht die Seite unnötig langsamer. Wenn möglich sollte man das besser vor machen. Leider gilt das nur für scripte und nicht stylesheets. CakePHP unterscheidet hier aber nicht :/
Das Beispiel mit codeBlock hast jedoch gut erklärt, das war es wo ich suchte, Danke ;)
March 11th, 2009 at 16:49
Sorry, dadurch das html Tags nicht angezeigt werden kann man mein Komentar kaum lesen, weitere Infos dazu: http://developer.yahoo.com/performance/rules.html#js_bottom
March 11th, 2009 at 16:50
Naja. Ich schreibe ja keine grossen Funktionen oben rein, sondern eigentlich nur Definitionen. Der ganze function-Kram liegt sowieso in nem externen JS das man am Besten noch mit nem “ewigen” Expire verpackt…