Ako pridať a spracovať Location CCK pole pre Drupal Form API?

Pridal/a petiar dňa Št, 20. 10. 2011 - 02:52

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'));

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:

$location = array(); 
$location['latitude'] = $form_state['values']['latitude']; 
$location['longitude'] = $form_state['values']['longitude']; 
$location['inhibit_geocode'] = TRUE; 
$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:

$node->locations[0]['lid'] = $lid;
$node->title = check_plain($form_state['values']['title']); // other stuff 
node_save($node);

Jednoduché, nie?

Značky
Sekcia