Puncte:1

AJAX într-o formă de plugin are ca rezultat „Reapelul #ajax specificat este gol sau nu poate fi apelat”.

drapel in

Am un formular de configurare pentru un plugin Condiție în care vreau să am ajax. Când selectez din acest câmp, vreau să obțin o listă de afișaje pentru acea vizualizare:

  funcția publică buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form = parent::buildConfigurationForm($form, $form_state);
    $views = $this->entityTypeManager->getStorage('view')->loadMultiple();
    $opțiuni = [];

    /** @var \Drupal\views\Views $view */
    foreach ($views ca $view) {
      $opțiuni[$view->id()] = $view->label();
    }

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

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

    dacă (gol ($view_id)) {
      $view_id = $form_state->getUserInput()["conditions"]["sfp_condition_view_not_empty"]["view_id"] ?? NUL;
    }

    dacă (gol ($view_id)) {
      $view_id = $this->configuration['view_id'] ?? NUL;
    }

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

    $form['view_id'] = [
      '#type' => 'selectați',
      '#title' => $this->t('Vizualizare'),
      '#required' => TRUE,
      '#options' => $opțiuni,
      '#default_value' => $view_id ? $options[$view_id] : '',
      '#ajax' => [
        'wrapper' => 'setări-vizionări',
        'callback' => '::updateViewsDisplay',
        'eveniment' => 'schimbare',
      ],
    ];

    dacă (!gol ($afișează)) {
      $form['view_display'] = [
        '#type' => 'selectați',
        '#title' => $this->t('Vizualizați afișajul'),
        '#required' => TRUE,
        '#options' => $afișează,
        '#default_value' => $afișează[$this->configuration['view_display']] ?? $displays['default'],
      ];
    }

    returnează $form;
  }

      /**
       * Reconstituirea formularului de declanșare.
       *
       * @param matrice $form
       * @param \Drupal\Core\Form\FormStateInterface $form_state
       * @return matrice
       */
      funcția publică updateViewsDisplay(matrice $form, FormStateInterface $form_state) {
        returnează $form;
      }

Xdebug merge bine metoda, dar primesc această eroare AJAX:

„Reapelul #ajax specificat este gol sau nu poate fi apelat.”

si nu se intampla nimic dupa aceea.

Am verificat în altă parte unde am făcut acest lucru și singura diferență pe care o pot vedea este că cele care au funcționat sunt formularele obișnuite Drupal Form API, iar acesta este un formular plugin transmis de la buildConfigurationForm. În afară de asta, nu văd problema.

drapel cn
Există vreo șansă să utilizați acest lucru într-un formular de UI de context (spre deosebire de, de exemplu, vizibilitatea blocului)? Îmi amintesc că am avut probleme groaznice în încercarea de a face AJAX să lucreze cu modulul Context
Kevin avatar
drapel in
Da, exact acolo sunt. Schimbarea apelului înapoi într-o funcție procedurală într-un .module funcționează, dar nu știu de ce. Nu ar trebui să fie aceasta o metodă accesibilă dacă este făcută statică? Nimic nu părea să funcționeze. Ce e bizar este că xdebug nu a reușit să-l lovească. De asemenea, starea formularului nu are întotdeauna valoarea selectată, spre deosebire de formele obișnuite.
drapel cn
A fost cu ceva timp în urmă, dar IIRC a avut ceva de-a face cu UI context având propriul punct de intrare pentru formularul AJAX, nu folosește `/system/ajax`. Sunt sigur că îmi amintesc că s-a întâmplat același lucru, callback-ul fiind cu siguranță lovit, dar rezultatele nefiind incluse în noul formular. Orice am ajuns să fac pentru a ocoli este undeva în acest modul dacă ajută: https://www.drupal.org/project/request_data_conditions
Kevin avatar
drapel in
Wow. Da. Cine stia? Postarea răspunsului.
Kevin avatar
drapel in
Asta a remediat de fapt AJAX, dar a ajuns să primești eroarea „detectată alegere ilegală”. Am terminat doar să elimin AJAX și să furnizez întreaga matrice într-o listă.
drapel cn
Nu te învinovăți, am recitit comentariul divagator pe care l-am scris cu ani în urmă încercând să explic ce se întâmplă (linia 152 din BaseCondition) și a revenit. Aici să fie dragoni.
Puncte:3
drapel in

Datorită link-ului Clives, din motive pentru care nu sunt 100% la formularele de configurare pentru un plugin Context, apelarea AJAX trebuie să facă acest lucru:

  /**
   * Reconstituirea formularului de declanșare.
   *
   * @param matrice $form
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   * @return matrice
   */
  funcția publică updateViewsDisplay(matrice $form, FormStateInterface $form_state) {
    $triggering_element = $form_state->getTriggeringElement();
    $parinti = array_slice($triggering_element['#array_parents'], 0, -1);
    returnează NestedArray::getValue($form, $părinți);
  }

Apoi a început să funcționeze.

De asemenea, declarația AJAX trebuia să fie:

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

Presupun că asta are de-a face cu faptul că este o „formă într-o formă”.

4uk4 avatar
drapel cn
Da, o declarație de formular într-un plugin de obicei nu este independentă, este un subarboresc pe care codul care utilizează pluginul îl poate plasa în propria sa formă. Vedeți acest truc cu tăierea matricei și în widget-urile de câmp. BTW bazarea apelului invers pe $this nu este recomandată, este posibil să nu obțineți instanța de formular pe care o așteptați. Aș folosi `'[static::class, 'updateViewsDisplay']` dacă `'::updateViewsDisplay'` nu funcționează. Dacă trebuie să faceți referire la obiectul formular, îl puteți obține de la $form_state.
Kevin avatar
drapel in
Văd, de asemenea, rețineți că static::class necesită ca callback-ul să fie și static, sau eroarea persistă.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.