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

时间:2012-10-17 21:58:08

标签: silverstripe

我在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'
    );

Trail Class

    class Trail extends Page {

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

当用户点击骑乘页面时设置会话。我只需要在Trail页面上直接从一个乘车页面到一个跟踪页面,就可以提供这个会话信息。

它给了我一些问题,因为当我点击'Ride'课程页面时,会话未设置。当我从if语句的第一部分注释掉Session :: clear时,会话设置正确,但是我需要它来清除任何其他页面类型。

我已经尝试在第一部分放置一个回声和一个骰子,看看它是否落入这里,但它永远不会被击中。这是非常奇怪的行为。谁能看到这里发生了什么?

更新: 进一步解释: 我有骑行和小径。乘车可以包含许多小径。在骑乘页面上,有一个菜单允许用户点击与骑行相关的小径。当他们从车道到路径点击时,会有一个菜单显示与他们刚从中点击过的车道相关的其他路径。菜单的路径存储在Ride页面上设置的会话中。我需要保留这个会话,因为他们通过菜单浏览其他路径,这样我就可以继续显示那些相关的路径了。

如果用户直接链接到跟踪页面(不是通过骑行)。我需要知道这一点,以便我可以显示所有路径,因为我没有任何相关的路径。

1 个答案:

答案 0 :(得分:2)

而不是将所有Trails保存到会话中,我只需设置持有者的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;
    }
    ...
}