Desativar uma opção para o campo de formulário selecionado

9

Como desabilito uma opção no campo de formulário selecionado?

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

Como posso desativar, por exemplo, a opção "Somente título"?

Miguel Borges
fonte
Isso seria ótimo saber como fazer, eu ainda quero a opção de aparecer na lista, mas não ser seleccionáveis ...
DrCord

Respostas:

6

A única maneira de desativar uma das opções para um "select" campo de formulário é para substituir o theme_select () função de execução hook_theme_registry_alter () .

theme_select() executa o seguinte 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>';
}

A função que você implementa deve chamar sua própria função em vez de form_select_options () .

Como theme_select()é chamado para cada campo de seleção usado em qualquer formulário Drupal, prefiro implementar hook_form_alter () para remover a opção do campo de formulário que você deseja.

kiamlaluno
fonte
6

Desabilitar uma opção pode ser complicado ( usando form_alter para desativar UMA opção de um campo de seleção ), portanto, recomendamos que você analise os optgroups como uma alternativa. A documentação da API do formulário Drupal não explica, mas a API permite uma matriz aninhada para as opções, consulte form_select_options () e a <optgroup>parte.
Você pode escrever 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.'),
);

Veja os formulários do Drupal 6 e as matrizes do grupo de opções .

Editar : esclarecer que esta é uma alternativa e não uma resposta direta.

tostinni
fonte
A questão é desativar uma das opções, não agrupá-las.
kiamlaluno
Entendi isso, mas achei que o optgroup era uma boa alternativa.
tostinni
brilhante! Era exatamente isso que eu procurava, obrigado !!!
Uwe
3

Não sei e não consegui encontrar nenhuma maneira de desativar uma opção individual. Parece que eles estão tentando colocar algo assim no Drupal. Talvez algumas alternativas, o que você quer fazer com css ?:

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

Ou, se você não deseja que os valores sejam mostrados, você pode desmarcá-los

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

Eu tenho o meu trabalhando com a seguinte linha

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

onde 1 é o índice do item que você não deseja que seja exibido.

ArcebispoLolly
fonte
Isso remove a opção. A questão é desativar a opção (deixando-a exibida em cinza).
Koen
0

Converta o único item que você deseja desativar em vazio <optgroup>.

Prós:

  • Isso pode ser feito de forma hook_form_alterdireta ou ao criar seu formulário personalizado, não há necessidade de implementar uma theme_selectfunção no seu tema.

Contras:

  • Não há como representar o value='title'atributo associado ao original <option>no DOM resultante.
  • YMMV se você estiver tentando desativar uma opção que já pertence a um grupo de opções. Os grupos de opções aninhados podem realmente funcionar, mas isso não foi testado e não foi confirmado.

Implementação:

Os grupos de opções no Drupal são indicados dentro da #optionsmatriz como quaisquer key => valuepares em que o próprio valor é uma matriz.

Portanto, a partir do exemplo no OP, moveríamos o valor de t('Titles only')para se tornar o keye, em seguida, tornar o valor uma matriz vazia.

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

O HTML resultante será mais ou menos assim:

<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
fonte
0

Para desativar todo o campo, use

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

Para desativar uma opção no campo de seleção, use

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

Onde:

['field_name'] é o nome do seu campo

[1] é o índice da opção na lista

Rony Samuel
fonte