web-dev-qa-db-ja.com

プログラムでsidによってWebform Submissionを更新する

プログラムでWebform Submissionを作成/更新しようとしています。 Drupal 8 [〜#〜] api [〜#〜] に従って新しい提出物を作成する方法をすでに知っています。現在、更新メソッドを作成しようとしています。WebformモジュールのソースコードとAPIドキュメントを参照していますが、解決策が見つかりませんでした。 Drupal 8.3のwebform_get_submissionwebform_submission_update関数も削除されていると思います。

$values = [
  'webform_id' => 'attendees_info',
  'in_draft' => FALSE,
  'uid' => $uid,
  'langcode' => 'en',
  'token' => 'at_'.$token,
  'uri' => '/webform/attendees/api',
  'remote_addr' => '',
  'data' => [
    'name' => $name,
    'email' => $email,
    'gallery_url' => 'gallery/'.$token,
  ],
];

$webform = Webform::load($values['webform_id']);
$is_open = WebformSubmissionForm::isOpen($webform);

if ($is_open === TRUE) {
    // Validate submission.
    $errors = WebformSubmissionForm::validateValues($values);

    // Check there are no validation errors.
    if (!empty($errors)) {
       return $errors;
    }
    else {
      // Submit values and get submission ID.
      $webform_submission = WebformSubmissionForm::submitValues($values);
      return $webform_submission->id();
    }
}

上記は送信作成コードですが、更新メソッドの実行方法がわかりません。誰かが以前にこの問題に直面していますか?誰かがこれを助けてくれることを願っています、ありがとう。

1
batMask

\ Drupal\webform\WebformSubmissionInterface :: getData();\ Drupal\webform\WebformSubmissionInterface :: setData($ data);を使用してみてください

// Load submission using sid.
/** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
$webform_submission = \Drupal\webform\Entity\WebformSubmission::load($sid);

// Get submission data.
$data = $webform_submission->getData();

// Change submission data.
$data['element_key'] = 'custom_element_value';

// Set submission data.
$webform_submission->setData($data);

// Save submission.
$webform_submission->save();

更新:クラス名の「エンティティー」に大文字の「E」を使用します。 (最近更新されました)。

9
jrockowitz

jrockowitz'sabove コードは正しいクリーンなアプローチです。以下も動作し、共有したかっただけです。

$query = \Drupal::database()->merge('webform_submission_data');
$query->key([
    'sid' => $sid,
    'name' => 'your_custom_key',
])->fields([
    'value' => 'your_value',
]);
$query->execute();
0
batMask