基于Fat-Free Framework的竞赛对阵框动态填充问题
解决Fat-Free Framework竞赛对阵树形布局的动态填充问题
首先我完全理解你的痛点:竞赛对阵的每个层级必须固定数量的<li>才能维持布局,但只有部分场次有数据库数据,得把有数据的选手精准填充到对应位置,空位置还要保留预设的空元素。下面分控制器数据预处理和视图渲染两部分来落地实现:
步骤1:控制器中预处理对阵数据
先在控制器里把原始的@bracket数组按ebene(层级)分组,再为每个层级生成对应位置的选手数组,空位置留空。这样视图里就能直接按顺序渲染,不用再复杂判断位置:
// 假设$bracket是从数据库获取的原始对阵数据 $bracket = $db->exec('SELECT * FROM your_match_table WHERE eventID=?', [1]); // 按层级分组并初始化位置数组 $groupedByLayer = []; foreach ($bracket as $match) { $layer = $match['ebene']; if (!isset($groupedByLayer[$layer])) { // 根据层级定义需要的总选手位置数(按你的布局需求调整) $totalSlots = match($layer) { '3' => 8, // 8强层级:8个选手位置 '2' => 4, // 4强层级:4个选手位置 '1' => 2, // 半决赛:2个选手位置 '0' => 1, // 决赛:1个选手位置 default => 0 }; // 用null填充初始化所有位置 $groupedByLayer[$layer] = array_fill(0, $totalSlots, null); } // 将fighter1放入对应位置 if (!empty($match['fighter1ID'])) { $groupedByLayer[$layer][(int)$match['fighter1Pos']] = [ 'Vorname' => $match['Vorname1'], 'Name' => $match['Name1'], 'fighterID' => $match['fighter1ID'], 'hasResult' => $match['result'] !== '0' // 标记是否已有比赛结果 ]; } // 将fighter2放入对应位置 if (!empty($match['fighter2ID'])) { $groupedByLayer[$layer][(int)$match['fighter2Pos']] = [ 'Vorname' => $match['Vorname2'], 'Name' => $match['Name2'], 'fighterID' => $match['fighter2ID'], 'hasResult' => $match['result'] !== '0' ]; } } // 把预处理好的数据传给视图 $f3->set('groupedBracket', $groupedByLayer);
步骤2:视图中动态渲染对阵列表
现在视图里可以针对每个层级,循环预处理好的位置数组,有数据就渲染选手内容,没有就渲染空<li>,完美适配布局要求:
<!-- 以4强层级(ebene=2)为例 --> <ul class="bracket bracket-2"> <repeat group="{{ @groupedBracket['2'] }}" value="{{ @fighter }}"> <check if="{{ @fighter }}"> <!-- 有选手数据时渲染完整内容 --> <li class="team-item"> {{ @fighter.Vorname }} {{ @fighter.Name }} <a href="/getFighterInformation/{{@fighter.fighterID}}"><i class="fa fa-pencil-alt"></i></a> <check if="{{ @fighter.hasResult }}"> <i class="fa fa-trophy"></i> </check> </li> </check> <check else> <!-- 无数据时渲染空li维持布局 --> <li class="team-item"> </li> </check> </repeat> </ul>
关键细节说明
- 位置映射准确性:
fighter1Pos和fighter2Pos的取值必须和对应层级的总位置数匹配,比如4强层级有4个位置,pos就得是0-3,确保选手能放到正确的<li>位置。 - 布局兼容性:这种方式会严格按照预设数量生成
<li>,不管有没有数据,都能完美保留你从codepen获取的布局样式。 - 扩展性:如果后续要调整层级的位置数量,只需要修改控制器里的
$totalSlots匹配逻辑即可,非常灵活。 - F3原生语法适配:全程用F3的
<repeat>和<check>语法实现,不需要额外前端JS处理,也符合框架的开发习惯。
这样就能实现:有数据的位置自动填充选手信息,空位置保留预设的空<li>,完全满足对阵布局的需求。
内容的提问来源于stack exchange,提问作者nameless
相关产品推荐
相关产品推荐

