2012-02-15 12 views
0

私は解決できないZFで奇妙な動作をしています。私はlayout.phtmlとlogin.phtmlを持っています。だから、ユーザーがlayout.phtmlにログインしている場合は、login.phtmlを表示する必要があります。これもうまくいきますが、login.phtmlを表示する前にZFはlayout.phtmlを通過します。これはerror.logファイルのエラーのために確認できます。ZFの不思議なレイアウトの振る舞い

すべてのヘルプが理解されるであろう
public function indexAction() { 


    $form = new BM_Form_Login(); 
    $request = $this->getRequest(); 

    if ($request->isPost()) { 
     if ($form->isValid($request->getPost())) { 
      if ($this->_process($form->getValues())) { 
       // We're authenticated! Redirect to the home page 
       //json validation on login page 
       $var = json_encode(array('valid' => true, 'redirect' => 'index')); 
       echo $var; 
       exit(); 
      } else { 
       $var = json_encode(array('valid' => FALSE, 'error' => 'Authentication failed!', 'redirect' => 'auth')); 
       echo $var; 
       exit(); 
      } 
     } 
    }// end if is POST 
    $this->_helper->layout()->setLayout('login'); // special login page 
    $this->view->form = $form; 
} 

... よろしく アンドレア

:私は認証コントローラを持っているものをここで

public static function _initAcl() 
{ 
    $auth = Zend_Auth::getInstance(); 
    $acl = new BM_Acl($auth); 

    $front = Zend_Controller_Front::getInstance(); 
    $front->registerPlugin(
     new BM_Controller_Plugin_Acl($auth, $acl) 
    ); 
} 

:私はブートストラップを持っているものをここで

PSこれは、新しいブラウザウィンドウからアプリケーションを起動した場合にのみ発生します。ログインページを参照すると、レイアウトはもう呼び出されません。

+1

私は、レイアウトを無効にし、ログインレイアウトのコンテンツをインデックスアクションテンプレートに入れることをお勧めします。 – designerrr

+0

コードはOKですが、私は同じことを何度もやっています。他のレイアウトも処理されていることは間違いありませんか?あなたのレイアウトを混乱させる追加のロジックがありますか? – bububaba

答えて

0

Iamはわかりませんが、レイアウトがビュースクリプトの前に変更されていると思います。あなたはコントローラのpreDispatch Hookの中にロジックを置くことができます。

public function preDispatch() { 


    $form = new BM_Form_Login(); 
    $request = $this->getRequest(); 

    if ($request->isPost()) { 
     if ($form->isValid($request->getPost())) { 
      if ($this->_process($form->getValues())) { 
       // We're authenticated! Redirect to the home page 
       //json validation on login page 
       $var = json_encode(array('valid' => true, 'redirect' => 'index')); 
       echo $var; 
       exit(); 
      } else { 
       $var = json_encode(array('valid' => FALSE, 'error' => 'Authentication failed!', 'redirect' => 'auth')); 
       echo $var; 
       exit(); 
      } 
     } 
    }// end if is POST 
    $this->_helper->layout()->setLayout('login'); // special login page 
    $this->view->form = $form; 
} 

またはControllerPluginを使用します。

Zend Controller Plugin - Doc

0

私は右を理解したとき、あなたはログインを除き、すべてのページで使用したレイアウトを持っています。レイアウトとしてログイン用のビューを使用する代わりに、このアクションのレイアウトを無効にし、通常はlogin.phtmlをレンダリングするだけです。あなたはsetLayout('login')するのではなく、あなたのコントローラのLoginActionの中で次のよう呼び出すことによってこれを行うことができます。

$this->_helper->layout()->disableLayout(); 

これは単にレイアウトを無効にしますが、ビューが正常にレンダリングされます。

あなたがそれをやりたいのであれば、view-pathではなく、login.phtmlをレイアウトパスに配置する必要があります(詳細な説明が必要な場合は、コメントを入力してください)。

+0

迅速な回答ありがとうございます。私はこのように変更しましたが、layout.phtmlはまだどこかで呼び出されています... – cwhisperer

+0

application.iniの 'resources.layout'を使ってデフォルトのレイアウトをどうやって設定しますか?あなたのレイアウトがまだ表示されている場合、私の推測は、何とかレイアウトがディスパッチプロセスの後のデフォルトに設定されているということです。 Controller_Pluginを介して – dbrumann

+0

アプリケーションのレイアウトをresources.layout.layoutPath = APPLICATION_PATH "/ layouts/scripts /"のように設定しました。しかし、レイアウトは表示されていません.... – cwhisperer

1

ビューは1ページ分です。 layout.phtmlのようなテンプレートで表示したい単一のページがある場合は、indexアクションのviewsディレクトリ内のindex.phtmlを編集します。あなたがメインのレイアウト

$this->_helper->layout()->disableLayout(); 

それとも

$this->_helper->layout()->setLayout('blank'); 

空白のレイアウトを使用して、単数ページに固有のコードを無効にしたい場合はビューで実行する必要があります。

関連する問題