it-swarm.com.de

Wie erstelle ich einen Knoten aus einer Webformularübermittlung?

Ich möchte in der Lage sein, einen Knoten aus einer Webformularübermittlung in Drupal 8.) zu erstellen. Dies kann entweder bei erfolgreicher Übermittlung oder als zusätzliche Aufgabe nach dem Übermitteln des Webformulars geschehen. I ' Ich habe einige Informationen zum Erstellen von Inhaltsentitäten über REST/GET gesehen ( https://www.drupal.org/docs/8/core/modules/rest/3-post-for-creating-content-entities =) und ich weiß, dass Sie eine Webform-Übermittlung an eine URL mit Webform (yamlform) senden können, indem Sie entweder x-www-form-urlencoded oder JSON verwenden, aber ich bin mir nicht sicher, ob dies überhaupt das Richtige ist.

Das Webformular, die Übermittlungen und der Inhaltstyp, den ich verwenden möchte, befinden sich alle auf derselben Website.

Ich weiß, dass diese Frage für Drupal 7) gestellt wurde und die Anweisung lautete, dass sie einen Inhaltstyp verwenden sollen, aber wir können den Einreichern derzeit nicht erlauben, Inhaltstypen zu verwenden, da Art und Weise, wie die Site eingerichtet ist.

2
owenpm3
<?php

/**
 * Convert webform submission to "Bulletin" content type.
 */

namespace Drupal\subtonode\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\webform\Entity\WebformSubmission;
use Drupal\node\Entity\Node;
use Symfony\Component\HttpFoundation\RedirectResponse;

class SubToNodeController extends ControllerBase {
  public function subtonode($webform_submission) {
    //$sid = 2;
    $node_details = WebformSubmission::load($webform_submission);
    $submission_array = $node_details->getOriginalData();
    $title = $submission_array['title'];
    $body = $submission_array['body'];
    $contact_name = $submission_array['contact_name'];
    $contact_email = $submission_array['contact_email'];
    $contact_website_uri = $submission_array['website'];
    $contact_website_title = $submission_array['website'];
    $des_pub_date = $submission_array['bulletin_publish_date'];
    $image_fid = $submission_array['image'];


// Create file object from remote URL.
    if (!empty($image_fid)) {
      $file = \Drupal\file\Entity\File::load($image_fid);
      $path = $file->getFileUri();
      $data = file_get_contents($path);
      $node_img_file = file_save_data($data, 'public://' . $file->getFilename(), FILE_EXISTS_REPLACE);
    }

    $timestamp = date("Y-m-d\TH:i:s", strtotime($des_pub_date));

// Create node object with attached file.
    $node = Node::create([
      'type' => 'bulletin',
      'title' => $title,
      'body' => [
        'value' => $body,
        'summary' => '',
        'format' => 'markdown',
      ],
      'field_bulletin_contact_name' => $contact_name,
      'field_bulletin_contact_email' => $contact_email,
      'field_bulletin_desired_publicati' => $timestamp,
      'field_bulletin_reference_submiss' => [
        'target_id' => $webform_submission,
      ],
      'field_bulletin_contact_website' => [
        'uri' => $contact_website_uri,
        'title' => $contact_website_title,
      ],
      'field_photo' => [
        'target_id' => (!empty($node_img_file) ? $node_img_file->id() : NULL),
        'alt' => 'Hello world',
        'title' => 'Goodbye world'
      ],
    ]);

    if (!empty($submission_array['audience'])) {
      $target_ids_aud = $submission_array['audience'];
      foreach ($target_ids_aud as $target_id) {
        $node->field_bulletin_audience->AppendItem($target_id);
      }
    }

    if (!empty($submission_array['category'])) {
      $target_ids_cat = $submission_array['category'];
      foreach ($target_ids_cat as $target_id) {
        $node->field_bulletin_category->AppendItem($target_id);
      }
    }

    $node->save();

    $url = '/admin/content/webform';
    $response = new RedirectResponse($url);
    //$response->send(); // don't send the response yourself inside controller and form.

    drupal_set_message(t('You have successfully created a node from webform submission @sid', array('@sid' => $webform_submission)), 'success');
    return $response->send();
  }
}
4
owenpm3

Die Antwort von @ owenpm3 ist großartig, um dies als Verwaltungsaufgabe hinzuzufügen.

Um dies zu automatisieren und bei einer erfolgreichen Übermittlung auftreten zu lassen, würde ich einen benutzerdefinierten WebformHandler erstellen, den Sie in den Konfigurationseinstellungen zu Ihrem Formular hinzufügen, genauso wie Sie Ihr Formular so konfigurieren, dass bei erfolgreicher Übermittlung eine E-Mail gesendet wird. Also auf der Registerkarte Einstellungen für Webformulare unter der Unterregisterkarte: E-Mails/Handler.

Um dies zu erstellen, müssten Sie ein benutzerdefiniertes Modul, mymodule, erstellen und den benutzerdefinierten Webform-Handler platzieren in: mymodule/src/Plugin/WebformHandler /

Ich werde den WebformHandler MyWebformHandler.php aufrufen. Abgesehen davon benötigen Sie eine Info-Datei und das sollte es tun.

Code für MyWebformHandler.php wie folgt:

<?php

namespace Drupal\mymodule\Plugin\WebformHandler;

use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Serialization\Yaml;
use Drupal\Core\Form\FormStateInterface;
use Drupal\node\Entity\Node;
use Drupal\webform\WebformInterface;
use Drupal\webform\Plugin\WebformHandlerBase;
use Drupal\webform\webformSubmissionInterface;
use Drupal\webform\Entity\WebformSubmission;


/**
 * Create a new Article node from a webform submission.
 *
 * @WebformHandler(
 *   id = "article_from_webform",
 *   label = @Translation("Create a node on submit"),
 *   category = @Translation("Content"),
 *   description = @Translation("Creates a new Article node from Webform Submissions."),
 *   cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_UNLIMITED,
 *   results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
 *   submission = \Drupal\webform\Plugin\WebformHandlerInterface::SUBMISSION_REQUIRED,
 * )
 */

class MyWebformHandler extends WebformHandlerBase {

  public function submitForm(array &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {

    // Get an array of form field values.
    $submission_array = $webform_submission->getData();

    // Dump the $submission_array to acquire the fields if you don't know what fields you're working with. 

    // Prepare variables for use in the node.  
    $title = $submission_array['subject'];
    $body = "<p>" . $submission_array['name'] . "<br/>";
    $body .= $submission_array['email'] . "</p>";
    $body .= $submission_array['message'];

    // Create the node.
    $node = Node::create([
      'type' => 'article',
      'status' => FALSE,
      'title' => $title,

      'body' => [
        'value' => $body,
        'format' => 'basic_html',
      ],

    ]);

    // Save the node. 
    $node->save();
  }
}
3
Andrew Wasson

Schauen Sie sich auch das Modul Webform Content Creator an.

Dieses Modul bietet die Möglichkeit, Knoten nach dem Senden von Webformularen zu erstellen und Zuordnungen zwischen den Feldern des erstellten Knotens und den Werten für das Senden von Webformularen vorzunehmen.

1
jrockowitz