merci-8.x-2.x-dev/src/Plugin/Validation/Constraint/MerciOpenHoursConstraintValidator.php

src/Plugin/Validation/Constraint/MerciOpenHoursConstraintValidator.php
<?php

/**
 * @file
 * Contains \Drupal\merci\Plugin\Validation\Constraint\MerciOpenHoursConstraintValidator.
 */

namespace Drupal\merci\Plugin\Validation\Constraint;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Drupal\Core\Datetime\Entity\DateFormat;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\office_hours\OfficeHoursDateHelper;

/**
 * Checks for conflicts when validating a entity with reservable items.
 */
class MerciOpenHoursConstraintValidator extends ConstraintValidator {

  private function renderOfficeHours($open_hours, $format = 'g:ia', $divider = '-') {
    $starthours = substr('0000' . $open_hours->starthours, -4);
    $endhours   = substr('0000' . $open_hours->endhours, -4);
    $start = DrupalDateTime::createFromFormat('Gi', $starthours);
    $end = DrupalDateTime::createFromFormat('Gi', $endhours);
    return $start->format($format) . $divider . $end->format($format);

  }

  /**
   * {@inheritdoc}
   */
  public function validate($value, Constraint $constraint) {
    /* @var \Drupal\Core\Field\FieldItemInterface $value */
    if (!isset($value)) {
      return;
    }
    $id = $value->target_id;
    // '0' or NULL are considered valid empty references.
    if (empty($id)) {
      return;
    }
    /* @var \Drupal\Core\Entity\FieldableEntityInterface $referenced_entity */
    $referenced_entity = $value->entity;

    $datetime_start = $value->getEntity()->{$constraint->date_field}->first()->start_date;
    $datetime_end = $value->getEntity()->{$constraint->date_field}->first()->end_date;

    $datetime_start->setTimeZone(timezone_open(drupal_get_user_timezone()));
    $datetime_end->setTimeZone(timezone_open(drupal_get_user_timezone()));

    $start_day_of_week = $datetime_start->format('w');
    $end_day_of_week   = $datetime_end->format('w');

    $start_time = $datetime_start->format('Gi');
    $end_time   = $datetime_end->format('Gi');

    $start_valid = FALSE;
    $end_valid   = FALSE;

    $office_hours_field = $referenced_entity->{$constraint->reservable_hours_field}->first()->entity->{$constraint->office_hours_field};

    $office_hours = array();

    foreach ($office_hours_field as $open_hours) {
      if (!array_key_exists($open_hours->day, $office_hours)) {
        $office_hours[$open_hours->day] = array();
      }
      $office_hours[$open_hours->day][] = $open_hours;
      $starthours = substr('0000' . $open_hours->starthours, -4);
      $endhours   = substr('0000' . $open_hours->endhours, -4);

      if ($open_hours->day == $start_day_of_week) {
        if ($starthours <= $start_time && $endhours >= $start_time) {
          $start_valid = TRUE;
        }
      }
      if ($open_hours->day == $end_day_of_week) {
        if ($starthours <= $end_time && $endhours >= $end_time) {
          $end_valid = TRUE;
        }
      }
    }

    if ($start_valid == FALSE) {
      if (array_key_exists($start_day_of_week, $office_hours)) {
        foreach ($office_hours[$start_day_of_week] as $open_hours) {
          $message[] = $this->renderOfficeHours($open_hours);
        }
        $this->context->addViolation('Reservation begins at a time we are closed. We are open: %open', array('%open' => implode(' ', $message)));
      }
      else {
        $this->context->addViolation($constraint->message);
      }
    }

    if ($end_valid == FALSE) {
      if (array_key_exists($end_day_of_week, $office_hours)) {
        foreach ($office_hours[$end_day_of_week] as $open_hours) {
          $message[] = $this->renderOfficeHours($open_hours);
        }
        $this->context->addViolation('Reservation ends at a time we are closed. We are open: %open', array('%open' => implode(' ', $message)));
      }
      else {
        $this->context->addViolation($constraint->message);
      }
    }
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc