この記事では、このような通知のいくつかの実装の長所と短所について説明します。
例
内部サイト検索があります:
結果が1つだけの場合は、役に立たないリストをバイパスして、すぐに彼のページにリダイレクトします。
驚いたユーザー-幸せなユーザー
この方法でやるのが悪いというだけです。たとえば、ユーザーが探している間違ったVasya Pupkinを検索した場合、たとえば別のユーザーがいない場合はどうでしょうか。
解決策:Vasyaのプロファイルのあるページに、Vasya Pupkinが1つしかないという通知が表示され、現在彼のページが表示されています。
RESTに優しいソリューションではありません
ユーザーをVasyaページにリダイレクトする前に、セッションストレージに通知を表示したいというサインを書き込みます。
PHPの大まかな例:
<?php
function doRedirect($location) {
$_SESSION['show_notice'] = true;
header("Location: $location");
}
Vasyaのページを表示するとき、フラグを確認します。
<?php
if (@$_SESSION['show_notice']) {
... ...
}
この決定が悪いのはなぜですか?
1.ユーザーが同時に多くのページを開き始めると、実装に応じて、さまざまな興味深い効果(実際にはささいなこと)を観察できます。
2.ページ全体をキャッシュする場合、依存関係アカウンティングの問題はそれほど長くかかりません。
最初の問題はさまざまな方法で解決できますが、実際には、取得された複雑な条件とタイムアウトは、この情報がセッションに属さないことを示唆しています。
UPD:ところで、セッションの代わりにCookieを使用する場合、2番目の問題は解決策を見つけます。 最初の方がより強くエスカレートするのは残念です:)
これら2つの問題を回避するには、通知を表示するかどうかに関する情報をURL-eに渡す必要があります。
次の決定に進みます。
GETパラメーター
ここではすべてが単純です-たとえば、ユーザーをlocation / vasya /?に投げるだけですShow_notice = 1 :
<?php
function doRedirect($location) {
header("Location: $location?show_notice=1");
}
そして、テンプレートをレンダリングするとき、フラグをチェックします:
<?php
if (@$_GET['show_notice']) {
... ...
}
- 同時にページを開く際の不具合はありません。
- URLで「額」ページをキャッシュできます。
本物のRESTと2つのトラブルのみ:
- キャッシュした場合、ページはキャッシュ内に2回存在します-ブロックあり(ブロックなし)(基本的には些細なことです)。
- ユーザーは「?show_notice = 1」で他のリンクを提供し始めます-これはあまり良くありません..
document.location.hash
通知情報をプッシュする別の場所はハッシュです。
次のようになります:
<?php
function doRedirect($location) {
header("Location: $location#show_notice");
}
ユーザーは、たとえばlocalhost / vasya /#show_noticeに転送されます
GETパラメーターとは異なり、サーバーはこの情報を受け取らないため、たとえばJavascript + PrototypeJSを使用して、通知はクライアントにのみ表示されます。
<div id="notice" class="notice" style="display:none"> </div>
<script type="text/javascript">
if(document.location.hash == '#show_notice')) {
$("notice").show();
document.location.hash = '';
}
</script>
ページlocalhost / vasya /#show_noticeを読み込んだ直後に、アドレスが変更されます(リロードせずに!) localhost / vasya /#に変更されます(迷惑な格子は削除できませんが、再度問題はありません)。