it-swarm.com.de

Wie kann ich einen Block für mein benutzerdefiniertes Formular erstellen?

Ich erstelle ein benutzerdefiniertes Formularmodul. Jetzt möchte ich mein Formular in einem Block anzeigen. Wie kann ich das machen ?

Hinweis: Ich erstelle MymoduleBlock.php im Pfad/modules/my-module/src/Plugin/Block mit diesem Code, aber es funktioniert nicht:

<?php

namespace Drupal\my-module\Plugin\Block;

use Drupal\Core\Form\FormInterface;
use Drupal\Core\Block\BlockBase;

class MymoduleBlock extends BlockBase {
  public function build() {
    $form = \Drupal::formBuilder()->getForm('Drupal\my-module\Form\MymoduleForm');
    return $form;
   }
}
3
RobinSon

Der Code in MymoduleBlock::build() ist korrekt und genau das macht Drupal core in UserLoginBlock::build() .

  $form = \Drupal::formBuilder()->getForm('Drupal\user\Form\UserLoginForm');
  unset($form['name']['#attributes']['autofocus']);
  // When unsetting field descriptions, also unset aria-describedby attributes
  // to avoid introducing an accessibility bug.
  // @todo Do this automatically in https://www.drupal.org/node/2547063.
  unset($form['name']['#description']);
  unset($form['name']['#attributes']['aria-describedby']);
  unset($form['pass']['#description']);
  unset($form['pass']['#attributes']['aria-describedby']);
  $form['name']['#size'] = 15;
  $form['pass']['#size'] = 15;

Was in der Blockdefinition fehlt, ist die Annotation (der Kommentar vor der Klasse), mit der Drupal diese Klasse als Plugin identifizieren kann. Sehen Sie, was Block API sagt. (Hervorhebung gehört mir.)

Blöcke sind eine Kombination aus einer Konfigurationsentität und einem Plugin . Die Konfigurationsentität speichert Platzierungsinformationen (Thema, Region, Gewichtung) und jede andere Konfiguration, die für den Block spezifisch ist. Das Block-Plugin rendert den Inhalt des Blocks für die Anzeige.

Block-Plugins verwenden die durch \Drupal\Core\Block\Annotation\Block definierten Annotationen . Weitere Informationen zu Anmerkungen finden Sie im Thema Anmerkungen .

In der Blockklasse, die ich als Beispiel verwendet habe, ist die Anmerkung die folgende.

/*
 * @Block(
 *   id = "user_login_block",
 *   admin_label = @Translation("User login"),
 *   category = @Translation("Forms")
 * )
 */

Außerdem sollte der Computername des Moduls keine Bindestriche enthalten, die in PHP -Funktionen nicht zulässig sind. Dies führt zu Problemen beim Implementieren von Hooks, da der Hook-Name vom Computernamen des Moduls abgeleitet wird Modul. Zum Beispiel wäre die Implementierung von hook_page_attachments() für Ihr Modul my-module_page_attachments(), was nicht akzeptabel ist PHP Funktionsname.
Wenn Sie der Meinung sind, dass Ihr Modul keine Hooks implementieren wird, denken Sie daran, dass die Mehrheit der Module mindestens hook_update_N () implementiert, für die es auch vorzuziehen ist, keine Großbuchstaben in der zu verwenden Modul Maschinenname.

7
kiamlaluno

Vorausgesetzt, Sie veröffentlichen Ihren gesamten Code, fehlen Anmerkungen in Ihrer Blockklasse. Anmerkungen werden von Drupal 8) verwendet, um Plugins zu registrieren.

Schauen Sie sich diesen Link an, um mit benutzerdefinierten Blöcken zu beginnen:

https://www.drupal.org/docs/8/creating-custom-modules/create-a-custom-block

Vergessen Sie nicht, Ihren Cache nach dem Erstellen Ihres Block-Plugins zu leeren.

P.S. Ich sehe, dass Sie Ihr Modul "mein-Modul" genannt haben. Bindestriche sind in Modulnamen nicht zulässig. Verwenden Sie Unterstriche. Weitere Informationen zur Benennung von Modulen finden Sie unter: https://www.drupal.org/docs/8/creating-custom-modules/naming-and-placing-your-drupal-8-module

2
mvdgun