Silverstripe:会话出现问题。奇怪的行为

Silverstripe:会话出现问题。奇怪的行为,silverstripe,Silverstripe,我的Page_控制器的init()函数中包含以下内容: if ($this->ClassName != 'Trail' && $this->ClassName != 'Ride'){ Session::clear('RelatedTrails'); } elseif ($this->ClassName == 'Ride') { Session::clear('RelatedTrails'); Session::set('RelatedTr

我的Page_控制器的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时,会话设置正确,但是我需要在任何其他页面类型上清除它

我试着在第一部分放一个回声和一个骰子,看看它是否落在这里,但它从未被击中。这是非常奇怪的行为。有人能看到这里发生了什么吗

更新: 进一步解释: 我有游乐设施和小径。一次骑行可以有许多小径。在骑乘页面上,有一个菜单,允许用户点击与骑乘相关的轨迹。当他们从骑乘设施点击到小径时,会出现一个菜单,显示与他们刚刚点击的骑乘设施相关的其他小径。菜单的轨迹存储在骑乘页面上设置的会话中。当他们通过菜单导航其他轨迹时,我需要保留此会话,以便我可以继续显示这些相关轨迹


如果用户直接链接到trail页面(不是通过骑乘)。我需要知道这一点,这样我就可以显示所有的轨迹,因为我没有任何关联的轨迹。

与其将所有轨迹保存到会话中,我只需要设置持有者的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;
    }
    ...
}

我个人认为,在处理我认为你们试图做的事情时,会话总是一种糟糕的方式。如果你能解释一下骑乘页面和小道页面之间的关系,或者发布相关代码,我想我们可能会找到更好的方法来处理它。谢谢。我已经添加了一个更新和一些代码。这段代码是什么类的?Trail是一个页面还是一个数据对象?Trail是一个页面。我的会话设置器在page类中。GetTrails和许多人都在乘坐课程中,感谢您的回复。我遇到的唯一问题是,如果我将会话设置为从任何地方(甚至主页)清除,则会话甚至不会在骑乘页面上设置,因为如果有人独立于骑乘导航到小径,我需要能够显示所有其他小径,而不仅仅是与骑乘相关的小径。你看,一条小径可以属于许多游乐设施,所以我们不知道该展示哪些其他游乐设施,所以我们会展示所有游乐设施。我通过将查询字符串从骑乘区传递到小道并仅显示相关小道(如果存在)来对其进行排序。谢谢你花时间帮忙!出于某种原因,如果我在任何地方清除会话(即使是与当前类无关的类),也不允许设置会话。我设法绕过它,只需像以前一样在骑乘页面上设置会话,然后将查询字符串传递到trail页面,以确定我们来自骑乘页面,然后继续传递查询字符串,直到我们离开该部分。通过这种方式,如果有人直接进入trail页面,他们将看到所有的trail,而不仅仅是与特定行驶相关的trail。非常感谢你在这里花时间!