【问题标题】:Display 9am-5pm in 30 minute blocks + array to cross out 'unavailable' times在 30 分钟块中显示上午 9 点至下午 5 点 + 阵列以划掉“不可用”时间
【发布时间】:2018-12-30 07:03:57
【问题描述】:

本帖参考:Laravel: Disable "Booked" times from time range

我需要以 30 分钟为单位显示从上午 9 点到下午 5 点的时间列表。然后我需要阻止一定数量的时间。例如,如果下午 12:30 - 下午 1:30 不可用,我需要在时间上加上删除线。

“不可用时间”需要在一个数组中,因为在任何一天都可能有多个。

@php
$bookings_array = array(
    array(
        'start_time' => "09:00:00",
        'end_time'   => "10:00:00"
    )
)
@endphp

@for ($i=$start_time;$i<=$end_time;$i = $i + 30*60)
    @if($i >= strtotime($empbooking->start_time) && $i <= strtotime($empbooking->end_time))
        @foreach($employee_booking as $booking)
            Booking [unavailable] {{ $booking->start_time }} - {{ $booking->end_time }} ({{ $booking->title }}) <br>
        @endforeach
    @endif
    {{ date('H:i a', $i) }} [available] <br>
@endfor

非常感谢您的帮助!

【问题讨论】:

  • @Devon 正如我的开场白所说,这是参考之前提交的代码:stackoverflow.com/questions/51461134/…。在这篇文章中,我已经解释了生成的日期,我试图找到一个“简化”版本,我可以适应我对上述帖子的要求。
  • 阅读如何提问部分。您不应该在其他地方引用代码,您需要提供一个示例来说明您所做的事情以及为什么它不起作用。
  • @Devon 道歉,请查看添加了代码示例的编辑版本。我已经设置了数组,但我很难理解如何在不重复时间/预订的情况下将其应用于其余代码。

标签: php mysql laravel laravel-blade


【解决方案1】:

我无法准确理解代码中每个变量的含义,但我相信您正在寻找的是这样的:

@php
    $bookings_array = array(
        (object)array(
            'start_time' => "12:30:00",
            'end_time'   => "13:30:00"
        ),
        (object)array(
            'start_time' => "16:30:00",
            'end_time'   => "18:00:00"
        )
    );

    $start_time = strtotime('09:00:00');
    $end_time = strtotime('19:00:00');
@endphp

@for ($i=$start_time;$i<=$end_time;$i = $i + 30*60)
    @foreach ($bookings_array as $booking)
        @if (strtotime($booking->start_time) <= $i && strtotime($booking->end_time) >= $i)
            {{ date('H:i a', $i) }} [unavailable] <br>
            @continue(2)
        @endif
    @endforeach
    {{ date('H:i a', $i) }} [available] <br>
@endfor

这种解决方案有点工作,但有点慢,因为您每次都在迭代预订数组。一种更有效的方法是预先计算可用/不可用时间并在之后进行渲染。

【讨论】:

  • 蒂亚戈,谢谢你的作品,这是一种享受!还有一件事,我现在怎样才能把我的字符串放到一个数组中?比如说:$booking_array = $bookings-&gt;where('employee_id',$employeedetails-&gt;id)-&gt;where('start_date', date('Y-m-d', strtotime($_GET['booking_date'])))-&gt;get(); - 这行得通吗?
  • @MattyClarke 在这种情况下 $booking_array 将是 collection,但它应该可以在没有任何更改的情况下工作。请注意,您正在按字段 start_date 过滤确切值。也许你想用-&gt;where('start_date', '&gt;', date('Y-m-d', strtotime($_GET['booking_date'])) 过滤?
  • 这太完美了,真是一种享受。这是正确的,我必须将预订与确切的日期相匹配。非常感谢您的帮助!
【解决方案2】:

感谢蒂亚戈的回答。我下面的完整代码可以按我的意愿工作:

@php
            $employee_booking = $bookings->where('employee_id',$employeedetails->id)->where('start_date', date('Y-m-d', strtotime($_GET['booking_date'])))->all();
            @endphp
            @for ($i=$start_time;$i<=$end_time;$i = $i + 30*60)
                @foreach ($employee_booking as $booking)
                    @if (strtotime($booking->start_time) <= $i && strtotime($booking->end_time) >= $i)
                        <div>
                          <input type="radio" id="control_{{ date('H:i a',$i) }}" name="booking_time" value="{{ date('H:i a',$i) }}" disabled="disabled">
                          <label for="control_{{ date('H:i a',$i) }}">
                            <h2>{{ date('H:i a', $i) }}</h2> <!-- TAKEN DATE -->
                          </label>
                        </div>
                        @continue(2)
                    @endif
                @endforeach
                <div>
                  <input type="radio" id="control_{{ date('H:i a',$i) }}" name="booking_time" value="{{ date('H:i a',$i) }}">
                  <label for="control_{{ date('H:i a',$i) }}">
                    <h2>{{ date('H:i a',$i) }}</h2> <!-- AVAILABLE DATE -->
                  </label>
                </div>
            @endfor

【讨论】:

    猜你喜欢
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 2014-09-08
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多