GpsPicker – formulářový prvek pro výběr GPS

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Addon, Github, vojtech-dobes/nette-forms-gpspicker (Composer)

  • využívá Google Maps API v3
  • avšak umožňuje mapová data stahovat i z Open Street Maps (vyhnutí se limitu u Googlu)
  • negeneruje žádný javascript
  • podporuje klientskou validaci (ne pro všechna pravidla)
  • lze jej manuálně renderovat {control coords}
  • registrace jako CompilerExtension
  • možnost manuálně renderovat jednotlivá dílčí políčka pro nonJS/offline
  • hledání v mapě podle adresy
use VojtechDobes\NetteForms\GpsPicker as Gps;
$brno = array(
	'lat' => 40.995141,
	'lng' => 86.572266,
);
$form->addGpsPicker('coords', 'Coordinates:', array(
	'type' => Gps::TYPE_SATELLITE,
	'zoom' => 1,
	'size' => array(
		'x' => '100%',
		'y' => 350, // v pixelech
	),
))
	->setDefaultValue($brno)
	->addRule(Gps::MAX_DISTANCE_FROM, 'Lokaci lze zvolit nejdál 20km od Brna.', array(20000, $brno));

Editoval vojtech.dobes (20. 11. 2012 1:19)

Filip Procházka
Moderator | 4668
+
0
-

Moc pěkné. Přidáš composer? :)

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

Eh, added composer.json :)

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

Přidána možnost manuálně renderovat jednotlivá dílčí políčka pro nonJS/offline stav aplikace.

A také je možné celý doplněk zaregistrovat skrze CompilerExtension.

$configurator->onCompile[] = function ($configurator, $compiler) {
	$compiler->addExtension('gpspicker', new VojtechDobes\NetteForms\GpsPickerExtension);
};
Tomáš Votruba
Moderator | 1114
+
0
-

Pěkné, doplnil bych ještě link na specifický js (http://maps.google.com/maps/api/js?…), demo a možnost určit polohu pouhým kliknutím, ne přetahováním z původní lokace (tak mi to funguje).

Ještě by mne zajímalo, jak moc se to liší od GMapFormControl, který již dělá to, co navhruji. Abych věděl, proč vybrat ten, či onen :)

Editoval Schmutzka (28. 8. 2012 9:52)

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

To kliknutí ti přijde intuitivní? Já bych to nějak „přirozeně“ dělal poklepáním, ale to zase defaultně zoomuje. Každopádně podporu pro single-click můžu přidat.

Demo zatím příliš není v mých možnostech… ale pokud by někdo chtěl hostovat, poskytnu sandbox. Link na API doplním.

Liší se to kupříkladu tím, že to negeneruje zbytečný JS v šabloně, lze to manuálně renderovat (což GMapFormControl nejde, protože v getControl() vrací šablonu. V issues mám rozepsané další plány, hlavně podporu výběru oblasti (portuju to z mého staršího kódu).

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

@Schmutzka A pochopitelně JS klientská validace :)

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

Přidána podpora pro nastavení lokace jedním klepnutím do mapy (při dvojkliku se provede defaultní zoom a lokace se nenastaví). Upřímně by mě v tomto zajímal širší průzkum, co je očekávatelnejší a co je pohodlnější.

Tomáš Votruba
Moderator | 1114
+
0
-

Super, nastavitelnost ideální – čteš mi myšlenky :). Brzy to použiju hlouběji, tak doplním poznatky. JS validace skvělý plus. To by mohl být pěkný standard u všech doplňků.

Nabídku na sandbox jsem ti poslal.

motorcb
Člen | 552
+
0
-

Komponenta vypadá parádně :)

Jen nevím co s tímto krokem:

V bootstrap.php provedeme registraci extenze VojtechDobes\NetteForms\GpsPickerExtension do $configurator->onCompile[].

Prosím o blíšší vysvětlení :) Díky

mkoubik
Člen | 728
+
0
-

Přidej do bootstrap.php:

$configurator->onCompile[] = function ($configurator, $compiler) {
    $compiler->addExtension('gps', new \VojtechDobes\NetteForms\GpsPickerExtension);
};

viz dokumentace

vvoody
Člen | 910
+
0
-

Nebolo by tam fajn vyhľadávanie podla adresy? (geocoding)

Upravil som si nette.gpsPicker.js, verejne priznávam že v js ešte strašne prasím :D tak ma za to nebite. (náhľad)

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

@voody Je to v plánu, ale trochu jiným způsobem.

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

And it's there…

