You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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 }}">
                    &nbsp;<i class="fa fa-trophy"></i>
                </check>
            </li>
        </check>
        <check else>
            <!-- 无数据时渲染空li维持布局 -->
            <li class="team-item">&nbsp;</li>
        </check>
    </repeat>
</ul>

关键细节说明

  1. 位置映射准确性:fighter1Pos和fighter2Pos的取值必须和对应层级的总位置数匹配,比如4强层级有4个位置,pos就得是0-3,确保选手能放到正确的<li>位置。
  2. 布局兼容性:这种方式会严格按照预设数量生成<li>,不管有没有数据,都能完美保留你从codepen获取的布局样式。
  3. 扩展性:如果后续要调整层级的位置数量,只需要修改控制器里的$totalSlots匹配逻辑即可,非常灵活。
  4. F3原生语法适配:全程用F3的<repeat>和<check>语法实现,不需要额外前端JS处理,也符合框架的开发习惯。

这样就能实现:有数据的位置自动填充选手信息,空位置保留预设的空<li>,完全满足对阵布局的需求。

内容的提问来源于stack exchange,提问作者nameless

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:58:19