วิธีสร้างเขตข้อมูลแบบอ่านอย่างเดียวโดยใช้ hook_form_alter


12

ฉันกำลังพยายามทำให้ฟิลด์ของฟอร์มโปรไฟล์ Drupal เป็นแบบอ่านอย่างเดียวในโหมดแก้ไข ฉันใช้รหัสต่อไปนี้ใน hook_alter

$form[field_organisation_company_name][und][0]['#after_build'][]='_build_element_readonly';

function _build_element_readonly($element, &$form_state) {  
    $element['value']['#attributes']['readonly'] = 'readonly';
    return $element;
}

ใน UI ที่ยื่นแสดงเป็นแบบอ่านอย่างเดียว แต่ยังฉันสามารถเปลี่ยนค่าโดยใช้ firebug และบันทึก มีวิธีป้องกันพฤติกรรมนี้หรือไม่?

คำตอบ:


6

ดูเหมือนว่าคุณจะประสบความสำเร็จในสิ่งที่คุณจำเป็นต้องมีสนามสิทธิ์ คุณสามารถตั้งค่าการอนุญาตเป็น:

  • สร้างมูลค่าของตัวเองสำหรับสนาม
  • แก้ไขค่าของตัวเองสำหรับฟิลด์
  • แก้ไขค่าของทุกคนสำหรับฟิลด์
  • ดูค่าของตัวเองสำหรับสนาม
  • ดูค่าของใครก็ได้สำหรับฟิลด์

ดังนั้นคุณจะสามารถอนุญาตให้ผู้ใช้ของคุณสร้างค่าสำหรับฟิลด์ได้อย่างง่ายดายในตอนแรก แต่ทันทีที่ผู้ดูแลระบบสามารถแก้ไขได้


+1 เนื่องจาก OP ต้องการอนุญาตให้ผู้ดูแลระบบแก้ไขค่าfield_permissionsจะง่ายกว่าการทำงานในลักษณะที่สกปรก
AyeshK

ใช่นี้เป็นคำตอบที่ดีกว่าเหมือง :)
อัลเฟรดอาร์มสตรอง

6

เมื่อคุณตั้งค่าฟิลด์เป็นreadonlyเบราว์เซอร์จะล็อคฟิลด์และส่งข้อมูลกลับไปยังเซิร์ฟเวอร์เมื่อส่ง คุณลักษณะอื่น ๆ คือdisabledล็อคฟิลด์และไม่ส่งข้อมูลกลับไปที่เซิร์ฟเวอร์

สำหรับทั้งสองกรณีคุณสามารถตั้งค่าให้เหมือนเดิมหลังจากส่ง ดังนั้นแม้เมื่อตั้งค่าเขตข้อมูลเป็นreadonlyหรือdisabledและผู้ใช้ปรับเปลี่ยน HTML และส่งข้อมูลที่แตกต่างกัน$form_state['values']จะยังคงไม่เปลี่ยนแปลง

function _build_element_readonly($element, &$form_state) {  
    $element['value']['#attributes']['readonly'] = 'readonly';
    $element['value']['#value'] = isset($element['value']['#default_value']) 
       ?  $element['value']['#default_value']
       :  ''; 
    return $element;
}

โปรดทราบว่าเราตั้งค่า#value จาก #default_value #default_value เป็นวิธีปกติในการตั้งค่าเริ่มต้นที่โหลดขึ้นเมื่อฟอร์มถูกสร้างขึ้นและ$form_state['values']จะมี default_value หรือการป้อนข้อมูลของผู้ใช้ เมื่อคุณตั้งค่า#valueอย่างชัดเจนการป้อนข้อมูลผู้ใช้จะถูกละเว้นและ#valueจะถูกใช้

อย่างไรก็ตามฉันแนะนำให้ใช้'#access' => FALSE,เมื่อซ่อนองค์ประกอบของฟอร์ม มันจะลบองค์ประกอบทั้งหมดโดยที่คุณสามารถใช้ค่าได้


1