Přidána podpora pro hledání podle adresy. S možností vypnutí a s podporou manuálního renderování (při potřebě custom umístění vyhledávacího políčka).

motorcb
Člen | 552
+
0
-

Paráda, super doplnek. Funguje :)

Mám pár dotazu :-)

$form->addGpsPicker('coords')
    ->addRule(Gps::MIN_LAT, 'Minimal latitude must be %f.', 20)
    ->addRule(Gps::MIN_LNG, 'Minimal longitude must be %f.', 40)
    ->addRule(Gps::MAX_LAT, 'Maximum latitude must be %f.', 20)
    ->addRule(Gps::MAX_LNG, 'Maximum longitude must be %f.', 40)
    ->addRule(Gps::MIN_DISTANCE_FROM, 'Minimal distance from Prague must be %i m.', array(15000, array(
        'lat' => 50.083,
        'lng' => 14.423,
    )));
  1. Jak nastavím velikost mapy? Ve starší verzi mi nefungovalo nastaveni v procentech.
  2. Nefunguji mi validacni pravidla… Kliknu kdekoliv na svete a bod se tam presune… Zadne upozorneni…
  3. Je mozne zobrazit na mape vice bodu?
  4. Je mozne pridat odesilaci tlacitko a odeslat souradnice bodu?

Diky za odpoved

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

1)

$form->addGpsPicker('name', 'Label', array(
	'size' => array(
		'x' => '80%',
		'y' => '80%',
	),
));
  1. Validační pravidla tak chytrá nejsou (ačkoliv je to v plánu). Fungují jako ostatní validační pravidla, tudíž vyskočí alert s hláškou v okamžiku odeslání formuláře.
  2. Na mapě nelze zobrazit více bodů, nějaký addMultiGpsPicker() zatím neexistuje.
  3. Nerozumím. Přesně o tom ten prvek je, ne? Samozřejmě aby se formulář dal odeslat, je třeba do něj přidat submit:).
motorcb
Člen | 552
+
0
-

vojtech.dobes:

Diky za vysvetleni :)

  1. procenta mi nefunguji :( Vubec se nezobrazi mapa :(
$form->addGpsPicker('coords', 'Label', array(
            'size' => array(
                    'x' => '80%',
                    'y' => '80%',
            ),
    )
    )
    ->addRule(Gps::MIN_LAT, 'Minimal latitude must be %f.', 20)
    ->addRule(Gps::MIN_LNG, 'Minimal longitude must be %f.', 1)
    ->addRule(Gps::MAX_LAT, 'Maximum latitude must be %f.', 60)
    ->addRule(Gps::MAX_LNG, 'Maximum longitude must be %f.', 40)
    ->addRule(Gps::MIN_DISTANCE_FROM, 'Minimal distance from Prague must be %i m.', array(15000, array(
        'lat' => 50.083,
        'lng' => 14.423,
    )));
  1. Dalsi problem vidim v pravidle:
->addRule(Gps::MIN_DISTANCE_FROM, 'Minimal distance from Prague must be %i m.', array(15000, array(
    'lat' => 50.083,
    'lng' => 14.423,
)));

Ktere mi zobrazuje hlasku:
Minimal distance from Prague must be m.
Kde neni doplnena vzdalenost v metrech…

  1. addMultiGpsPicker() by byl perfektní doplněk :)
  2. Nedari se mi ziskat hodnoty bodu. Formular odeslu( hodnoty jsou odeslany ):
$aValues = $form->getValues(TRUE);
print_r( $aValues );

Avsak nevim jak si pro ne sahnout:

echo $aValues->lat;

Nefunguje a vraci: Trying to get property of non-object

Vojtěch Dobeš
Gold Partner | 1316
+
0
-
  1. Ujistil bych se, že obalující prvek má nějakou šířku nastavenou. Mně to funguje.
  2. Moje chyba, má tam být %d. Opravím dokumentaci.
  3. Je třeba přistupovat jako klasicky nejprve k prvku :). Takže $form->values->coords->lat etc. A btw, pokud chceš k hodnotám formuláře přistupovat objektově (->), tak nepředávej metodě getValues to TRUE.

Editoval vojtech.dobes (30. 8. 2012 10:23)

motorcb
Člen | 552
+
0
-

vojtech.dobes:

Super. Diky za info. Tak az na nastaveni sirvy a vysky v procentech mi to funguje.
Diky za super komponentu
Jeste kdyby tak byl addMultiGpsPicker() :)

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

@motorcb Ad addMultiGpsPicker(), nebyl by to takový problém implementovat, ale spíš mi jde o použitelnost. Nevím jak pohodlné a hlavně pochopitelné by pro uživatele bylo nastavovat v jedné mapce více frček… už hýbání s jednou za účelem nastavení lokace bývá pro uživatele někdy jako z jiné planety :). Takže bych spíše situaci řešil prostým přidáním více gpspickerů do formuláře. V případě dynamického počtu pomocí addDynamic()Hosiplanova Kdyby.

talpa
Člen | 44
+
0
-

nekde se stala chyba a na gitu chybi const v gpsPicker.php

	const DEFAULT_SIZE_X = 400;
	const DEFAULT_ZOOM = 100;
	const MAX_LAT = 10000;
	const MIN_LAT = 10000;
	const MIN_LNG = 100;
	const MAX_LNG =100000;
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

@talpa tomu úplně nerozumím, co máš na mysli? Tyto konstanty v GpsPicker.php jsou.

bazo
Člen | 620
+
0
-

zdravim,

pokusam sa to rozbehnut, fixol som tam jednu chybicku v php, ale mam stale nejake javascriptove chyby. jedna na riadku 55, reportoval som na githube.

ked zakomentujem ten riadok tak na mna vyskoci:

TypeError: c is undefined
[Break On This Error]
…e=„forceredraw“,Ve=„staticmaploaded“,We=„panby“,Xe=„panto“,Ye=„insert“,Ze="remov…

na riadku 18 v main.js.

neviete kde moze byt chyba? v appke je pouzity twitter bootstrap, tak sa aj mapa nejak cudne zobrazuje

Editoval bazo (30. 9. 2012 10:54)

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

Vydána verze 1.0.2, opravena chybička v manuálním renderování. Díky @bazo za report a opravu.

David Ďurika
Člen | 328
+
0
-

zdravim, moje mapa vyzera takto http://grab.by/gCfo
cela je nejaka cudne a na boku ten panel na zoom je uplne cudny, on tam sice je ale ledva ho vydiet a je rozhodeny…
neviete ako to fixnut ?

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

@achtan je to bug způsobený Twitter Bootstrapem. Přidej si do CSS tento kousek:

[data-nette-gpspicker] img {
	max-width: none;
}

Viz https://github.com/…ker/issues/1. Časem chci do pickeru přidat, aby tenhle snippet CSSka aplikoval automaticky.

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

Vydána verze 1.0.3, která přináší jednu feature:

  • pokud je povoleno vyhledávání podle adresy a nějaká adresa je zadána, přenáší se též na server a je přístupná jako property address – funkci je třeba povolit explicitním zavoláním enableSearch(TRUE) (s tím TRUE)
$form->addGpsPicker('coords')
	->enableSearch(TRUE);

$values = $form->values;
$values->coords->address;
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Vydána verze 1.0.4. Doplňuje Javascriptové API pro snadnou manipulaci s pickery, provázání s Ajaxem atd.:

  • dokumentace na Githubu
  • přidán jQuery plugin $.fn.gpspicker()
  • metody load() a initialize()
  • konkrétní GpsPicker lze získat voláním $el.data('gpspicker)

Editoval vojtech.dobes (14. 10. 2012 20:33)

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

Vydána verze 1.0.5.

  • k dispozici je demo
  • zrušena závislost na Google mapách – doplněk stále využívá stejné Javascriptové knihovny, ale mapová data lze alternativně stahovat z projektu Open Street Maps (lze se tak vyhnout možnému vyčerpání limitu požadavků u Google map)
$form->addGpsPicker('coords', 'Coordinates:')
	->disableGoogle();
h4kuna
Backer | 740
+
0
-

Přihodím zpracování souřadnic převede souřadnice různým způsobem zapsané (mapy.cz/maps.google.com) na pole.

Hafran
Člen | 121
+
0
-

Paráda. A nešlo by z toho ještě dostat při hledání dle adresy i ostatní info, nejenom lat a lng (např. PSČ, Čtvrť, formátovanou adresu)?

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

@Hafran Aktuálně lze zapnout, aby se na server posílala adresa zadaná do vyhledávacího políčka. Ostatní údaje plánuju podporovat též, ale chci to spojit i se serverovým fallbackem, a ještě jsem nevymyslel přesnou koncepci. De facto na to mám knihovničku, ale nevím, jestli ji mám tahat jako závislost.

mirdič
Člen | 41
+
0
-

Super addon,

Jen by to možná chtělo napsat k instalaci, že je potřeba zapsat do configu v neonu:

	gpspicker:

Editoval mirdič (8. 12. 2012 18:06)

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

@mirdič Díky :). Ale není to pravda, prázdné návěstí rozšíření není do konfigurace třeba psát.

