我有一个移动网站,我为 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”,这应该使其自动使用正确的布局和视图。新代码(在控制器的初始化中):
$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');” 我可以在控制器初始化中的 If 语句中使用,