คุณไม่สามารถป้องกัน Firebug จากการเปลี่ยนฟิลด์แบบอ่านอย่างเดียว แต่ถ้าฟิลด์ข้อความเป็นแบบอ่านอย่างเดียวมีวัตถุประสงค์เพื่อแสดงข้อมูลเท่านั้น ดังนั้นทำไมไม่เปลี่ยนอิลิเมนต์อินพุตกับอิลิเมนต์ข้อความ?

คุณสามารถใช้แอททริบิวต์ "disabled" แทนเนื่องจาก disable input-fields ไม่ใช่ beeing ที่ส่งไปยังเซิร์ฟเวอร์

คุณสามารถลบแอตทริบิวต์ "disabled" ด้วย firebug ได้เช่นกัน แต่แกน drupal ไม่ตอบสนองต่อการเปลี่ยนแปลงของช่องอินพุตที่ถูกปิดใช้งาน!


ขอบคุณ larrydahooster สำหรับความช่วยเหลือ ความต้องการของฉันเป็นสิ่งที่ต้องการล็อคบางส่วนของเขตข้อมูลที่ผู้ใช้กรอกตอนลงทะเบียน ขณะที่อยู่ในโหมดแก้ไขโปรไฟล์ต้องการแสดงข้อมูลนี้แก่ผู้ใช้ แต่ต้องการป้องกันไม่ให้ผู้ใช้อัปเดตฟิลด์เหล่านี้ มีเพียงผู้ใช้ระดับสูงเท่านั้นที่สามารถแก้ไขฟิลด์เหล่านี้ได้
Jayesh Jose

1

วิธีที่ปลอดภัยที่สุดในการทำเช่นนี้คือการเปลี่ยนประเภทของเขตข้อมูลเป็น 'รายการ' http://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#item


การใช้คุณลักษณะ #disabled ฉันแก้ปัญหาได้ ในกรณีของฉันมีเพียงผู้ใช้บางคนเท่านั้นที่สามารถแก้ไขฟิลด์ได้ซึ่งผู้อื่นสามารถดูฟิลด์ได้ ฉันเขียนตรรกะตามบทบาทของผู้ใช้และแก้ปัญหา ขอบคุณทุกท่าน
Jayesh Jose

1

คุณสามารถใช้การอนุญาตฟิลด์ + ฟิลด์แบบอ่านอย่างเดียว

การอนุญาตฟิลด์จะอนุญาตให้คุณทำให้ผู้ใช้บางคนไม่สามารถเข้าถึงฟิลด์ของคุณได้

ฟิลด์อ่านอย่างเดียวจะช่วยให้คุณแสดงฟิลด์ที่ไม่สามารถเข้าถึงได้เป็นไอเท็มแบบอ่านอย่างเดียวในฟอร์มแก้ไข (แทนที่จะซ่อนไว้)


1

ฉันคิดว่าการใช้#disabled = true;เป็นวิธีที่ง่ายที่สุดในการทำสิ่งนี้แทนการเพิ่มโมดูลขนาดใหญ่ลงในคอร์ของคุณตัวอย่างเช่นฉันปิดใช้งานการแก้ไขฟิลด์รูปภาพที่กำหนดเองใน user_profile_form เมื่อผู้ใช้กรอกข้อมูลก่อน

function MY_CUSTOM_MODULE_form_alter(&$form, $form_state, $form_id){

        if($form_id == 'user_profile_form'){
            if($form['field_national_front']['und'][0]['#default_value']['fid']){
                $form['field_national_front']['und']['#disabled'] = true;
             }
          //ym($form);
        }
}

นอกจากนี้คุณสามารถตรวจสอบบทบาทของผู้ใช้และเพียงแค่ปิดการใช้งาน (เขตข้อมูลแบบอ่านอย่างเดียว) ไม่ใช่ผู้ใช้ที่เป็นผู้ดูแลระบบ

    function MY_CUSTOM_MODULE_form_alter(&$form, $form_state, $form_id){
       global $user;
       if($form_id == 'user_profile_form'){
           if($form['field_national_front']['und'][0]['#default_value']['fid'] && !in_array('webadmin', $user->roles)){
              $form['field_national_front']['und']['#disabled'] = true;
         }
//ym($form);
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.