Twig中的成员过滤器



我有一些类别和项目。我希望只能删除尚未设置项目的类别。例如,我有"图书"类别,但没有添加具体的书籍,所以我可以删除它。我有"食品"类别,其中有披萨、三明治、苹果,所以我不能删除它。

<table class="table table table-striped spacer">
    {% for c in cat %}
        <tr>
            <td>
                {# If in edit mode, display edit form #}
                {% if id == c.id %}
                <form class="form-inline" action="{{ path('edit_category', {'id': c.id}) }}" method="post" {{ form_enctype(form) }}>
                    {% form_theme form 'EMBudgetTrackerBundle:Forms:inputs.html.twig' %}
                    {% for field in form %}
                    {{ form_row(field) }}
                    {% endfor %}
                    <button type="submit" class="btn"><i class="icon-ok"></i></button>
                </form>
                {# Else display the name #}
                {% else %}
                    {{ c.name }} 
                    <a href="{{ path('edit_category', {'id': c.id}) }}"><i class="icon-pencil"> </i></a> 
                    <a href="{{ path('delete_category', {'id': c.id}) }}"> <i class="icon-remove"></i></a> 
                {% endif %}
            </td>
        </tr>
    {% endfor %}
</table>

这是我为每个类别所做的。我想要的是,如果有添加的项目,不提供删除链接。我唯一能想到的就是有两个数组——一个有带项目的类别,另一个有不带项目的分类,并对这两个数组进行循环。但这会导致代码重复——一切都会一样——只有一个循环这一行没有<a href="{{ path('delete_category', {'id': c.id}) }}"> <i class="icon-remove"></i></a>,而且看起来不太优雅。我在想类似的东西

if(c.name not member of array_with_categories_without_items) 
then display the delete link

但我不知道是否有办法做到这一点。有人能给我一些想法吗?提前非常感谢!:)

根据您的应用程序,您可以做一些事情。

我的偏好是显示所有类别的删除链接,并在实际的删除页面上进行验证。这还有几个额外的好处:

  • 让您在删除页面上思考此逻辑。许多人在隐藏链接时会忘记在用户删除类别时检查逻辑。这意味着,如果他们手动更改删除链接,使其包含项目类别的ID,您的应用程序将很乐意删除它
  • 降低整个应用程序的复杂性。并不是说一个简单的MySQL查询会让你的应用程序变得更复杂,但它确实有助于视图层在没有显示链接的条件逻辑的情况下表现得更干净
  • 减少服务器负载。在打印删除链接之前,您不必检查每个类别中的子项(不过,根据您的设置,这可能是一个廉价的操作)
  • 它让用户知道发生了什么。否则,在不了解您的应用程序的内部和外部的情况下,他们会想知道为什么没有删除链接。如果他们点击一个删除链接,就会显示一个错误,这将告诉他们,如果他们想删除一个类别,就需要删除所有子项

话虽如此,你可以这样做:

SELECT
    c.category_name,
    c.category_id,
    COUNT(f.food_id) AS children
FROM 
    categories c
    LEFT JOIN food f ON (c.category_id = f.food_id)
GROUP BY
    c.category_id

这显然需要对数据库结构进行猜测,但这将为您提供一个类别列表,其中包含每个的子项数

最新更新