Ich habe mir mal die Extension EGMaps zur Einbindung von Google Maps angeschaut. Leider sind dort nicht alle Möglichkeiten integriert, die ich gerne haben möchte. Ist es irgendwie möglich, alle Funktionen der Google Maps API mit YII zu Nutzen oder kann ich EGMaps irgendwie erweitern?
Hier mal einige Anforderungen:
die autocomplete Funktion der Google Maps Suche nutzen (Ist das überhaupt möglich?)
Polylines nutzen
Events nach dem Klicken auf Städte oder Länder
korrekter Zoom bei Auswahl von Ländern oder Kontinenten
beim geocoden werden mir ja relativ wenig Informationen geliefert. Eigentlich nur der Breiten- und Längengrad. Weitere Informationen wären hier sinnvoll.
Du kannst jede Komponente in Yii für deine Bedürfnisse anpassen, indem du deine eigenen Klassen von den gegebenen Klassen ableitest . Das gilt natürlich auch für Extensions.
Das ist mir schon irgendwie klar. Ich frage mal anders: Wenn ich Google Maps einbinden möchte, muss ich ja custom JS in YII einbinden. Dazu habe ich auch schon einiges gelesen aber das Konzept noch nicht wirklich verstanden.
CClientScript::registerCoreScript()
CClientScript::registerScriptFile()
CClientScript::registerScript()
Was genau machen diese Funktionen und wofür sind sie? Wie kann ich Variablen in JS an PHP(YII) übergeben und wie von PHP(YII) zu JS?
Ich habe einfach mal probiert, JS einfach in die VIEW-Dateien zu schreiben. Beispielsweise war dann aber hier die Reihenfolge der JS-Funktionen nicht korrekt. Die Eingabe eines Feldes sollte erst geprüft werden und erst danach an meine JS-Customfunktion geliefert werden.
Das ist natürlich schon eine etwas konkretere Frage.
CClientScript ist da, um JS und CSS zu verwalten. Du solltest in deinen Views JS nicht direkt einbetten, sondern bei CClientScript deinen Code registieren. Beim rendern des Views fügt CClientScript diese dann in deine Seite ein. Die Methoden die du genannt hast, sind genau für diese Aufgabe da (es gibt sogar noch einige mehr). Mit registerCoreScript() kannst du ein package (das ist ein Paket aus js und/oder css files) registrieren. Zum Beispiels registerCoreScript(‘jquery’). Der Methode registerScriptFile() kannst du den Pfad zu einer js Datei mitgeben. Diese wird dann ebenfalls im View miteingebunden. Der Methode registerScript() kannst du schlussendlich ein kleines Snippet JS code als Parameter mitgeben, welches (wer hätte es gedacht ) in dein View eingebettet wird. Ich kann dir in dem Zusammenhang nur empfehlen einmal in der Doku von CClientScript zu stöbern. Schau dir auch mal das Konzept von den packages an (http://danaluther.blogspot.ch/2012/03/using-packages-with-clientscript.html scheint auf den ersten Blick ganz informativ zu sein).
Zur zweiten Frage: Kommt drauf an was du tun willst. Wenn es beispielsweise darum geht, die Optionen eines jquery plugins zu setzen, kannst du das quasi in php zusammenbasteln. Kannst ja mal den Code eines JuiWidgets von Yii angucken, dann weisst du was ich meine.
Anderenfalls ist ajax das Zauberwort. Das setzt du ein, wenn du wirklich eine Kommunikation zwischen js und Yii haben willst.
Hier können ja PHP-Variablen ($options) recht einfach eingefügt werden. Das ist aber doch nur mit Jquery so einfach, oder? Ich hab jetzt noch was anderes gefunden:
var myvar = <?php echo json_encode($myVarValue); ?>;
Kann ich Variablen so einfügen und ist das sinnvoll?
Also ein Beispiel, das ich gerne Umsetzen möchte: User hat die Möglichkeit über ein Eingabefeld eine Stadt einzugeben und diese soll dann, am besten dynamisch, auf der Karte angezeigt werden.
Meine Idee ist, dass ich die benötigte JS-Funktion mit onClick() aufrufe und in der JS-Funktion dann die benötigte Variable aus dem $model ziehe. (Bin ich da konzeptionell auf dem richtigen Weg?)
Ganz genau so wirds gemacht. Zu beachtet ist, dass das $options array als JS encoded ist. Das passiert entweder mit json_encode() oder noch etwas mächtiger mit CJavaScript::encode(). Beiden Methoden kannst du ein PHP array übergeben und erhälst ein JSON array zurück.
Zu deiner Idee: Am besten guckst du dir mal das API von Google Maps an. Da ich keine Erfahrungen damit habe, kann ich dir nicht wirklich weiterhelfen. Das scheint mir aber eher ein JS Task zu sein