いくつかの公開されたフィルターを含むビューページがあります。以下のように、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クエリを認識せず、ビューをロードせず、親メニューのコールバックにフォールバックすることです。
宛先を手動で生成する代わりに、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インストールでテストしました。
あなたができることはこれです:
送信/キャンセルフォームを直接変更するか、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
個人的な経験から:宛先をデバッグするときは、編集を上書きしている可能性がある「ルール」モジュールの使用を必ず確認してください。