양식 선택 필드에 대한 옵션 비활성화


9

양식 선택 필드에서 옵션을 비활성화하려면 어떻게합니까?

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

예를 들어 "제목 만"옵션을 비활성화하려면 어떻게해야합니까?


이 방법을 아는 것이 좋을 것입니다. 여전히 목록에 옵션이 표시되기를 원하지만 선택할 수는 없습니다 ...
DrCord

답변:


6

에 "선택"양식 필드의 옵션을 해제 한 유일한 방법은 무시하는 것입니다 theme_select () 함수를 구현 hook_theme_registry_alter를 () .

theme_select() 다음 코드를 실행합니다.

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>';
}

구현하는 함수는 form_select_options () 대신 자신의 함수를 호출해야합니다 .

theme_select()Drupal 양식에 사용 된 각 선택 필드에 대해 요구되는 것처럼 , 원하는 양식 필드에서 옵션을 제거하기 위해 hook_form_alter () 를 구현하는 것이 좋습니다.


6

옵션을 비활성화하는 것은 까다로울 수 있습니다 ( form_alter를 사용하여 선택 필드의 하나의 옵션을 비활성화 ) optgroup 을 대안으로 보는 것이 좋습니다 . Drupal 양식 API 설명서에서는 설명하지 않지만 API는 옵션에 대해 중첩 배열을 허용 합니다 . form_select_options ()<optgroup>부분을 살펴보십시오 .
이 코드를 작성할 수 있습니다 :

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

Drupal 6 양식 및 optgroup 배열을 살펴보십시오 .

편집 : 이것은 명확하고 직접적인 대답이 아닌 대안임을 분명히합니다.


문제는 옵션 중 하나를 그룹화하지 않고 비활성화하는 것입니다.
kiamlaluno

나는 optgroup이 좋은 대안을 제공한다고 생각했다.
tostinni

훌륭한! 바로 내가 찾던 것입니다, 감사합니다 !!!
uwe

3

개별 옵션 을 사용 중지 할 수있는 방법을 찾지 못했습니다 . 그들이 Drupal에 이와 같은 것을 얻으려고하는 것처럼 보입니다. 어쩌면 CSS로 할 수있는 대안이 있습니까? :

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

또는 값을 전혀 표시하지 않으려면 설정을 해제 할 수 있습니다

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

3

나는 다음 줄을 가지고 일했다.

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

여기서 1은 표시하지 않으려는 항목의 색인입니다.


옵션이 제거됩니다. 문제는 옵션을 비활성화하는 것입니다 (회색으로 표시된 상태로 두는 것).
Koen

0

사용하지 않으려는 단일 항목을 빈 항목으로 변환하십시오 <optgroup>.

장점 :

  • 이것은 hook_form_alter사용자 정의 양식을 작성할 때 또는 직접 수행 할 수 있으며 theme_select테마에서 기능 을 구현할 필요가 없습니다 .

단점 :

  • 결과 DOM에서 value='title'원본과 관련된 속성 을 나타내는 방법은 없습니다 <option>.
  • 이미 optgroup과 관련된 옵션을 비활성화하려는 경우 YMMV. 중첩 된 옵트 그룹은 실제로 작동하지만 테스트되지 않았으며 확인되지 않았습니다.

이행:

Drupal의 Optgroup 은 값 자체가 배열 인 쌍으로 #options배열 내부에 표시 key => value됩니다.

우리는 것 OP의 예에서 그래서 값 이동 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.'),
);

결과 HTML은 다음과 같습니다.

<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

전체 필드를 비활성화하려면

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

선택 필드에서 옵션을 비활성화하려면

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

어디:

[ 'field_name'] 은 (는) 귀하의 필드 이름입니다

[1] 은 목록에있는 옵션의 색인입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.