POSTフォームのデータを外部URLに送信する必要があります。
Drupal 7では、
$form['#action'] = url('http://example.com', array('external' => true));
または多分これはGETのためでした。とにかく... Drupal 8では、これは機能しません。submitFormメソッドを編集してみました。
public function submitForm(array &$form, FormStateInterface $form_state) {
$response = new TrustedRedirectResponse('http://example.com');
$response->send();
}
これは機能しますが、リクエストとともにフォームの値を送信する方法が見つかりませんでした。 httpClientクラスを見ましたが、それはデータの送信/要求専用であり、ユーザーをリダイレクトしないようです。
誰かが私を助けてくれることを願っています。それが原因である場合は、代わりにGETを使用して問題ありません。
$form['#action']
は同じように機能します。Drupal 7またはDrupal 8.文字列が必要です。これは、url()
がDrupalで返すものです。 7. url()
が通常使用される理由は、url('comment/reply/'. $edit['nid'])
のように、コードにルーティング項目の相対パスがあるためです。
たとえば、Drupal 8では、Commentモジュールは次のコードを使用します。
$form['#action'] = $this->url('comment.reply', array('entity_type' => $entity->getEntityTypeId(), 'entity' => $entity->id(), 'field_name' => $field_name));
UrlGeneratorTrait::url()
、そのコードで呼び出されたメソッドは、オブジェクトではなく文字列を返します。この場合も、コードにルート名(comment.reply)があり、そのルートのURLを取得する必要があるため、UrlGeneratorTrait::url()
が使用されます。
次のコードは、Drupal 7およびDrupal 8で機能します。
$form['#action'] = 'http://example.com';
わかりました。 Drupal 7メソッドが機能することがわかりましたが、URLオブジェクトを送信する必要がなくなり、URLを含む文字列だけが送信されました。したがって、
$form['#action'] = url('http://example.com', array('external' => true));
単純になる
$form['#action'] = 'http://example.com';
サンプルコードは、単純なリダイレクトで問題なく機能します。
ただし、データを外部URLに投稿する場合、これは機能するはずです。
$response = \Drupal::httpClient()->post($Host, [
'form_params' => $fields,
'headers' => [
'Content-type' => 'application/x-www-form-urlencoded',
],
]);