Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasy modelu
Forum PHP.pl > Forum > PHP > Frameworki
rsobczuk
Stworzyłem sobie w Symfony nowy komponent. Są to 2 flagi, które pozwolą zmienić mi język aplikacji (np z PL na EN). Komponent ten wyświetla się na wszystkich stronach (jest wywołany w layout.php).
Po kliknięciu którejś z flag wywołana jest akcja np. ......../language/change/l/polish
Chciał bym, żeby po wykonaniu akcji executeChange() strona została przekierowana do miejsca z którego została wykonana akcja zmiany języka.
Dziękuję z góry za pomoc.
RS
defrag
Po wywolaniu w filtrze $filterChain->execute(); mozesz sobie ustawic $user->setAttribute('back', $request->getUri() ); i wtedy to atrybutu z sesji spowrotem zrobic redirect
rsobczuk
Czyli mam rozumieć, że muszę sobie zapamiętać gdzieś (może być w sesji) na jakiej stronie aktualnie się znajduję?
mike
A po co tak kombinować?
Obiekt WebRequest ma metodę getReferer().
Zrób co masz zrobić i przekieruj na referera smile.gif
rsobczuk
Działa super!!!
Mam jeszcze inne pytanko:
Stworzyłem sobie moduł A i w nim mam akcje... Jedna z akcji zapisuje coś do bazy danych (AkcjaZapisz).
Czy możliwe jest wywołanie tej akcji (AkcjaZapisz) z modułu A w jakiejś innej akcji w module B?
AkcjęZapisz chciał bym wywoływać z innej akcji innego modułu lub z dowolnego pliku template'u.

Dodatkowo...
Stworzyłem sobie komponent, który mogę wywołać z poziomu template'u, ale nie wiem, czy można ten sam komponent wywołać z poziomu akcji - komponent nic nie pokazuje na ekranie,ale zapisuje coś w bazie danych...

Być może gdzieś pobłądziłem, bo chodzi mi o to, żeby przy każdej akcji jaka następuje na stronie coś zapisało się do bazy danych - coś w stylu zapisywania logów. Nie chcę tworzyć zwykłych funkcji, a potem include, które coś wrzucają do bazy, ale chcę użyć w pełni symfony i modelu ORM.

Pozdrawiam
RS
destroyerr
Jeśli chodzi o coś w stylu logów to zastosuj do tego filtr. Polecam przeczytać książkę, wszystkie tego typu informacje są w niej zawarte, jeśli nie są podane bezpośrednio to wielu rzeczy można się z niej domyśleć.

Co do modułu A i B to nic nie zrozumiałem.
rsobczuk
Zapomnij o tym A i B. Chodzi mi o to, że chciał bym stworzyć sobie jakąś klasę, która będzie zapisywała mi coś w bazie danych. Klasa powinna być dostępna z poziomu każdej akcji w aplikacji/projekcie. Do budowy klasy -budowy zapytań chciał bym użyć ORM.
Dzięki
Rafał
mike
Do tego właśnie masz klasy modeli. Propel generuje modele na podstawie encji bazy danych.
Wygenerowane klasy znajdziesz w lib/models (z tego co pamiętam). I tam bawisz się ORMem.

Czytałeś w ogóle dokumentację? Odnoszę wrażenie, że nie.
rsobczuk
Dzięki za naprowadzenie. To chyba to, o co mi chodziło. Dokumentację przeczytałem, ale nie do końca, chociaż o klasach modeli przeczytałem, ale nie uważnie widocznie... po robocie jestem za bardzo zmęczony... musiało mi to uciec.
Tak naprawdę nie jestem pewien, czy Symfony jest w stanie dać mi to, czego oczekuję i staram się to wykorzystywać jak narazie metodą prób i błędów.
Dzięki raz jeszcze
Rafał
mike
Cytat(rsobczuk @ 5.02.2008, 12:08:08 ) *
Tak naprawdę nie jestem pewien, czy Symfony jest w stanie dać mi to, czego oczekuję i staram się to wykorzystywać jak narazie metodą prób i błędów.
To zależy czego oczekujesz smile.gif
rsobczuk
Jakiś czas temu w poprzedniej firmie stworzyliśmy framework, który bazował na Smarty. Część rzeczy działa w nim podobnie. Był to jednak framework uzywany tylko u nas w firmie. Całkiem fajnie tworzyło się w nim aplikacje i stronki.
Zależy mi jednak na opanowaniu frameworku, który jest publicznie znany. O ile opanuję symfony i zacznę w miarę swobodnie tworzyć w nim aplikacje pewnie kolejnym krokiem będzie kolejny framework.

