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

Това задава сесия, когато потребителят посети страница за пътуване. Трябва да направя информацията за тази сесия налична на страницата на пътеката САМО когато преминават директно от страница с каране към страница с пътека.

Създава ми проблеми с това, че когато натисна страница на клас „Ride“, сесията не е зададена. Когато коментирам Session::clear от първата част на оператора if, сесията е зададена правилно, но имам нужда от нея, за да изчистя всеки друг тип страница.

Опитах се да сложа ехо и зарче в първата част, за да видя дали пада тук, но никога не се уцелва. Това е много странно поведение. Може ли някой да види какво става тук?

АКТУАЛИЗАЦИЯ: За да обясня допълнително: имам вози и пътеки. Едно пътуване може да съдържа много пътеки. На страницата за каране има меню, което позволява на потребителя да кликне до пътеките, които са свързани с карането. Когато кликнат от пътуването до пътеката, има меню, което показва другите пътеки, свързани с пътуването, от което току-що са щракнали. Пътеките за менюто се съхраняват в сесията, която е зададена на страницата Ride. Трябва да запазя тази сесия, докато те навигират в другите пътеки чрез менюто, за да мога да продължа да показвам тези свързани пътеки.

Ако потребителят се свързва директно към страницата на пътеката (не чрез пътуване). Трябва да знам това, за да мога просто да покажа ВСИЧКИ пътеки, тъй като нямам свързани пътеки.


person Fraser    schedule 17.10.2012    source източник
comment
Аз лично намирам сесията винаги за лош начин да се справя с това, което мисля, че се опитвате да направите. ако можете да обясните връзката между страницата Ride и страницата Trail и може би да публикувате съответния код, мисля, че може да намерим още по-добър начин да се справим с него.   -  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)


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