Vô hiệu hóa một tùy chọn cho trường mẫu chọn


9

Làm cách nào để tắt tùy chọn trong trường chọn biểu mẫu?

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

Làm thế nào tôi có thể vô hiệu hóa, ví dụ, tùy chọn "Chỉ tiêu đề"?


Điều này sẽ rất tuyệt để biết cách làm, tôi vẫn muốn tùy chọn xuất hiện trong danh sách, nhưng không thể chọn được ...
DrCord

Câu trả lời:


6

Cách duy nhất để vô hiệu hóa một trong các tùy chọn cho trường biểu mẫu "chọn" là ghi đè hàm theme_select () thực hiện hook_theme_registry_alter () .

theme_select() thực thi đoạn mã sau:

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

Hàm mà bạn triển khai sẽ gọi hàm của riêng bạn thay vì form_select_options () .

Như theme_select()được gọi cho mỗi trường chọn được sử dụng trong bất kỳ biểu mẫu Drupal nào, tôi muốn xem xét việc triển khai hook_form_alter () để xóa tùy chọn khỏi trường biểu mẫu bạn muốn.


6

Việc vô hiệu hóa một tùy chọn có thể khó đạt được ( Sử dụng form_alter để vô hiệu hóa tùy chọn ONE của một trường được chọn ) vì vậy tôi khuyên bạn nên xem các nhóm opt thay thế. Tài liệu API biểu mẫu Drupal không giải thích điều đó nhưng API cho phép mảng lồng nhau cho các tùy chọn, hãy xem form_select_options ()<optgroup>một phần.
Bạn có thể viết mã này:

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

Có một cái nhìn về Drupal 6 hình thức và mảng optgroup .

Chỉnh sửa : để làm rõ đây là một thay thế và không phải là một câu trả lời trực tiếp.


Câu hỏi là về việc vô hiệu hóa một trong các tùy chọn, không nhóm chúng.
kiamlaluno

Tôi hiểu điều đó nhưng tôi nghĩ optgroup cung cấp một sự thay thế tốt.
tostinni

xuất sắc! Đó chính xác là những gì tôi đang tìm kiếm, cảm ơn bạn !!!
uwe

3

Tôi không biết và không thể tìm ra cách nào để vô hiệu hóa một tùy chọn riêng lẻ. Có vẻ như họ đang cố gắng đưa thứ gì đó như thế này vào Drupal. Có lẽ một số lựa chọn thay thế, có thể những gì bạn muốn được thực hiện với css?:

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

Hoặc, nếu bạn không muốn các giá trị được hiển thị, bạn có thể bỏ đặt chúng

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

3

Tôi có của tôi làm việc với dòng sau

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

Trong đó 1 là chỉ mục của mục mà bạn không muốn hiển thị.


Điều này loại bỏ các tùy chọn. Câu hỏi là về việc vô hiệu hóa tùy chọn (để nó hiển thị màu xám).
Koen

0

Chuyển đổi một mục duy nhất bạn muốn vô hiệu hóa thành một mục trống <optgroup>.

Ưu điểm:

  • Điều này có thể được thực hiện trong một hook_form_alterhoặc trực tiếp khi xây dựng biểu mẫu tùy chỉnh của bạn, không cần phải thực hiện một theme_selectchức năng trong chủ đề của bạn.

Nhược điểm:

  • Không có cách nào để biểu diễn value='title'thuộc tính được liên kết với bản gốc <option>trong DOM kết quả.
  • YMMV nếu bạn đang cố gắng vô hiệu hóa một tùy chọn đã liên quan đến một nhóm chọn. Các nhóm opted lồng nhau thực sự có thể hoạt động, nhưng điều này chưa được kiểm tra và chưa được xác nhận.

Thực hiện:

Các nhóm quang trong Drupal được ký hiệu bên trong #optionsmảng là bất kỳ key => valuecặp nào trong đó giá trị tự nó là một mảng.

Vì vậy, từ ví dụ trong OP, chúng ta sẽ di chuyển giá trị t('Titles only')để trở thành keyvà sau đó làm cho giá trị là một mảng trống.

$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 kết quả sẽ trông giống như thế này:

<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

Để vô hiệu hóa toàn bộ trường, sử dụng

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

Để vô hiệu hóa một tùy chọn trong trường chọn, hãy sử dụng

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

Ở đâu:

['field_name'] là tên của trường của bạn

[1] là chỉ số của tùy chọn trong danh sách

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.