リダイレクト コントローラー メソッドが一部の時間で機能していないことに気付きました。debug > 0 に設定してもメッセージは表示されません。リダイレクト メソッドを呼び出す前にコードをエコーしません。
私の ArticlesController add アクションを見てみましょう。リダイレクトはあるインスタンスでは機能しますが、別のインスタンスでは機能しません。
public function add($page = null) {
// Custom component to get if user has required access level
// of page to write an article. If not, setflash to an error message
// specific to user's access level and redirect.
$access_message = $this->CustomPage->AccessMessage(4, $this->viewVars['access']);
if($access_message){
// Flash works but redirect does not
$this->Session->setFlash(__($access_message));
$this->redirect(array('action' => 'index', 'page' => $page));
// Also tried
// $this->redirect(array('controller'=>'articles', 'action' => 'index', 'page' => $page), null, true);
} else
{
if ($this->request->is('post')) {
$this->Article->create();
if ($this->Article->save($this->request->data)) {
// BLAH BLAH save post, do other stuff
// BLAH BLAH save post, do other stuff
// This flash and redirect works
$this->Session->setFlash(__('The article has been saved'));
$this->redirect(array('action' => 'view', 'id' => $article_id, 'page' => $page));
} else {
$this->Session->setFlash(__('The article could not be saved. Please, try again.'));
} // end else if article cannot be saved
} // if method is post
} // end if user has access
} // end add action
それは間違いなくコンポーネントと関係がありますが、私にはわかりません。おそらく、コンポーネントが使用された直後にリダイレクトが呼び出されるため、「$this」はコントローラーではなくコンポーネントでリダイレクトメソッドを実行しようとしています。$this->Article->redirect を試して、リダイレクトの前に Article モデルをリロードしましたが、どちらも機能しませんでした。
私のコンポーネントコードは次のとおりです。
public function AccessMessage($required_level, $user_level) {
if(!$user_level && $this->_View->viewVars['access']){
$user_level = $this->_View->viewVars['access'];
}
if(!$required_level || !$user_level || $user_level != $required_level){
$accessModel = ClassRegistry::init('Access');
$access_message = $accessModel->field('access_message', array('Access.id' => $required_level));
}
return $access_message;
}
編集1:わかりましたので、問題がどこから生じているのかを正確に見つけるために掘り下げました. コンポーネントの使用は、私が以前に考えていた問題ではありません。私のコンポーネントにあるのは
public function AccessMessage($required_level, $user_level) {
if(!$user_level && $this->_View->viewVars['access']){
$user_level = $this->_View->viewVars['access'];
}
if(!$required_level || !$user_level || $user_level != $required_level){
$access_message = 1;
}
return $access_message;
}
その後、動作します。問題は、私が期待している $access_message の値を返すため、正しく実装されているこれらの 2 行にありますが、リダイレクト機能に干渉しています。おそらくヘッダーはすでに送信されていますか?
$accessModel = ClassRegistry::init('Access');
$access_message = $accessModel->field('access_message', array('Access.id' => $required_level));
私も試したことに注意してください:
$access_message = ClassRegistry::init('Access')->field('access_message', array('Access.id' => $required_level));
と
$this->loadModel('Access');
$access_message = $this->Access->field('access_message', array('Access.id' => $required_level));
要点:
コンポーネントの要点: https://gist.github.com/970a951715205c222348
コントローラーの要点: https://gist.github.com/2b90e5af2518a81672fb
モデルの要点へのアクセス: https://gist.github.com/bhndbrwneyes/f333a93f0a21302d832f