Komponenta pro GoogleMap API

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
besir
Člen | 170
+
0
-

Ahoj,
řešil jsem ted situaci kdy jsem na webu v různých obměnách potřeboval googleMap. Napadlo mě, žebych pro to udělal nějakou sofistikovanou komponentu. Jen si chci předem ujasnit co vše a jak by to mohlo umět. Přemýšlím od základním zobrazení jednoho bodu a více bodů.

Je pár bodů u kterých si ovšem nejsem jist s best way.

Např.

  1. Je samozřejmé že potřebuju JS, jenže vykreslovat JS v komponentě není zrovna cool a hezké řešení. Tím pádem by to chtělo posílat někam do hlavičky a ideálně do bloku head, ale co když ho někdo nebude používat? Jsem schopen to zjistit v komponentě? Pak by se měl vygenerovaný soubor nalinkovat v místě komponenty.

2)
Má se konfigurace jako třeba API key tahat přímo z konfigu, nebo předávat v parametrech komponenty a obstarávat tak presenterem. (Podle mě to druhé)

  1. Co vše by v ideálním případě mělo být konfigurovatelné? Mám dělat konfiguraci pro jednotlivé body pomocí Associativního pole nšco ve stylu:

$markers = array(
‚icon‘ ⇒ ‚default‘,
‚lat‘ ⇒ ‚12.8787‘,
‚lng‘ ⇒ ‚26.86567‘,
‚dragable‘ ⇒ true
);

Nebude to pak moc zbytečně robustní, ošetřovat všechny stavy atd.
…)

Pojďte o tom udělat brainstorming. Myslím si, že takovouto věc by mohlo dost lidí využít.

Díky, uvítám podporu :-)

OK3
Člen | 91
+
0
-

Mně to tedy přijde skoro zbytečné z toho dělat Nette komponentu. Je to spíš na nějakou JS komponentu nebo jQ widget – většina potřebného kódu bude stejně na klientu a v PHP ho budeš jen duplikovat. Navíc, pokud to správně chápu, chceš pomocí Nette generovat JS? To mi nepřijde vůbec hezké. Já bych to napsal čistě v JS a jediný, co by tuhle komponentu zajímalo by byla URL, ze které si načte JSON s daty, které má zobrazit.

Ale nechci tě od toho odrazovat, píšu svůj názor :)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Kašli na komunitu, udělej to podle svého nejlepšího vědomí a svědomí :).

Ad 1) to bych moc neřešil. Určitě bych žádný Javascript negeneroval, ale napsal bych unobtrusive skript, který by si uživatel prostě musel ručně nalinkovat. Brzy už se možná objeví řešení, jak tohle přilinkování zautomatizovat v libovolném Nette addonu (vedou se nějaké diskuse), takže řešit to specificky pro tvoji komponentu, to by mohla být zbytečná práce.
Taky by se skripty měly linkovat spíš před koncem </body>, aby nezdržovaly načítání stránky.

besir
Člen | 170
+
0
-

Co se týká toho generování:
Když chci vykreslit více bodů, tak musím sestavit JS array s objekty Markerů (bodů na mapě). No a jak to udělat jinak aby to nemuselo strašit v kodu třeba při každé smyčce vykreslení objektu. Proto mě napadlo ten JS vygenerovat. Samozřejmě, mohu to vygenerovat mimo a do toho kodu pak jen předat ono pole, ale pořád se o to budu muset nějak postarat. A do výslednýho outputu se to dostat musí. Takže pro moje oči je to zatím stále jediná možnost jak to udělat co možná nejlépe :-)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Nejvhodnější způsob je využít datové atributy (data-something=" ... "), do kterých můžeš narvat cokoli, třeba ten json. A ten si pak v obslužném skriptu vyzvedneš pomocí $('#map').data('something');.

besir
Člen | 170
+
0
-

Good Idea :-) Ale pořád to nutí uživatele k tomu, aby něco správně přidal. Pak už je to opavdu jen o tom JS :-)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

No tak myslel jsem, že ten datový atribut by samozřejmě generovala ta tvoje komponenta. Asi máme trochu jiné představy o výsledku :). Proto říkám, neraď se s komunitou, ale tvoř :).

vvoody
Člen | 910
+
0
-

@besir: zostaviť JS array? Čo si mam pod tým predstaviť. Nedajbože vypísať „ručne“ do šablóny cez foreach to pole?

besir
Člen | 170
+
0
-

vvoody napsal(a):

@besir: zostaviť JS array? Čo si mam pod tým predstaviť. Nedajbože vypísať „ručne“ do šablóny cez foreach to pole?

No to právě ne, proto sestavení JS celého, kam by se sestavilo to pole s daty pro mapy a pak by se vratil celý funkční javascript…

vvoody
Člen | 910
+
0
-

besir napsal(a):
..kam by se sestavilo to pole s daty…

Stále si nie som istý ako to myslíš. Z toho čo píšeš mi vychádza, že nevieš o existencii funkcie json_encode ktorá preformátuje akékoľvek php pole do JS objektu/pola a vdaka Context-Aware Escaping tu funkciu ani volať nemusis, v šablóne to za teba spraví latte.

Aearsis
Člen | 57
+
0
-

Něco takového jsem si udělal. Unobtrusive to celý udělat nejde, Nette komponentový model se docela osvědčil. Mapa je v podstatě kontejner, do který si přidávám další komponenty – body, trasy. Všechno je vykreslitelné, a komponenty „vykreslují“ javascript – není to sice pěkné, ale může to umět všechno. Duplikaci kódu se nevyhneš – buď budeš PHP přepisovat na javascript, a nebo budeš mít v tom javascriptu spoustu ošetřování různejch data-* featur z HTML.

Já sem to měl ještě složitější v tom, že mapa musí být přepínací mezi google/seznam mapou, tím pádem mám ještě nějaké js rozhraní skrz které ovládám teprve API map. Pomysli i na tohle.

A ohledně sestavení pomocí json_encode – nedokáže zpracovat volání funkcí. Takže stejně pak budeš muset souřadnice přeměnit do LatLng objektu atd. V případě map mi tedy nepřipadá generování js nic tak strašnýho.

Plus to umožňuje snadno přidat například formulářovou komponentu pro zadání bodu – předá se jí instance mapy, ona si v ní sama vytvoří marker, a u klienta zařídí přenášení souřadnic do textovýho pole.