Постоянный флаг, что пользователь на фейсбуке? - PullRequest
1 голос
/ 02 февраля 2012

Я занимаюсь разработкой мобильного сайта для нашего основного сайта электронной коммерции.Поскольку сайт состоит из негибкого унаследованного кода, я решил искать строку пользовательского агента пользователей и идентифицировать их как мобильных пользователей при каждом запросе страницы.Таким образом, никаких изменений в структуре URL не требуется.Кажется, до сих пор это работает хорошо.

Однако я подумал, что было бы круто использовать эту мобильную версию, чтобы пользователи могли просматривать наш сайт электронной коммерции на Facebook через iframe (размеры идеальны).Но, в отличие от мобильных браузеров, у меня возникают проблемы с поиском постоянного способа идентифицировать пользователя как пользователя Facebook.Я знаю, что Facebook отправляет переменную $ _POST при первом просмотре страницы через iframe, и я мог бы просто сохранить ее в переменной сеанса и покончить с этим.Однако возникает проблема: что если пользователь заходит на Facebook, помечается как пользователь facebook в своей сессии, а затем посещает наш обычный сайт электронной коммерции?Ну, они все равно будут идентифицированы как пользователь Facebook и получат версию Facebook, что не идеально.

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

Может быть, вы можете решить проблему под другим углом и проверить, загружен ли сайт из фрейма или нет?

Это возможно с javascript:

if (top === self) { 
   //not a frame 
} else { 
   //a frame 
}
0 голосов
/ 03 февраля 2012

Не уверен, что это правильный этикет, чтобы ответить на мой собственный вопрос, но я нашел ответ, который представляет собой комбинацию ответа Хассу и сценария обнаружения php javascript.

Сценарий, который я изменил, отсюда: http://snippets.bluejon.co.uk/check4-js-and-cookies/check4-js-enabled-v2-phpcode.php

По сути, идея состоит в том, чтобы использовать javascript для отправки формы, ссылающейся на текущий URL-адрес, в результате сообщается, включен ли javascript ... Однако идею можно легко изменить, чтобы отправить форму, только если 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 и использовать их над вашим кодом перед любым выводом на экран, что может быть проще для обработки. Обратите внимание, что приведенный выше код не протестирован, он дан только для того, чтобы предоставить основную идею другим людям с такой же проблемой.

...