Ich muss das Entitätsformular für meine benutzerdefinierte Entität programmgesteuert generieren - im Grunde die gleiche Ausgabe erhalten, die beim Aufrufen auftritt
\Drupal::formBuilder()->getForm('form namespace')
Wenn ich versuche, dies mit meinem Entitätsformular zu tun, wird folgende Fehlermeldung angezeigt :
Call to a member function getEntityTypeId() on null in Drupal\Core\Entity\EntityForm->getBaseFormId() (line 77 of core/lib/Drupal/Core/Entity/EntityForm.php).
Wirklich ratlos, wie es weitergehen soll.
Hier ist eine verschleierte Version des Codes, den ich verwende
Entitätsdefinition:
/**
* Defines the My Entity entity.
*
* @ingroup my_module
*
* @ContentEntityType(
* id = "my_entity",
* label = @Translation("My Entity"),
* handlers = {
* "view_builder" = "Drupal\Core\Entity\EntityViewBuilder",
* "list_builder" = "Drupal\my_module\MyEntityListBuilder",
* "views_data" = "Drupal\my_module\Entity\MyEntityViewsData",
* "translation" = "Drupal\my_module\MyEntityTranslationHandler",
*
* "form" = {
* "default" = "Drupal\my_module\Form\MyEntityForm",
* "add" = "Drupal\my_module\Form\MyEntityForm",
* "edit" = "Drupal\my_module\Form\MyEntityForm",
* "delete" = "Drupal\my_module\Form\MyEntityDeleteForm",
* },
* "access" = "Drupal\my_module\MyEntityAccessControlHandler",
* "route_provider" = {
* "html" = "Drupal\my_module\MyEntityHtmlRouteProvider",
* },
* },
* base_table = "my_entity",
* data_table = "my_entity_field_data",
* translatable = TRUE,
* admin_permission = "administer as my_entity entities",
* entity_keys = {
* "id" = "id",
* "label" = "name",
* "uuid" = "uuid",
* "uid" = "user_id",
* "langcode" = "langcode",
* "status" = "status",
* },
* links = {
* "canonical" = "/admin/structure/my_entity/{my_entity}",
* "add-form" = "/admin/structure/my_entity/add",
* "edit-form" = "/admin/structure/my_entity/{my_entity}/edit",
* "delete-form" = "/admin/structure/my_entity/{my_entity}/delete",
* "collection" = "/admin/structure/my_entity",
* },
* field_ui_base_route = "my_entity.settings",
* constraints = {
* "CustomContraint" = {}
* }
* )
*/
class MyEntity extends ContentEntityBase implements MyEntityInterface {
Formular-Namespace
namespace Drupal\my_module\Form;
use Drupal\Core\Entity\ContentEntityForm;
use Drupal\Core\Form\FormStateInterface;
/**
* Form controller for My Entity edit forms.
*
* @ingroup my_module
*/
class MyEntityForm extends ContentEntityForm {
Okay, das habe ich bisher gefunden. Die Antwort des Benutzers funktioniert teilweise. Ich musste meiner Container-Formularklasse auch eine Dummy-Funktion hinzufügen, um einen Rückruffehler zu umgehen, der folgendermaßen aussah:
public function processForm($element, FormStateInterface $form_state, $form)
{
return $element;
}
Dies ist wahrscheinlich nicht der richtige Weg, aber es führt zu einem Formularobjekt, das in einem anderen Formular gerendert wird.
Antworten:
Sie können den Builder-Service für Entitätsformulare verwenden. Ich konnte das Benutzerformular auf diese Weise laden (wobei $ entity der aktuelle Benutzer ist):
Wenn Sie das Benutzerregisterformular erhalten möchten (bei dem es sich im Grunde um ein Entitätsformular ohne gespeicherte Entität handelt), können Sie einfach die Methode create für Ihre Entitätsklasse verwenden, bevor Sie es an das Formular übergeben:
quelle
Entitätsformulare funktionieren ohne Entität nicht. Wenn Sie ein leeres Formular möchten, verwenden Sie eine neu erstellte Entitätsinstanz. Sie können dieses Beispiel aus der Knotenentität verwenden:
Der Entity Form Builder wird in die Controller-Basisklasse eingefügt. Normalerweise verwenden Sie einen Controller, um Entitätsformulare zu erstellen.
Beim Erstellen eines Knotens müssen Sie ein Bundle (Inhaltstyp) definieren, für das das Entitätsformular erstellt wird. Wenn Ihre Entität keine Bundles hat, können Sie ein leeres Array verwenden.
Bemerkungen
Kommentare erfordern mehr Arbeit, da sie an ein Entitätsfeld angehängt sind.
Beispiel zum Erstellen eines Formulars für das Kommentarfeld eines Knotens:
Oder dasselbe außerhalb eines Controllers ohne injizierte Dienste:
quelle
Zur Verdeutlichung funktioniert der folgende Code in Drupal 8.2.x für mich:
quelle