Score:1

หลายรูปแบบในหน้า

ธง cn

ฉันกำลังพยายามทำให้หลายรูปแบบทำงานในการแสดงมุมมอง แบบฟอร์มทั้งหมดใช้ AJAX แต่ดูเหมือนจะรบกวนซึ่งกันและกัน

ฟอร์มหนึ่งคือฟอร์ม Views Bulk Operations ที่เปลี่ยนตาราง view เป็น 'viewsForm' แบบฟอร์มที่สองคือแบบฟอร์ม 'แก้ไขด่วน' ที่มีอยู่ในแต่ละแถวในมุมมอง ปัญหาคือเมื่อฉันส่งแบบฟอร์มใด ๆ จากการแก้ไขอย่างรวดเร็ว มันพยายามส่งแบบฟอร์ม 'viewsForm' ด้วย (ซึ่งไม่ควรทำ) ส่งผลให้เกิดข้อผิดพลาดในการตรวจสอบความถูกต้องของแบบฟอร์มนั้น นอกจากนี้ยังไม่รับ ajax callback ของฉันสำหรับแบบฟอร์มที่กำหนดเอง ดังที่เห็นได้จาก 'ajax callback is blank or not callable' ใน dblog

ถ้าฉันปิดใช้งานการดูจำนวนมาก สิ่งนี้จะทำงานตามที่ตั้งใจไว้ แต่ด้วยแบบฟอร์มหลายรายการในหน้านี้ ฉันไม่สามารถหาวิธีบอกปุ่ม 'ส่ง' ที่ฉันใช้เพื่อส่งเฉพาะแบบฟอร์มที่เป็นของปุ่มส่งเท่านั้น

ฉันได้ให้คลาส formbuilder ของฉันสำหรับการอ้างอิง

<?php

เนมสเปซ Drupal\request_system\Form;

ใช้ Drupal\Core\Form\FormBase;
ใช้ Drupal\Core\Form\FormStateInterface;
ใช้ Drupal\Core\Ajax\AjaxResponse;
ใช้ Drupal\Core\Ajax\ReplaceCommand;
ใช้ Drupal\Core\Ajax\HightlightCommand;

/**
 * ให้แบบฟอร์มขอระบบ
 */
