如果我有一个专为桌面 Web 使用而设计的网站,但我想创建一个面向移动设计的版本,我将如何在不维护两个具有非常相似逻辑的页面版本的情况下显示它。
我不能只为移动版本使用不同的 CSS,因为我计划提供不同的 HTML 结构,有没有比在每个页面中使用大量 if 语句更好的方法?
如果我有一个专为桌面 Web 使用而设计的网站,但我想创建一个面向移动设计的版本,我将如何在不维护两个具有非常相似逻辑的页面版本的情况下显示它。
我不能只为移动版本使用不同的 CSS,因为我计划提供不同的 HTML 结构,有没有比在每个页面中使用大量 if 语句更好的方法?
您将有两个版本的站点,一个用于桌面,另一个用于移动设备。然后根据$_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';
}
一个想法是实现一个模板系统,如 Smarty 或 Zend View(那里有很多)。从您的主站点,您的控制器代码将为您执行所有逻辑并将值分配给模板变量。然后根据用于查看您的站点的版本(桌面/移动),加载适当的模板文件。这些可能有非常不同的 HTML/CSS 规则和结构,但在渲染视图之前仍然使用相同的 PHP 逻辑。
我使用如下示例的代码来确定用户是否是移动用户以重定向到网站的移动版本。该站点使用相同的模型和控制器文件,但使用不同的视图文件。
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();
}
有没有比在每个页面中使用大量 if 语句更好的方法?
是的,有一个更好的方法。不幸的是,如果您在设计网站时考虑到这一点,会容易得多。您可以做的是使用模板引擎将您的 PHP 代码和实际内容完全分开。因此,如果您想更改/添加一些新的客户端页面,这将非常简单。您只需将内容添加到您的模板中。您还可以根据用户的用户代理字符串(包括操作系统信息)选择要加载的模板。PHP 本身只负责从您的数据库/文件/获取动态数据的任何地方获取数据。
看看现有的许多PHP 模板引擎。