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:

  1. $map_macro = '[gmap|id=usermap|center=0,30|zoom=13|width=400px|height=400px]';
  2. $form = array();
  3.  
  4. $form['title'] = array(
  5. '#type' => 'textfield',
  6. '#title' => t('Názov lokality'),
  7. '#required' => TRUE,
  8. );
  9.  
  10. $form['latitude'] = array(
  11. '#type' => 'hidden',
  12. '#default_value' => '48.15509285476016',
  13. );
  14.  
  15. $form['longitude'] = array(
  16. '#type' => 'hidden',
  17. '#default_value' => '17.105712890625',
  18. );
  19.  
  20. $form['gmap']['#value'] = gmap_set_location($map_macro, $form, array('latitude'=>'latitude','longitude'=>'longitude'));

Takže prvý kúsok - mapku na určovanie polohy - máme úspešne za nami. Samozrejme, že elementy zemepisná dĺžka a šírka nemusia byť ako 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:

  1. $location = array();
  2. $location['latitude'] = $form_state['values']['latitude'];
  3. $location['longitude'] = $form_state['values']['longitude'];
  4. $location['inhibit_geocode'] = TRUE;
  5. $lid = location_save($location);

Všimnite si veľmi dôležitý kľúč 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:

  1. $node->locations[0]['lid'] = $lid;
  2. $node->title = check_plain($form_state['values']['title']);
  3. // other stuff
  4.  
  5. node_save($node);

Jednoduché, nie?

Súvisiace články:

Poslať nový komentár

Obsah tohto poľa je súkromný a nebude verejne zobrazený.
  • Webové a e-mailové adresy sú automaticky zmenené na odkazy.
  • Povolené sú HTML značky: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Riadky a odstavce sa zalomia automaticky.
  • Zvýrazňovanie syntaxe zdrojového kódu môžete zapnúť pomocou nasledujúcich značiek: <code>, <blockcode>, <c>, <cpp>, <css>, <drupal5>, <drupal6>, <html4strict>, <java>, <javascript>, <php>, <python>, <ruby>.

Viac informácií o možnostiach formátovania

By submitting this form, you accept the Mollom privacy policy.