Score:1

AJAX ในรูปแบบปลั๊กอินส่งผลให้ "การโทรกลับ #ajax ที่ระบุว่างเปล่าหรือไม่สามารถเรียกได้"

ธง in

ฉันมีรูปแบบการกำหนดค่าสำหรับปลั๊กอินเงื่อนไขที่ฉันต้องการมี ajax เมื่อเลือกจากฟิลด์นี้ ฉันต้องการรับรายการการแสดงผลสำหรับมุมมองนั้น:

  ฟังก์ชันสาธารณะ buildConfigurationForm (อาร์เรย์ $form, FormStateInterface $form_state) {
    $form = parent::buildConfigurationForm($form, $form_state);
    $views = $this->entityTypeManager->getStorage('view')->loadMultiple();
    $ตัวเลือก = [];

    /** @var \Drupal\views\Views $ดู */
    foreach (ดู $ เป็น $ ดู) {
      $options[$view->id()] = $view->label();
    }

    $form['#prefix'] = '<div id="views-settings">';
    $form['#suffix'] = '</div>';

    $view_id = $form_state->getValue('view_id');

    ถ้า (ว่าง ($ view_id)) {
      $view_id = $form_state->getUserInput()["conditions"]["sfp_condition_view_not_empty"]["view_id"] ?? โมฆะ;
    }

    ถ้า (ว่าง ($ view_id)) {
      $view_id = $this->configuration['view_id'] ?? โมฆะ;
    }

    $displays = isset($view_id) ? $this->getViewsDisplays($view_id) : [];

    $แบบฟอร์ม['view_id'] = [
      '#type' => 'เลือก',
      '#title' => $this->t('ดู'),
      '#required' => จริง,
      '#options' => $ตัวเลือก,
      '#default_value' => $view_id ? $options[$view_id] : '',
      '#อาแจ็กซ์' => [
        'wrapper' => 'การตั้งค่ามุมมอง',
        'callback' => '::updateViewsDisplay',
        'เหตุการณ์' => 'เปลี่ยนแปลง',
      ]
    ];

    ถ้า (!empty($displays)) {
      $แบบฟอร์ม['view_display'] = [
        '#type' => 'เลือก',
        '#title' => $this->t('ดูการแสดงผล'),
        '#required' => จริง,
        '#options' => $displays,
        '#default_value' => $displays[$this->configuration['view_display']] ?? $displays['ค่าเริ่มต้น'],
      ];
    }

    คืนฟอร์ม $;
  }

      /**
       * สร้างแบบฟอร์มทริกเกอร์ใหม่
       *
       * @param อาร์เรย์ $form
       * @param \Drupal\Core\Form\FormStateInterface $form_state
       * @return อาร์เรย์
       */
      ฟังก์ชั่นสาธารณะ updateViewsDisplay (อาร์เรย์ $form, FormStateInterface $form_state) {
        คืนฟอร์ม $;
      }

Xdebug ใช้วิธีนี้ได้ดี แต่ฉันได้รับข้อผิดพลาด AJAX นี้:

"การโทรกลับ #ajax ที่ระบุว่างเปล่าหรือไม่สามารถโทรได้"

และไม่มีอะไรเกิดขึ้นหลังจากนั้น

ฉันตรวจสอบที่อื่นที่ฉันได้ทำสิ่งนี้แล้ว และข้อแตกต่างเพียงอย่างเดียวที่ฉันเห็นคือแบบฟอร์มที่ทำงานเป็นแบบฟอร์ม Drupal Form API ปกติ และนี่คือแบบฟอร์มปลั๊กอินที่ส่งผ่านจาก buildConfigurationForm นอกนั้นไม่เห็นเป็นประเด็น