mirdič
Člen | 41
+
0
-

Aha, tak bude chyba asi někde u mě, ale bez toho mi to nejde. Vůbec to nebere zaregistrovanou extenzi v bootstrapu.

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

@mirdič jakože pokud tu sekci zase smažeš, tak ti to přestane fungovat a hlásí neznámou metodu addGpsPicker?

mirdič
Člen | 41
+
0
-

Zkusil jsem to znova na jiném projektu. Máš samozřejmě pravdu, není to potřeba přidávat do configu. Jen mi nenačetl rotbotLoader nové knihovny a myslel jsem že jsem keš vymazal, ale obnovilo se to, nevim proč, až když jsem to přidal do configu :)

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

Tak to jsem rád, konec dobrý, všecko dobré :).

motorcb
Člen | 552
+
0
-

Chtěl bych se zeptat zda je možné nastavit polohu pro editaci přes: $form->setDefaults(…)

Pokud ano, jak?

Děkuji

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

Zdravíčko, je to snadné:

$form->addGpsPicker('coords');
$form->setDefaults(array(
	'coords' => array(
		'lat' => 50.103245,
		'lng' => 14.474691,
	),
));

Doplním to i do dokumentace.

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

Vydána verze 1.0.6.

  • opraven bug způsobující nemožnost odeslat formulář v prohlížeči Chrome (inputy s typem number musí mít atribut step="any", pokud má do nich být možné zapsat float)
motorcb
Člen | 552
+
0
-

Funguje tato verze v Nette 2.1dev?

Hlásí mi chybu: Declaration of VojtechDobes\NetteForms\GpsPickerExtension::afterCompile() should be compatible with Nette\Config\CompilerExtension::afterCompile(Nette\PhpGenerator\ClassType $class)

Děkuji za vyřešení

raketoplan2005
Člen | 147
+
0
-

@vojtech.dobes: Ahoj, verze 1.0.8 vyžaduje v composeru Nette 2.0, plánuješ prosím release i pro 2.1? Děkuji

Edit:
Když si stáhnu aktuální verzi, upravím si GpsPickerExtension.php tak aby používal místo Nette\Utils\PhpGenerator\ClassType jen Nette\PhpGenerator\ClassType tak se mi doplněk rozběhne, mapa vykreslí, ale při zpracování formu vrací jen nějaké defaultní GPS souřadnice.

Stejně tak v těch souborech nikde nemůžu najít konstantu „DRIVER_SEZNAM“ která se používá v demu. Možná púořád stahuji špatnou verzi?

Díky

Editoval raketoplan2005 (27. 1. 2014 23:05)

raketoplan2005
Člen | 147
+
0
-

Listenery na onclick a up v javascriptu mi při klikání mapou vrací v lat a lng správné GPS souřadnice (zkoušeno alertem). Vyhledávání přes search funguje. Data se však z formu přdají jen ta výchozí (50.083,14.423).

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

@raketoplan2005 Seznam mapy a další featury v demu jsem popravdě řečeno ještě nezveřejnil :). Podporu pro Nette 2.1 připravím co nejdřív.

raketoplan2005
Člen | 147
+
0
-

@vojtech.dobes: Díky moc, snažil jsem se to rozjet sám, ale ukázalo se že na to asi nemám :-)

Maxell92
Člen | 38
+
0
-

Ahoj, vyřešil prosím někdo ten problém se špatným zobrazením mapy, jak reportoval achtan?

Zkoušel jsem i postup zmíněný na konci https://github.com/…ker/issues/1, ale nefunguje mi to, stále musím zresizovat okno nebo otevřít FireBug, aby se mapa načetla celá :(

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

Vydána verze 1.1.0!

  • podpora pro Nette 2.1
  • podpora pro Nokia mapy a Seznam mapy
  • podpora pro různé typy map (záleží na zvoleném poskytovateli map, viz dokumentace v Readme)
  • lze ponechat zobrazené inputy pro manuální zadání souřadnic

Editoval vojtech.dobes (3. 2. 2014 12:48)

raketoplan2005
Člen | 147
+
0
-

Díky moc za update. Je už trochu pozdě tak to může být tím, je ale možné že mi i nová verze vrací stále:

Nette\ArrayHash
  coords => VojtechDobes\NetteForms\GpsPoint
    lat private => 50.083
    lng private => 14.423
    address private => NULL

Děkuji