2

プラグインLoginおよびBabelで modX Revo を使用しています。Babel のマニュアルに書かれているように、2 つの言語用に 2 つのコンテキストを作成し、TV パラメータを使用し、contextSwitch プラグインを作成しました。ほとんどの場合、マニュアルの例のプラグインに似ています。その後、イベントHandleRequestにプラグインを配置しました。

ログイン後のコンテキストの切り替え以外はすべて機能しています。ユーザーが承認されている場合、modX はメイン ページのみを表示し、他のページは 404 ページを表示します。コードを調べてみたところ、モデル modx のメソッド switchContext (/core/model/modx/modx.class.php の 1843 行目) が false を返すことがわかりました。

  public function switchContext($contextKey, $reload = false) {
        $switched= false;
        if ($this->context->key != $contextKey) {
            $switched= $this->_initContext($contextKey, $reload); // RETURNS FALSE
            if ($switched) {
                if (is_array($this->config)) {
                    $this->setPlaceholders($this->config, '+');
                }
            }
        }
        return $switched;
    }

これは、コンテキストを開始できないために発生します (同じファイルの同じクラスのメソッド _initContext)。ここで、コンテキストに切り替えるように要求すると、コンテキストは正しく作成されますが、$this->context->checkPolicy('load') は false を返します (同じファイルの 2169 行付近)。

protected function _initContext($contextKey, $regenerate = false) {
    // HERE IS EVERYTHING ALLRIGHT
    $initialized= false;
    $oldContext = is_object($this->context) ? $this->context->get('key') : '';
    if (isset($this->contexts[$contextKey])) {
        $this->context= & $this->contexts[$contextKey];
    } else {
        $this->context= $this->newObject('modContext');
        $this->context->_fields['key']= $contextKey;
    }
    if ($this->context) { //HERE TRUE
        if (!$this->context->prepare((boolean) $regenerate)) { // HERE TRUE
            $this->log(modX::LOG_LEVEL_ERROR, 'Could not prepare context: ' . $contextKey);
        } else {
            if ($this->context->checkPolicy('load')) { // HERE FALSE - MODX CAN'T DO IT
                // .. SOME OTHER modX CODE

その後、コアをかき回すのをやめました。誰かがすでにそのようなものを見たことがありますか、ユーザーがログインしているときに modx がコンテキストを切り替えることができない理由に答えるのに良い modx Revo コアを知っていますか?

Ps コンテキスト スイッチ プラグインに別のイベントを使用しようとしましたが、もちろん、このイベントはプラグインに最も適しています。そして、ユーザーがログインしている間だけ modx がコンテキストを切り替えることができないことを強調しています!

アップデート

いくつかの権限を編集しようとしました。しかし、何も起こりませんでした (私は現金を清算し、すべてのユーザーを再ログインしました)。これはコンテキスト権限のスクリーンショットです(英語以外の人には申し訳ありませんが、明確にする必要があります): ここに画像の説明を入力

UPDATE 2 パーミッションが間違っていました: それらはすべて 9999 で、"list, veiw, load" でなければなりません。しかし、同時に、以前と同じように2番目のコンテキストにいる間はログインできません。今、私はそれが同じ問題かどうかを調べようとしました。

更新 3 ログインに関する 2 番目の問題は非常に簡単に解決できます。スニペット パラメータには &contexts= が必要です。web,eng

4

1 に答える 1

3

$this->context->checkPolicy('load') は false を返します (同じファイルの 2169 行付近)。

さて、あなたの答えがあります!ユーザーがコンテキストに切り替えるには、少なくともコンテキストの「読み込み」権限が必要です。

[セキュリティ] > [アクセス ポリシー] に移動し、ユーザー グループを右クリックして更新を選択します。[Context Access] タブで、できれば "Load, List & View" アクセス ポリシーを使用して、フロントエンドに面したすべてのコンテキストがそこにリストされていることを確認します。ログインしていないユーザーに使用される (匿名の) グループと同様に、自分でロックアウトされるのを防ぐために、最初に管理者ユーザー グループに対してこれを実行することをお勧めします。

特定の設定について詳しく調べないと 100% 確実ではありませんが、匿名ユーザーに対して機能する理由を説明する 2 番目のコンテキストへのアクセス権をユーザー グループに与えていないと思います。

于 2012-03-18T19:46:05.620 に答える