我在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页面上设置的会话中。我需要保留这个会话,因为他们通过菜单浏览其他路径,这样我就可以继续显示那些相关的路径了。
如果用户直接链接到跟踪页面(不是通过骑行)。我需要知道这一点,以便我可以显示所有路径,因为我没有任何相关的路径。
答案 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;
}
...
}