[英]Looping through values in a twig template and finding existing ones (Symfony2)
我已经从事Symfony2项目已有一段时间了,尽管我认为我正确地执行了该特定部分,但是我对它的需求还不够。
我在树枝模板上显示与任务及其驻留的类别有关的数据。这使用联接表,因为它是ManyToMany关系,因为可以将任务分配给多个类别。 幸运的是,只有3个类别,所以它不太复杂。
目前,我正在像这样循环遍历分配给每个任务的类别...在此示例中,“任务”是从任务实体中检索的数据,其中“类别”是映射到联接表的数组集合:
{% 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
)
)
....
);
现在,我可以在树枝文件中使用可管理的数组了。
也感谢您的所有建议:)
试试看。 我认为这就是您要寻找的。 这个对我有用。
诀窍是仅在“已检查”属性周围放置条件。
//
// 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 %}
我建议以下内容:
将以下方法添加到Catorgy
:
namespace MyBundle\Entity;
class Catorgy {
...
public function isAssigned()
{
return (count($this->getTasks()) > 0);
}
...
}
如果正确定义了getTasks
关系,则getTasks
方法要么已经存在,要么不难添加。
然后,在Twig中,仅使用MyClass.something
即可访问名为MyClass::isSomething()
方法:
{% 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 %}
这是我想到的最简单的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.