如何实现按周分Tab展示餐食?解决餐食混排问题
实现按Week标签页分离餐食内容的修改方案
问题描述
当前餐食内容展示时出现混排,需将第1周的餐食仅显示在Week 1标签页下,第2周的餐食仅显示在Week 2标签页下,请问如何修改现有代码实现该需求?
修改后的完整代码
<!-- 标签页导航 --> <ul class="nav nav-tabs" id="weekTabs" role="tablist"> <li class="nav-item" role="presentation"> <button class="nav-link active" id="week1-tab" data-bs-toggle="tab" data-bs-target="#week1-content" type="button" role="tab" aria-controls="week1-content" aria-selected="true">Week 1</button> </li> <li class="nav-item" role="presentation"> <button class="nav-link" id="week2-tab" data-bs-toggle="tab" data-bs-target="#week2-content" type="button" role="tab" aria-controls="week2-content" aria-selected="false">Week 2</button> </li> </ul> <!-- 标签页内容容器 --> <div class="tab-content" id="weekTabsContent"> <!-- Week 1 内容面板 --> <div class="tab-pane fade show active" id="week1-content" role="tabpanel" aria-labelledby="week1-tab"> <table id="user-list-table-week1" class="table table-striped" role="grid" data-toggle="data-table" style="font-size: 13px;"> <tr> <th>Date</th> <th>Breakfast</th> <th>Lunch</th> <th>Snacks</th> <th>Dinner</th> </tr> @php $i = 0; $week = 1; $currentDt = $dt; // 复制初始日期,避免修改原变量影响第二次循环 $fromm = new DateTime($currentDt); $firstDayName = strtolower($fromm->format('l')); $dayName = strtolower($fromm->format('l')); @endphp @for ($i = 0; $i < $diff; $i++) @php $menuCategoryCG0001=array_filter($mnu_arr, function ($ma) use ($week, $dayName) { return $ma['category_code']=='CG0001' && $ma['week'] == $week && $ma['day'] == $dayName; }); $menuCategoryCG0002=array_filter($mnu_arr, function ($ma) use ($week, $dayName) { return $ma['category_code']=='CG0002' && $ma['week'] == $week && $ma['day'] == $dayName; }); $menuCategoryCG0003=array_filter($mnu_arr, function ($ma) use ($week, $dayName) { return $ma['category_code']=='CG0003' && $ma['week'] == $week && $ma['day'] == $dayName; }); $menuCategoryCG0004=array_filter($mnu_arr, function ($ma) use ($week, $dayName) { return $ma['category_code']=='CG0004' && $ma['week'] == $week && $ma['day'] == $dayName; }); @endphp @if($week == 1) <!-- 仅渲染Week1的行 --> <tr style="height: 50px"> <td> <input type="hidden" value="{{ $custom_plan_id }}" name="customplanid"> <input type="hidden" value="{{ $diff }}" name="numdays"> <input type="hidden" id="mdbf-{{ $i }}"> <input type="text" name="date-{{ $i }}" value="{{ $currentDt }}" class="btn btn-outline-primary rounded iq-col-masonry-block"><br><br> <input type="text" value="Week-{{ $week }}" class="btn btn-outline-primary rounded iq-col-masonry-block"> </td> <td> @foreach ($menuCategoryCG0001 as $ma) <div id="button-{{ $ma['id'] }}" href="#" class="btn btn-outline-primary rounded iq-col-masonry-block"> <img src="{{ asset('menuimages/' . $ma['image']) }}" width="81px"><br> <input type="checkbox" name="{{ $ma['category_code'] . '-' . $i }}[]" value="{{ $ma['id'] }}" class="check"> <p style="font-size: 10px">{{ $ma['name'] }}</p> </div><br><br> @endforeach </td> <td> @foreach ($menuCategoryCG0002 as $ma) <div id="button-{{ $ma['id'] }}" href="#" class="btn btn-outline-primary rounded iq-col-masonry-block"> <img src="{{ asset('menuimages/' . $ma['image']) }}" width="81px"><br> <input type="checkbox" name="{{ $ma['category_code'] . '-' . $i }}[]" value="{{ $ma['id'] }}" class="check"> <p style="font-size: 10px">{{ $ma['name'] }} <br><br>Protein/Carb : {{ $lunchp_c }}</p> </div><br><br> @endforeach </td> <td> @foreach ($menuCategoryCG0003 as $ma) <div id="button-{{ $ma['id'] }}" href="#" class="btn btn-outline-primary rounded iq-col-masonry-block"> <img src="{{ asset('menuimages/' . $ma['image']) }}" width="81px"><br> <input type="checkbox" name="{{ $ma['category_code'] . '-' . $i }}[]" value="{{ $ma['id'] }}" class="check"> <p style="font-size: 10px">{{ $ma['name'] }}</p> </div><br><br> @endforeach </td> <td> @foreach ($menuCategoryCG0004 as $ma) <div id="button-{{ $ma['id'] }}" href="#" class="btn btn-outline-primary rounded iq-col-masonry-block"> <img src="{{ asset('menuimages/' . $ma['image']) }}" width="81px"><br> <input type="checkbox" name="{{ $ma['category_code'] . '-' . $i }}[]" value="{{ $ma['id'] }}" class="check"> <p style="font-size: 10px">{{ $ma['name'] }} <br><br>Protein/Carb : {{ $dinnerp_c }}</p> </div><br><br> @endforeach </td> </tr> @endif @php $currentDt = date('d-m-Y', strtotime($currentDt . ' + 1 days')); $day = new DateTime($currentDt); $day = $day->format('l'); if ($day == 'Friday') { $currentDt = date('d-m-Y', strtotime($currentDt . ' + 1 days')); } $fromm = new DateTime($currentDt); $dayName = strtolower($fromm->format('l')); if($firstDayName === $dayName){ $week++; } if($week == 3){ $week = 1; } if($week == 4){ $week = 2; } @endphp @endfor </table> </div> <!-- Week 2 内容面板 --> <div class="tab-pane fade" id="week2-content" role="tabpanel" aria-labelledby="week2-tab"> <table id="user-list-table-week2" class="table table-striped" role="grid" data-toggle="data-table" style="font-size: 13px;"> <tr> <th>Date</th> <th>Breakfast</th> <th>Lunch</th> <th>Snacks</th> <th>Dinner</th> </tr> @php $i = 0; $week = 1; $currentDt = $dt; // 重新初始化日期 $fromm = new DateTime($currentDt); $firstDayName = strtolower($fromm->format('l')); $dayName = strtolower($fromm->format('l')); @endphp @for ($i = 0; $i < $diff; $i++) @php $menuCategoryCG0001=array_filter($mnu_arr, function ($ma) use ($week, $dayName) { return $ma['category_code']=='CG0001' && $ma['week'] == $week && $ma['day'] == $dayName; }); $menuCategoryCG0002=array_filter($mnu_arr, function ($ma) use ($week, $dayName) { return $ma['category_code']=='CG0002' && $ma['week'] == $week && $ma['day'] == $dayName; }); $menuCategoryCG0003=array_filter($mnu_arr, function ($ma) use ($week, $dayName) { return $ma['category_code']=='CG0003' && $ma['week'] == $week && $ma['day'] == $dayName; }); $menuCategoryCG0004=array_filter($mnu_arr, function ($ma) use ($week, $dayName) { return $ma['category_code']=='CG0004' && $ma['week'] == $week && $ma['day'] == $dayName; }); @endphp @if($week == 2) <!-- 仅渲染Week2的行 --> <tr style="height: 50px"> <td> <input type="hidden" value="{{ $custom_plan_id }}" name="customplanid"> <input type="hidden" value="{{ $diff }}" name="numdays"> <input type="hidden" id="mdbf-{{ $i }}"> <input type="text" name="date-{{ $i }}" value="{{ $currentDt }}" class="btn btn-outline-primary rounded iq-col-masonry-block"><br><br> <input type="text" value="Week-{{ $week }}" class="btn btn-outline-primary rounded iq-col-masonry-block"> </td> <td> @foreach ($menuCategoryCG0001 as $ma) <div id="button-{{ $ma['id'] }}" href="#" class="btn btn-outline-primary rounded iq-col-masonry-block"> <img src="{{ asset('menuimages/' . $ma['image']) }}" width="81px"><br> <input type="checkbox" name="{{ $ma['category_code'] . '-' . $i }}[]" value="{{ $ma['id'] }}" class="check"> <p style="font-size: 10px">{{ $ma['name'] }}</p> </div><br><br> @endforeach </td> <td> @foreach ($menuCategoryCG0002 as $ma) <div id="button-{{ $ma['id'] }}" href="#" class="btn btn-outline-primary rounded iq-col-masonry-block"> <img src="{{ asset('menuimages/' . $ma['image']) }}" width="81px"><br> <input type="checkbox" name="{{ $ma['category_code'] . '-' . $i }}[]" value="{{ $ma['id'] }}" class="check"> <p style="font-size: 10px">{{ $ma['name'] }} <br><br>Protein/Carb : {{ $lunchp_c }}</p> </div><br><br> @endforeach </td> <td> @foreach ($menuCategoryCG0003 as $ma) <div id="button-{{ $ma['id'] }}" href="#" class="btn btn-outline-primary rounded iq-col-masonry-block"> <img src="{{ asset('menuimages/' . $ma['image']) }}" width="81px"><br> <input type="checkbox" name="{{ $ma['category_code'] . '-' . $i }}[]" value="{{ $ma['id'] }}" class="check"> <p style="font-size: 10px">{{ $ma['name'] }}</p> </div><br><br> @endforeach </td> <td> @foreach ($menuCategoryCG0004 as $ma) <div id="button-{{ $ma['id'] }}" href="#" class="btn btn-outline-primary rounded iq-col-masonry-block"> <img src="{{ asset('menuimages/' . $ma['image']) }}" width="81px"><br> <input type="checkbox" name="{{ $ma['category_code'] . '-' . $i }}[]" value="{{ $ma['id'] }}" class="check"> <p style="font-size: 10px">{{ $ma['name'] }} <br><br>Protein/Carb : {{ $dinnerp_c }}</p> </div><br><br> @endforeach </td> </tr> @endif @php $currentDt = date('d-m-Y', strtotime($currentDt . ' + 1 days')); $day = new DateTime($currentDt); $day = $day->format('l'); if ($day == 'Friday') { $currentDt = date('d-m-Y', strtotime($currentDt . ' + 1 days')); } $fromm = new DateTime($currentDt); $dayName = strtolower($fromm->format('l')); if($firstDayName === $dayName){ $week++; } if($week == 3){ $week = 1; } if($week == 4){ $week = 2; } @endphp @endfor </table> </div> </div>
关键修改说明
- 添加标签页切换组件:用Bootstrap自带的标签页组件,制作Week1和Week2的切换按钮,默认激活Week1标签页。
- 拆分餐食表格到对应面板:将原来的单一表格拆分为两个,分别放入Week1和Week2的标签面板中,从结构上隔离不同周的内容。
- 按周过滤渲染行:在循环生成表格行时,添加
@if($week == 1)和@if($week == 2)的判断,只渲染对应周的餐食行。 - 优化数据过滤逻辑:将周和日期的判断提前到
array_filter中,减少循环内的重复条件判断,提升渲染效率。 - 修复重复DOM ID问题:原代码中所有餐食按钮的ID均为
button,会导致DOM冲突,修改为button-{{ $ma['id'] }}保证每个按钮ID唯一。 - 使用独立日期变量:每个标签面板的循环使用独立的
$currentDt变量,避免两个面板的日期计算互相干扰。
内容的提问来源于stack exchange,提问作者Joseph MAthew
相关产品推荐
相关产品推荐

