Zend framework 如何将Zend Framework网站转换为移动网站?

Zend framework 如何将Zend Framework网站转换为移动网站?,zend-framework,mobile-website,Zend Framework,Mobile Website,我已经在Zend框架中创建了一个巨大的网站(前端和管理端),现在我也想这样做 ZF中的项目,但用于移动设备 我当然会使用HTML5和jQuery mobile,但在开始为我的移动网站开发之前,我想问专家,这样做的好方法是什么?您可能需要签出-它允许您根据“格式”参数切换视图脚本。您可以使用它(或扩展它)将视图切换到更便于移动的模板 具体来说,它会禁用布局-如果检测到移动请求,可以使用相同的技术切换布局 当然,如果你能通过一些CSS媒体查询来完成你所需要的,那当然是一条路要走 您可能还发现检测移动

我已经在Zend框架中创建了一个巨大的网站(前端和管理端),现在我也想这样做 ZF中的项目,但用于移动设备


我当然会使用HTML5和jQuery mobile,但在开始为我的移动网站开发之前,我想问专家,这样做的好方法是什么?

您可能需要签出-它允许您根据“格式”参数切换视图脚本。您可以使用它(或扩展它)将视图切换到更便于移动的模板

具体来说,它会禁用布局-如果检测到移动请求,可以使用相同的技术切换布局

当然,如果你能通过一些CSS媒体查询来完成你所需要的,那当然是一条路要走

您可能还发现检测移动设备的可用功能很有用。同样,与媒体查询类似,但可能有用

但底线是不需要“转换”网站,有很多工具可以让桌面和移动用户访问同一个网站。


我,读我,我相信你会喜欢我,因为我是法瓦德·加福尔(Fawad Ghafoor)的anwser,从互联网上消失了(仍然可以在网络档案中找到)

我不知道这是否可以,但我会在这里复制和格式化网站的内容

适用于iPhone、BlackBerry和Co的Zend Framework应用程序

移动设备在过去几年中变得非常重要。本教程将向您展示如何为您的网站拉皮条,并为iPhone、BlackBerry等移动设备做好准备

在我们开始之前:正如在本博客的所有其他帖子中一样,我希望您是一名软件工程师,并使用MVC(模型/视图/控制器)模式以及Zend_布局实现您的web应用程序

1。我们需要什么

基本上,在为移动设备准备web应用程序时,您必须做的唯一一件事是a)检测用户是否使用移动或非移动设备浏览您的站点,b)根据a)的结果更改MVC中的V)

然而,我发现稍微扩展一下这种方法是非常有用的。除了用移动设备的视图替换您的视图外,我们还将做两件事:我们还将替换用于web应用程序的布局(Zend_布局),并使用不同的翻译文件(Zend_翻译)。很明显,为什么替换布局很有用,但是为什么我们需要使用不同的翻译文件呢?事实上,我们不需要这样做,但我发现如果你有大屏幕的翻译文件(你可能需要使用长时间的文本描述)和移动设备的翻译文件(带有清晰的描述、错误消息、标签等),那么它非常方便

正如我们稍后将看到的,Zend框架的Context Switch()几乎是我们所需要的全部……ContextSwitch是一个动作助手,“旨在促进在请求时返回不同的响应格式”。这个动作助手提供了两种不同的随时可用的上下文:JSON和XML。对于我们的示例,我们将创建一个名为“mobile”的附加上下文

控制流架构丢失。。。在某个时候,它就在这里:

基本上,我们的控制流必须如图“控制流”所示工作(单击该图以放大它)。如果用户浏览到,我们直接将正确的上下文设置为“mobile”。如果用户浏览到,我们会检查他是否正在使用移动设备。如果他正在使用移动设备,我们会询问用户是否想要使用我们web应用的移动版或桌面版。由于我们不想在用户每次请求页面时询问他是否希望使用移动版本,因此我们会将她/他的决定存储在会话变量中(如果她在几分钟内处于非活动状态,则仅再次询问她)

作为此工作流的示例,请查看

2。创建我们的移动插件 为了实现我们的目标,我们将实现一个小插件。在实现这个插件之前,我们需要一个功能来检查当前用户是否正在使用移动设备。您可以使用像WURFL这样的智能解决方案来实现这一点。然而,在我们的示例中,我们将使用一个简单的函数,如果用户正在使用移动设备,则返回true,否则返回false。如果你用谷歌搜索的话,你会发现很多功能都可以完成这项工作。我将使用我在Brain Handles中找到的一个函数

现在,让我们创建我们的插件。在\plugins文件夹中,创建一个名为Mobile.php的文件,并复制并粘贴以下源代码:

<?php
class Plugin_Mobile extends Zend_Controller_Plugin_Abstract
{
    // instead of defining all these parameters here,
    // you could also put them into your application.ini

    // if user is inactive for X minutes and surfs to
    // www.example.com, we'll ask him again if he wants
    // to user mobile or desktop version
    private $ask_again_after_x_minutes = 10;

    // used to test your mobile layout. Set this
    // to 1 to emulate a mobile device
    private $test_mobile = 0;

