it-swarm.it

Elenco di selezione dinamica nel modulo (elenco a discesa dipendente)

Sto usando Drupal sette. Voglio fare in modo che le opzioni in un elenco di selezione dipendono dal valore scelto in un altro elenco di selezione in un modulo. Sono sicuro che questo è stato chiesto molte volte prima, ma ho difficoltà a trovare una risposta chiara su come farlo.

Il modulo consente agli utenti di inserire una cronologia di lavoro. Devono selezionare uno squadrone che è un riferimento nodo al tipo di campo squadrone, e questo è in un elenco a discesa. Tuttavia, lo squadrone dipende da un elenco a discesa della città. Gli utenti devono prima selezionare una città che quindi filtrerà le opzioni per lo squadrone. Nel tipo di contenuto dello squadrone, ho creato una tassonomia per la città che viene taggata dallo squadrone.

Sarei molto grato per qualsiasi suggerimento sul modo migliore (più semplice?) Di fare questo, o per qualsiasi risorsa utile online che possa aiutare.

29
Ben

È possibile utilizzare Ajax per ottenere questo risultato. Drupal 7 ha un buon supporto Ajax ora. Nel tuo primo elenco di selezione (città) dovrai aggiungere le informazioni Ajax. Quindi, il secondo elenco di selezione può essere popolato in base alle informazioni nel primo Puoi anche nascondere il secondo elenco di selezione fino a quando non viene selezionata un'opzione nella prima e ti spiegherò come farlo in un attimo. Innanzitutto, per impostare il modulo di base:

$form['city'] = array(
  '#type' => 'select',
  '#title' => t('City'),
  '#options' => $options,
  '#ajax' => array(
    'event' => 'change',
    'wrapper' => 'squadron-wrapper',
    'callback' => 'mymodule_ajax_callback',
    'method' => 'replace',
  ),
);
$form['squadron_wrapper'] = array('#prefix' => '<div class="squadron-wrapper">', '#suffix' => '</div>');
$form['squadron_wrapper']['squadron'] = array(
  '#type' => 'select',
  '#title' => t('Squadron'),
  '#options' => $squadron_options,
);

Questa è solo la configurazione di base degli elementi. Ora avrai bisogno di un modo per determinare quali opzioni dovrebbero andare nello squadrone. Per prima cosa devi fare in modo che il tuo callback Ajax sia identificato nell'elenco di selezione 'city'. Nella maggior parte dei casi puoi semplicemente restituire l'elemento che avvolge l'elemento ajax, in questo caso $ form.

function mymodule_ajax_callback($form, $form_state) {
  return $form;
}

Ora, quando l'elenco di selezione 'città' cambia, ricostruirà la parte del modulo di avvolgimento di squadroni. Il valore di "città" sarà ora in $ form_state ["valori"]. Quindi, quando il modulo viene ricostruito, dobbiamo determinare quali opzioni dare alla lista selezionata in base al valore di "città".

// Get the value of the 'city' field.
$city = isset($form_state['values']['city']) ? $form_state['values']['city'] : 'default';
switch ($city) {
  case 'default':
    // Set default options.
    break;
  case 'losangeles':
    // Set up $squadron_options for los angeles.
    break;
}

// If you want to hide the squadron select list until a city is
// selected then you can do another conditional.
if ($city !== 'default') {
  $form['squadron_wrapper']['squadron'] = array(
    '#type' => 'select',
    '#title' => t('Squadron'),
    '#options' => $squadron_options,
  );
}
27
jordojuice

Mille grazie a jordojuice sopra. Con il suo aiuto sono riuscito a trovare una soluzione. Ho anche fatto riferimento all'esempio in http://public-action.org/content/drupal-7-form-api-dependent-lists-and-ajax-form-submission . Alla fine ho usato il codice seguente che ha funzionato in un modulo personalizzato. Per qualche motivo non sono riuscito a trovare nessuno dei miei valori nei valori $ form_state, ma sono riuscito a trovarli in $ form. Alla fine, quando ho provato, ho ricevuto un messaggio di errore che Drupal aveva rilevato una scelta illegale nel menu a discesa. Ho aggirato questo commento commentando la riga 1290 in form.inc:

form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));

Il codice finale che ho usato era:

<?php

function sappers_squadron_form_work_history_node_form_alter(&$form, &$form_state) {     
        //echo '<pre>';
        //print_r ($form);
        //echo '</pre>';

        $squadron_options = array();

        if(isset($form['field_wkhist_city']['und']['#default_value'][0])) {
            $city = $form['field_wkhist_city']['und']['#default_value'][0];
        }
        else {
            $city = 0;
        }

        $squadron_options = sappers_squadron_squadrons($city);

        $form['field_wkhist_city']['und']['#ajax'] = array(
            'event' => 'change',
            'wrapper' => 'squadron-wrapper',
            'callback' => 'sappers_squadron_ajax_callback',
            'method' => 'replace',
        );

        $form['field_squadron']['und']['#prefix'] = '<div id="squadron-wrapper">';
        $form['field_squadron']['und']['#suffix'] = '</div>';
        $form['field_squadron']['und']['#options'] = $squadron_options;
}


function sappers_squadron_ajax_callback($form, $form_state) {   
    $city = $form['field_wkhist_city']['und']['#value'];

    $form['field_squadron']['und']['#options'] = sappers_squadron_squadrons($city);

    return $form['field_squadron'];
}


function sappers_squadron_squadrons($city) {
    $nodes = array();

    $select = db_query("SELECT node.title AS node_title, node.nid AS nid FROM  {node} node INNER JOIN {taxonomy_index} taxonomy_index ON node.nid = taxonomy_index.nid WHERE (( (node.status = '1') AND (node.type IN  ('squadron')) AND (taxonomy_index.tid = $city) )) ORDER BY node_title ASC");

    $nodes[]="";

    foreach ($select as $node) {
            $nodes[$node->nid] = $node->node_title;
    }

    return $nodes;
}

?>
11
Ben

inserisci la riga di codice, ad es
$nodes[''] = '- None -'; Dopo

 $nodes = array();

in ur sappers_squadron_squadrons function e questo risolverà il tuo errore

form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));

2
Hacker

La causa principale di "È stata rilevata una scelta illegale. Contatta l'amministratore del sito." è che la stringa vuota con il valore di 0 aggiunto da $nodes[]=""; non è valido per il campo field_squadron.

Vedi Advance PHP Programming and Development , ma tieni presente che DANGEROUS_SKIP_CHECK e flag validati sono deprecati in D7 .

Dopo aver rimosso quella riga, l'errore era sparito.

1
Siripong

Utilizzare il modulo Limite opzione campo di riferimento

Questo modulo consente ai campi di riferimento di diversi tipi di avere le opzioni disponibili dei loro widget limitate dai valori di altri campi nell'entità corrente.

0
Rakesh Nimje