Nedávno, vlastne asi pre hodinou, som programoval jeden modul pre Drupal a jeho úlohou bolo vytvoriť formulár, ktorý by nahrádzal tej tradičný formulár na vytváranie obsahu. Samotné spracovanie by potom zabezpečila funkcia node_save
. Toto je veľmi jednoduché až na to, že jedným z elementov formulára mala byť aj Google mapka, pomocou ktorej sa mala dať vybrať lokalita. Trvalo mi nejakú chvíľku kým som na všetko poprichádzal a čo to aj ponachádzal po internete, takže by som to rád zdieľal na jednom mieste. Tak v prvom rade potrebujeme zobraziť mapku ako element formulára. Po chvíli skúšania a hľadana som narazil na šikovnú funkciu gmap_set_location. Má tri vstupné parametre. Prvý, $map
, je premenná obsahujúca gmap makro, ktoré sa použije pre zobrazenie mapky. Druhá, &$form
, je vlastne referencia na formulár v ktorom chceme mapku zobraziť. Tretia premenná je pole obsahujúce názvy elementov, v ktorých budeme ukladať informácie kvôli ďalšiemu spracovaniu. Treba každopádne ukladať informáciu o zemepisnej šírke a dĺžke (kľúče latitude
a longitude
), voliteľne môžme ukladať aj adresu (kľúč address
). Takže náš formulár bude vyzerať nejako takto:
$map_macro = '[gmap|id=usermap|center=0,30|zoom=13|width=400px|height=400px]'; $form = array(); $form['title'] = array( '#type' => 'textfield', '#title' => t('Názov lokality'), '#required' => TRUE, ); $form['latitude'] = array( '#type' => 'hidden', '#default_value' => '48.15509285476016', ); $form['longitude'] = array( '#type' => 'hidden', '#default_value' => '17.105712890625', ); $form['gmap']['#value'] = gmap_set_location($map_macro, $form, array('latitude'=>'latitude','longitude'=>'longitude'));
hidden
- ak chcete dať návštevníkom možnosť vložiť súradnice aj manuálne, dajte tieto elementy ako textfield
. Poďme teraz k spracovaniu formulára. Rozdelíme si ho na dva kroky - najprv uložíme lokalitu a potom samotný obsah, teda nód. Toto je veľmi jednoduché, pretože jediné, čo potrebujeme vedieť, je ako uložiť lokalitu. A na toto našťastie existuje funkcia location_save
, ktorá za nás spraví všetku špinavú prácu. Má jeden vstupný parameter a tým je pole obsahujúce informácie o lokalite. Keďže my chceme ukladať len súradnice, bude náš kód vypadať nejako takto:
$location = array(); $location['latitude'] = $form_state['values']['latitude']; $location['longitude'] = $form_state['values']['longitude']; $location['inhibit_geocode'] = TRUE; $lid = location_save($location);
inhibit_encode
. Ako som zistil skúmaním funkcie location_save
a následne i ňou volanej _location_geo_logic
, modul Location totiž defaultne zisťuje zemepisnú šírku a dĺžku (aj keď mu ich pošleme) z adresy. Keďže ale my adresu neposielame, výsledné súradnice budú podľa modulu Location nulové. Našťastie však existuje prepínač, ktorým je možné tento geocoding obísť a tak uložiť tú "našu" zemepisnú šírku a dĺžku. Týmto prepínačom je práve kľúč inhibit_encode
a treba ho nastaviť na TRUE. Ak funkcia location_save
zbehne úspešne, vráti nám ID novej lokality ($lid
). S novým obsahom (nódom) ju uložíme takto:
$node->locations[0]['lid'] = $lid; $node->title = check_plain($form_state['values']['title']); // other stuff node_save($node);
Pridať nový komentár