   public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
    {
        // did we already ask the user?
        if (isset($_SESSION['mobileasked'])) {
            // is mobile session still valid?
            if (time() < $_SESSION['mobileasked']) {
                // update session
                $_SESSION['mobileasked'] = time() + $this->ask_again_after_x_minutes * 60;
                // continue with requested page
                return $request;
            }
        }

        // otherwise, check if user is using a mobile device
        // or if we are in test mode.
        if ($this->checkmobile() || ($this->test_mobile == 1)) {
            // if requested page != MOBILE.example.com
            if (!(Zend_Registry::isRegistered('directmobile') && Zend_Registry::get('directmobile') == '1')) {
                // set mobile session
                $_SESSION['mobileasked'] = time() + $this->ask_again_after_x_minutes * 60;
                // ask user if he wants to use mobile or desktop version
                $request->setControllerName('index')
                        ->setActionName('askmobile')
                        ->setParam('format', 'mobile')
                        ->setParams($request->getParams())
                        ->setDispatched(false);
            }
        }
        return $request;
    }

/**
  * This function returns true if user is using a mobile device. False otherwise.
  * (c) by http://www.brainhandles.com/techno-thoughts/detecting-mobile-browsers
  */

private function checkmobile(){
   if(isset($_SERVER["HTTP_X_WAP_PROFILE"])) return true;
   if(preg_match("/wap\.|\.wap/i",$_SERVER["HTTP_ACCEPT"])) return true;
   if(isset($_SERVER["HTTP_USER_AGENT"])){
      // Quick Array to kill out matches in the user agent
      // that might cause false positives
      $badmatches = array("OfficeLiveConnector","MSIE\  8\.0","OptimizedIE8","MSN\ Optimized","Creative\ AutoUpdate","Swapper");

      foreach($badmatches as $badstring){
        if(preg_match("/".$badstring."/i",$_SERVER["HTTP_USER_AGENT"])) return  false;
      }

      // Now we'll go for positive matches
      $uamatches = array("midp", "j2me", "avantg", "docomo", "novarra",  "palmos", "palmsource", "240x320", "opwv", "chtml", "pda", "windows\  ce", "mmp\/", "blackberry", "mib\/", "symbian", "wireless", "nokia",  "hand", "mobi", "phone", "cdm", "up\.b", "audio", "SIE\-", "SEC\-",  "samsung", "HTC", "mot\-", "mitsu", "sagem", "sony", "alcatel", "lg",  "erics", "vx", "NEC", "philips", "mmm", "xx", "panasonic", "sharp",  "wap", "sch", "rover", "pocket", "benq", "java", "pt", "pg", "vox",  "amoi", "bird", "compal", "kg", "voda", "sany", "kdd", "dbt", "sendo",  "sgh", "gradi", "jb", "\d\d\di", "moto","webos");

      foreach($uamatches as $uastring){
        if(preg_match("/".$uastring."/i",$_SERVER["HTTP_USER_AGENT"])) return  true;
      }
   }
   return false;
}
3。上下文检测

这就是你在手机插件中所要做的一切。接下来我们要做的是确保检测到正确的上下文。我们将在引导程序中执行此操作。打开bootstrap.php并在其中放入类似的内容:

// set correct context
$domains = explode('.', $_SERVER['HTTP_HOST']);
if ($domains[0] == 'mobile' || $frontController->getParam('format') == 'mobile') {
    if ($domains[0] == 'mobile') {
        // if set, user will be redirected directly to requested page
        Zend_Registry::set('directmobile', '1');
    }
    Zend_Registry::set('context', '\mobile');
} else {
    Zend_Registry::set('context', '');
}
How do you want to use this application?<br/>
<a href="<?= 'http://mobile.fopp.de' . $_SERVER["REQUEST_URI"]?>">MOBILE VERSION</a>
<br></br>
<a href="<?= 'http://dev.fopp.de' . $_SERVER["REQUEST_URI"] ?>">DESKTOP VERSION</a>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>        
 <?php echo $this->headTitle() . "\n" ?>
 <?php echo $this->headLink() . "\n" ?>
</head>
<body>
 <div id="header">This is your header</div>    
 <div id="content"><?= $this->layout()->content ?></div>
 <div id="footer">This is your footer</div>
</body>
</html>
4。询问用户

当我们询问用户是否希望使用我们应用程序的移动版或桌面版时,我们将在索引控制器中创建一个简单的操作。我们将在我们的移动插件中将用户重定向到该控制器/操作(参见第2章)

打开IndexController.php并创建一个askmobilection:

public function askmobileAction()
{
    // nothing to do here...
}
这个动作基本上没什么作用;-)。现在,让我们看看askmobile视图。在“视图”文件夹(可能是\views\scripts\index)中创建一个名为askmobile.mobile.view的文件,并在其中放置类似以下内容:

// set correct context
$domains = explode('.', $_SERVER['HTTP_HOST']);
if ($domains[0] == 'mobile' || $frontController->getParam('format') == 'mobile') {
    if ($domains[0] == 'mobile') {
        // if set, user will be redirected directly to requested page
        Zend_Registry::set('directmobile', '1');
    }
    Zend_Registry::set('context', '\mobile');
} else {
    Zend_Registry::set('context', '');
}
How do you want to use this application?<br/>
<a href="<?= 'http://mobile.fopp.de' . $_SERVER["REQUEST_URI"]?>">MOBILE VERSION</a>
<br></br>
<a href="<?= 'http://dev.fopp.de' . $_SERVER["REQUEST_URI"] ?>">DESKTOP VERSION</a>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>        
 <?php echo $this->headTitle() . "\n" ?>
 <?php echo $this->headLink() . "\n" ?>
</head>
<body>
 <div id="header">This is your header</div>    
 <div id="content"><?= $this->layout()->content ?></div>
 <div id="footer">This is your footer</div>
</body>
</html>
7。创建您的移动视图

最后,您必须创建移动视图。对于移动上下文中可用的每个视图(在控制器的init()方法中定义),必须创建一个移动视图。因此,如果您有一个名为myaction的操作,那么桌面版本需要一个myaction.phtml和一个myaction.mobile.p