Disabilita un'opzione per il campo di selezione modulo


9

Come disabilitare un'opzione nel campo di selezione modulo?

$form['feed'] = array(
  '#type' => 'select', 
  '#title' => t('Display of XML feed items'), 
  '#options' => array(
    'title' => t('Titles only'), 
    'teaser' => t('Titles plus teaser'), 
    'fulltext' => t('Full text'),
  ),
  '#description' => t('Global setting for the length of XML feed items that are output by default.'),
);

Come posso disabilitare, ad esempio, l'opzione "Solo titolo"?


Sarebbe bello sapere come fare, voglio ancora l'opzione di apparire nella lista, ma non essere selezionabile ...
DrCord

Risposte:


6

L'unico modo per disabilitare una delle opzioni per un campo modulo "seleziona" è quello di sovrascrivere la funzione theme_select () implementando hook_theme_registry_alter () .

theme_select() esegue il seguente codice:

function theme_select($variables) {
  $element = $variables['element'];
  element_set_attributes($element, array('id', 'name', 'size'));
  _form_set_class($element, array('form-select'));

  return '<select' . drupal_attributes($element['#attributes']) . '>' . form_select_options($element) . '</select>';
}

La funzione implementata dovrebbe invocare la propria funzione anziché form_select_options () .

Come theme_select()viene chiamato per ogni campo selezionato utilizzato in qualsiasi modulo Drupal, preferirei prendere in considerazione l'implementazione di hook_form_alter () per rimuovere l'opzione dal campo modulo desiderato.


6

Disabilitare un'opzione può essere difficile da ottenere ( Usare form_alter per disabilitare UNA opzione di un campo selezionato ) quindi ti consiglio di guardare optgroup come alternativa. La documentazione dell'API del modulo Drupal non lo spiega, ma l'API consente l'array nidificato per le opzioni, dai un'occhiata a form_select_options () e alla <optgroup>parte.
Puoi scrivere questo codice:

$form['feed'] = array(
    '#type' => 'select', 
    '#title' => t('Display of XML feed items'), 
    '#options' => array(
        'Titles only' => array(, 
          'teaser' => t('Titles plus teaser'), 
          'fulltext' => t('Full text'),
        ),
        'Titles only 2' => array(, 
          'teaser2' => t('Titles plus teaser 2'), 
          'fulltext2' => t('Full text 2'),
        ),
    ),
    '#description' => t('Global setting for the length of XML feed items that are output by default.'),
);

Dai un'occhiata ai moduli Drupal 6 e agli array di optgroup .

Modifica : per chiarire questa è un'alternativa e non una risposta diretta.


La domanda riguarda la disabilitazione di una delle opzioni, non il raggruppamento.
kiamlaluno

L'ho capito, ma ho pensato che optgroup rappresentasse una buona alternativa.
tostinni,

brillante! Questo è esattamente quello che stavo cercando, grazie !!!
Uwe

3

Non lo so e non sono stato in grado di trovare alcun modo per disabilitare una singola opzione. Sembra che stiano cercando di ottenere qualcosa del genere in Drupal. Forse alcune alternative, cosa potresti fare con css ?:

$form['feed']['#attributes'] = array('class' => array('options-styles-class'));

Oppure, se non si desidera visualizzare i valori, è possibile annullarli

unset($form['feed']['#options']['title']);

3

Ho ottenuto il mio lavorare con la seguente riga

unset($form['field_name']['und']['#options'][1]);

dove 1 è l'indice dell'elemento che non si desidera visualizzare.


Questo rimuove l'opzione. La domanda riguarda la disabilitazione dell'opzione (lasciandola visualizzata in grigio).
Koen,

0

Converti un singolo elemento che desideri disabilitare in uno vuoto <optgroup>.

Professionisti:

  • Questo può essere fatto in hook_form_altero direttamente durante la creazione del modulo personalizzato, non è necessario implementare una theme_selectfunzione nel tema.

Contro:

  • Non è possibile rappresentare l' value='title'attributo associato all'originale <option>nel DOM risultante.
  • YMMV se stai provando a disabilitare un'opzione che già appartiene a un optgroup. Gli optgroup nidificati potrebbero effettivamente funzionare, ma questo non è testato e non confermato.

Implementazione:

Gli optgroup in Drupal sono indicati all'interno #optionsdell'array come qualsiasi key => valuecoppia in cui il valore è esso stesso un array.

Quindi, dall'esempio nell'OP, spostiamo il valore di t('Titles only')per diventare il keye quindi renderemo il valore un array vuoto.

$form['feed'] = array(
  '#type' => 'select', 
  '#title' => t('Display of XML feed items'), 
  '#options' => array(
    t('Titles only') => array(), // This one becomes disabled as an empty optgroup
    'teaser' => t('Titles plus teaser'), 
    'fulltext' => t('Full text'),
  ),
  '#description' => t('Global setting for the length of XML feed items that are output by default.'),
);

Il codice HTML risultante sarà simile al seguente:

<form>
  <div>
    <label>Display of XML feed items</label>
    <select>
      <optgroup>Titles only</optgroup>
      <option value="teaser">Titles plus teaser</option>
      <option value="fulltext">Full text</option>
    </select>
  </div>
</form>

0

Per disabilitare l'intero campo, utilizzare

$form['field_name']['#disabled']= TRUE;

Per disabilitare un'opzione nel campo di selezione, utilizzare

unset($form['field_name']['und']['#options'][1]);

dove:

['field_name'] è il nome del tuo campo

[1] è l'indice dell'opzione nell'elenco

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.