web-dev-qa-db-ja.com

Webフォーム送信からノードを作成する方法は?

Drupal 8.でWebフォーム送信からノードを作成できるようにしたい。これは、送信が成功したとき、またはWebフォームが送信された後の追加タスクとして発生する可能性がある。 REST/GETを介したコンテンツエンティティの作成に関するいくつかの情報を見た( https://www.drupal.org/docs/8/core/modules/rest/3-post-for-creating-content-entities =)そして、x-www-form-urlencodedまたはJSONのいずれかを使用してWebform(yamlform)のURLにWebform送信を投稿できることを知っていますが、これが正しいことかどうかわかりません。

使用したいWebフォーム、送信、コンテンツタイプはすべて同じサイトにあります。

この質問がDrupal 7で発生し、コンテンツタイプを使用するよう指示されていましたが、現時点では送信者がコンテンツタイプを使用することを許可することはできません。サイトのセットアップ方法。

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

@ owenpm3からの回答は、これを管理義務として追加するのに最適です。

これを自動化し、送信が成功したときにそれを発生させるには、送信が成功したときにメールを送信するようにフォームを構成するのと同じ方法で、構成設定でフォームに追加するカスタムWebformHandlerを作成します。したがって、Webフォームの[設定]タブのサブタブである[メール/ハンドラー]をクリックします。

これをビルドするには、カスタムモジュールmymoduleを作成し、カスタムWebフォームハンドラーをmymodule/src/Plugin/WebformHandler /に配置する必要があります。

WebformHandler MyWebformHandler.phpを呼び出します。これとは別に、infoファイルが必要です。これで十分です。

MyWebformHandler.phpのコードは次のとおりです。

<?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

また、 Webform Content Creator モジュールも確認してください。

このモジュールは、Webフォームの送信後にノードを作成し、作成されたノードのフィールドとWebフォーム送信値の間のマッピングを行う機能を提供します。

1
jrockowitz