Yii Framework Forum: Takie Same Oddzielne Serwisy - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Takie Same Oddzielne Serwisy Rate Topic: -----

#1 User is offline   andrzej1_1 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 67
  • Joined: 16-April 13

Posted 03 December 2013 - 09:54 AM

Witam. Mój współpracownik chce, by serwis był dla wielu krajów i żeby każdy był osobny tj. dla każdego osobna baza. Poza tym kod będzie taki sam.

1.Czy najlepszym rozwiązaniem jest skopiowanie ileś razy folderu z aplikacją i dla każdego w configu zmienienie języka?

Dodatkowo czas jest brany z serwera i przez to nie zgodny z lokalnym czasem użytkownika. Rozwiązaniem dla PHP jest ustawienie w configu 'timeZone' i wtedy time() zwraca czas zgodny ze strefą, ale zostaje MySQL.

2.Teraz mam poprawiać każde zapytanie na stronie w którym jest NOW() albo CURRENT_TIMESTAMP, czy może jest sposób by dla danej strefy Yii je podmieniał?
0

#2 User is offline   nineinchnick 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 622
  • Joined: 12-September 11
  • Location:Bialystok, Poland

Posted 03 December 2013 - 02:04 PM

Moim zdaniem powinien być jeden folder z kodem aplikacji i tylko różna konfiguracja zależnie od wybranego kraju (różne połączenia, różny język). Mam takie rozwiązanie w moim demku, źródła na Githubie.

Czas powinien być przechowywany w aplikacji zawsze bezwzględnie, czyli w UTC (bez offsetu). Powinien być formatowany przy wyświetlaniu zależnie od strefy czasowej użytkownika.
Nie polecam też stosowania funkcji date() i time() tylko klasy DateTime wbudowanej w PHP.
Don't be a dick.
1

#3 User is offline   andrzej1_1 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 67
  • Joined: 16-April 13

Posted 03 December 2013 - 02:30 PM

Jak mogłem na to nie wpaść że, może być to jedna aplikacja i różne połączenia do bazy... Naprawdę dużo to ułatwia sprawę przyszłych modyfikacji serwisu.

Czyli że wszędzie przy zapisywaniu czasu używam:
$time = new DateTime('NOW', new DateTimeZone('UTC'));

