ปิดใช้งานตัวเลือกสำหรับเขตข้อมูลฟอร์มที่เลือก


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 เพื่อปิดการใช้งานหนึ่งตัวเลือกของเขตข้อมูลที่เลือก ) ดังนั้นฉันจะแนะนำให้คุณดูoptgroupsเป็นทางเลือก เอกสารAPI ของฟอร์ม Drupal ไม่ได้อธิบาย แต่ 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 รูปแบบและอาร์เรย์

แก้ไข : ชี้แจงนี้เป็นทางเลือกและไม่ใช่คำตอบโดยตรง


คำถามคือเกี่ยวกับการปิดใช้งานหนึ่งในตัวเลือกไม่ใช่จัดกลุ่มพวกเขา
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ฟังก์ชั่นในชุดรูปแบบของคุณ

จุดด้อย:

  • ไม่มีวิธีในการแสดงvalue='title'แอตทริบิวต์ที่เกี่ยวข้องกับต้นฉบับ<option>ใน DOM ที่เป็นผลลัพธ์
  • YMMV หากคุณพยายามปิดใช้งานตัวเลือกที่เกี่ยวข้องกับ optgroup อยู่แล้ว กลุ่ม optg ที่ซ้อนกันอาจใช้งานได้จริง แต่นี่ยังไม่ได้ทดสอบและไม่ยืนยัน

การดำเนินงาน:

Optgroups ใน Drupal จะแทนค่าภายใน#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.