2

クリックしたときにサイト全体で URL パラメータを保持する方法はありますか? 最初のページに url パラメーターを設定して、次のページに表示される内容を決定するデモ サイトに取り組んでいます。私はセッション変数を使用しますが、内部ユーザーは相互にリンクを共有する可能性が高く、セッションは存在しません。グーグルで検索してみましたが、返されるのは Cake のような php フレームワークに関連する記事だけです。フレームワークを使わずにこれを達成する方法はありますか?

フローの例:

  • ページを選択 > ユーザーがユースケースを選択し、送信を押してデモサイトを表示
  • 内部ページ > URL パラメータを検出し、ユース ケースに基づいてデータを表示します。
  • ユーザーがデモ サイトをクリックすると、パラメーターが保持されるため、関連するデータが表示されます。
  • ユーザーが選択ページに戻ると、新しいユースケースを選択して上記のアクションを繰り返すことができます。
4

4 に答える 4

1

あなたが説明しているのはCookieですが、URLには表示されません。

ユースケースの場合、talkolが2番目のアイデアで説明しているように、最善の解決策はURLと相対リンクのパスプレフィックスです。リンクを相対的なものに保つ限り、サーバー側で余分な作業を行う必要はありません。

2番目のオプションは、出力バッファリングURLリライター(output_add_rewrite_varを参照)を使用して、アプリケーションから生成された出力を解析し、リンクを置き換えることです。しかし、それは少しばかげたアプローチです。大規模なアプリケーションがあり、それを変更したくない場合は合理的です。

他のすべての方法は、特殊関数またはフレームワークの関数を使用してPHPでリンクを生成することです。

于 2013-02-03T22:05:08.330 に答える
1

url パラメーターをセレクションに追加するだけで、常にすべての内部リンクで見つかるようにすることができます。変更が多すぎるため、そうしたくないと思います。

いくつかの代替案:

アイデア 1:

初期選択をセッション内または Cookie 内に保存します。また、選択を保持するすべてのページにオプションの url パラメータを追加します。すべての内部リンクを変更しないようにするには、選択 URL パラメーターが指定されているかどうかをサーバー側で確認してください。そうでない場合は、(セッション/Cookie に従って) url パラメータを追加して、すぐに同じ URL にリダイレクトします。このようにして、すべての内部リンクをどこでも変更することなく、url パラメータが常に表示され、ユーザーは引き続きリンクを共有できます。

$_SESSION['sel']実装のために、セッション変数がで、オプションの URL パラメータが であると仮定しましょうpsel。サイト内のすべてのページが php 経由で提供されていると仮定しましょう。次の php 行がすべてのページの上部に表示されます (個別の php ファイルに配置して、各ページに含めることができます)。

if (!isset($_REQUEST['psel']))
{
  header('Location: '.$_SERVER['REQUEST_URI'].'&psel='.$_SESSION['sel']);
  exit;
}

これは疑似コードです。私は iPad を使用しているので、少し短くて完璧でない場合はご容赦ください。この行は、URL パラメーターが定義されているかどうかを確認し、定義されていない場合は (同じページに) リダイレクトし、セッション変数に従って定義します。このように、URL パラメータを含まない内部リンクがある場合でも、このリダイレクトによって追加されます。リクエスト uri に小さなバグがあり?ます。修正させていただきます。

このコードはすべての内部リンクを変更するわけではなく、次のことだけを行います: 内部リンクが訪問され、URL パラメーターが省略されている場合 (通常はそうであるように)、このコードは、パラメーターとリダイレクトなしでページが表示されないようにします。パラメータと同じページに。

もう 1 つの重要なコードは、URL パラメータが定義されている場合に備えて、セッション変数を変更することです。これは、上記のコードにこのelseブロックを追加することで実行できます:

else $_SESSION['sel'] = $_REQUEST['psel'];

このように、URL が 2 人のユーザーによって共有されている場合、常にpselURL パラメータが含まれ、新しいユーザーが最初にアクセスしたときに、それに応じてセッション変数が設定されます。

アイデア 2:

選択ごとに「偽の」ディレクトリを作成します。たとえば、サイトがhttp://example.com/index.phpだったとします。この場合、http://example.com/sel1/index.phpとhttp://example.com/sel2/indexになります。 php。これらのディレクトリは実際のものではなく、.htaccess の書き換え (または FS のシンボリック リンクでさえも) を使用すると、実際には元のファイルを指します。ただし、パスにこの魔法のパラメーターが含まれるようになりました。これは、すべての相対リンクでパスが同じままであるため便利です。つまり、すべての内部リンクを変更する必要はありません。現在の選択にアクセスする必要がある場合は、現在の URL のパスを解析することで簡単に取得できます。

このアイデアは、リダイレクトなしで同じことを達成するので、少し良いと思います。シンボリック リンクで説明するのが最も簡単ですが、これは .htaccess 書き換えルールでも実行できることに注意してください。Linux のシンボリック リンクは、別のパスにリンクするパスです。次のコンソール コマンドを実行すると (通常はサーバーで SSH を使用):

ln -s . sel1
ln -s . sel2

内に 2 つのディレクトリが作成されます。(ローカル ディレクトリ)、sel1 および sel2 という名前ですが、これらは元の現在のディレクトリへのリンクにすぎません。この現在のディレクトリが Web サーバーのドキュメント ルートである場合、以下にアクセスすることになります。

http://example.com/sel1/index.php

実際にアクセスします:

http://example.com/index.php

これはディレクトリのコピーではないことに注意してください。ローカル ディレクトリ内の index.php やその他のファイルに変更を加えると、これらの変更も反映されます/sel1/sel2

これはどのように役立ちますか? 通常のサイトにアクセスする代わりに、選択 2 を表示したい場合は URL を使用しますhttp://example.com/sel2/index.php。シンボリック リンクのため、この URL は元の Web サイトとまったく同じように動作しますhttp://example.com/index.php

ここで、選択 2 を表示しているかどうかを php で確認したいとします。変数$_SERVER['REQUEST_URI']を調べるだけで、パスが含まれているかどうかを確認/sel2できます。

通常、これらのパスは相対パスであるため、すべての内部 URL 間で永続的なパスが維持されます。

于 2013-02-03T18:00:18.940 に答える
0

ケースベースの問題の場合は、$ _ SESSIONにケースを設定し、ケースごとにスイッチを使用するだけです。

http://www.php.net/manual/en/book.session.php

http://www.php.net/manual/en/control-structures.switch.php

于 2013-02-03T18:04:35.573 に答える
0

あなたの最善の解決策は、最初の選択を$_SESSION変数内に保存し、その変数をサイトの構造全体の URL に単純に追加することだと思います。次に例を示します。

$url = (isset($_SESSION['use_case'])) ? $_SESSION['use_case'] : 'default';
echo 'my-page.php?use_case='.urlencode($url);
于 2013-02-03T17:56:23.170 に答える