Select dinamiche ajax Comuni-province-regioni

16 contenuti / 0 new
Ultimo contenuto
Select dinamiche ajax Comuni-province-regioni

Buon giorno,

Sto facendo un sito di annunci ed nella form con la quale l'utente inserisce gli annunci,ho la necessità di inserire tre select dinamiche dipendenti(POPOLATE VIA DB) con cui l'utente sceglie la regione, la provincia e il comune.
So che è un argomento già trattato ma, per mia inesperienza , nonostante abbia già letto vari post nel forum e in rete non sono riuscito a venirne a capo.

Allora, per riepilogare i dati DELLE TRE select sono reperiti da 3 distinte tabelle che ho importato nel DB cosi strutturate:

tab_regione : ( 20 record)
id_regione
regione

tab_province (circa 107 record)
id_regione
id_province
provincia

tab_comuni (circa 8700 record)
id_provincia
comune

Nel contenuto "ANNUNCIO" ho inserito tre campi/select citta, regione e provincia che dovrebbero popolarsi automaticamente. L'utente , quando inserisce l'annuncio, sceglie la regione, si popola la select province e scelta la provincia si popola la select comune.

Da quanto ho capito dovrei creare un modulo dove inserire il codice del tipo form alter per popolare le tre select e per la connessione al DB e ma in pratica non ho capito come farlo.

Ho già provato varie soluzioni tipo hierarchical select/ autocomplete delux ed altri ma sarà anche per la mole di dati non vanno bene

Potete aiutarmi con qualche esempio pratico??

Grazie per l'aiuto

Drupal Version:

Ciao,
se vuoi scrivere un tuo modulo dovresti creare dei nuovi tipi di field (con Field API) da utilizzare poi all'interno dei contenuti. Ti dovresti leggere un po' di cose inerenti sia a Field API che a Entity API. Il lavoro, di per sé, è fattibile, ma se sei alle prime armi sarà lunghetto. Ti consiglio di dare un occhio al "modulo" Examples for Developers (https://www.drupal.org/project/examples) in cui puoi travare esempi pratici sull'utilizzo delle API di Drupal... oltre ovviamente a api.drupal.org.
;)

Ciao,

sto guardando l'esempio ma ho delle difficoltà in quanto non prende i dati dal dbase e quindi mancano tutti i riferimenti per popolare le tabelle tramite db.

Grazie per la tua risposta

Ho trovato questo esempio http://w3shaman.com/article/creating-ajax-dropdown-drupal-7
ho scaricato l'allegato e funziona perfettamente.
Il problema è che crea una form con le due select alla pagina / sandbox/ajax/dropdown mentre io le due select dovrei posizionarle nella form inserimento nodo.

Potete aiutarmi ??

Meggis (non verificato)
Ritratto di Anonimo

Ciao, se vuoi fare un modulo custom con codice e capirne la logica (si tratta di form asincrono ahah temizzato) ti posso dare un vecchio codice che feci per drupal 6.

Funziona proprio cosi (ma solo per italia e svizzera):
""L'utente , quando inserisce l'annuncio, sceglie la regione, si popola la select province e scelta la provincia si popola la select comune""

Codice:
companyprofile . netsons.org / sites / default / files / aziende . module . rename

Demo:
companyprofile . netsons . org / aziende / register

Ps: occhio agli spazi :)
In alternativa mi metterò a fare presto un modulo cck (non opensource) perchè è richiestissimo!! :)

Ciao,
Ho visto la demo e sarebbe quello che mi serve , il problema è che non so inserire le due select nella mia form per l'inserimento annuncio.

Come dicevo nella precedente risposta ho trovato anche questo esempio http://w3shaman.com/article/creating-ajax-dropdown-drupal-7
ho scaricato l'allegato e installato il modulo demo , interfacciandolo con le mie tabelle tab_comuni e tab_province e funziona perfettamente.
Il problema è che questo modulo crea una form con le due select alla pagina / sandbox/ajax/dropdown mentre io le due select dovrei posizionarle nella form inserimento annuncio.
E' quello che ora sto cercando di capire, penso che dovrei modificare questo modulo usando un gancio hook_form_alter per poter popolare le due select della form annunci ,ma non riesco.

non so se potresti darmi qualche consiglio.

Grazie per la risposta

Ciao,
non devi modificare il form di inserimento dei contenuti con hook_form_alter. hook_form_alter lo utilizzi quando vuoi alterare funzionalità o processi minimi. Nel tuo caso devi per forza di cose creare dui nuovi field con Field API per poi poterli usare all'interno dei tipi di contenuto (proprio come se creassi un nuovo tipo di campo). Se hai già la logica del form e di AJAX non dovresti avere grossi problemi. Vedi ad esempio questo piccolo articolo http://clikfocus.com/blog/how-set-custom-field-type-using-drupal-7-field... in cui ti spiega come poter creare un nuovo field (se cerchi su Google ne usciranno molti altri) ;)

Ciao,

