如果我有一个专为桌面Web使用而设计的网站,但我想创建一个面向移动设计的版本,我将如何在不保留两个版本的页面的情况下显示它,并且背后有非常相似的逻辑。
我不能只为移动版本使用不同的CSS,因为我打算提供不同的HTML结构,有没有比在每个页面中使用大量if语句更好的方法?
答案 0 :(得分:3)
您将拥有该网站的两个版本,一个用于桌面,另一个用于移动设备。然后,根据$_SERVER['HTTP_USER_AGENT']
,您将重定向用户。
例如:
<?php
// Let's define a function to make it easier to read
function is_mobile(){
$list = array('Android', 'Iphone'); // Add more yourself
foreach ($mobile as $agent) {
if (stripos($agent, $_SERVER['HTTP_USER_AGENT']) {
// Looks like mobile
return true;
}
}
// Assuming desktop by default
return false;
}
// Then before rendering a template, you'd it approach like this:
if (is_mobile()) {
require 'mobile.php';
} else {
require 'desktop.php';
}
答案 1 :(得分:2)
一个想法是实现像Smarty或Zend View这样的模板系统(那里有很多)。从您的主站点,您的控制器代码将为您执行所有逻辑并为模板变量赋值。然后,根据用于查看站点的版本(桌面/移动设备),加载相应的模板文件。这些可能具有非常不同的HTML / CSS规则和结构,同时在渲染视图之前仍然使用相同的PHP逻辑。
答案 2 :(得分:0)
有没有比在每个页面中使用大量if语句更好的方法?
是的,还有更好的方法。不幸的是,如果您考虑到这一点设计您的网站,那将会容易得多。您可以做的是使用模板引擎来保持PHP代码和实际内容完全分离。因此,如果您想要更改/添加一些新的客户端页面,这将非常简单。您只需在模板中添加内容即可。您还可以根据用户的用户代理字符串(包括操作系统信息)选择要加载的模板。 PHP本身只负责从数据库/文件/获取动态数据的任何地方获取数据。
看一下那里的许多template engines for PHP。
答案 3 :(得分:0)
我使用了以下示例中的代码来确定用户是否可以移动以重定向到该网站的移动版本。该站点使用相同的模型和控制器文件,但使用不同的View文件。
if (preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone|android)/i', strtolower($_SERVER['HTTP_USER_AGENT']))
or strpos(strtolower($_SERVER['HTTP_ACCEPT']),'application/vnd.wap.xhtml+xml') > 0
or ((isset($_SERVER['HTTP_X_WAP_PROFILE']) or isset($_SERVER['HTTP_PROFILE'])))
)
{
header('location: /m/index.php');
exit();
}