Silverstripe: проблема с сеансом. Странное поведение

У меня есть следующее в функции init() моего Page_Controller:

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',
        );
....
}

Это устанавливает сеанс, когда пользователь переходит на страницу поездки. Мне нужно сделать информацию об этом сеансе доступной на странице маршрута ТОЛЬКО тогда, когда они переходят непосредственно со страницы маршрута на страницу маршрута.

Это вызывает у меня проблемы в том, что когда я нажимаю на страницу класса «Поездка», сеанс не устанавливается. Когда я комментирую Session::clear из первой части оператора if, сеанс устанавливается правильно, однако мне нужно, чтобы он очищался на любом другом типе страницы.

Я пытался поставить эхо и кубик в первой части, чтобы увидеть, попадает ли он сюда, но он никогда не попадал. Это очень странное поведение. Кто-нибудь может увидеть, что здесь происходит?

ОБНОВЛЕНИЕ: Чтобы объяснить дальше: у меня есть аттракционы и тропы. Поездка может содержать множество маршрутов. На странице поездки есть меню, которое позволяет пользователю переходить по маршрутам, связанным с поездкой. Когда они переходят от поездки к тропе, появляется меню, в котором отображаются другие маршруты, связанные с поездкой, которую они только что перешли. Трассы для меню сохраняются в сеансе, установленном на странице поездки. Мне нужно сохранить этот сеанс, поскольку они перемещаются по другим тропам через меню, чтобы я мог продолжать показывать эти связанные тропы.

Если пользователь напрямую переходит на страницу следа (не через поездку). Мне нужно знать это, чтобы я мог просто показать ВСЕ следы, поскольку у меня нет связанных следов.


person Fraser    schedule 17.10.2012    source источник
comment
Я лично нахожу сеанс всегда плохим способом справиться с тем, что, как я думаю, вы пытаетесь сделать. если бы вы могли объяснить связь между страницей поездки и страницей маршрута и, возможно, опубликовать соответствующий код, я думаю, мы могли бы найти еще лучший способ справиться с этим.   -  person Zauberfisch    schedule 18.10.2012
comment
Спасибо. Я добавил обновление и еще немного кода   -  person Fraser    schedule 18.10.2012
comment
в каком классе этот код? И является ли Trail страницей или DataObject?   -  person Zauberfisch    schedule 18.10.2012
comment
Трейл — это страница. Мой установщик сеанса находится в классе страницы. GetTrails и many_many относятся к классу Ride.   -  person Fraser    schedule 18.10.2012


Ответы (1)


вместо того, чтобы сохранять все следы в сеансе, я бы просто установил идентификатор держателя на следе, после чего вы можете получить страницу поездки и получить следы

будет ли это работать в вашем случае?

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;
    }
    ...
}
person Zauberfisch    schedule 17.10.2012
comment
Спасибо за ответ. Единственная проблема, с которой я сталкиваюсь, заключается в том, что если я устанавливаю сеанс на очистку из любого места (даже с домашней страницы), сеанс даже не устанавливается на странице поездки. - person Fraser; 18.10.2012
comment
потому что, если кто-то переходит к тропе независимо от поездки, мне нужно иметь возможность отображать все остальные тропы, а не только те, которые связаны с поездкой. Видите ли, тропа может принадлежать многим аттракционам, поэтому мы не знали, какие другие показать, поэтому мы показываем их все. Мне удалось отсортировать его, передав строку запроса от поездки к следу и показав только связанные следы, если они существуют. Спасибо, что нашли время помочь! - person Fraser; 18.10.2012
comment
По какой-то причине, если я очищал сеанс из любого места (даже из класса, не связанного с текущим классом), это не позволяло установить сеанс. Мне удается обойти это, просто установив сеанс на странице поездки, как и раньше, а затем передав строку запроса на страницу следа, чтобы определить, откуда мы пришли со страницы поездки, а затем продолжая передавать строку запроса, пока мы не покинем этот раздел. Таким образом, если кто-то зайдет прямо на страницу маршрута, ему будут показаны все маршруты, а не только те, которые относятся к конкретной поездке. Тем не менее, огромное спасибо за ваше время! - person Fraser; 20.10.2012