,a do formatowania i offsetu przy wyświetlaniu:
$time = new DateTime($model->time, new DateTimeZone('Europe/Warsaw');
?


P.s Jak z obiektu DateTime wypisać czas? $object['date'] nie działa, a nie potrafię odnaleźć się w dokumentacji.
0

#4 User is offline   nineinchnick 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 622
  • Joined: 12-September 11
  • Location:Bialystok, Poland

Posted 03 December 2013 - 03:50 PM

DateTime.format()
Don't be a dick.
1

#5 User is offline   andrzej1_1 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 67
  • Joined: 16-April 13

Posted 04 December 2013 - 10:04 AM

Ok dzięki. Teraz została jeszcze jedna kwestia: skąd brać strefę czasową usera i gdzie ją przechowywać? Lokalizacja przez IP nie jest zawsze prawidłowa, więc trzeba ustalać strefę na podstawie tego co poda użytkownik. Tylko czy lepiej zrobić dropdownlist na stronie i zapisywać wartość w ciasteczku czy może jednak przy rejestracji dać możliwość wyboru kraju i na podstawie jego pobierać strefę z bazy?
0

#6 User is offline   nineinchnick 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 622
  • Joined: 12-September 11
  • Location:Bialystok, Poland

Posted 04 December 2013 - 11:21 AM

Ja bym to zrobił jawnie, przy rejestracji, i zapisał na stałe, z możliwością zmiany później.
Don't be a dick.
1

#7 User is offline   andrzej1_1 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 67
  • Joined: 16-April 13

Posted 04 December 2013 - 12:07 PM

W kodzie mam dość dużo wyrażenia 'NOW()'. Zamiast bindować to:
$time = new DateTime('NOW', new DateTimeZone('UTC'));

lepiej dać po prostu w zapytaniu 'UTC_TIMESTAMP()' ?
I czy mógłbyś mi powiedzieć gdzie trzymać informacje o strefie po pobraniu jej z bazy? Cookies czy może jakoś da się załadować to do configa?
0

#8 User is offline   Rasgan 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 14
  • Joined: 26-June 13

Posted 04 December 2013 - 11:55 PM

Pobierz z bazy i trzymaj w sesji lub w $this->user jeśli masz to zapisane w tabeli użytkowników.
1

#9 User is offline   aztech 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 206
  • Joined: 12-December 08
  • Location:Poland

Posted 05 December 2013 - 02:30 AM

Jeżeli nie chcesz tworzyć tysiąca baz danych, tylko jedną, to możesz skorzystać z opcji prefiksów do nazw tabel w modelu ActiveRecord. Załóżmy, że masz tabelę, w której chcesz przechowywać użytkowników. Wtedy definiujesz w modelu tabeli nazwę jako {{user}} a prefiks ustalasz w zależności od języka i tak, np. dla Polski będziesz miał tabelę pl_user, dla Niemiec {{de_user}} i tak dalej a tylko 1 model do obsługi i łatwiejsze zarządzanie bazami
I'm not complete idiot... some parts are missing!
1

#10 User is offline   nineinchnick 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 622
  • Joined: 12-September 11
  • Location:Bialystok, Poland

Posted 05 December 2013 - 06:12 AM

Dobry trik z tymi prefiksami, chociaż jeśli niektóre tabele byłyby wspólne dla wszystkich języków to może dodawać taki prefiks wg. bieżącego języka aplikacji w metodzie tableName() w modelach.
Don't be a dick.
0

#11 User is offline   andrzej1_1 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 67
  • Joined: 16-April 13

Posted 05 December 2013 - 06:34 AM

Dobry pomysł z prefiksami, tylko że na jednym modelu tego nie zrobię, gdyż użytkownicy z zagranicy będą musieli podać inne informacje przy rejestracji(np. nie mają PESEL'u).

Jest pewna rozbieżność pomiędzy UTC_TIMESTAMP, a klasą z php DateTime ktora wynosi około 1,5minuty. Wszystko stoi na jednym serwerze, ale i tak jedno i drugie zwraca czas od tego 1970 roku więc powinno się zgadzać, a tak nie jest. Czy jest jakiś sposób, aby to ujednolicić?
0

#12 User is offline   mirunho 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 170
  • Joined: 19-December 12
  • Location:Gdansk, Poland

Posted 05 December 2013 - 07:54 AM

View Postandrzej1_1, on 05 December 2013 - 06:34 AM, said:

Dobry pomysł z prefiksami, tylko że na jednym modelu tego nie zrobię, gdyż użytkownicy z zagranicy będą musieli podać inne informacje przy rejestracji(np. nie mają PESEL'u).

Po to ktos wymyslil cos takiego jak http://www.yiiframew...scenario-detail
1

#13 User is offline   andrzej1_1 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 67
  • Joined: 16-April 13

Posted 05 December 2013 - 08:23 AM

No dobra ale jak załatwić kwestię rozbieżności UTC_TIMESTAMP i klasy DateTime? Bo tak to było by dużo roboty żeby wszędzie bindować czas z php. A i jak odczytać czas mając sam offset?
0

#14 User is offline   nineinchnick 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 622
  • Joined: 12-September 11
  • Location:Bialystok, Poland

Posted 05 December 2013 - 11:02 AM

Wycinek z man 8 hwclock:

Quote

Clocks in a Linux System
There are two main clocks in a Linux system:

The Hardware Clock: This is a clock that runs independently of any control program running in the CPU and even when the machine is powered off.

The System Time: This is the time kept by a clock inside the Linux kernel and driven by a timer interrupt.


Być może baza i PHP używają dwóch różnych zegarów. Tak czy inaczej, polecam używać ntp do synchronizacji zegara w systemie.

Co do drugiego pytania to chodzi o to jak sformatować czas UTC z użyciem offsetu czyli strefy czasowej?
Don't be a dick.
1

#15 User is offline   aztech 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 206
  • Joined: 12-December 08
  • Location:Poland

Posted 06 December 2013 - 02:54 AM

Podpowiem jeszcze, że w Yii mamy CTimestampBehavior, który zautomatyzuje Ci wstawianie dat do bazy. W szczególności przyjrzyj się timestampExpression
I'm not complete idiot... some parts are missing!
1

#16 User is offline   andrzej1_1 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 67
  • Joined: 16-April 13

Posted 06 December 2013 - 01:45 PM

View Postnineinchnick, on 05 December 2013 - 11:02 AM, said:

Wycinek z man 8 hwclock:


Być może baza i PHP używają dwóch różnych zegarów. Tak czy inaczej, polecam używać ntp do synchronizacji zegara w systemie.

Co do drugiego pytania to chodzi o to jak sformatować czas UTC z użyciem offsetu czyli strefy czasowej?


Tak, o to chodziło. Próbowałem używać timezone_name_from_abbr(), ale dla UTC i offsetu 3, nie wiadomo czemu dawało 4 godziny przesunięcia, a dla offsetu 2 - 2 godziny czyli tutaj prawidłowo.

Do configa do bazy dodałem taką linijkę:
'initSQLs'=>array("set time_zone='+00:00';")

a do komponentu Controller dodałem funkcję:
public function getTime($time, $timeZone='UTC', $pattern='Y-m-d H:i:s')
        {
            $czas = new DateTime($time, new DateTimeZone($timeZone));
            return $czas->format($pattern);
        }


Nie wiem czy akurat w tym pliku to umiescić, ale przynajmniej już nie musze w kodzie zmieniać żadnych zapytań i przerabiać wyrażeń NOW(). Wszystkie godziny działają poprawnie ze strefą, a jedynym mankamentem jest to że w bazie czasy nie są zapisane w formacie utc, lecz serwerowym. Mam dostęp do plików phpmyadmina, więc może dało by się to dopieścić?
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users