0

このような例をあちこち探しましたが、見つかりませんでした。profile?arg1=113 のようなクエリ引数を含むパスのエイリアスを作成しようとしています。

パスのプレーンな文字列表現を提供path_save()するか、url().

url('profile', array('query' => array('arg1' => $uid)))

いずれにせよ、および=は、URL エイリアス管理ページにエスケープ文字として表示されます。これは当然、パスが見つからないことを意味します。

どうすれば維持できますか?および = エスケープされることから?

2012 年 12 月 19 日編集 1:より大きなコンテキストは、 Profile2プロファイルが保存されているときに (つまり、mymodule_profile2_presave() で)エイリアスを設定しようとしているということです。プログラムでエイリアスを設定します。

2012 年 12 月 19 日 編集 2:問題は挿入側にあるのではないことに気付きました - url_alias テーブルには、実際にはエスケープされていない文字が含まれています。問題は、Drupal がパスを使用する前に URL デコードしないことです...

12/20/12 編集 3:パス エイリアスの代わりにリダイレクトを使用するソリューションが見つかりました。Redirect はクエリ文字列を適切にデコードします!

4

1 に答える 1

0

クエリ文字列をエイリアスの宛先に添付することはできません。drupal_path_initialize()から実行されるコードは、クエリ文字列を正しく処理しません。

関数には次のコードが含まれています。

$_GET['q'] = drupal_get_normal_path($_GET['q']);

「node/93?uid=1」を指すパスエイリアスとして「example」があるとします。そのコードは に設定さ$_GET['q']れますが、を取得し、に設定されること'node/93?uid=1'を期待しています。$_GET['q']'node/93'$_GET['uid']1

あなたができることは、次のようなコードでhook_inbound_alter()を実装することです。

function mymodule_url_inbound_alter(&$path, $original_path, $path_language) {
  list ($path, $query) = explode('?', $path);
  $_GET += drupal_get_query_array($query);
}
于 2012-12-19T08:18:00.737 に答える