0

私はそれらにいくつかのカテゴリとアイテムを持っています。項目が設定されていないカテゴリだけを削除できるようにしたい。たとえば、書籍のカテゴリがありますが、具体的な書籍が追加されていないため、削除できます。そして、私は食品のカテゴリーを持っていて、それにはピザ、サンドイッチ、リンゴがあります - だから私はそれを削除することはできません. これをどうするのがベストなのかを考えています。

<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>

これは、私が各カテゴリに対して行っていることです。私が欲しいのは、追加されたアイテムがある場合、削除リンクが提供されないことです。私が考えることができた唯一のことは、2 つの配列を持つことでした。1 つは項目を含むカテゴリを持ち、もう 1 つは項目を含まないカテゴリを持ち、これを両方の for ループにします。しかし、これはコードの重複につながります - すべてが同じになり、1 つのループだけが<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

しかし、これを行う方法があるかどうかはわかりません。誰かが私にいくつかのアイデアを教えてもらえますか? 事前にどうもありがとうございました!:)

4

1 に答える 1

1

アプリケーションに応じて、できることがいくつかあります。

私の好みは、すべてのカテゴリの削除リンクを表示し、実際の削除ページで検証を行うことです。これには、いくつかの追加の利点があります。

  • 削除ページでこのロジックについて考えさせられます。多くの人がリンクを隠すことに巻き込まれ、ユーザーがカテゴリを削除しようとしたときにそのロジックを実際に確認するのを忘れています。つまり、削除リンクを手動で変更して項目のカテゴリの 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

これは明らかにデータベース構造を推測していますが、それぞれの子の数を含むカテゴリのリストが得られます

于 2013-02-05T13:37:39.723 に答える