代码之家  ›  专栏  ›  技术社区  ›  Miguel

10月CMS-按页面变量订购前端列表(变量不在数据库中)

  •  0
  • Miguel  · 技术社区  · 7 年前

    所以我想在10月CMS上创建一个包含前端用户数据的排行榜, 排行榜将基于数据库中当前变量的总和。我最近才开始研究细枝和十月,所以请耐心地看这个

    一般变量:

    {% set totalScore = totalPoints + user.xp + user.progress %}
    

    列表(简化)

    {% for user in activatedUsers %}
    <div class="card">
            <p class="name"><span class="rank-title">NAME</span><br>{{ user.name }}</p>
            <p><span class="rank-title">LEVEL</span><br>{{ user.level }}</p>
            <p><span class="rank-title">TOTAL POINTS</span><br>{{ totalPoints }} </p>
            <p><span class="rank-title">PROGRESS</span><br>{{ user.progress }}</p>
            <p><span class="rank-title">XP</span><br>{{ user.xp }}</p>
    </div>
    {% endfor %}
    

    我不能真正使用查询进行排序,因为有些变量不在数据库中,而是在页面中定义的。 我已经研究了排序细枝函数,但无法使其正常工作。 我试过了 this solution ,但我有个例外。

    为了让“usort”函数在模块/细枝/扩展文件中工作,我添加了以下代码,但它不起作用,必须有一个更简单的解决方案。。。

    new \Twig_SimpleFilter('usort', array($this, 'usortFilter'))
    
    public function usortFilter($item){
        usort($item, function ($item1, $item2) {
            if ($item1['orderNo'] == $item2['orderNo']) return 0;
            return $item1['orderNo'] < $item2['orderNo'] ? -1 : 1;
        });
    
    return $item;
    }
    

    在阅读了细枝文档之后,我也尝试了合乎逻辑的做法:

    {% for user in activatedUsers|sort('totalPoints') %}
    

    但那里没有运气。 我可能走错了路,所以请随意提出其他建议或指出我错过的东西。 提前感谢

    1 回复  |  直到 7 年前
        1
  •  1
  •   Hardik Satasiya    7 年前

    嗯,我不确定你的 activatedUsers 但是在设置之前,您可以简单地定义这个循环来对它们进行排序

    只有在您的 dataset 仅限于列表中的10个或30个条目这样的数字,再多也无法在代码中对db记录进行排序

    $activatedUsers = <<some code to fetch users>>
    $sortedPointsWithUserId = [];
    $sortedActivatedUsers = [];
    
    foreach($activatedUsers as $user) {
        // if $totalPoints  is page variable you can use it directly $this->page['totalPoints'] from components and from page lifecycle $this['totalPoints']
        $sortedPointsWithUserId[$user->id] = $totalPoints + $user->xp + $user->progress;
    }
    
    // sort array in descending order as we are storing totalpoints as value and key as user ID
    // arsort maintain key value association  
    arsort($sortedPointsWithUserId);
    
    foreach($sortedPointsWithUserId as $key => $value) {
       $user = $activatedUsers[$key];
       // create variable in model to hold totalPoints so we dont need to calculate again
       $user->totalPoints = $value;
       $sortedActivatedUsers[] = $user;
    }
    
    // $sortedActivatedUsers <-- this is your sorted array and you can use it 
    

    如果您有任何疑问,请发表评论