Permalink
Browse files

+ první commit do samostatného repozitáře addonu (původní historie za…

…chována v repozitáři dema)
  • Loading branch information...
0 parents commit 102aa85b34a757fc123696a5dc4d174d8b54d686 @stekycz committed Aug 17, 2012
@@ -0,0 +1,152 @@
+<?php
+
+namespace steky\nette\DatePaginator;
+use \Nette\Object;
+use \DateTime;
+
+/**
+ * @author Martin Štekl <martin.stekl@gmail.com>
+ * @since 2012-07-21
+ *
+ * @property \DateTime $date
+ * @property-read bool $oldest
+ * @property-read bool $newest
+ * @property-read int $days
+ * @property-read \DateTime $previousDate
+ * @property-read \DateTime $nextDate
+ */
+class DatePaginator extends Object {
+
+ /** @var \DateTime|null */
+ private $date = null;
+
+ /** @var IPeriod|null */
+ private $period = null;
+
+ /** @var IModel|null */
+ private $model = null;
+
+ /**
+ * Pokud zadáme datum mimo nastavené minimum a maximum,
+ * zarovná se autiomaticky na daný okraj.
+ *
+ * @param \DateTime $date
+ */
+ public function setDate(DateTime $date) {
+ $date = $this->period->normalizeDate($date);
+ if ($this->getOldestDate() !== null && $this->getOldestDate() > $date) {
+ $date = clone $this->getOldestDate();
+ } elseif ($this->getNewestDate() !== null && $this->getNewestDate() < $date) {
+ $date = clone $this->getNewestDate();
+ }
+ $this->date = $date;
+ }
+
+ /**
+ * @return \DateTime
+ */
+ public function getDate() {
+ return clone $this->date;
+ }
+
+ /**
+ * @param IModel $model
+ * @return DatePaginator
+ */
+ public function setModel(IModel $model) {
+ $this->model = $model;
+ return $this;
+ }
+
+ /**
+ * Nastaví stránkovačí periodu.
+ *
+ * @param IPeriod $period
+ * @return DatePaginator
+ */
+ public function setPeriod(IPeriod $period) {
+ $this->period = $period;
+ return $this;
+ }
+
+ /**
+ * @return \DateTime
+ */
+ public function getOldestDate() {
+ return clone $this->period->normalizeDate($this->model->getOldestDate());
+ }
+
+ /**
+ * @return \DateTime
+ */
+ public function getNewestDate() {
+ return clone $this->period->normalizeDate($this->model->getNewestDate());
+ }
+
+ /**
+ * @return bool
+ */
+ public function isOldest() {
+ return $this->getOldestDate() == $this->date;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isNewest() {
+ return $this->getNewestDate() == $this->date;
+ }
+
+ /**
+ * Vrací datum předchozího dne. Pokud bychom měli vrátit starší datum než nejstarší,
+ * tak vrátíme právě to nejstarší.
+ *
+ * @return \DateTime
+ */
+ public function getPreviousDate() {
+ if ($this->date == $this->getOldestDate()) {
+ return $this->date;
+ }
+ $previous_date = clone $this->date;
+ $previous_date = $previous_date->modify('- ' . $this->period->getPeriod());
+ $closest_previous = $this->period->normalizeDate($this->model->getClosestPrevious($this->date));
+ if ($closest_previous < $previous_date) {
+ $previous_date = clone $closest_previous;
+ }
+ return $previous_date;
+ }
+
+ /**
+ * Vrací datum následujícího dne. Pokud bychom měli vrátit novější datum než nejnovější,
+ * tak vrátíme právě to nejnovější.
+ *
+ * @return \DateTime
+ */
+ public function getNextDate() {
+ if ($this->date == $this->getNewestDate()) {
+ return $this->date;
+ }
+ $next_date = clone $this->date;
+ $next_date = $next_date->modify('+ ' . $this->period->getPeriod());
+ $closest_next = $this->period->normalizeDate($this->model->getClosestNext($this->date));
+ if ($closest_next > $next_date) {
+ $next_date = clone $closest_next;
+ }
+ return $next_date;
+ }
+
+ /**
+ * Vrací počet dní mezi nejstarším a nejnovějším datem.
+ *
+ * @return int
+ * @throws InvalidStateException Pokud zjistíme, že neest date je starší než oldest
+ */
+ public function getDays() {
+ if ($this->getNewestDate() < $this->getOldestDate()) {
+ throw new InvalidStateException('Newest date is older than Oldest date.');
+ }
+ $difference = $this->getNewestDate()->diff($this->getOldestDate());
+ return (int) $difference->days;
+ }
+
+}
@@ -0,0 +1,51 @@
+<?php
+
+namespace steky\nette\DatePaginator;
+use \DateTime;
+
+/**
+ * Rozhraní pro práci s modelem. Umožňuje upravovat stránkování
+ * podle dat v modelu.
+ *
+ * @author Martin Štekl <martin.stekl@gmail.com>
+ * @since 2012-08-14
+ */
+interface IModel {
+
+ /**
+ * Vrací datum nejstaršího záznamu.
+ *
+ * @abstract
+ * @return \DateTime
+ */
+ public function getOldestDate();
+
+ /**
+ * Vrací datum nejnovějšího záznamu.
+ *
+ * @abstract
+ * @return \DateTime
+ */
+ public function getNewestDate();
+
+ /**
+ * Vrací datum nejbližšího staršího záznamu než zadané datum. Pokud
+ * neexisttuje starší, vrací zadané.
+ *
+ * @abstract
+ * @param \DateTime $current_date
+ * @return \DateTime
+ */
+ public function getClosestPrevious(DateTime $current_date);
+
+ /**
+ * Vrací datum nejbližšího novějšího záznamu než zadané datum. Pokud
+ * neexisttuje starší, vrací zadané.
+ *
+ * @abstract
+ * @param \DateTime $current_date
+ * @return \DateTime
+ */
+ public function getClosestNext(DateTime $current_date);
+
+}
@@ -0,0 +1,40 @@
+<?php
+
+namespace steky\nette\DatePaginator;
+use \DateTime;
+
+/**
+ * Rozhraní definuje časovou periodu pro DatePaginator.
+ *
+ * @author Martin Štekl <martin.stekl@gmail.com>
+ * @since 2012-08-14
+ */
+interface IPeriod {
+
+ /**
+ * Vrací název periody.
+ *
+ * @abstract
+ * @return string
+ */
+ public function getName();
+
+ /**
+ * Vrací velikost posunu bez znaménka ve formátu, který akceptuje funkce strtotime().
+ *
+ * @abstract
+ * @return string
+ */
+ public function getPeriod();
+
+ /**
+ * Provede normalizaci data pro danou periodu. Jedná-li se o den zaokrouhlí na půlnoc daného data.
+ * Pro hodinovou periodu na začátek hodiny, tedy např.: 13:00:00.
+ *
+ * @abstract
+ * @param \DateTime $date
+ * @return \DateTime
+ */
+ public function normalizeDate(DateTime $date);
+
+}
@@ -0,0 +1,46 @@
+<?php
+
+namespace steky\nette\DatePaginator\Period;
+use \steky\nette\DatePaginator\IPeriod;
+use \Nette\Object;
+use \DateTime;
+
+/**
+ * Třída pro periodu jednoho dne.
+ *
+ * @author Martin Štekl <martin.stekl@gmail.com>
+ * @since 2012-08-14
+ */
+class Day extends Object implements IPeriod {
+
+ /**
+ * Vrací název periody.
+ *
+ * @return string
+ */
+ public function getName() {
+ return $this->getReflection()->getName();
+ }
+
+ /**
+ * Vrací velikost posunu bez znaménka ve formátu, který akceptuje funkce strtotime().
+ *
+ * @return string
+ */
+ public function getPeriod() {
+ return '1 day';
+ }
+
+ /**
+ * Provede normalizaci data pro danou periodu. Jedná-li se o den zaokrouhlí na půlnoc daného data.
+ * Pro hodinovou periodu na začátek hodiny, tedy např.: 13:00:00.
+ *
+ * @param \DateTime $date
+ * @return \DateTime
+ */
+ public function normalizeDate(DateTime $date) {
+ $date = clone $date;
+ return $date->setTime(0, 0, 0);
+ }
+
+}
@@ -0,0 +1,46 @@
+<?php
+
+namespace steky\nette\DatePaginator\Period;
+use \steky\nette\DatePaginator\IPeriod;
+use \Nette\Object;
+use \DateTime;
+
+/**
+ * Třída pro periodu jednoho měsíce.
+ *
+ * @author Martin Štekl <martin.stekl@gmail.com>
+ * @since 2012-08-14
+ */
+class Month extends Object implements IPeriod {
+
+ /**
+ * Vrací název periody.
+ *
+ * @return string
+ */
+ public function getName() {
+ return $this->getReflection()->getName();
+ }
+
+ /**
+ * Vrací velikost posunu bez znaménka ve formátu, který akceptuje funkce strtotime().
+ *
+ * @return string
+ */
+ public function getPeriod() {
+ return '1 month';
+ }
+
+ /**
+ * Provede normalizaci data pro danou periodu. Jedná-li se o den zaokrouhlí na půlnoc daného data.
+ * Pro hodinovou periodu na začátek hodiny, tedy např.: 13:00:00.
+ *
+ * @param \DateTime $date
+ * @return \DateTime
+ */
+ public function normalizeDate(DateTime $date) {
+ $date = clone $date;
+ return $date->modify('first day of month');
+ }
+
+}
@@ -0,0 +1,46 @@
+<?php
+
+namespace steky\nette\DatePaginator\Period;
+use \steky\nette\DatePaginator\IPeriod;
+use \Nette\Object;
+use \DateTime;
+
+/**
+ * Třída pro periodu jednoho týdne.
+ *
+ * @author Martin Štekl <martin.stekl@gmail.com>
+ * @since 2012-08-14
+ */
+class Week extends Object implements IPeriod {
+
+ /**
+ * Vrací název periody.
+ *
+ * @return string
+ */
+ public function getName() {
+ return $this->getReflection()->getName();
+ }
+
+ /**
+ * Vrací velikost posunu bez znaménka ve formátu, který akceptuje funkce strtotime().
+ *
+ * @return string
+ */
+ public function getPeriod() {
+ return '1 week';
+ }
+
+ /**
+ * Provede normalizaci data pro danou periodu. Jedná-li se o den zaokrouhlí na půlnoc daného data.
+ * Pro hodinovou periodu na začátek hodiny, tedy např.: 13:00:00.
+ *
+ * @param \DateTime $date
+ * @return \DateTime
+ */
+ public function normalizeDate(DateTime $date) {
+ $date = clone $date;
+ return $date->modify('first day of week');
+ }
+
+}
Oops, something went wrong.

0 comments on commit 102aa85

Please sign in to comment.