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

而不是将所有 Trails 保存到会话中,我只需在 Trail 上设置持有者的 ID,然后您可以获取 Ride Page 并获取 Trails

这对你的情况有用吗?

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 回答