Potrzebujesz taniej, bezpiecznej i profesjonalnie wykonanej strony?

Zapraszam do kontaktu!

Git na dziś

git add dodaje pliki do "stage" czyli jako kandydatów do commitu.

JDate w przykładach

Tags: Joomla 1.7

Czas, jak wiadomo jest pojeciem względnym. Względem czasu i przestrzeni. Chodzi oczywiście o strefy czasowe i przesunięcia letnio-zimowe. Podczas tworzenia rozszerzeń do Joomla często trzeba korzystać z obsługi daty. Jak skonfigurować Joomla 1.7 i system, żeby nie było różnic na różnych serwerach, w szczególności między lokalnym serwerem testowym a serwerem klienta? Jak poprawnie używać JDate? Jak dokonywać operacji na datach: dodawanie, odejmowanie godzin i lat?

 

Najważniejsze to trzymać się podstawowych reguł. Regułę główną można wybrać sobie samemu: czy używać UTC, czy czasu lokalnego? Jeżeli serwer jest skonfigurowany w tej samej strefie czasowej w której są jego użytkownicy warto pozostać przy czasie lokalnym, UTC jest bardziej uniwersalny.

 

Na początek fakty:

  • standardowo MySQL: SELECT now() zwraca datę w aktualnej strefie czasowej.
  • JFactory::getDate() zwraca czas UTC bez opisu strefy.

 Wybierając opcję czasu lokalnego każde pobranie aktualnej daty w Joomla powinno wyglądać:

$globalConfig = JFactory::getConfig();
$nowDate = JFactory::getDate('now',$globalConfig->get('offset'));

Oczywiście w panelu administracyjnym trzeba ustawić wybraną strefę (dla Polski jest to Europe/Warsaw).

Wszystkie zapytania do bazy danych zależne od aktualnej daty najlepiej wykonywać używając daty pobranej w PHP, żeby nie kombinować ze zmianą ustawień serwera MySQL:

$db = JFactory::getDbo();
$query = "SELECT * FROM #__sample_table WHERE published_from < ".$db->quote($nowDate->toSql(true));

Przy okazji napiszę jeszcze o sposobie manipulacji datami. Do tego celu używamy DateInterval - warto poczytać o tej klasie na stronie php.net w szczególności o tym jak dodawać dni a jak godziny.

$futureDate = JFactory::getDate('now',$globalConfig->get('offset'));
$futureDate = $futureDate->add(new DateInterval('P1D')); // + 1 dzień
$futureDate = $futureDate->add(new DateInterval('PT5M')); // + 5 minut

Sprawdzić, czy data w bazie danych nie jest zerowa, można przez:

$db = JFactory::getDbo();
$query = "SELECT * FROM #__sample_table WHERE published_from < ".$db->quote($db->nullDate());