rsobczuk
4.02.2008, 18:15:25
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
4.02.2008, 21:14:31
Po wywolaniu w filtrze $filterChain->execute(); mozesz sobie ustawic $user->setAttribute('back', $request->getUri() ); i wtedy to atrybutu z sesji spowrotem zrobic redirect
rsobczuk
4.02.2008, 22:11:30
Czyli mam rozumieć, że muszę sobie zapamiętać gdzieś (może być w sesji) na jakiej stronie aktualnie się znajduję?
A po co tak kombinować?
Obiekt
WebRequest ma metodę
getReferer().
Zrób co masz zrobić i przekieruj na referera
rsobczuk
4.02.2008, 23:34:34
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
5.02.2008, 00:21:11
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
5.02.2008, 10:44:01
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ł
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
5.02.2008, 12:08:08
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ł
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
rsobczuk
5.02.2008, 13:41:41
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
5.02.2008, 19:44:42
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
7.02.2008, 16:04:40
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
7.02.2008, 16:13:31
Zobacz, co zwraca metoda getConnection(), bo powinna obiekt PDO.
rsobczuk
7.02.2008, 16:19:14
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
7.02.2008, 16:23:43
Aaaaa to to jest Syfony ;p A to nie wiem

Co poszło nie tak, bo to jest debug object. Sprawdź dokumentację symfony.
Pozdrawiam.
rsobczuk
7.02.2008, 16:26:08
No wlasnie doSelect wykonuje sie bez zadnego problemu, czyli polaczenie do bazy mam!!!
destroyerr
7.02.2008, 16:28:02
@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
7.02.2008, 16:37:55
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
7.02.2008, 16:42:13
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 ...
<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
7.02.2008, 16:59:36
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?

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.