Temat: Użytkownicy online - problem z app_controll.php

Potrzebuje informacji na temat użytkowników, którzy są online w serwisie. W bazie danych trzymam informacje o ostatniej akcji zalogowanego użytkownika i na tej podstawie wysnuwam wniosek, czy jest on on-line, czy nie. Zapis akcji robię w app_controller.php jako, że kod tam zawarty jest wykonywane zawsze. Cały kod jest zawarty w metodzie beforeRender

$member=$this->Session->read('Auth.Member');
        if(!empty($member)){
            $this->set('auth', true);
            if(isset($this->Member)){
                $data=array();
                $data['Member']['id']=$member['id'];
                $data['Member']['last_action']=time();
                $this->Member->save($data,false);
            }
        } else
            $this->set('auth', false);

Problem w tym, że czasami odwołanie $this->Member - wyrzuca błąd, gdyż nie każda podstrona używa tego modelu. W takim wypadku chciałem dynamiczne załadować moduł, jednak App:import wyrzuca błąd, że metoda import() nie istnieje. W jaki sposób zrobić to tak, aby działało poprawnie? Tzn. załadować dynamicznie moduł Member lub w ogóle przenieść wywołanie z app_controller.php gdzie indziej ten kod?

2

Odp: Użytkownicy online - problem z app_controll.php

jeśli 1.2 spróbuj ClassRegistry::init()

3

Odp: Użytkownicy online - problem z app_controll.php

skorzystaj z loadModel:

if (!isset($this->Member)) $this->loadModel('Member');

4

Odp: Użytkownicy online - problem z app_controll.php

tomay7 napisał/a:

skorzystaj z loadModel:

if (!isset($this->Member)) $this->loadModel('Member');

Raczej bym uzyl jednak klasy registry ;-)

5

Odp: Użytkownicy online - problem z app_controll.php

deweloperzy Cake radza uzywac loadModel, no i zauwaz jaka roznica w objetosci kodu tongue

Ostatnio edytowany przez tomay7 (2010-01-28 23:19:00)

6

Odp: Użytkownicy online - problem z app_controll.php

W wiekosci przypadkow, jezeli juz ladujesz model w ktorlerze, wywolujesz z niego odpowiednia metode, i wysylasz dane do widoku/ komponentu, wtedy zamiast :

if (!isset($this->Liwko)) $this->loadModel('Liwko');
$this->set("data",$this->Liwko->skoczPoPiwko());

mozesz zrobic tak:

$this->set("data",ClassRegistry::init("Liwko","Model")->skoczPoPiwko()); 

Zeby mozna bylo obslugiwac bledy ladowania modelu, albo unikac tworzenia dwoch instancji tego samego modelu, mozna opakowac ClassResitry::init i ClassRegistry::getObject w jakas metode, dzieki ktorej zminimializujemy ryzyko refactoringu 3/4 aplikacji wink

Przy korzystaniu z fluent interface, wygla to jeszcze bardziej minimalistycznie i przejzyscie :

$this->getModelObject("Liwko")->skoczPoPiwko()->getUsers()->sortByName()->saveTofile("log.txt")->skoczPoDrugie();

Tak, fatycznie gwoo gdzies tam pisal , ze on osobiscie woli  $this->loadModel(), ale ja uwazam ze  modele , o ile nie sa automatycznie ladowanie przez kontroller ( model podstawowy, albo z $uses), to nie powinny byc ladowane wg lasnego widzimisie, do kontrollera mozna zawsze zrobic model, niekrzystajacy z tabeli, porobic akcesory do obcych modeli i tam sobie ladowac, nie ladowac, sprawdzac poprawnosc otrzymanych danych i dopowiednio reagowac na bledy, zostawiac kontrollery przejrzystymi.

A terazskocze po piate, sam.

Ostatnio edytowany przez robal77 (2010-02-01 04:29:31)

7

Odp: Użytkownicy online - problem z app_controll.php

no musze przyznac, ze jest duzo racji w tym co piszesz. tak btw gwoo juz nie pisze cake-a tylko lithium smile

8

Odp: Użytkownicy online - problem z app_controll.php

pewnie nie wytrzymal brniecia bez konca w php4 , kiedy ostani raz sprawdzalem roadmap kejka, zapowiadalo sie na to ze bedzie napisany w php5 , tuz przed wypuszczeniem php8 rc 1 ;-)

Co do samego lithium ... jakos tego nie widze na serwerach produkcyjnych, chyba ze ktos sobie chce koniecznie zrobic cos we frameworku php5  bez przegladania tysiecy stron dokumentacji smile

9

Odp: Użytkownicy online - problem z app_controll.php

w app_controller dodajesz zmienna klasy:

var $uses = array('Member');

dzieki temu kazda akcja bedzie miala model Member smile

a potem w beforeFilter() dajesz:
- sprawdzenie czy jest zmienna sesyjna ($this->Session->check('Auth.User.id'))
- jezeli jest, to zaktualizuj baze itp.