Probabilmente faccio un po' di confusione, pensavo di dover usare hook_form_alter in quanto i tre campi nel contenuto annunci li ho già creati, sono 3 campi "Riferimento termine" / "Elenco di selezione" Regione-Provincia e Citta e quindi io dovrei solo popolarli con i dati che prendo dal database.
L'esempio http://w3shaman.com/article/creating-ajax-dropdown-drupal-7 funziona, Il problema è che questo modulo crea una form con le due select alla pagina / sandbox/ajax/dropdown mentre io dovrei modificarlo per popolare i 3 campi già esistenti.
Ora guardo l'esempio che mi hai inviato.

Grazie

Ah, ok,
allora è un'altro discorso! :)
Da come l'avevi messa, sembrava che dovevi creare tutta la struttura da 0, campi compresi. Se hai già tutta la logica, allora hook_form_alter (o meglio acnora hook_form_FORM_ID_alter) ti danno sicuramente una mano e puoi agire unicamente con questi hook. Vediti il modulo example che dovresti trovare il codice per alterare un form.

Ciao, Sono due giorni che provo ma non riesco a trovare una soluzione, come dicevo ho trovato l'esempio alla pagina http://w3shaman.com/article/creating-ajax-dropdown-drupal-7, l'ho scaricato e funziona. Crea due select dipendenti che si popolano con dati del DB , la prima select è la provincia, selezionata la provincia si popola la select citta con le citta prese dal db.
Il problema è che questo modulo crea una nuova form con le due select alla pagina / sandbox/ajax/dropdown mentre io dovrei modificarlo per popolare 2 campi select già esistenti (provincie e citta) nel contenuto annunci nella form inserimento con id "annunci-node-form.
Il modulo è composto da due pagine:
dropdown.inc
sandbox.module

Invio di seguito il codice nella speranza che qualcuno possa darmi una mano.

codice sandbox.module
<?php
/**
* Function for generating form
*/
function sandbox_ajax_dropdown($form, &$form_state) {
// Province dropdown list
$form['sandbox_ajax_dropdown']['province'] = array(
'#title' => t('Province'),
'#type' => 'select',
'#options' => _load_province(),
'#ajax' => array(
'event'=>'change',
'callback' =>'sandbox_ajax_dropdown_city',
'wrapper' => 'city-wrapper',
),
);

// Wrapper for city dropdown list
$form['sandbox_ajax_dropdown']['wrapper'] = array(
'#prefix' => '',
'#suffix' => '',
);

// Options for city dropdown list
$options = array('- Select city -');
if (isset($form_state['values']['province'])) {
// Pre-populate options for city dropdown list if province id is set
$options = _load_city($form_state['values']['province']);
}

// Province dropdown list
$form['sandbox_ajax_dropdown']['wrapper']['city'] = array(
'#title' => t('City'),
'#type' => 'select',
'#options' => $options,
);

// Form submit button
$form["sandbox_ajax_dropdown"]["submit"] = array(
"#value" => t("Submit"),
"#type" => "submit",
"#submit" => array("sandbox_ajax_dropdown_submit"),
);

return $form;
}

/**
* Function for handling form submission
*/
function sandbox_ajax_dropdown_submit($form, &$form_state) {
$replacement = array(
'@province_id' => $form_state['values']['province'],
'@city_id' => $form_state['values']['city'],
);

drupal_set_message(t('Submitted data: Province ID = @province_id, City ID = @city_id.', $replacement));
}

/**
* Function for handling ajax request
*/
function sandbox_ajax_dropdown_city($form, $form_state) {
// Return the dropdown list including the wrapper
return $form['sandbox_ajax_dropdown']['wrapper'];
}

/**
* Function for populating province
*/
function _load_province() {
$province = array('- Select province -');

// Select table
$query = db_select("province", "a");
// Selected fields
$query->fields("a", array('codice_provincia', 'provincia'));
// Filter the active ones only
//$query->condition("a.status", 1);
// Order by name
$query->orderBy("a.provincia");
// Execute query
$result = $query->execute();
while($row = $result->fetchObject()){
// Key-value pair for dropdown options
$province[$row->codice_provincia] = $row->provincia;
}

return $province;
}

/**
* Function for populating city
*/
function _load_city($cod_prov) {
$city = array('- Select city -');

// Select table
$query = db_select("comuni", "a");
// Selected fields
$query->fields("a", array('num', 'comune'));
// Filter the active ones only
//$query->condition("a.status", 1);
// Filter based province id
$query->condition("a.cod_prov", $cod_prov);
// Order by name
$query->orderBy("a.comune");
// Execute query
$result = $query->execute();

while($row = $result->fetchObject()){
// Key-value pair for dropdown options
$city[$row->num] = $row->comune;
}

return $city;
}

Codice sandbox.module
<?php
/**
* Implementation of hook_menu()
*/
function sandbox_menu() {
$items = array();

// Ajax dropdown demo
$items["sandbox/ajax/dropdown"] = array(
"title" => "Ajax Dropdown",
"type" => MENU_CALLBACK,
"access arguments" => array("access content"),
"page callback" => "drupal_get_form",
"page arguments" => array("sandbox_ajax_dropdown"),
"file" => "includes/dropdown.inc",
);

return $items;
}

Meggis (non verificato)
Ritratto di Anonimo

