Silverstripe:会话出现问题。奇怪的行为
我的Page_控制器的init()函数中包含以下内容: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
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。非常感谢你在这里花时间!