Puncte:0

De ce o formă nu păstrează valoarea creată în timpul construcției

drapel sa

Iată un formular care utilizează DI pentru $this->entity_type_manager

Există și un buton radio cu Ajax (am adăugat codul deoarece poate este motivul problemei mele)

clasa myForm extinde FormBase {

  privat ?EntityTypeManagerInterface $entity_type_manager=NULL;

  funcția publică __construct(Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager) {

    $this->entity_type_manager=$entity_type_manager;
  }

  funcția publică statică create(ContainerInterface $container) {
    returnează static nou (
      $container->get('entity_type.manager'),
    );
  }

  funcția publică buildForm(array $form, FormStateInterface $form_state) {
    // păstrează valoarea în $form_state pentru a fi folosită la trimitere
    $form_state->set('entity_type_manager', $this->entity_type_manager);
    ...
    // Poate că problema este componenta Ajax
    $form['container'] = [
      '#type' => 'container',
      '#prefix' => '<div id="ajax-wrapper">',
      '#sufix' => '</div>',
      'my_radio' => [
        '#type' => 'radiouri',
        '#options' => ["option1","option2"],
        '#required' => TRUE,
        '#default_value' => $type_of_bo,
        '#ajax' => [
          'callback' => [$this, 'ajaxGetInvestmentHandler'],
          'wrapper' => 'ajax-wrapper',
          „eveniment” => „dați clic pe intrare”,
        ],
      ],
      ...
    ];
  }

  funcție publică statică ajaxGetInvestmentHandler(matrice $form, FormStateInterface $form_state) {
    returnează $form['container'];
  }
  
  funcția publică submitForm(matrice &$form, FormStateInterface $form_state) {
    // $this->entity_type_manager este NULL
    // $form_state->get('entity_type_manager') este, de asemenea, NULL
    ...
  }

  ...
  
}

După cum puteți vedea în Trimite, $this->entity_type_manager este NULL și $form_state->get('entity_type_manager') este, de asemenea, NULL.

Ce s-a întâmplat?

Jaypan avatar
drapel de
„Așa cum puteți vedea” - cum putem vedea asta? Nu există niciun motiv pentru care ar trebui să fie nulă, cum determinați că este?
Baud avatar
drapel sa
Îmi pare rău că nu sunt suficient de clar. Am vrut să spun că am făcut niște teste pe acele valori și sunt NULL (după cum arată rezumatele din trimitere). Sunt de acord că acest lucru nu ar trebui să fie NULL, dar este... poate că vine de la AJAX?
Jaypan avatar
drapel de
Pe baza codului afișat, nu este posibil ca `$this->entity_type_manager` să fie NULL. Funcția submitForm nu poate fi apelată fără instanțierea formularului, iar formularul necesită ca variabila să îi fie transmisă pentru a construi formularul. De aceea vă întreb cum ați diagnosticat că este NULL.
Baud avatar
drapel sa
$this->entity_type_manager este, de asemenea, NULL în funcția de validare...
No Sssweat avatar
drapel ua
Pentru că îl setați la null... `$entity_type_manager=NULL;`
Baud avatar
drapel sa
Dacă nu îl setez la NULL ca valoare implicită, am primit `$entity_type_manager nu trebuie accesat înainte de inițializare`
Jaypan avatar
drapel de
Atunci e o altă problemă.
Puncte:2
drapel cn

După cum puteți vedea în trimitere, $this->entity_type_manager este NULL

Trebuie să declarați proprietatea serviciului protejat. Proprietățile private nu pot fi restaurate. Vedea https://www.drupal.org/docs/drupal-apis/services-and-dependency-injection/dependency-injection-for-a-form#s-considerations-for-dependency-injection

.. și $form_state->get('entity_type_manager') este, de asemenea, NULL

Form_state nu este stocat în cache între prima compilare a formularului și cererea de trimitere. Vedea buildForm: cum se diferențiază între reîncărcarea paginii și apel invers Ajax?. Și când rulați formularul de compilare în solicitările ulterioare Ajax, suprascrieți valoarea stării formularului cu NULL.

Baud avatar
drapel sa
Aceasta este magie. Îmi salvezi ziua!!!

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.