Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.73 KB | None | 0 0
  1.  
  2.  
  3. <?php declare(strict_types=1); namespace frontend\models\home\single\query; use common\components\bookingStorage\BookingItem; use common\models\Guest; use common\yii\base\Model; use common\yii\helpers\DateHelper; use common\yii\validators\DateValidator; use common\yii\validators\DefaultValueValidator; use common\yii\validators\IntegerValidator; use common\yii\validators\IntValValidator; use DateInterval; use DateTime; use DateTimeZone; use yii\validators\RequiredValidator; /** * Компонент для загрузки данных, пришедших от сервера, в модель запроса для получения номеров, тарифов и цен. * * @author Залатов Александр <zalatov.ao@gmail.com> */ class HomeQueryLoader extends Model { /** @var string Идентификатор отеля. */ private $homeId; /** @var string Дата прибытия. */ public $arrival_date; const ATTR_ARRIVAL_DATE = 'arrival_date'; /** @var string Дата отбытия. */ public $departure_date; const ATTR_DEPARTURE_DATE = 'departure_date'; /** @var int Количество взрослых. */ public $adults; const ATTR_ADULTS = 'adults'; /** @var int Количество детей. */ public $child; const ATTR_CHILD = 'child'; private const DATE_FORMAT = 'd.m.Y'; /** * {@inheritdoc} * * @param string $homeId Идентификатор отеля * * @author Залатов Александр <zalatov.ao@gmail.com> */ public function __construct(string $homeId, array $config = []) { $this->homeId = $homeId; parent::__construct($config); } /** * {@inheritdoc} * * @author Залатов Александр <zalatov.ao@gmail.com> */ public function rules(): array { return [ [static::ATTR_ARRIVAL_DATE, RequiredValidator ::class], [static::ATTR_ARRIVAL_DATE, DateValidator ::class, DateValidator::ATTR_FORMAT => 'php:' . static::DATE_FORMAT], [static::ATTR_DEPARTURE_DATE, RequiredValidator ::class], [static::ATTR_DEPARTURE_DATE, DateValidator ::class, DateValidator::ATTR_FORMAT => 'php:' . static::DATE_FORMAT], [static::ATTR_ADULTS, RequiredValidator ::class], [static::ATTR_ADULTS, IntegerValidator ::class, IntegerValidator::ATTR_MIN => 0], [static::ATTR_ADULTS, IntValValidator ::class], [static::ATTR_CHILD, IntegerValidator ::class, IntegerValidator::ATTR_MIN => 0], [static::ATTR_CHILD, IntValValidator ::class], [static::ATTR_CHILD, DefaultValueValidator ::class, DefaultValueValidator::ATTR_VALUE => 0], ]; } /** * Проверка пользовательского ввода и получение модели-запроса для тарифов и цен. * * @param array $params * * @return HomeQuery * * @author Залатов Александр <zalatov.ao@gmail.com> */ public function getQuery(array $params): HomeQuery { // -- Значения по умолчанию $query = new HomeQuery; $query->dateArrival = DateHelper::nowUTC(); $query->dateDeparture = DateHelper::nowUTC()->add(new DateInterval(BookingItem::PERIOD)); $query->adults = 0; $query->child = 0; // -- -- -- -- // -- Получаем данные из сессии $booking = BookingItem::load(); if (null !== $booking->dateArrival) { $query->dateArrival = clone $booking->dateArrival; } if (null !== $booking->dateDeparture) { $query->dateDeparture = clone $booking->dateDeparture; } foreach ($booking->guests as $guest) { if ($guest::TYPE_ADULT === $guest->type) { $query->adults++; } else { $query->child++; } } // -- -- -- -- // -- Загружаем данные, переданные пользователем $this->load($params, ''); if ($this->validate()) { $query->dateArrival = DateTime::createFromFormat(static::DATE_FORMAT, $this->arrival_date, new DateTimeZone('UTC')); $query->dateDeparture = DateTime::createFromFormat(static::DATE_FORMAT, $this->departure_date, new DateTimeZone('UTC')); $query->adults = $this->adults; $query->child = $this->child; } // -- -- -- -- // -- Сохраняем данные в сессию $booking->dateArrival = clone $query->dateArrival; $booking->dateDeparture = clone $query->dateDeparture; $booking->guests = []; for ($i = 0; $i < $query->adults; $i++) { $guest = new Guest; $guest->type = $guest::TYPE_ADULT; $booking->guests[] = $guest; } for ($i = 0; $i < $query->child; $i++) { $guest = new Guest; $guest->type = $guest::TYPE_CHILD; $booking->guests[] = $guest; } $booking->save(); // -- -- -- -- return $query; } }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement