2016-02-19 91 views
0

我已經在Symfony2項目上工作了一段時間了,儘管我認爲我正確執行了這個特定的部分,但它並不完全適用於我需要它。循環通過樹枝模板中的值並找到現有的部分(Symfony2)

我在樹枝模板上顯示與任務及其所在類別相關的數據。它使用連接表,因爲它是ManyToMany關係,因爲任務可以分配給多個類別。幸運的是,只有3個類別,所以它不是太複雜。

目前,我循環遍歷分配給每個任務的類別,如下所示......在本例中,'task'是從任務實體中檢索的數據,其中'category'是映射到連接的數組集合表:

{% for cat in task.category %} 
    <input type="checkbox" checked name="cat[]" /><label>{{ cat.name }}</label> 
{% endfor %} 

正如你所看到的,有一個複選框列表,並且分配給任務的類別將被檢查。以上代碼僅顯示分配的類別。

要獲得所有類別,我所做的:

{% for category in categories %} 
    ... 
{% endfor %} 

其中, 「類別」 是的findAll()從類別實體造成的。

基本上,我需要做的是循環所有可用的類別,但只檢查那些分配。我試圖創建其可以交叉引用數組:

{% for cat in stage.category %} 
{% set arr = {} %} 
{% for category in categories %} 
    {% set arr = arr|merge({ 'id': cat.id}) %} 
{% endfor %} 
{% if category.id in arr %} 
    ... 
{% endif %} 
{% endfor %} 

但陣列永遠只能有一個它的值,因爲我認爲它只是覆蓋它。所以,如果任務只分配給一個類別,這很好,但不幸的是它可以分配給幾個。

我需要的是一種循環遍歷類別並運行檢查以查看它是否分配給當前任務的方法。

我也試圖消除陣列選項,並用這個:

{% for cat in stage.category %} 
    {% for category in categories %} 
     {% if cat.id == category.id %} 
      <input id="category_{{ category.id }}" checked type="checkbox" name="category[]" /> 
      <label style="font-weight:100" for="category_{{ category.id }}">{{ category.name }}</label><br /> 
     {% else %} 
      <input id="category_{{ category.id }}" type="checkbox" name="category[]" /> 
      <label style="font-weight:100" for="category_{{ category.id }}">{{ category.name }}</label><br /> 
     {% endif %} 
    {% endfor %} 
{% endfor %} 

但是,這只是顯示所有類別兩次,一次檢查,並沒有選中。

我接近這個正確的方式嗎?還是有更好,更簡單的方法來做到這一點?

希望有人能指出我正確的方向。

編輯:

感謝您的答案 - 問題是,一些數據是不是爲了執行提供的解決方案可以直接訪問,但我想了很多有關這一點,並想出了與此:

// get all the active categories for each task 
foreach($tasks as $task) { 
    foreach($task->getCategory() as $task_category) { 
     $task_array[$task->getId()]['active'][$task_category->getId()] = $task_category->getName(); 
    } 
} 

// get all available categories 
foreach($categories as $category) { 
    $category_array[$category->getId()] = $category->getName(); 
} 

// find out which categories are not in the active array and add them as inactive 
foreach($task_array as $key => $task_cat) { 
    foreach($task_cat as $new_key => $new_task) { 
     foreach ($category_array as $cat_key => $cat_name) { 
      if (!array_key_exists($cat_key, $new_task)) { 
       $task_array[$key]['inactive'][$cat_key] = $cat_name; 
      } 
     } 
    } 
} 

然後,我有一個$ task_array它看起來像這樣:

Array 
(
    [1] => Array 
     (
      [active] => Array 
       (
        [1] => Standard Wire Guide 
        [2] => Standard Wire Guide with Additional Features 
       ) 

      [inactive] => Array 
       (
        [3] => Stator 
       ) 

     ) 

    [2] => Array 
     (
      [active] => Array 
       (
        [1] => Standard Wire Guide 
        [2] => Standard Wire Guide with Additional Features 
       ) 

      [inactive] => Array 
       (
        [3] => Stator 
       ) 

     ) 

.... 
); 

而且現在我有一個可管理的數組我可以在twig文件中使用。

感謝您的所有建議:)

回答

2

試試這個。我想這就是你要找的。這個對我有用。

訣竅是把條件放在「checked」屬性上。

// 
// In our controller. 
// 
$categories = 
[ 
    ['id' => 1, 'name' => 'catOne'], 
    ['id' => 2, 'name' => 'catTwo'], 
    ['id' => 3, 'name' => 'catThree'] 
]; 
$tasks = 
[ 
    ['id' => 1, 'name' => 'Some task', 'cats' => [ 1, 3 ]], 
    ['id' => 2, 'name' => 'Another task', 'cats' => [2]] 
]; 
$vars = ['categories' => $categories, 'tasks' => $tasks]; 
Return $this->render('SiteBundle:Debug:debug.html.twig', $vars); 

{# 
# In the template. 
#} 
{% for task in tasks %} 
    {{ task.name }}: 
    {% for category in categories %} 
     <input id="category_{{ category.id }}" 
      type="checkbox" 
      {% if category.id in task.cats %}checked{% endif %} 
      name="category[]"/> 
     <label style="font-weight:100" 
      for="category_{{ category.id }}">{{ category.name }}</label> 
    {% endfor %}<br> 
{% endfor %} 
+0

雖然這個解決方案接近我想要的,但是抓取您在控制器中顯示的數據並不那麼簡單 - 但我已經使用您的答案來幫助我生成效果很好的東西(請參閱我的原始問題編輯), 所以謝謝。 –

0

我建議如下:

下面的方法添加到Catorgy

namespace MyBundle\Entity; 

class Catorgy { 
    ... 
    public function isAssigned() 
    { 
     return (count($this->getTasks()) > 0); 
    } 
    ... 
} 

如果你的許多一對多的關係,正確定義,該getTasks方法要麼已經存在或不應該不難添加。

然後,在嫩枝,命名爲MyClass::isSomething()方法可以只用MyClass.something訪問:

{% for cat in catorgies %} 
    <input id="category_{{ cat.id }}" type="checkbox" name="category[]"{% if cat.assigned %} checked{% endif %}/> 
    <label style="font-weight:100" for="category_{{ cat.id }}">{{ cat.name }}</label><br /> 
{% endfor %} 

這是我能想到的最簡單的方法。