0

リダイレクト コントローラー メソッドが一部の時間で機能していないことに気付きました。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

4

4 に答える 4

2

空きがあるかもしれませんbefore/after php Opening/Closing tags in controller and models。タグを開く前に、すべてのコントローラーとモデルからすべての終了タグと空白を削除します。次に、結果を確認します。

于 2013-01-31T05:19:09.520 に答える
1

ケーキ 2: コンポーネントの上部に: 追加

  public function initialize(Controller $controller) {
        $this->Controller = $controller;
    }

関数内では、次のようにリダイレクトできます。

$this->Controller->redirect(array('plugin' => false, 'controller' => 'users', 'action' => 'index'));
于 2015-11-14T18:06:59.597 に答える
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 は、ユーザーがページへのアクセスを許可されていない場合にのみ定義されます
  • 'access' viewVar がまったく設定されていない場合、エラーが発生する可能性があります

これを次のように変更します。

public function AccessMessage($required_level, $user_level) {
    $access_message = 0;

    if(!$user_level && $this->_View->get('access')){
        $user_level = $this->_View->get('access');
    }

    if(!$required_level || !$user_level || $user_level != $required_level){
        $access_message = 1;
    }

    return $access_message;
}

[更新] Gist に $access_message が定義されていることを確認しました( https://gist.github.com/970a951715205c222348 )

ただし、これは機能しませ

App::uses('Component', 'Controller', 'ClassRegistry', 'Utility');

App::uses() は 2 つの引数を取ります。使用したい「クラス」とその場所。上記の行は次のように記述します。

App::uses('Component',     'Controller/Component');
App::uses('Controller',    'Controller');
App::uses('ClassRegistry', 'Utility');

しかし、ClassRegistry を手動でロードする必要があるのだろうか

[更新 2] アプリケーションで実際に多くの「奇妙な」ことが起こっているので、それを整理できるかどうか疑問に思っています。

public function add($page = null) {
    $access = $this->viewVars['access'];

    if($this->CustomPage->AccessMessage(4, $access)){
        $this->Session->setFlash(__($this->CustomPage->AccessMessage(4, $access)));
        $this->redirect(array('action' => 'index', 'page' => $page));
    }

    // ......
}
  • 「viewVars['access']」はどこに設定されていますか?
  • 'viewVars['access']' を 2 番目のパラメーター ($user_level) として AccessMessage() に渡していますが、パラメーター '$user_level' が設定されていない場合、AccessMessage()で同じ viewVar を再度使用しようとしています。 ?
  • $this->CustomPage->AccessMessage() は 2 回呼び出され何かが返されたかどうかを確認してから使用します。あまり効率的ではない

.

public function add($page = null) {
    // Where does is $this->viewVars['access'] come from? Where is it set?
    $access  = empty($this->viewVars['access'])? null : $this->viewVars['access'];
    $message = $this->CustomPage->AccessMessage(4, $access);

    if ($message) {
        $this->Session->setFlash(__($message));
        $this->redirect(array('action' => 'index', 'page' => $page));
    }

    // ......
}

さらに注意してください。「メッセージ」が見つかり、空ではない場合にのみユーザーをリダイレクトしています。現在のユーザーのアクセス許可に基づいていない場合は、2 つを分割することを検討してください。

あなたのコンポーネントで:

public function HasAccessLevel($required_level, $user_level) {
    if(!$user_level || $user_level != $required_level){
        return false;
    }

    return true;
}

public function AccessMessage($required_level) {
    return ClassRegistry::init('Access')->field('access_message', array('Access.id' => $required_level));
}

コントローラーで:

public function add($page = null) {
    // Where does is $this->viewVars['access'] come from? Where is it set?
    $access  = empty($this->viewVars['access'])? null : $this->viewVars['access'];

    if($this->CustomPage->HasAccessLevel(4, $access)){
        $this->Session->setFlash(__($this->CustomPage->AccessMessage(4)));
        $this->redirect(array('action' => 'index', 'page' => $page));
    }

    // ......
}
于 2013-02-03T14:11:01.887 に答える
0

index()リダイレクトが呼び出されてもリダイレクトされない場合は、アクションにアクセスを妨げる権限チェックがあると思います。コントローラーコード全体を確認または投稿できますか?

于 2013-01-27T10:52:13.610 に答える