@tastiera ha scritto:

Da quanto ho capito dovrei creare un modulo dove inserire il codice del tipo form alter per popolare le tre select e per la connessione al DB e ma in pratica non ho capito come farlo....Sono due giorni che provo ma non riesco a trovare una soluzione ...

https://www.drupal.org/project/addressfield

:)

Grazie

Ho provato addressfield ma non va bene per quelle che devo fare, con quel modulo puoi selezionare la provincia ma indicare la citta errata o di altra provincia, come detto avrei necessita tramite select di proporre all'utente le citta in base alla provincia che ha selezionato.

Ciao

Meggis (non verificato)
Ritratto di Anonimo

Ciao, si ho letto tutto per questo ho citato:

@tastiera ha scritto
Sono due giorni che provo ma non riesco a trovare una soluzione .

Come soluzione: io ti ho indicato addressfield perchè potresti partire da questo modulo per personalizzarlo come vuoi. Ad esempio i brasiliani - con br_address-7.x (che dipende da addressfield) - sono stati molto bravi hanno un autocompletamento della città con possibilità di scaricare le città brasiliane dal server.

Quello che farei io partire dalla logica di br_address e creerei it_address!!
Vedi tu

Non ci arrivo ancora....
Faccio seguito ai precedenti post, dopo diversi tentativi sono a riuscito a visualizzare tramite modulo personalizzato customcountries.module, nella form annunci_node_form del contenuto Annunci le due select provincia e citta.
Le select richiamano i dati dal db e si popolano correttamente la prima con le province e la seconda in base alla provincia scelta, con le relative citta, il problema e che salvando il nodo Annunci, i valori delle due select non vengono salvati e viene visualizzato il seguente errore.

Notice: Undefined index: #language in locale_field_entity_form_submit() (linea 438 di /web/htdocs/www.........com/home/nuovo/modules/locale/locale.module).

Per riassumere ho creato il contenuto Annunci e tra gli altri, due campi select riferimento termine filed_provincia e field_city basati sul vocabolario citta, l'utente deve indicare la provincia e la citta, l'intento è quello tramite la funzione form_alter di popolare questi due campi con due select dipendenti e memorizzare i valori scelti dall'utente ma non funziona, il nodo viene salvato tranne le due select .

Passo di seguito il codice che utilizzo nella pagina del module customcountries.module nella speranza che qualcuno posso indicarmi come risolvere e magari indicarmi se ci sono errori in quanto sono andato un po a spanne prendendo spunto da vari esempi.

<?php
function customcountries_form_alter(&$form, &$form_state, $form_id) {
if ($form['#form_id'] == 'annunci_node_form') {

$form['field_provincia'] = array(
'#title' => t('Seleziona Provincia'),
'#type' => 'select',
'#options' => _load_province(),
'#ajax' => array(
'event'=>'change',
'callback' =>'customcountries_city',
'wrapper' => 'city-wrapper',
),
);

// Options for city dropdown list
$options = array('- Seleziona la città -');
if (isset($form_state['values']['field_provincia'])) {
// Pre-populate options for city dropdown list if province id is set
$options = _load_city($form_state['values']['field_provincia']);
}

$form['field_city'] = array(
'#type' => 'select',
'#title' => t('Seleziona Città'),
'#prefix' => '',
'#suffix' => '',
'#options' => $options,
);

}
}

/**
* Function for handling ajax request
*/
function customcountries_city($form, $form_state) {
// Return the dropdown list including the wrapper
return $form['field_city'];
}

/**
* Function for populating province
*/
function _load_province() {
$province = array('- Seleziona una provincia -');

// Select table
$query = db_select("province", "a");
// Selected fields
$query->fields("a", array('codice_provincia', 'provincia'));
// Filter the active ones only
//$query->condition("a.status", 1);
// Order by name
$query->orderBy("a.provincia");
// Execute query
$result = $query->execute();
while($row = $result->fetchObject()){
// Key-value pair for dropdown options
$province[$row->codice_provincia] = $row->provincia;
}

return $province;
}

/**
* Function for populating city
*/
function _load_city($cod_prov) {
$city = array('- Seleziona la citta -');

// Select table
$query = db_select("comuni", "a");
// Selected fields
$query->fields("a", array('num', 'comune'));
// Filter the active ones only
//$query->condition("a.status", 1);
// Filter based province id
$query->condition("a.cod_prov", $cod_prov);
// Order by name
$query->orderBy("a.comune");
// Execute query
$result = $query->execute();

while($row = $result->fetchObject()){
// Key-value pair for dropdown options
$city[$row->num] = $row->comune;
}

return $city;
}

Meggis (non verificato)
Ritratto di Anonimo

Crei il codice come vuoi - non funzionante - poi vuoi che qualcuno lo risolva...
Beato te se trovi il risolutore!

Ciao,

In realtà il codice funziona, questo modulo crea 2 select dipendenti basate su 2 tabelle DB province e comuni che è possibile inserire nelle forms di Drupal. l'unico problema che non sono riuscito a risolvere al momento, è memorizzare i dati selezionati dall'utente nel contenuto.

Grazie
Saluti