cn flag
มีโอกาสใดที่คุณใช้สิ่งนี้ในรูปแบบ Context UI (ซึ่งตรงข้ามกับเช่น การปิดกั้นการมองเห็น) ฉันจำได้ว่ามีปัญหาร้ายแรงในการพยายามให้ AJAX ทำงานกับโมดูลบริบท
Kevin avatar
in flag
ใช่ นั่นคือที่ที่ฉันอยู่ การเปลี่ยนการโทรกลับเป็นฟังก์ชันขั้นตอนใน .module ใช้งานได้ แต่ฉันไม่รู้ว่าทำไม นี่ไม่ควรเป็นวิธีที่สามารถเข้าถึงได้หากทำแบบคงที่ ดูเหมือนจะไม่มีอะไรทำงาน สิ่งที่แปลกประหลาดคือ xdebug ไม่เคยพลาดที่จะตีมัน สถานะของฟอร์มไม่ได้มีค่าที่เลือกเสมอไป ซึ่งแตกต่างจากฟอร์มปกติ
cn flag
เมื่อไม่นานมานี้ IIRC มีบางอย่างที่เกี่ยวข้องกับ UI บริบทที่มีจุดเริ่มต้นสำหรับแบบฟอร์ม AJAX ของตัวเอง แต่ไม่ได้ใช้ `/system/ajax` ฉันแน่ใจว่าฉันจำสิ่งเดียวกันที่เกิดขึ้นได้ การเรียกกลับถูกโจมตีอย่างแน่นอน แต่ผลลัพธ์ไม่รวมอยู่ในแบบฟอร์มใหม่ ไม่ว่าฉันจะลงเอยด้วยการทำสิ่งใดบ้างในโมดูลนี้ ถ้ามันช่วยได้: https://www.drupal.org/project/request_data_conditions
Kevin avatar
in flag
ว้าว. ใช่. ใครจะรู้? โพสต์คำตอบ
Kevin avatar
in flag
นั่นแก้ไข AJAX จริง ๆ แต่ได้รับข้อผิดพลาด 'ตรวจพบตัวเลือกที่ผิดกฎหมาย' ฉันลงเอยด้วยการขว้าง AJAX และจัดหาอาร์เรย์ทั้งหมดในรายการ
cn flag
อย่าโทษคุณ ฉันเพิ่งอ่านความคิดเห็นที่ฉันเขียนเมื่อหลายปีก่อนอีกครั้งเพื่อพยายามอธิบายว่าเกิดอะไรขึ้น (บรรทัดที่ 152 ของ BaseCondition) และมันก็กลับมาท่วมท้น นี่คือมังกร
Score:3
ธง in

ขอบคุณลิงก์ Clives ด้วยเหตุผลที่ฉันไม่ได้ 100% ในรูปแบบการกำหนดค่าสำหรับปลั๊กอินบริบทที่การโทรกลับ AJAX จำเป็นต้องทำสิ่งนี้:

  /**
   * สร้างแบบฟอร์มทริกเกอร์ใหม่
   *
   * @param อาร์เรย์ $form
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   * @return อาร์เรย์
   */
  ฟังก์ชั่นสาธารณะ updateViewsDisplay (อาร์เรย์ $form, FormStateInterface $form_state) {
    $triggering_element = $form_state->getTriggeringElement();
    $parents = array_slice($triggering_element['#array_parents'], 0, -1);
    ส่งคืน NestedArray::getValue($form, $parents);
  }

จากนั้นก็เริ่มทำงาน

นอกจากนี้ การประกาศ AJAX จำเป็นต้องเป็น:

'callback' => [$this, 'updateViewsDisplay'],

ฉันคิดว่าสิ่งนี้เกี่ยวข้องกับการเป็น 'แบบฟอร์มภายในแบบฟอร์ม'

4uk4 avatar
cn flag
ใช่ การประกาศแบบฟอร์มในปลั๊กอินมักจะไม่ใช่แบบสแตนด์อโลน แต่เป็นทรีย่อยที่โค้ดที่ใช้ปลั๊กอินสามารถวางในรูปแบบของตัวเองได้ คุณเห็นเคล็ดลับนี้ด้วยการแบ่งส่วนอาร์เรย์ในวิดเจ็ตฟิลด์ด้วย BTW ไม่แนะนำให้เรียกกลับเป็น $this คุณอาจไม่ได้รับอินสแตนซ์ของแบบฟอร์มที่คุณคาดหวัง ฉันจะใช้ `'[static::class, 'updateViewsDisplay']` ถ้า `'::updateViewsDisplay'` ไม่ทำงาน หากคุณต้องการอ้างอิงวัตถุแบบฟอร์ม คุณสามารถรับได้จาก $form_state
Kevin avatar
in flag
ฉันเห็นแล้ว โปรดทราบว่า static::class ต้องการให้การโทรกลับเป็นแบบคงที่เช่นกัน มิฉะนั้นข้อผิดพลาดจะยังคงอยู่

โพสต์คำตอบ

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