it-swarm-vi.com

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

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 đề"?

9
Miguel Borges

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 trường được chọn ) vì vậy tôi sẽ khuyên bạn nên xem optgroups như một cách thay thế. Tài liệu Drupal API mẫ không giải thích được 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> 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.'),
);

Hãy xem Drupal 6 biểu mẫu và mảng optgroup .

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

6
tostinni

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 đè theme_select () thực hiện chức năng 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 () .

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, tôi muốn xem xét triển khai hook_form_alter () để xóa tùy chọn khỏi hình thức lĩnh vực bạn muốn.

6
kiamlaluno

Tôi không biết và không thể tìm thấy bất kỳ 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
jordojuice

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ị.

3
ArchbishopLolly

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

Ưu điểm :

  • Điều này có thể được thực hiện trong hook_form_alter Hoặ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 thực hiện chức năng theme_select Trong chủ đề của bạn.

Nhược điểm :

  • Không có cách nào để biểu thị thuộc tính value='title' Được liên kết với <option> Ban đầu 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 tham gia trong Drupal được biểu thị bên trong mảng #options Là bất kỳ cặp key => value 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ị của t('Titles only') để trở thành key và sau đó biến giá trị thành 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
JamesWilson

Để 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ỉ mục của tùy chọn trong danh sách

0
Rony Samuel