iPhone やその他の iOS デバイスの検出を追加したモバイル サイトがあります。iOS ページには、通常のページ (実際には古いモバイル デバイス用) とは異なるレイアウトとビューが必要です。それで、モバイル検出を行うコードがいくつかありますが、その部分は簡単でした。私がやりたいのは、iOS デバイスが検出されたときに Zend が自動的に正しいレイアウトとビューを見つけて使用するようにすることですが、それは驚くほど難しいことが判明しました...
できるだけ早く起動して実行する必要があったため、機能する簡単で汚いハックを行いました。各アクション関数には、iOS ブール値フラグが設定されているかどうかを検出する単純な If ステートメントがあります (これはコントローラーの init で発生します)。であり、そうであれば、レイアウトとビューを明示的にオーバーライドします。既存のコード (アクション内):
if ($_SESSION['user']['iPhone']) {
$this->_helper->layout->setLayout('osriphone'); // 'osr' is the name of the app
$this->_helper->viewRenderer->setRender('iphone/index');
}
これは機能しますが、ちょっと醜くてハックで、各アクションに配置する必要があり、各アクションのレンダラーを設定する必要があります。Zend ContextSwitch について読んだところ、まさに私がすべきことのように思えました。を使用する (私はまだ Zend に慣れていない) ので、いじり始めましたが、よくわかりません。
コントローラーの init で、ContextSwitch を初期化し、'iphone' のコンテキストを追加し、接尾辞を 'iphone' に設定しています。コンテキストを「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 のようなものへのすべてのリンクを調べて変更し、コンテキストを切り替えます (これも実際には必要ではなく、望んでもいません。既にモバイル サイトであり、レイアウト/ビューを次のように切り替えたいと考えています)。ユーザーに対して完全に透過的であり、私の迅速で汚いハックのようにバックエンドからのみ処理されます)。これらは基本的に、私の簡単で汚いハックと同じ量のコードのように見えます。だから...誰か提案はありますか?「$contextSwitch->setContext('iphone');」のような 1 行だけを本当に望んでいます。コントローラーの init の If ステートメントで使用できる