2011-01-07 9 views
2

私はZend FrameworkのWebサイトを作成しました。ユーザーがモバイルデバイスに接続されているかどうかによって、レイアウトファイルを切り替えるように更新しています。Zend Layoutを切り替えるコードを置くのに適切な場所はどこですか?

私は検出に対処するためのクラスを作成しましたが、このチェックを配置し、使用されているレイアウトファイルをトリガーする場所がどこにあるのかわかりません。

コード:

include(APPLICATION_PATH . "/classes/MobileDetection.php"); 
$detect = new MobileDetect(); 

if ($detect->isMobile()) { 
    $layout = $layout->setLayout('mobile'); 
} 

私は、ブートストラップ機能_initViewHelpers()からレイアウトをトリガすることができますが、私はすぐに私が上記で行を追加すると500エラーが発生します。

どのように配置するかについての推奨事項はありますか?私は元々は小切手を扱うヘルパーを持っていましたが、それはレイアウトファイル全体を交換するのではなく、レイアウト自体で使用されていました。

答えて

2

あなたがプラグインを使用することができ、それは私が何をすべきかです:

<?php 

class Mobile_Layout_Controller_Plugin_Layout extends Zend_Layout_Controller_Plugin_Layout 
{ 

    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     switch ($request->getModuleName()) { 
      case 'mobile': $this->_moduleChange('mobile'); 
     } 
    } 

    protected function _moduleChange($moduleName) { 
     $this->getLayout()->setLayoutPath(
      dirname(dirname(
       $this->getLayout()->getLayoutPath() 
      )) 
      . DIRECTORY_SEPARATOR . 'layouts/scripts/' . $moduleName 
     ); 
     $this->getLayout()->setLayout($moduleName); 
    } 

} 

私はlibrary/ProjectName/Layout/Controller/Plugin/Layout.phpに保管してください。それは実際に私にこれを考え出し得るためにしばらく時間がかかった

Zend_Layout::startMvc(
    array(
     'layoutPath' => self::$root . '/application/views/layouts/scripts', 
     'layout' => 'layout', 
     'pluginClass' => 'Mobile_Layout_Controller_Plugin_Layout' 
    ) 
); 

が、あなたがそれを介して動作したら、あなたはずっとのでを次のようになります。あなたのBootsrapで

、あなたはこのようなものを組み込む必要があります幸せ。これは助けられたと思っています:)

+0

よく起こっていることがわかりません。私のロジックはpre関数に入り、getModuleName()は何を返しますか?ブートストラップからのpluginClassだけですか? – Andrew

0

実際には、実際に何が起こっているのかは、「mobile」という別の新しいモジュールがあり、レイアウトプラグインヘルパーが、実際にはこれが呼び出されたモジュールかどうかを調べるpreDispatch()その後、メソッドはレイアウトを変更しています。それはかなり複雑です。私はあなたが実際にあなたのモバイルバージョンとそのinit()メソッドで$ this - > _ helper-> layout-> changeLayout()でレイアウトを変更するためのベースコントローラを作成できると思います。

0

あなたがmobile.example.comにリダイレクトされるようにするモバイルデバイスでこのページを打ったとき、あなたがwww.example.comを持っていると想像:WWWのモジュールであり、移動が内のモジュールであることを知って

私は、モバイルデバイスhttp://framework.zend.com/manual/de/zend.http.user-agent.html#zend.http.user-agent.quick-start

方法とリダイレクトするように

を検出する方法については以下のページを見つけ

異なるレイアウトを使用してアプリケーション?

よろしくお願いいたします。

関連する問題