0

我正在尝试基于浏览器视口来服务器设备特定的布局和内容。我有一个庞大的网站,由于某些特定原因,主要是页面加载速度,我没有使用媒体查询。我只需要以这种方式完成这项任务。

OK 情况是这样的......

我有 2 个文件index.php,并且viewport.php都位于一个文件夹中http://localhost/test/

为了获取浏览器视口并将值转换为 PHP 变量,我使用以下脚本:

<?php
if (isset($_GET['width'])) {
  $layoutType = $_GET['width'];

      if ( $layoutType >= 240 && $layoutType <= 600 ) {
        $layoutType = 'mobile';
      } else if ($layoutType >= 601 && $layoutType <= 900 ) {
          $layoutType = 'tablet';
      } else {
         $layoutType = 'desktop';
      }
} else {
  echo "<script language='javascript'>\n";
  echo "  location.href=\"${_SERVER['SCRIPT_NAME']}?${_SERVER['QUERY_STRING']}"
            . "&width=\" + document.documentElement.clientWidth;\n";
  echo "</script>\n";
  exit();
}
?>

我的问题:

Q1。如何存储$layoutType会话变量以便可以多次使用?它的正确语法是什么?

Q2。如何从中运行文件viewport.phpindex.php仅获取$layoutType数据而没有其他数据。这是因为通过使用该<?php require_once ?>方法,我得到了这样的 URL http://localhost/test/index.php?&width=1600:. 我希望 URLhttp://localhost/test/只显示。我需要在index.php文件中使用的正确语法是什么?

Q3。跳过 Ajax 部分有没有办法摆脱index.php?&width=1600URL?我试过了,.htaccess但它给了我一个错误,说“页面没有正确重定向”

请注意:我不打算使用像 jQuery 和 MooTools 这样的 JavaScript 库,因为这是我整个网站中唯一的 JavaScript 函数,为它加载整个库是没有意义的。

4

2 回答 2

2

首先,PHP 发生在服务器端,因此一旦页面加载,再次使用 PHP(不加载页面)的唯一方法是进行 ajax 调用,大概是对另一个执行特定功能并返回值的 php 页面。

如果要将值存储为会话变量以便可以连续使用,可以执行以下操作:

  1. 当他们第一次登陆您的网站时,有 php 检查会话是否存在,如果它不存在,则调用 Javascript 函数以获取 layoutWidth 并对 php 页面进行 ajax 调用,该页面将其存储为会话变量,然后重新加载页面并包含正确的布局文件。

我可能不会使用这种方法,实际上会寻找使用 JavaScript/JQuery 来实现这一点的方法。但这就是你要求这样做的方式。

对于您的示例,我根本没有使用过 JQuery,但我希望包含的内容只有大约 19kb 左右,它让生活变得如此轻松。

例子:

索引.php

<?php
   session_start();
?>
<!DOCTYPE html>
<html>
   <head>
      <title></title>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <?php 
         if (empty($_SESSION['layoutWidth'])) {
            echo '<script type="text/javascript"> var session=false; var layoutWidth;</script>';
         } else {
            echo '<script type="text/javascript"> var session=true; var layoutWidth=' . $_SESSION['layoutWidth'] . ';</script>';
         }
      ?>
      <script type="text/javascript" src="js/viewport.js"></script>
   </head>
   <body>
         <?php

            if (!empty($_SESSION['layoutWidth'])) {
               $layoutWidth = $_SESSION['layoutWidth'];
               if ( $layoutWidth >= 240 && $layoutWidth <= 900 ) {
                  include('layout1.php');
               } else if ($layoutWidth > 900 && $layoutWidth <= 1200 ) {
                  include('layout2.php');
               } else {
                  include('layout3.php');
               }
            }
         ?>
   </body>
</html>

js/viewport.js

// JavaScript Document

window.onload = function() {
    // if there is no session (session = false)
    if (!session) {
        // call function to get the screen size
        getScreenWidth();

        // make ajax call to php page to set the session variable
        setSession();
    }
}

function getScreenWidth() {
    layoutWidth = screen.width;
}

function setSession() {
    var xmlhttp;
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    xmlhttp.onreadystatechange=function()
      {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
        // Reload the page
        window.location.reload();
        }
      }
    xmlhttp.open("POST","set_session.php?layoutWidth=" + layoutWidth,true);
    xmlhttp.send();
}

您的 php 文件来设置会话参数是从您的 ajax 调用传递的:

set_session.php

<?php
    session_start();
    // you can check if it is already set if you like otherwise:
    $_SESSION['layoutWidth'] = $_REQUEST['layoutWidth'];
?>

布局1.php

<?php
   echo '<div>This is layout1.php</div>';
   echo '<div>Your screen width is: ' . $_SESSION['layoutWidth'] . '</div>';
?>

布局2.php

<?php
  echo '<div>This is layout2.php</div>';
  echo '<div>Your screen width is: ' . $_SESSION['layoutWidth'] . '</div>';
?>

布局3.php

<?php
   echo '<div>This is layout3.php</div>';
   echo '<div>Your screen width is: ' . $_SESSION['layoutWidth'] . '</div>';
?>

这种方法意味着您不必在 URL 中传递参数。这一切都会被隐藏起来。

于 2012-04-30T23:35:10.387 回答
1

Q1) $_SESSION['layoutType']=$layoutType;

Q2&Q3 )我认为你把它弄得太复杂了。最好的方法是结合 cookie 和 session 的力量来实现你想要的限制,你将拥有一个更快、更整洁的代码。所以你可以做的是检查是否设置了会话 layoutType,如果没有,注入一个 javascript 代码,它会为你获取 layoutType 并将其放入一个 cookie 中,下次你在页面中包含 viewport.php 时,它'将检查 cookie 是否已设置并将其传输到会话以供将来使用,因此您可以将 viewport.php 更改为:

<?php
  if(isset($_SESSION['layoutType'])){
    //write the code for when session is set here
  }elseif(isset($_COOKIE["layoutType "])){
    $_SESSION['layoutType']=$_COOKIE["layoutType "];
  }else{
      $script = "<script language='javascript'>function SetCookie(cookieName,cookieValue) { var today = new Date(), expire = new Date(), nDays=1;expire.setTime(today.getTime() + 3600000*24*nDays);document.cookie = cookieName+'='+escape(cookieValue)+ ';expires='+expire.toGMTString();SetCookie('layoutType',document.documentElement.clientWidth}";
      echo $script;
  }
?>
于 2012-04-30T23:23:03.560 回答