2012-02-02 9 views
1

私は主要なeコマースサイトのモバイルサイトを設計中です。このサイトは柔軟性のないレガシーコードで構成されているため、ユーザーのユーザーエージェントの文字列を検索し、モバイルユーザーとしてそれぞれのページリクエストを識別することを選択しました。そうすれば、URL構造を変更する必要はありません。これは今のところうまく機能しているようです。ユーザーがFacebookにいる永続的なフラグ?

しかし、私は、このモバイル版を使用すると、ユーザーがiframe経由でFacebookのeコマースサイトを閲覧できるようにすばらしいと思っていました(サイズは完全です)。しかし、モバイルブラウザと違って、私はユーザーをfacebookユーザーとして識別するための永続的な方法を見つけるのが難しいです。私はfacebookがiframe経由でページを最初に見たときに$ _POST変数を送信することを知っています。単にセッション変数にその変数を保存しておけばいいだけです。しかし、ユーザーがFacebookにアクセスしてセッション中にFacebookのユーザーとしてマークされてから、通常のeコマースサイトにアクセスするとどうなるのでしょうか?まあ、彼らはまだフェイスブックのユーザーとして識別され、理想的ではない、フェイスブックのバージョンを提供する。

答えて

1

多分あなたは別の角度で問題に取り組んで、ウェブサイトがフレームからロードされているかどうかをテストできますか?

これはJavaScriptで可能です:

if (top === self) { 
    //not a frame 
} else { 
    //a frame 
} 
+0

はい、それは動作する可能性があります、初期ページの読み込みは、モバイルサイトのデザインを介して読み込むように教えてくれるfacebook $ _POST varを受け取ることができます。その後、ajaxスクリプトは各ページリクエストを実行して、それがまだFacebookからのものであるというフラグを送信することができます。しかし、それは依然として識別のために1ページの遅れを生じるので、実際にページロードの前にそのフラグを送信することが好ましいでしょう。サーバーサイドのように、それは可能だとは思いません。しかし、それは私が今までに見てきた最良のアイデアです、私はまだ他のアイデアに開いている方法を使用して調査します。 –

0

それは自分の質問に答えるために、適切なエチケットだかどうかわからないが、私はHassouの答えとJavaScript、PHP検出スクリプトのコンボで答えを見つけました。

は私が変更されたスクリプトはこちらから: はhttp://snippets.bluejon.co.uk/check4-js-and-cookies/check4-js-enabled-v2-phpcode.php

基本的な考え方は、結果はあなたにはJavaScriptが有効になっている場合...しかし、アイデアはでき告げる現在のURLを参照してフォームを送信するためにJavaScriptを使用することですiframe内でjavascriptがtrueを返す場合にのみ、フォームを送信するように簡単に変更できます。その後、$ _POSTデータをフォームに渡して、$ _POSTデータが引き継がれるようにすることができます($ _POSTデータがアプリケーションの表示レイヤー内で参照される場合にのみ必要です)。ここでは基本的な考え方だ:

<?php 
/* Include head of your application goes here, this should do whatever 
session handling code you have and all processing done to the $_POST variables */ 

// ~~~~~~Full Url Function - Works With Mod_Rewrite~~~~~~~~~ // 
// important thing is function will grab all $_GET vars 
function fullurlnav() 
{ 
$fullurlsortnav = 'http'; 
$script_name = ''; 
    if(isset($_SERVER['REQUEST_URI'])) 
    { 
    $script_name = $_SERVER['REQUEST_URI']; 
    } 
    else 
    { 
    $script_name = $_SERVER['PHP_SELF']; 
    if($_SERVER['QUERY_STRING']>' ') 
    { 
    $script_name .= '?'.$_SERVER['QUERY_STRING']; 
    } 
    } 

    if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on') 
    { 
    $fullurlsortnav .= 's'; 
    } 

$fullurlsortnav .= '://'; 

    if($_SERVER['SERVER_PORT']!='80') 
    { 
    $fullurlsortnav .= 
    $_SERVER['HTTP_HOST'].':'.$_SERVER['SERVER_PORT'].$script_name; 
    } 
    else 
    { 
    $fullurlsortnav .= $_SERVER['HTTP_HOST'].$script_name; 
    } 

return $fullurlsortnav; 
} 
// ~~~~~~~~~~~End Full URL Function~~~~~~~~~ // 
?> 
<html> 
<body> 
<?php 
// Only run this check if user has been identified as a facebook user in their session 
// or if they've been identified via the $_POST['signed_request'], which facebook sends 
// upon first request via iframe. 
// Doing this removes the check when it's unneeded. 
if (!isset($_POST['inIframe']) && (isset($_SESSION['inIframe']) || isset($_POST['signed_request']))) 
{ 
?> 
    <form name="postJs" action="<?php echo fullurlnav(); ?>" method="post"> 
    <input type="hidden" name="inIframe" value="1"> 
    <?php 
    // Carry over $_POST 
    foreach($_POST as $key => $value) 
    { 
    echo '<input type="hidden" value="'.$value.'" name="'.$key.'" />'; 
    } 
    ?> 
    </form> 
    <script type="text/javascript"> 
      <!-- 
      // If in an iframe 
      if (top !== self) 
      { 
      document.postJs.submit(); 
      } 
     //--> 
    </script> 
    <?php 
} 
elseif(isset($_POST['inIframe']) && (isset($_SESSION['inIframe']) || isset($_POST['signed_request']))) 
{ 
$_SESSION['inIframe']=1; 
} 
else 
{ 
$_SESSION['inIframe']=0; 
} 

if ($_SESSION['inIframe']== 1){ 
echo 'IS in an Iframe'; 
}else{ 
echo 'IS NOT in an Iframe'; 
} 

// echo out rest of your template code 
?> 
</body> 
</html> 

それはあなたのページの表示コード出力の周りに少しトリッキーなスケートを取得し、それは働きますが、それは私がこれまで持っている基本的な考え方です。技術的には、以下のelseif文からフォーム生成ブロックを分離し、表示出力の前にコードよりも上のものを使用すると、処理が簡単になる場合があります。上記のコードはテストされておらず、ちょうど同じ問題を持つ他の人のための基本的なアイデアを提供するために与えられていることに注意してください。

+1

あなた自身の質問に答えても何も間違ってはいません。何かを学んだことを示し、同じ問題を抱えている可能性のある人とそれを共有します。 – Skuld

関連する問題