คลาส QuickEditForm ขยาย FormBase {

  สาธารณะ $sub_id = 0;
  $entity_id สาธารณะ = 0;

  /**
   * {@inheritdoc}
   */
  ฟังก์ชั่นสาธารณะ getFormId () {
    ส่งคืน 'request_system_quick_edit-' $this->sub_id;
  }

  /**
   * {@inheritdoc}
   */
  ฟังก์ชันสาธารณะ buildForm (อาร์เรย์ $form, FormStateInterface $form_state) {

    $entity = \Drupal::entityTypeManager()->getStorage('lms_request')->load($this->entity_id);
    
    $ตัวเลือก = [];

    $options['_none'] = '- เลือกหนึ่งรายการ -';

    ถ้า ($entity->bundle() == 'book_request') {
      $statuses = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadByProperties([
        'vid' => 'book_request_status',
      ]);
    }

    // แสดงเฉพาะ 'ว่างจากผู้ขาย' และ 'รอดำเนินการ'
    foreach (สถานะ $ เป็น $ สถานะ) {
      ถ้า ($status->getName() == 'รอดำเนินการ' || $status->getName() == 'มีจำหน่ายจากผู้ขาย') {
        $options[$status->id()] = $status->getName();
      }
      
      ถ้า ($status->id() == $entity->field_request_status->getString()) {
        $options[$status->id()] = $status->getName();
      }
    }

    $แบบฟอร์ม['quick_edit'] = [
      '#type' => 'คอนเทนเนอร์',
      '#id' => 'แก้ไขด่วน-wrapper-' $this->sub_id,
    ];

    $แบบฟอร์ม['quick_edit']['สถานะ'] = [
      '#type' => 'ชุดฟิลด์',
      '#title' => 'อัปเดตสถานะ',
      '#name' => 'update-wrapper',
    ];

    ถ้า (!$entity->field_aph_shipment_number->isEmpty() || !$entity->field_library_shipment_number->isEmpty()) {
      $form['quick_edit']['status']['value'] = [
        '#type' => 'รายการ',
        '#title' => 'สถานะคำขอ:',
        '#markup' => \Drupal::entityTypeManager()->getStorage('taxonomy_term')->load($entity->field_request_status->getString())->getName(),
      ];

      // แสดงข้อความระบุว่าสินค้าเป็นส่วนหนึ่งของการจัดส่ง
      $form['quick_edit']['status']['shipment_number'] = [
        '#markup' => 'คำขอนี้เป็นส่วนหนึ่งของการจัดส่ง',
      ];
    }
    อื่น {
      // ปิดใช้งานฟิลด์นี้หากสถานะคำขอไม่ใช่ 'รอดำเนินการ' หรือ 'มีจำหน่ายจากผู้ขาย' หรือหากรายการนั้นเป็นของการจัดส่ง
      $form['quick_edit']['status']['value'] = [
        '#type' => 'เลือก',
        '#title' => 'สถานะ',
        '#options' => $ตัวเลือก,
        '#default_value' => $entity->field_request_status->getString(),
      ];

      if ($entity->field_request_status->getString() != \Drupal\request_system\Controller\RequestSystemController::getStatus('Pending') && $entity->field_request_status->getString() != \Drupal\request_system\Controller\ RequestSystemController::getStatus('มีจำหน่ายจากผู้ขาย')) {
        $form['quick_edit']['status']['value']['#disabled'] = TRUE;
      }
    }

    $แบบฟอร์ม['quick_edit']['สถานะ']['ข้อความ'] = [
      '#type' => 'textarea',
      '#title' => $this->t('ข้อความ'),
    ];

    $form['quick_edit']['status']['notify_user'] = [
      '#type' => 'ช่องทำเครื่องหมาย',
      '#title' => 'แจ้งผู้กู้',
    ];

    // อนุญาตให้แก้ไขแค็ตตาล็อก APH #

    $form['quick_edit']['อื่นๆ'] = [
      '#type' => 'ชุดฟิลด์',
      '#title' => 'อื่นๆ',
      '#name' => 'other-wrapper',
    ];

    $form['quick_edit']['อื่นๆ']['aph_catalog_number'] = [
      '#type' => 'ช่องข้อความ',
      '#title' => 'แค็ตตาล็อก APH #',
      '#default_value' => $entity->field_attached_copy_aph_number->getString(),
      '#description' => $entity->field_attached_copy_main_record->isEmpty() ? '' : 'ไม่สามารถเปลี่ยนหมายเลขแค็ตตาล็อก APH เมื่อกำหนดระเบียนหลัก',
      '#disabled' => $entity->field_attached_copy_main_record->isEmpty() ? ผิดถูก,
    ];

    $form['quick_edit']['id'] = [
      '#type' => 'ซ่อน',
      '#value' => $this->entity_id,
    ];

    $form['quick_edit']['actions'] = [
      '#type' => 'การกระทำ',
    ];
    $form['quick_edit']['actions']['submit'] = [
      '#type' => 'ส่ง',
      '#value' => $this->t('บันทึก'),
      '#อาแจ็กซ์' => [
        'callback' => '::quickEditAjax',
        'wrapper' => 'quick-edit-wrapper-' $this->sub_id,
      ]
      '#validate' => '::ตรวจสอบ',
      '#limit_validation_errors' => [['id'],['status']],
      '#submit' => ['::quickEditAjaxSubmit'],
    ];

    // $form['quick_edit']['actions']['cancel'] = [
    // '#type' => 'ส่ง',
    // '#value' => 'ยกเลิก',
    // ];

    คืนฟอร์ม $;
  }

  /**
   * {@inheritdoc}
   */
  ฟังก์ชันสาธารณะ validateForm (อาร์เรย์ &$form, FormStateInterface $form_state) {
    $values ​​= $form_state->getValues();

    $entity = \Drupal::entityTypeManager()->getStorage('lms_request')->load($values['id']);

    ถ้า ($values['status'] == \Drupal\request_system\Controller\RequestSystemController::getStatus("ส่งจากคลังยืม")) {
      ถ้า (นับ ($entity->field_imcid->referencedEntities()) == 0) {
        $form_state->setErrorByName('status','ไม่สามารถทำเครื่องหมายรายการนี้ที่จัดส่งได้เนื่องจากไม่ได้แนบรายการไลบรารี');
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  ฟังก์ชันสาธารณะ submitForm (อาร์เรย์ &$form, FormStateInterface $form_state) {

  }

  ฟังก์ชันสาธารณะ quickEditAjax (&$form, FormStateInterface $form_state) {
    $values ​​= $form_state->getValues();

    ถ้า ($form_state->hasAnyErrors()) {
      $แบบฟอร์ม['status_messages'] = [
        '#type' => 'status_messages',
        '#น้ำหนัก' => -1000,
      ];
      $form['#sorted'] = FALSE;
    }
    
    $response = ใหม่ AjaxResponse();

    $status = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->load($values['status']);
    $response->addCommand(new ReplaceCommand('.request-status-'. $values['id'],$status->getName()));
    $response->addCommand(new ReplaceCommand('#quick-edit-wrapper-'. $this->sub_id,$form));
    $response->addCommand(new HightlightCommand('#row-'. $values['id']));

    ส่งคืน $response;
  }

  ฟังก์ชันสาธารณะ quickEditAjaxSubmit (&$form, FormStateInterface $form_state) {
    $values ​​= $form_state->getValues();

    // ก่อนอื่นให้โหลดเอนทิตี
    $entity = \Drupal::entityTypeManager()->getStorage('lms_request')->load($values['id']);

    $entity->set('field_request_status',$values['สถานะ']);
    $entity->save();

    $form_state->setRebuild();
  }

}

และวิธีที่ฉันแสดงแบบฟอร์มคือผ่าน

$form = \Drupal::classResolver()->getInstanceFromDefinition('Drupal\request_system\Form\QuickEditForm');
$form->sub_id = $entity->id();
$form->entity_id = $entity->id();
$build['form'] = \Drupal::formBuilder()->getForm($form);

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

ฉันปวดหัวกับเรื่องนี้มาสองสัปดาห์แล้วเพื่อพยายามแก้ไขปัญหานี้ และคิดไม่ออกว่าปัญหาคืออะไร

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก.

แก้ไข: ฉันได้แนบภาพหน้าจอของสิ่งที่เราพยายามทำให้สำเร็จ ช่องทำเครื่องหมายทางซ้ายคือดูการดำเนินการเป็นกลุ่ม แบบฟอร์ม 'แก้ไขด่วน' อยู่ทางขวาสุดผ่าน 'คอลัมน์ตารางที่ขยายได้'

การแสดงฟังก์ชันการทำงาน

cn flag
มี `` เป็น HTML ที่ไม่ถูกต้อง ขึ้นอยู่กับเบราว์เซอร์ว่าจะเกิดอะไรขึ้นในสถานการณ์นั้น ฉันคิดว่าฉันพูดถูกที่เบราว์เซอร์สมัยใหม่ทั้งหมดจะเพิกเฉยต่อ ` ข้างใน`)
Ex0r avatar
cn flag
VBO ไม่ได้ห่อตารางในแบบฟอร์ม แต่ Views ใช้เมธอด viewsForm ที่แสดงออกมา ดังนั้นจึงเป็นไปได้มากว่าจะต้องมีการปรับเปลี่ยนวิธีการทำงานของ Views เพื่อทำสิ่งนั้นฉันกำลังใช้ form_alter ในแบบฟอร์มเพื่อเปลี่ยนแปลงบางสิ่งที่ VBO ทำอยู่ แต่มันทำในระดับมุมมอง ไม่ใช่ระดับแต่ละแถวซึ่งเป็นสิ่งที่ฉันต้องทำ
cn flag
โอเค แผน B นั้นอาจเป็นไปไม่ได้เลยที่จะนำมาใช้ใหม่ ระดับแถวต้องพร้อมใช้งานเนื่องจาก VBO ใช้ - ฉันเดาว่ามีตัวจัดการฟิลด์ซึ่งใช้ API ของโมดูลเพื่อรับบริบทของแบบฟอร์มเพื่อให้สามารถแสดงช่องทำเครื่องหมายต่อแถวได้ บางทีแนวทางของคุณอาจเหมือนกันก็ได้ คุณจะต้องทำให้ฟังก์ชันการทำงานของคุณทำงานภายในแบบฟอร์ม VBO และอาจแก้ไขการตรวจสอบความถูกต้อง/อื่นๆ แต่ด้วยลักษณะของการใช้งานและสิ่งที่ HTML อนุญาต ฉันไม่แน่ใจว่าทางเลือกอื่นจะเป็นอย่างไร
cn flag
โดย "แบบฟอร์ม VBO" ฉันหมายถึง "แบบฟอร์มที่ VBO โน้มน้าวให้ Views สร้างผ่าน `ViewsBulkOperationsBulkForm::viewsForm`" ฉันแค่ดูรหัสและเห็นว่าทำไมคุณถึงติดขัด
Ex0r avatar
cn flag
ใช่ ดูเหมือนว่าสิ่งที่เราพยายามจะบรรลุนั้นไม่มีทางเป็นไปได้ VBO ใช้ viewsForm เพื่อสร้างองค์ประกอบแบบฟอร์มประเภท #checkbox ในตำแหน่งคอลัมน์ที่ตั้งค่าไว้ในมุมมอง แต่นั่นไม่เหมาะเพราะนั่นไม่ใช่สิ่งที่เราต้องการทำ เนื่องจากคอลัมน์สำหรับการแก้ไขด่วนอยู่ในคอลัมน์ที่แตกต่างกันโดยสิ้นเชิง และควรจะทำงานโดยไม่ขึ้นกับมุมมองการทำงานแบบกลุ่ม
Ex0r avatar
cn flag
ฉันได้อัปเดตคำถามของฉันเพื่อรวมภาพหน้าจอของสิ่งที่เราพยายามบรรลุ
cn flag
ฉันอยากจะละทิ้งเส้นทางรูปแบบดั้งเดิมโดยสิ้นเชิงและใช้ JS เพื่อส่งข้อมูลไปยังเส้นทางในโมดูลที่กำหนดเองของคุณซึ่งดำเนินการบันทึก เว้นแต่จะมีบางสิ่งที่ฉันพลาดไป ดูเหมือนว่าจะเป็นไปได้ในทางเทคนิค แต่อาจไม่คุ้มกับความพยายามที่จะทำตามปกติ
Ex0r avatar
cn flag
ฉันไม่แน่ใจว่าคุณหมายถึงอะไร ฉันไม่เคยทำงานกับการส่งแบบฟอร์มผ่าน Drupal โดยใช้ Javascript มาก่อน เนื่องจากฉันเป็นนักพัฒนาแบ็กเอนด์เป็นหลัก ฉันจึงไม่ค่อยมีประสบการณ์กับส่วนหน้าของ Drupal มากนัก
Score:0
ธง cn

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

โดยไม่ต้องตรวจทานโค้ดทั้งหมด หากคุณมีฟอร์ม Ajax หลายฟอร์มในหน้า ควรใช้คีย์ฟอร์มส่งที่ไม่ซ้ำกันในลักษณะเดียวกับที่คุณทำกับ wrapper:

$form['quick_edit']['actions']['submit' $นี้->sub_id] = [
  ...
  '#อาแจ็กซ์' => [
    'callback' => '::quickEditAjax',
    'wrapper' => 'quick-edit-wrapper-' $this->sub_id,
  ]

ในอีกกรณีหนึ่ง คุณจะซ้อนแบบฟอร์มไม่ได้ตามที่กล่าวไว้ในความคิดเห็น

โดยทั่วไป คุณต้องวางองค์ประกอบฟอร์มของคุณไว้ในฟอร์มที่มีอยู่ ซึ่งจากนั้นจะทำสิ่งต่างๆ เองโดยใช้การเรียกกลับแบบส่งและ ajax และละเว้นส่วนที่เหลือของฟอร์ม ซึ่งสามารถทำได้ในรูปแบบง่าย ๆ ของเบ็ดเตล็ดหรือระบบที่ซับซ้อนกว่านั้น สำหรับฟอร์มเอนทิตี Drupal มีฟอร์มย่อยที่ใช้งานในปลั๊กอินวิดเจ็ตฟิลด์ สำหรับปลั๊กอินฟิลด์แบบฟอร์มจำนวนมากของ Views ที่ใช้งาน การดูฟอร์ม($form, $form_state). หากคุณใช้หนึ่งในนั้นให้ทำตามวิธีที่พวกเขาทำ

Ex0r avatar
cn flag
ตอนนี้ฉันใช้ hook_form_alter เพื่อแก้ไขการดำเนินการและเวิร์กโฟลว์ของ VBO ฉันพยายามใช้สิ่งนั้นเพื่อเพิ่มฟิลด์แต่ละแถวลงในแบบฟอร์ม แต่มันไม่ได้วางไว้ในตำแหน่งคอลัมน์/ฟิลด์ที่ถูกต้องที่ควร และไม่ได้แสดงฟิลด์ฟอร์มทั้งหมดเช่นกัน ขณะนี้ฉันใช้ปลั๊กอินฟิลด์มุมมองที่กำหนดเองเพื่อแสดงแบบฟอร์มในคอลัมน์ตารางที่ถูกต้อง แต่ตัวจัดการการส่ง ajax และปุ่มเมื่อคลิกจะเรียกใช้ตัวจัดการการส่ง vbo และการตรวจสอบความถูกต้อง คุณมีลิงค์ไปยังเอกสาร Drupals สำหรับแบบฟอร์มย่อยหรือไม่? ฉันไม่พบสิ่งใดที่จะแสดงให้เห็นถึงความเป็นเรา
4uk4 avatar
cn flag
ฟอร์มย่อย? สร้างขึ้นโดยอัตโนมัติสำหรับวิดเจ็ตฟิลด์ซึ่งจะเป็นแนวทางที่แตกต่างไปจากเดิมอย่างสิ้นเชิง ไม่ใช้ฟอร์ม Views จำนวนมาก แต่เป็นการแสดงเอนทิตีในกริดที่คุณสามารถแนบฟอร์มเอนทิตีสำหรับแต่ละเอนทิตีได้
Ex0r avatar
cn flag
ฉันใช้ VBO เพื่อการทำงานที่แตกต่างกัน โดยพื้นฐานแล้วฉันกำลังพยายามสร้างสองรูปแบบที่แตกต่างกันในหน้านี้ หนึ่งรายการเพื่อให้คุณสามารถดำเนินการด่วนกับแต่ละรายการแถวแบบอินไลน์ และอีกรายการหนึ่งเพื่อให้คุณสามารถเลือกหลายแถวและดำเนินการ 'การดำเนินการเป็นกลุ่ม' ที่แตกต่างกันกับรายการเหล่านั้น ดูเหมือนว่าฉันไม่สามารถทำในสิ่งที่ฉันต้องการได้ตราบเท่าที่มีการดำเนินการจำนวนมากในมุมมองซึ่งน่าขยะแขยง ฉันจะต้องหาวิธีแก้ปัญหาอื่น
Ex0r avatar
cn flag
แบบฟอร์มที่ฉันกำลังแสดงผลในแต่ละแถวคือฟิลด์มุมมองที่กำหนดเองซึ่งใช้รหัสการแสดงผลด้านบนเพื่อแสดงแบบฟอร์มใหม่ในแต่ละแถว ปลั๊กอินฟิลด์เป็นฟิลด์ 'ปลอม' ที่แสดงเอาต์พุตและแบบฟอร์มไปยังแถวในคอลัมน์ฟิลด์ที่เหมาะสมในตาราง ดูเหมือนจะไม่มีวิธีสร้างวิดเจ็ตฟิลด์มุมมอง หรือถ้าไม่มีในเอกสารคู่มือ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา