直前のページのURLを拾う方法

質問全般・改善要望
maki
メンバー
メンバー
記事: 7
登録日時: 2016年10月28日(金) 20:44

直前のページのURLを拾う方法

投稿記事by maki » 2017年11月13日(月) 19:03

いつもお世話になります。
お問い合わせフォームでどのページからの問い合わせだったのかを拾い、フォームで送る仕様にするため、直前のページのURLを拾うスニペットを
return $_SERVER['HTTP_REFERER'];
として作ってみたのですが、どうも動作が不安定で、値を拾ったり拾わなかったりします。PHPが不得手で申し訳ありません。
MODxの機能を使って安定的に取得する方法があれば教えていただけると助かります。
どうぞよろしくおねがいいたします。
maki
メンバー
メンバー
記事: 7
登録日時: 2016年10月28日(金) 20:44

直前のページのURLを拾う方法

投稿記事by maki » 2017年11月14日(火) 16:00

すみません、追記です。どうやら私の勘違いで、動作が不安定なのではなく、いったんキャッシュに入ったデータがフォームを送信するまで温存されてしまうようです。フォーム送信にはcfFormMailerを使っています。
事象はこうです。
Aという画面からフォーム入力画面に行く→確認画面に行く(確認画面にはAから遷移したと記載されている)→送信はやめてBというページに遷移する→Bからフォーム入力画面に行く→確認画面に行く
すると、確認画面にはAから遷移したと記載されたままになっており、Bから遷移してきた情報が入りません。
ですので、最初に入ってしまった情報が都度クリアされればよいのですが。。。
mod_kks
メンバー
メンバー
記事: 3
登録日時: 2017年11月04日(土) 01:31

直前のページのURLを拾う方法

投稿記事by mod_kks » 2017年11月16日(木) 00:36

フォーム入力画面→確認画面の受け渡しでリファラをどのように受け渡しているのかが不明ですが、「フォームデータが変化しない」とのことなので、cfFormMailerで定義したinputでの受け渡しをしているものと仮定します。
cfFormMailerは確認画面から入力画面に戻った時のために、入力された項目のデータを一旦セッションに退避させて、戻った場合に入力値を戻すという動作が含まれています。この時退避したデータが次に入力画面に入った際復元されてしまうということでしょう。

スニペット本体「class.cfFormMailer.inc.php」の122行目あたりに退避、338行目あたりから復元の動作になっているのですが、338行目あたりに「復元処理しないタグ」というコメントがあり、この条件文で復元しない(リセットしたい)項目を追加することができます。方法としては次のような形になります。

※こんな形かどうかわかりませんが、例えば以下のようにしていた場合
<input type="hidden" name="f_page" id="f_page" value="[!referer!]">

※class.cfFormMailer.inc.php:338行目付近
// 復元処理しないタグ
if ($fieldName == 'f_page' || $fieldName == '_mode' || $fieldType == 'submit' || $fieldType == 'image' || $fieldType == 'file' || $fieldType == 'button') continue;

$fieldNameはname属性値のことで、これが定義したタグのname属性と合致していれば、リファラが必ず入るかどうか、また正しいかどうかは別として、とりあえず項目の復元回避はできると思います。

意図しているものかどうかわかりませんが参考までに。