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

  • Posted on: 20 October 2011
  • By: petiar

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?

Pridať nový komentár