【发布时间】:2012-05-21 16:06:38
【问题描述】:
我有一个移动网站,我为 iPhone 和其他 iOS 设备添加了检测功能。 iOS 页面需要与常规页面不同的布局和视图(实际上是针对较旧的移动设备)。所以,我有一些代码可以进行移动检测,那部分很简单。我想做的是让 Zend 在检测到 iOS 设备时自动找到并使用正确的布局和视图,但事实证明这非常困难......
我需要它尽快启动并运行,所以我做了一个快速而肮脏的黑客攻击:在每个动作函数中,我有一个简单的 If 语句来检测 iOS 布尔标志是否已设置(发生在控制器的 init),如果是这样,则显式覆盖布局和视图。现有代码(在动作中):
if ($_SESSION['user']['iPhone']) {
$this->_helper->layout->setLayout('osriphone'); // 'osr' is the name of the app
$this->_helper->viewRenderer->setRender('iphone/index');
}
所以这行得通,但它有点丑陋和hacky,必须放在每个动作中,并且必须设置每个动作的渲染器等等。我开始阅读有关 Zend ContextSwitch 的内容,这似乎正是那种我应该使用的东西(我对 Zend 还是有点陌生),所以我开始弄乱它,但不太明白。
在控制器的初始化中,我正在初始化 ContextSwitch,为“iphone”添加一个上下文并将后缀设置为“iphone”,现在我想做的是有一个地方可以检测到用户是 iOS 设备并将上下文设置为“iphone”,这应该使其自动使用正确的布局和视图。新代码(在控制器的 init 中):
$this->_helper->contextSwitch()->initContext();
$contextSwitch = $this->_helper->getHelper('contextSwitch');
$contextSwitch->addContext('iphone', array('suffix' => 'iphone'));
$contextSwitch->setAutoDisableLayout(false);
if ($_SESSION['user']['iPhone']) {
//$this->_currentContext = 'iphone'; // Doesn't work.
//$contextSwitch->initContext('iphone'); // Doesn't work.
//$contextSwitch->setContext('iPhone'); // Not the function I'm looking for...
// What to put here, or am I barking up the wrong tree?
}
我在 contextSwitcher 上做了一些阅读,似乎上面有很多东西,例如将其设置为特定于每个特定操作(我不需要;这需要在我的应用程序中的每个操作上发生),并通过并修改所有链接到 /osr/format/iphone 之类的内容以切换上下文(我也不需要或想要它;它已经是一个移动站点,我希望布局/视图开关对用户完全透明,并且只能从后端处理,因为它是我快速而肮脏的黑客)。对于我的快速而肮脏的 hack,这些似乎基本上是等量的代码。所以...有人有什么建议吗?我真的希望只有一行像“$contextSwitch->setContext('iphone');”我可以在控制器的 init 中的 If 语句中使用它,但 Zend 文档很糟糕,而且我似乎找不到任何人在 Google 或 SO 上做类似事情的例子。
【问题讨论】:
-
这似乎是一个使用Plugin 的好地方,但我还没有弄清楚。如果我发现任何更有用的信息,我会回复您。
标签: php iphone zend-framework mobile