Mam jeszcze pytanko apropos tych klas modelu.
Mam stworzoną tabelę w bazie SessionInfo (pomijając fakt, ze jest obsługa sesji już w Symfony). Posiada ona kilka kolumn (session_id, session_identifier, session_string, session_date, session_ip).
Generator stworzył mi pliki (między innymi jest SessionInfo.php w katalogu /lib/model
W nim mam klasę SessionInfo. Plik wygląda tak:

<?php

/**
* Subclass for representing a row from the 'session_info' table.
*
*
*
* @package lib.model
*/
class SessionInfo extends BaseSessionInfo
{
public static function DB_initializeSession(){

/*
$pSessionCriteria = new Criteria();
$pSessionCriteria->add(SessionInfoPeer::SESSION_IDENTIFIER, session_id());

$pSessionInfo = SessionInfoPeer::doSelect($pSessionCriteria);

// tu jest problem
$pSessionInfo->getSessionString();
//Fatal error: Call to a member function getSessionString() on a non-object in

if(count($pSessionInfo) == 0){
$pNewSessionInfo = new SessionInfo();
$pNewSessionInfo->setSessionIdentifier(session_id());
$pNewSessionInfo->setSessionDate(date("Y-m-d H:i:s"));
$pNewSessionInfo->setSessionIp($_SERVER['REMOTE_ADDR']);
$pNewSessionInfo->setSessionString(DEFAULT_LANGUAGE);
$pNewSessionInfo->save();
}
}
*/
}

Aktualnie metoda DB_initializeSession jest wywołana w jednym z komponentów na stronie głównej: SessionInfo::DB_initializeSession();
Zadaniem tej metody jest sprawdzenie, czy istnieje taki identyfikator sesji w bazie danych. Jeżeli tak, to odczytaj jakieś informacje o nim, jeżeli nie stwórz nowy identyfikator sesji i zapisz go w bazie danych.
To co jest zaremowane dopisane jest przeze mnie. Jak odremuję wszystko działa ładnie, ale mam problem z odczytaniem wartości identyfikatora sesji. Co jest nie tak i jak powinienem to zrobić?
Chciał bym stworzyć sobie jeszcze wiele róznych metod do obsługi tej tabeli, czy innych, które będą wywołane z dowolnej akcji w aplikacji.
Dzięki
Rafał
destroyerr
No to w ilu postach trzeba Ci napisać, żebyś przeczytał dokumentację?? Zobacz lepiej co zwraca funkcja SessionInfoPeer::doSelect().
Gdybyś czytał dokumentację pewnie dowiedziałbyś się, że fukcja DB_initializeSession() powinna się raczej znaleźć w klasie SessionInfoPeer.

To co chcesz uzyskać lepiej wykonać za pomocą filtrów, o tym zresztą też już pisałem.
rsobczuk
Witam ponownie...
przebrnąłem przez większość problemów narazie, ale napotkałem kolejny.
W klasie modelu chcę wykonać doUpdate jednego rekordu i stworzyłem sobie coś takiego:

private static function DB_setSessionStringElements($aElementsArray){

$pString = 'Hello world';

$aaa = new Criteria();
$aaa->add(self::SESSION_IDENTIFIER, session_id());

$pUpdateCriteria = new Criteria();
$pUpdateCriteria->add(self::SESSION_STRING, $pString);

$connection = Propel::getConnection();
SessionInfoPeer::doUpdate($aaa, $pUpdateCriteria, $connection);

}

Dostałem coś takiego :
Fatal error: Argument 3 passed to BasePeer::doUpdate() must implement interface Connection, called in ................

Przeszukałem kilka stron w necie, w dokumentacji niewiele jest napisane na temat doUpdate. Czemu jest problem z połączeniem?

Dzięki
Rafał
Cysiaczek
Zobacz, co zwraca metoda getConnection(), bo powinna obiekt PDO.
rsobczuk
No wlasnie cos zwraca.. cos takiego konkretnie:
sfDebugConnection Object ( [childConnection:private] => MySQLConnection Object ( [database:private] => www_sobczuk_eu [transactionOpcount:protected] => 0 [dblink:protected] => Resource id #133 [dsn:protected] => Array ( [database] => www_sobczuk_eu [encoding] => [hostspec] => localhost [password] => xxxxxxxx [persistent] => [phptype] => mysql [port] => [protocol] => [socket] => [username] => user_www ) [flags:protected] => 0 [lastQuery] => SELECT session_info.SESSION_ID, session_info.SESSION_IDENTIFIER, session_info.SESSION_STRING, session_info.SESSION_DATE, session_info.SESSION_IP FROM session_info WHERE session_info.SESSION_IDENTIFIER='ujpffd491mhl6fap5gdjd1c5a1' LIMIT 1 ) [numQueriesExecuted:private] => 1 [lastExecutedQuery:private] => SELECT session_info.SESSION_ID, session_info.SESSION_IDENTIFIER, session_info.SESSION_STRING, session_info.SESSION_DATE, session_info.SESSION_IP FROM session_info WHERE session_info.SESSION_IDENTIFIER='ujpffd491mhl6fap5gdjd1c5a1' LIMIT 1 )
Cysiaczek
Aaaaa to to jest Syfony ;p A to nie wiem snitch.gif Co poszło nie tak, bo to jest debug object. Sprawdź dokumentację symfony.

Pozdrawiam.
rsobczuk
No wlasnie doSelect wykonuje sie bez zadnego problemu, czyli polaczenie do bazy mam!!!
destroyerr
@Cysiaczek: ta metoda nie powinna zwracać obiektu PDO ponieważ symfony 1.0.x ma starego Propela.

@rsobczuk: jeżeli chcesz uzyskać połączenie propela to metode getConnection() musisz wywołać z parametrem, który jest nazwą tego połączenia, które chcesz uzyskać (standardowo: propel). Jednak metody doUpdate nie wymagają 3 parametru, czyli połączenia. No chyba, że istnieje u Ciebie taka potrzeba.
rsobczuk
Jeżeli wyrzuciłem 3ci parametr, to jest dokładnie to samo. Chcę, żeby używane było dokładnie to samo połączenie, które jest używane do selectów...
Cysiaczek
daj getConnection(null).
W Propelu jest moim zdaniem błąd (choć devy mówią, że jest ok). Polaga na tym, że jeśli nie podasz nazwy bazy danych, lub podana nazwa nie istnieje (nie ma bazy), to są zgłaszane wyjątki. Plik schema.xml ...
  1. <database name="nazwa" />


Jeśli nie podasz nazwy bazy danych automatycznie zostanie wygenerowany pusty string, który powoduje błędy (bo takiej bazy przecież nie ma!). Teraz zauważ, że masz w propelu tzw blok default, który zawiera dane do domyślnego połaczenia z bazą. Jest on wywoływany tylko, gdy nazwa bazy danych ma wartość NULL. Przeszukaj pliki pod kątem nazwy Twojej bazy danych i zamień jej na NULL (2 zmiany na model, o ile się nie mylę)
Wiem, że to trochę zamotane, ale jeśli zmeniałeś nazwę bazy danych (np przy przenosinach na inny serwer), to może to Ci pomoże

Pozdrawiam.

p.s zawsze możesz wygenerować nowy model z nową nazwą bazy danych.
rsobczuk
Zrobiłem tak:
Sprawdziłem metodę doUpdate w klasie Base<tabela>Peer i okazało się, że przyjmuje ona tylko 2 parametry:
public static function doUpdate($values, $con = null){...}
Dziwne to bardzo, bo żadnego zapytania chyba nie wykonam w ten sposób?questionmark.gif
Jak sobie podejrzysz jakie zapytania wykonują się podczas ładowania strony, to jednym z nich jest:
UPDATE session_info SET SESSION_STRING = 'ccc' WHERE session_info.SESSION_ID IS NULL
Chciałem dodać drugi warunek, żeby było:
UPDATE session_info SET SESSION_STRING = 'ccc' WHERE session_info.SESSION_ID = 'ujpffd491mhl6fap5gdjd1c5a1'

W tej samej funkcji uzyty jest doUpdate:
BasePeer::doUpdate($selectCriteria, $criteria, $con);
Uzyłem tego i zadziałało...:
UPDATE session_info SET SESSION_STRING = 'ccc' WHERE session_info.SESSION_IDENTIFIER='ujpffd491mhl6fap5gdjd1c5a1'
Czy może ktoś mi powiedzieć czemu tak?

Dzięki
Rafał
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.