web-dev-qa-db-ja.com

フォームを外部URLに投稿する

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を使用して問題ありません。

2
qualverse

$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';
3
kiamlaluno

わかりました。 Drupal 7メソッドが機能することがわかりましたが、URLオブジェクトを送信する必要がなくなり、URLを含む文字列だけが送信されました。したがって、

$form['#action'] = url('http://example.com', array('external' => true));

単純になる

$form['#action'] = 'http://example.com';

1
qualverse

サンプルコードは、単純なリダイレクトで問題なく機能します。

ただし、データを外部URLに投稿する場合、これは機能するはずです。

$response = \Drupal::httpClient()->post($Host, [
        'form_params' => $fields,
        'headers' => [
          'Content-type' => 'application/x-www-form-urlencoded',
        ],
    ]);

https://drupal.stackexchange.com/a/288929/18756 で同様の質問に回答

0