Tengo un modelo en el que podemos elegir el horario de apertura de la institución para cada día de la semana, de tal y tal a tal y tal, por ejemplo Monday 12:00 AM - 11:30 PM
<?php namespace common\models; use yii\behaviors\TimestampBehavior; use yii\db\ActiveRecord; use yii\db\Expression; class WorkHours extends _source_WorkHours { public const WEEK_DAY_MON = 'Mon'; public const WEEK_DAY_TUE = 'Tue'; public const WEEK_DAY_WED = 'Wed'; public const WEEK_DAY_THU = 'Thu'; public const WEEK_DAY_FRI = 'Fri'; public const WEEK_DAY_SAT = 'Sat'; public const WEEK_DAY_SUN = 'Sun'; /** * {@inheritdoc} */ public function behaviors(): array { return [ 'timestamp' => [ 'class' => TimestampBehavior::class, 'attributes' => [ ActiveRecord::EVENT_BEFORE_INSERT => ['created_at'], ], 'value' => new Expression('NOW()'), ], ]; } public static function weekDays(): array { return [ self::WEEK_DAY_MON => 'Monday', self::WEEK_DAY_TUE => 'Tuesday', self::WEEK_DAY_WED => 'Wednesday', self::WEEK_DAY_THU => 'Thursday', self::WEEK_DAY_FRI => 'Friday', self::WEEK_DAY_SAT => 'Saturday', self::WEEK_DAY_SUN => 'Sunday', ]; } public static function getWeekDay(string $val): string { $ar = self::weekDays(); return $ar[$val] ?? $val; } public static function hoursList(): array { $list = []; for ($i = 0; $i < 24; $i++) { $A = 'AM'; $n = $i; if ($i >= 12) { $A = 'PM'; $n = $i - 12; } $n = $n < 10 ? '0' . $n : $n; $_A = ($i === 12 ? 'AM' : $A); $list[$i . '.00'] = $n . '.00 ' . ($i === 0 ? 'PM' : $_A); $list[$i . '.30'] = $n . '.30 ' . $A; } return $list; } }
A continuación, utilizo este modelo al crear una institución y la posibilidad de elegir el horario de apertura allí.
<div class="form-group"> <label class="control-label col-sm-3">Wokr Hours</label> <div class="col-sm-6"> <div class="form-group"> <?php foreach (WorkHours::weekDays() as $weekDay => $day) { ?> <div class="col-sm-2"><?= $weekDay ?></div> <div class="col-sm-5"> <?= $form->field( $restaurantWorkHoursForm, RestaurantWorkHoursForm::getAttributeName($weekDay, 'open'), ['template' => '<div class="col-sm-12">{input}</div>'] )->dropDownList(WorkHours::hoursList(), ['prompt' => ''])->label(false) ?> </div> <div class="col-sm-5"> <?= $form->field( $restaurantWorkHoursForm, RestaurantWorkHoursForm::getAttributeName($weekDay, 'close'), ['template' => '<div class="col-sm-12">{input}</div>'] )->dropDownList(WorkHours::hoursList(), ['prompt' => ''])->label(false) ?></div> <?php } ?> </div> </div> </div>
Yo también uso este modelo al reservar un lugar en una institución donde puedes elegir la hora, pero aquí puedes elegir cualquier hora del día.
<a class="btn btn-fourth <?= $restaurantReservationForm->getErrors('time') ? 'btn-error' : '' ?>" id="reservation-time" role="button" data-bs-toggle="dropdown" aria-expanded="false"> <span class="icon br-clock"></span> <span class="js-value"> <?= $restaurantReservationForm->time ? WorkHours::hoursList()[$restaurantReservationForm->time] : '-- : --' ?> </span> </a> <ul class="dropdown-menu dropdown-menu-height-fixed" aria-labelledby="reservation-time"> <?php foreach (WorkHours::hoursList() as $k => $v) { ?> <li><a class="dropdown-item <?= $restaurantReservationForm->time === $k ? 'active' : '' ?>" href="#" data-value="<?= $k ?>"><?= $v ?></a></li> <?php } ?> </ul>
Ahora cual es la pregunta. tengo dos formas En uno se indicaba el tiempo, en el otro debía haber una elección de tiempo de la primera forma. ¿Cómo se puede vincular el horario de apertura del establecimiento que te indicamos con la elección del horario de reserva?
Digamos que tenemos un horario de trabajo de 12:00 AM - 11:30 PM
, cualquier horario está disponible en la reserva, pero es necesario que haya una opción solo dentro del horario de apertura de la institución que especificamos anteriormente, es decir, de 12:00 AM
a 11:30 PM
, y así todos los días, si la hora no se selecciona en la institución para algún día, entonces la reserva también estará vacía
¿Hay alguna manera de hacer esto a través de json
?
Por supuesto, esto tiene solución, pero deberá manejarlo tanto en el lado del servidor como en el lado del cliente. La necesidad en el lado del servidor es que se asegure de que no haya travesuras realizadas por un usuario técnicamente avanzado y en el lado del cliente su necesidad es ayudar al usuario a saber de qué período puede elegir el valor.
En el lado del servidor, tiene varias opciones en términos de almacenamiento, pero un enfoque factible (asumiendo que el intervalo elegido también se reutilizará en el futuro) es almacenar este valor en la base de datos. Eso significaría que necesitará un CRUD para este valor en el lado del servidor y una función API que atienda las solicitudes del lado del cliente, diciéndole al usuario cuál fue su elección. En el lado del servidor, puede codificar cosas en JSON a través json_encode
y enviar el resultado al cliente.
Necesitará un validador tanto del lado del servidor como del lado del cliente para determinar si una fecha dada está dentro del intervalo especificado.
En resumen, necesitas: