web-dev-qa-db-ja.com

公開されたフィルターでビューページに宛先パラメーターと追加のクエリ文字列を含むURLを作成します

いくつかの公開されたフィルターを含むビューページがあります。以下のように、phpフィールドを使用してリンクを作成しました。

$url = '/admin/dashboard/applications/create/' . $row->nid . '?destination=' . current_path() . '&' . $_SERVER['QUERY_STRING'];
$link = '<a class="create-app" href="' . $url . '" title="Create application">App+</a>';

これにより、確認の[送信]または[キャンセル]ボタンのあるフォームページが表示されます。そのページの結果のURLは次のようになります。

http://www.site.com/admin/dashboard/applications/create/154575?destination=admin/dashboard/enquiries&nid=&field_enquiry_fname_value=&field_enquiry_email_value=&field_enquiry_country_tid=&field_enquiry_campaign_id_value=&field_enquiry_emailed_value=0&field_enquiry_stage_1_tid=All&field_enquiry_enabled_value=1

リダイレクトが行われると、?destination = admin/dashboard/enquiriesの後のクエリ文字列が削除されます。これはURLエンコードされていないために発生すると思います。

次に、以下のようにリンクをURLエンコードしてみました。

$query_string = array('destination' => current_path() . '&' . $_SERVER['QUERY_STRING']);
$url = url('admin/dashboard/applications/create/' . $row->nid, array('query' => $query_string));
$link = '<a class="create-app" href="' . $url . '" title="Create application">App+</a>';

これにより、次のURLが作成されます。

http://www.site.com/admin/dashboard/applications/create/154575?destination=admin/dashboard/enquiries%26nid%3D%26field_enquiry_fname_value%3D%26field_enquiry_email_value%3D%26field_enquiry_country_tid%3D%26field_enquiry_campaign_id_value%3D%26field_enquiry_emailed_value%3D0%26field_enquiry_stage_1_tid%3DAll%26field_enquiry_enabled_value%3D1

ここでの問題は、リダイレクトがビューページに戻ったときに、ビューがURLクエリを認識せず、ビューをロードせず、親メニューのコールバックにフォールバックすることです。

1
davewilly

宛先を手動で生成する代わりに、drupal_get_destination()を使用できます。したがって、上記のコードは次のようになります。

$url = url('admin/dashboard/applications/create/' . $row->nid, array('query' => drupal_get_destination()));
$link = '<a class="create-app" href="' . $url . '" title="Create application">App+</a>';

drupal_get_destination()は現在のパスを取得し、クエリ文字列をエンコードして宛先として作成します。これは以下のURLを生成します:

http://www.site.com/admin/dashboard/applications/create/154575?destination=admin/dashboard/enquiries%3Fnid%3D%26field_enquiry_fname_value%3D%26field_enquiry_email_value%3D%26field_enquiry_country_tid%3D%26field_enquiry_campaign_id_value%3D%26field_enquiry_emailed_value%3D0%26field_enquiry_stage_1_tid%3DAll%26field_enquiry_enabled_value%3D1

あなたのURLの代わりに。

http://www.site.com/admin/dashboard/applications/create/154575?destination=admin/dashboard/enquiries%26nid%3D%26field_enquiry_fname_value%3D%26field_enquiry_email_value%3D%26field_enquiry_country_tid%3D%26field_enquiry_campaign_id_value%3D%26field_enquiry_emailed_value%3D0%26field_enquiry_stage_1_tid%3DAll%26field_enquiry_enabled_value%3D1

違いは、「?」のエンコードです。ローカルD7インストールでテストしました。

1
vijaycs85

あなたができることはこれです:

送信/キャンセルフォームを直接変更するか、hook_form_alterを呼び出して非表示のアイテムを追加します

$destination = drupal_get_destination()
$form['destination'] = array(
  '#type' => 'hidden',
  '#value' => $destination['destination']
);

次に、2つのシナリオがあります。フォーム送信ハンドラを制御する場合は、簡単に行うことができます

function MY_MODULE_blah_blah_form_submit($form, &$form_state)
{
   ...
   $destination = urldecode($form_state['values']['destination']);
   $path_parts = explode('&', $destination);
   // The first path_part is your URL, the rest will make up the query_string.

   $url = array_shift($path_parts);
   $query = array();
   foreach($path_parts as $path_part)
   {
      list($key,$value) = explode('=', $path_part);
      $query[$key] = $value;
   }
   $form_state['redirect'] = array(
      $url,
      array(
          'query' => $query,
      ),
   );
}

または、フォームの2番目の送信ハンドラを作成します。これは、このハンドラの後で起動され、上記を自分で実装します。

いくつかの役立つ(そしてより詳細な情報): https://api.drupal.org/api/drupal/includes%21form.inc/function/drupal_redirect_form/7

1
GWPROD

個人的な経験から:宛先をデバッグするときは、編集を上書きしている可能性がある「ルール」モジュールの使用を必ず確認してください。

0