ฟิลด์ค่าไม่ จำกัด - วิธีซ่อนฟิลด์พิเศษในการแก้ไขโหนด


9

เมื่อสร้างโหนดใหม่ฉันมีฟิลด์ค่าไม่ จำกัด นี้พร้อมปุ่ม "เพิ่มรายการใหม่"

ฟิลด์ค่าไม่ จำกัด - โหนดใหม่

ไม่เป็นไรวิเศษ แต่เมื่อผมแก้ไขโหนดที่มีอยู่ฉันได้รับที่ไม่พึงประสงค์มูลค่าเพิ่มที่ว่างเปล่าเพิ่มสำหรับฉัน: ฟิลด์ค่าไม่ จำกัด - แก้ไขโหนด

กรณีจริงของฉันคือกับเขตผสมขนาดใหญ่ แต่ฉันคิดว่าการใช้เขตข้อมูลขนาดเล็กนี้เป็นตัวอย่างจะเข้าใจได้ง่ายขึ้น

ฉันมีวิธีใดที่จะป้องกันไม่ให้ฟิลด์ "พิเศษ" นี้ถูกเพิ่มเข้ามาอย่างคร่าวๆ?


2
เพื่อชี้แจงคุณต้องการให้ไม่มีฟิลด์ว่างที่แสดงเมื่อแก้ไขหรือไม่ หากต้องการเพิ่มฟิลด์อื่นพวกเขาจะถูกบังคับให้ใช้ปุ่ม "เพิ่มรายการอื่น"
tim.plunkett

ใช่คุณเข้าใจมันอย่างสมบูรณ์
Fidelix

@Fidelix คุณพบโมดูลที่จะทำเช่นนี้หรือเฉพาะรหัสที่กำหนดเอง ณ จุดนี้
David Barratt

@ DavidBarratt รหัสที่กำหนดเองเท่านั้นฉันกลัว
Fidelix

คำตอบ:


10

สิ่งนี้จะใช้ได้กับทุกรูปแบบการแก้ไขโหนด:

/**
 * Implements hook_form_BASE_FORM_ID_alter().
 */
function MYMODULE_form_node_form_alter(&$form, &$form_state, $form_id) {
  $field_name = 'field_YOURFIELD';

  if (empty($form[$field_name])) {
    return;
  }

  $field_language = $form[$field_name]['#language'];
  $max_delta = $form[$field_name][$field_language]['#max_delta'];
  unset($form[$field_name][$field_language][$max_delta]);
}

เป็นไปได้หรือไม่ที่จะ "เพิ่ม" ช่องว่างใหม่ในเบ็ดนี้?
Fidelix

ในทางทฤษฎีคุณสามารถ สิ่งที่ชอบ$form[$field_name][$field_language][$max_delta + 1] = $form[$field_name][$field_language][$max_delta];อาจทำงานได้
tim.plunkett

มีปัญหาในการแก้ปัญหานี้ หากไม่มีค่าและเดลต้าสูงสุดคือ 0 และคุณคลิกที่เพิ่มรายการอื่นมันจะไม่เพิ่มเขตข้อมูลพิเศษ จากนั้นเมื่อคุณคลิกอีกครั้งเพื่อเพิ่มรายการอื่นมันจะเพิ่มเขตข้อมูลพิเศษ หมายถึงการคลิกสองครั้งที่ต้องการเมื่อเพิ่มรายการอื่น ff โหนดไม่มีค่าเทียบกับฟิลด์
อาห์หมัด

3

สิ่งนี้จะใช้ได้กับทุกรูปแบบการแก้ไขโหนดโดยไม่ต้องระบุชื่อฟิลด์

/**
 * Implements hook_form_NODE_FORM_alter().
 */
function MY_MODULE_form_node_form_alter(&$form, &$form_state, $form_id) {
  if (isset($form['#node']->nid) && $form['#node']->nid > 0) {
    $form_fields = array_keys($form);

    foreach ($form_fields as $index => $field_name) {
      if (substr($field_name, 0, 6) == "field_") { // Check if the field is a custom field
        $field_language = $form[$field_name]['#language'];
        if (isset($form[$field_name][$field_language]['#cardinality']) && 
            $form[$field_name][$form[$field_name]['#language']]['#cardinality'] == -1) {

          if (empty($form[$field_name])) {
            continue;
          }

          $max_delta = $form[$field_name][$field_language]['#max_delta'];
          unset($form[$field_name][$field_language][$max_delta]);

        }
      }
    }

  }
}

ฉันแค่คิดว่าคุณสามารถตรวจสอบการอ่านคำตอบสูงสุดแล้วเห็นว่าคุณทำมัน!
jowan sebastian

เพื่อหลีกเลี่ยงการลบอินพุตฟิลด์เดียว (หากไม่จำเป็นต้องใช้ฟิลด์):if ($max_delta > 0) { unset($form[$field_name][$field_language][$max_delta]); }
quoteBro

2

คุณสามารถเขียนโมดูลของคุณเองด้วยhook_form_FORM_ID_alterเพื่อลบฟิลด์ที่ไม่ต้องการ สิ่งที่ต้องการ...

function my_module_form_FORM_ID_alter(&$form, &$form_state, $form_id) {
  // Do checks here to make sure this is an existing node...

  // Get the index of the last input element in this field
  $last_index = $form['field_field_name'][LANGUAGE_NONE]['#max_delta'];
  // Get rid of the last input element
  unset($form['field_field_name'][LANGUAGE_NONE][$last_index]);
  // Move back the last index so that any new elements are added correctly
  $form['field_field_name'][LANGUAGE_NONE]['#max_delta'] = $last_index-1;
}

0

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

<script>
if(!$('div.filefield-file-info').length){
$('table#field_test_file_values tr.even:eq(0)').remove();
}
</script>

(ใส่ไว้ข้างหน้าbodyแท็กปิดของ page.tpl.php ของคุณ)

จากการทดสอบของฉันรูปภาพถูกอัพโหลดโดยไม่มีปัญหาและเมื่อคุณแก้ไขโหนดไฟล์ทั้งหมดจะถูกแสดง

หมายเหตุ: สำหรับตัวอย่างนี้ 'field_test_file' เป็นชื่อของฟิลด์ CCK ดังนั้นอย่าลืมเปลี่ยนตามชื่อของฟิลด์ cck ของคุณ


ความคิดเห็นของฉันเกี่ยวกับโซลูชัน CSS ของคุณยังคงอยู่: ทำไมทำเช่นนี้เมื่อคุณสามารถทำได้ด้วย PHP ดูdrupal.stackexchange.com/questions/10481/…
tim.plunkett

สวัสดีทิมฉันเข้าใจมุมมองของคุณและเห็นด้วยในบางกรณี หากไม่ผิดฉันคิดว่าช่องไฟล์ CCK กำลังใช้งานจาวาสคริปต์เพื่อแสดงฟิลด์ใหม่และเป็นวิธีแก้ปัญหาที่ดี (หากคุณปิดการใช้งานฟีเจอร์นี้หรือไม่มีจาวาสคริปต์วิธีแบ็กเอนด์ / php เป็นไปได้เช่นทางเลือกที่สอง) นอกจากนี้ฉันคิดว่าเป็นการดีที่จะทราบทางเลือกในการแก้ไขข้อกำหนดเดียวกัน
cigotete
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.