Deshabilitar una opción para el campo de formulario de selección

9

¿Cómo desactivo una opción en el campo de formulario de selección?

$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.'),
);

¿Cómo puedo desactivar, por ejemplo, la opción "Solo título"?

Miguel Borges
fuente
Sería genial saber cómo hacerlo, todavía quiero que la opción aparezca en la lista, pero no sea seleccionable ...
DrCord

Respuestas:

6

La única forma de deshabilitar una de las opciones para un campo de formulario "select" es anular la función theme_select () que implementa hook_theme_registry_alter () .

theme_select() ejecuta el siguiente código:

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 función que implemente debería invocar su propia función en lugar de form_select_options () .

Como theme_select()se llama para cada campo de selección utilizado en cualquier formulario de Drupal, preferiría considerar implementar hook_form_alter () para eliminar la opción del campo de formulario que desee.

kiamlaluno
fuente
6

Deshabilitar una opción puede ser difícil de lograr ( Usar form_alter para deshabilitar UNA opción de un campo de selección ), por lo que le recomendaré que busque optgroups como alternativa. La documentación de la API de formulario de Drupal no lo explica, pero la API permite una matriz anidada para las opciones, eche un vistazo a form_select_options () y la <optgroup>parte.
Puedes escribir este código:

$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.'),
);

Eche un vistazo a los formularios de Drupal 6 y las matrices de grupos de opt .

Editar : para aclarar esto es una alternativa y no una respuesta directa.

tostinni
fuente
La pregunta es sobre deshabilitar una de las opciones, no agruparlas.
kiamlaluno
Entendí eso pero pensé que optgroup proporcionaba una buena alternativa.
tostinni
¡brillante! Eso es exactamente lo que estaba buscando, ¡gracias!
Uwe
3

No sé y no he podido encontrar ninguna forma de desactivar una opción individual. Parece que están tratando de introducir algo como esto en Drupal. Tal vez algunas alternativas, ¿podría lo que quieres hacer con css ?:

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

O, si no desea que se muestren los valores, puede desarmarlos

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

Obtuve el mío trabajando con la siguiente línea

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

donde 1 es el índice del elemento que no desea que se muestre.

ArzobispoLolly
fuente
Esto elimina la opción. La pregunta es sobre deshabilitar la opción (dejándola mostrada en gris).
Koen
0

Convierta el único elemento que desea deshabilitar en un vacío <optgroup>.

Pros:

  • Esto se puede hacer en hook_form_altero directamente al crear su formulario personalizado, no es necesario implementar una theme_selectfunción en su tema.

Contras:

  • No hay forma de representar el value='title'atributo asociado con el original <option>en el DOM resultante.
  • YMMV si está intentando deshabilitar una opción que ya pertenece a un grupo opt. Los grupos opcionales anidados podrían funcionar, pero esto no se ha probado ni confirmado.

Implementación:

Los grupos ópticos en Drupal se denotan dentro de la #optionsmatriz como cualquier key => valuepar donde el valor es en sí mismo una matriz.

Entonces, a partir del ejemplo en el OP, moveríamos el valor de para convertirse en el y luego haríamos que el valor sea una matriz vacía.t('Titles only')key

$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.'),
);

El HTML resultante se verá así:

<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>
JamesWilson
fuente
0

Para deshabilitar todo el campo, use

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

Para deshabilitar una opción en el campo de selección, use

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

dónde:

['field_name'] es el nombre de su campo

[1] es el índice de la opción en la lista

Rony Samuel
fuente