it-swarm.com.de

Wie kann ich eine benutzerdefinierte Entitätsoperation mit einer Webformularübermittlung durchführen?

Mein Mangel an D8-Erfahrung wird zeigen, wie viele Unbekannte ich hier habe. Ich hoffe, jemand kann einige der Stücke für mich verlinken.

Ich habe eine benutzerdefinierte Aktion mit hook_entity_operation_alter() auf der Seite admin/struktur/webform/manage/dis_document_generator/results/submissions erstellt siehe unten. Ich vermute, dass dies auf verschiedenen anderen Seiten angezeigt wird, was in Ordnung ist.

Wie Sie sehen, ist die URL derzeit auf die aktuelle Seite eingestellt, dies muss sich jedoch ändern, sobald ich eine Controller-Umleitung zu habe. Es wäre auch schön, diesen Vorgang über einen Controller anstelle eines Hooks hinzuzufügen, aber das ist im Moment nicht wichtig.

    /**
     * Implements hook_entity_operation_alter()
     */
    function dis_doc_gen_entity_operation_alter(array &$operations, \Drupal\Core\Entity\EntityInterface $entity) {
      if ($entity->getEntityTypeId() === 'webform_submission' && $entity->bundle() === 'dis_document_generator') {

        static $operation;
        static $permission;

        if (is_null($operation)) {
          $user = \Drupal::currentUser();
          $permission = $user->hasPermission('utilize mq client');

          $url = \Drupal\Core\Url::fromRoute('<current>');

          $operation = [
            'title' => t('Send XML'),
            'weight' => 8,
            'url' => $url,
          ];
        }

        if ($permission) {
          $operations['send_xml'] = $operation;
        }
      }
    }

Ich habe WebformSubmissionNotesForm.php als Beispiel verwendet, um einen Controller zu erstellen, da er relativ einfach aussah, aber ich bin mir nicht sicher, ob er die beste Wahl ist, da ich eigentlich kein Formular benötige. Ich werde nur eine Aktion ausführen und dann zurückkehren, sie jedoch erst einmal verwenden.

Der Router dafür ist folgender:

entity.webform_submission.notes_form:
  path: '/admin/structure/webform/manage/{webform}/submission/{webform_submission}/notes'
  defaults:
    _entity_form: 'webform_submission.notes'
    _title_callback: '\Drupal\webform\Controller\WebformSubmissionViewController::title'
  requirements:
    _entity_access: 'webform_submission.notes'

Wenn mein Modul dis_doc_gen heißt, stelle ich fest, dass meine Router-Details so aussehen sollten?:

dis_doc_gen.webform_submission.sendxml:
  path: '/admin/structure/webform/manage/{webform}/submission/{webform_submission}/sendxml'
  defaults:
    _entity_form: 'dis_doc_gen.sendxml'
    _title_callback: 'Send XML'
  requirements:
    _entity_access: 'dis_doc_gen.utilize_mq_client'

wo meine Erlaubnis utilize mq client heißt und ich glaube, dass sie hier als dis_doc_gen.utilize_mq_client dargestellt wird.

Schließlich befindet sich WebformSubmissionNotesForm.php unter webform/src. Das einzige Plugin, das ich für mein Webformular erstellt habe, musste unter webform/src/Plugin/WebformHandler Untergehen. Daher frage ich mich, da dies aus einer Webform-Übermittlung hervorgeht, ob ich einen Controller unter folgender Adresse platzieren muss:

  • webform/src Oder
  • webform/src/Plugin/WebformHandler Oder
  • webform/src/Plugin/WebformSubmissionHandler.

Zuletzt definiert das Webformular WebformSubmissionNotesForm in seinem Header wie folgt:

<?php
/**
 * Defines the WebformSubmission entity.
 *
 * @ingroup webform
 *
 * @ContentEntityType(
 *   handlers = {
 *     "form" = {
 *       "notes" = "Drupal\webform\WebformSubmissionNotesForm",

Da ich das für meinen neuen Controller nicht so fest codieren kann, ist das in Ordnung, da ich meinen Controller einfach über die Schnittstelle anschließen kann.

2
user5429087

Es scheint, dass die Antwort darin bestand, einen Tag (und ein bisschen) damit zu verbringen, nur das Innenleben von D8 zu studieren und zu erkennen, wie viel für Sie getan wird, was in D7 nicht der Fall war.

Letztendlich möchte ich die Aktion an einen Controller senden, nicht an ein Plugin, und die primäre Quelle, um genügend Erdung zu erhalten, um dies herauszufinden, kam aus folgenden Gründen:

1
user5429087