Puncte:2

Blocați setările din formular

drapel in

Vă rog, am nevoie de ajutor cu codul meu. Am un formular și un bloc create programatic. Blocul încorporează formularul pentru a-l afișa pe front-end.Blocul are și unele setări (text prefix de formă). Vreau să încarc setările de bloc în interiorul meu buildForm în Form.php meu pentru a obține textul prefixului și a-l afișa în câmpul de markup al formularului. Dar se pare că nu găsesc o modalitate de a transmite $block_id la buildForm() astfel încât să poată încărca blocul.

Am un scenariu în care pot exista două dintre aceste blocuri pe aceeași pagină în care Drupal unifică blocul prin adăugarea unui ID cu ID-ul blocului. Deci, de exemplu, pagina mea are două dintre aceste blocuri unul ar fi feedbackblock celălalt ar fi feedbackblock_2 prin urmare, nu pot codifica ID-ul blocului pentru a-l încărca în funcția mea buildForm.

Vreau să treacă în mod dinamic ID-ul blocului în formular.

build() din Block.php meu:

  public function build() {
    $block_id // obține id-ul de bloc al instanței blocului curent
    $feedback_form = $this->formBuilder->getForm(FeedbackForm::class, $block_id);

    $build = [];
    $build['#theme'] = 'feedback_block';
    $build['feedback_block']['#markup'] = randare($feedback_form);

    returnează $build;
  }

buildForm din FeedbackForm.php meu:

  funcția publică buildForm(array $form, FormStateInterface $form_state, șir $block_id) {
      // Obțineți ID-ul blocului aici.
  }

Există vreo modalitate de a realiza acest lucru?

Kevin avatar
drapel in
$feedback_form este deja un tablou de randare, nu trebuie să îl redați. Setați-o la o variabilă, lăsați Drupal să facă treaba.
Kevin avatar
drapel in
De asemenea: https://drupal.stackexchange.com/a/199929/57
New To 'C' avatar
drapel in
Mulțumesc pentru link, dar l-am văzut deja și asta nu va funcționa în cazul meu, deoarece nu am un routing.yml și nu am nevoie de unul. Doar creez un bloc și un bloc de formular arată acel formular și blocul poate fi afișat oriunde pe site, indiferent de rută.
Kevin avatar
drapel in
Nu aveți nevoie de un yaml de rutare. Citiți răspunsul. " când utilizați parametri în formulare, trebuie să setați o valoare nulă în lista de parametri"
New To 'C' avatar
drapel in
O, mulțumesc amice! A funcționat, aș vrea să pot vota în favoarea comentariului tău, dar nu am opțiunea. Acum pot să trec un arg suplimentar la buildForm(). Dar cum pot obține în mod dinamic ID-ul de bloc al instanței de bloc curent?
Kevin avatar
drapel in
Nu înțeleg ce vrei să spui în mod dinamic?
New To 'C' avatar
drapel in
De exemplu, pagina mea are două dintre aceste blocuri, așa că Drupal le atribuie ID-uri unice (nume de mașini). Unul ar fi ca feedbackblock, iar altul ar merge ca feedbackblock_2, acesta este comportamentul implicit Drupal, nu ceva ce fac eu. Drupal unifică blocurile dacă există două pe aceeași pagină. Deci, cum pot obține acest nume unic de mașină pentru fiecare dintre ele și să-l transmit la buildForm()?
Puncte:2
drapel cn

Există un strat de abstecție între stocarea configurației blocului și clădirea vizualizării blocului. Configurația blocurilor poate fi stocată oriunde și nu are neapărat un nume de mașină.Cu toate acestea, puteți transfera numele mașinii în setările blocului atunci când plasați un bloc în Aspect bloc:

utilizați Drupal\block\BlockInterface;

/**
 * Implementează hook_ENTITY_TYPE_presave() pentru entitățile bloc.
 */
function mymodule_block_presave(BlockInterface $bloc) {
  if ($bloc->isNew()) {
    $settings = $block->get('settings');
    $settings['block_id'] = $block->get('id');
    $block->set('settings', $settings);
  }
}

Apoi puteți obține numele mașinii în build():

  public function build() {
    // obțineți ID-ul de bloc al instanței de bloc curent
    $block_id = !empty($this->configuration['block_id']) ? $this->configuration['block_id'] : '';

Ca o notă secundară. Nu cred că restul codului din întrebare funcționează. Trebuie să adăugați ID-ul unic la instanța de formular înainte de a apela formBuilder->getForm() și apoi să îl utilizați pentru a crea un ID unic de formular. După aceea, buildForm() poate obține ID-ul de la proprietatea clasei. Vedea Folosind același formular de mai multe ori pe pagină cu apeluri AJAX

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.