0

Page_Controllerのinit()関数には次のものがあります。

if ($this->ClassName != 'Trail' && $this->ClassName != 'Ride'){
    Session::clear('RelatedTrails');
} elseif ($this->ClassName == 'Ride') {
    Session::clear('RelatedTrails');
    Session::set('RelatedTrails', $this->getTrails());
}

ライドクラス:

function getTrails() {

        return $this->Trails();
    }
static $many_many = array(
        'Trails' => 'Trail'
    );

トレイルクラス

    class Trail extends Page {

        .....
        static $belongs_many_many = array(
            'Rides' => 'Ride',
        );
....
}

これにより、ユーザーがライドページにアクセスしたときにセッションが設定されます。このセッション情報をトレイルページで利用できるようにする必要があるのは、ライドページからトレイルページに直接移動する場合のみです。

「ライド」クラスのページにアクセスすると、セッションが設定されないという問題があります。ifステートメントの最初の部分からSession::clearをコメントアウトすると、セッションは正しく設定されますが、他のページタイプでクリアする必要があります。

最初の部分にエコーとダイを入れて、ここに落ちているかどうかを確認してみましたが、ヒットすることはありません。これは非常に奇妙な振る舞いです。誰かがここで何が起こっているのか見ることができますか?

更新:さらに説明すると、私には乗り物とトレイルがあります。乗り物には多くのトレイルが含まれる場合があります。ライドページには、ユーザーがライドに関連付けられているトレイルにクリックスルーできるメニューがあります。ライドからトレイルまでクリックすると、クリックしたばかりのライドに関連する他のトレイルを表示するメニューが表示されます。メニューのトレイルは、ライドページで設定されたセッションに保存されます。これらの関連するトレイルを引き続き表示できるように、メニューを介して他のトレイルをナビゲートするため、このセッションを保持する必要があります。

ユーザーが(乗車ではなく)トレイルページに直接リンクしている場合。関連するトレイルがないため、すべてのトレイルを表示できるように、これを知る必要があります。

4

1 に答える 1

2

すべてのトレイルをセッションに保存するのではなく、トレイルに所有者の ID を設定するだけで、ライドページを取得してトレイルを取得できます

これはあなたの場合に機能しますか?

class Page_Controller extends ContentController {
    ...
    public function init() {
        parent::init();
        // clear on every page
        Session::clear('rideID');
    }
    ...
}

class Ride_Controller extends Page_Controller {
    ...
    public function init() {
        parent::init();
        // sets the session after clear
        Session::set('rideID', $this->data()->ID);
    }
    ...
}

class Trail_Controller extends Page_Controller {
    ...
    public function getRelatedTrails()
        // get the ID from session before clear
        $rideID = Session::get('rideID');
        parent::init();
        $ridePage = DataObject::get_by_id('Ride', (int)$rideID);
        if ($ridePage && $ridePage->Trails())
            return $ridePage->Trails();
        // here you could return some default Trails, in case no RideID is set
        return false;
    }
    ...
}
于 2012-10-17T22:56:55.500 に答える