如何在Symfony中创建列表?

5

我刚接触Symfony框架。我想创建一个记录列表,看起来像这样:

enter image description here

我需要在顶部放置一些筛选器,在中间放置项目列表,并在底部放置分页。列表应该支持可编辑和只读模式。在只读模式下,用户可以浏览数据,而在编辑模式下,他将能够更新多个字段和列中的值。

由于我将制作许多这些列表,因此我想使用类似Symfony2表单的界面,而不是一直调整twig模板。

是否缺少Symfony Forms的某些功能,可以创建像这样的列表?是否有其他常见的实现此功能的方式?您能否给我提示,哪些与表格相关的类要扩展以创建列表支持?


3
对我来说,你在这里尝试做的事情最好使用Twitter Bootstrap(用于CSS部分)和KNP分页器来解决,后者是适用于SF2的一个非常有能力的分页器套件。话虽如此,我觉得这个问题略微偏离主题,因为它似乎并没有真正涉及到具体的与代码相关的问题,更像是一个“如何开始”的问题(如果你需要在SF2上进行速成课,请查看Symfony官网上的Symfony cookbook,它真的很不错)。 - Elias Van Ootegem
我已经查过了手册,但它没有说明如何创建列表。我知道可以在Twig中创建它们,但我更喜欢表单构建界面。因为我需要可编辑的列表,可以包含表单字段,所以我尝试调试表单以找出可以插入的位置。我发现应该替换PropertyPathMapper来处理数据行,但这只是个开始。所以我希望有一个更简单的解决方案来修改表单,使其像列表一样工作。 - pbosko
使用表单作为列表并不难,也不需要像ProperyPathMapper那样深入挖掘,一个简单的twig模板和嵌套的自定义表单类型就可以完成,这两个都在Symfony cookbook中有介绍,并在Symfony2文档中详细解释。 - Elias Van Ootegem
也许可以使用datatables.js。 - john Smith
2个回答

2
为了将Symfony表单转换成列表,我创建了一个新的表单类型ListType,它接受任意嵌套集合类型。这样我就可以创建各种列的列表。它看起来会像这样:
class ListType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        if (empty($options['collection_type']) || !$options['collection_type'] instanceof AbstractType) {
            throw new \InvalidArgumentException();
        }
        $builder->add('rows', 'collection', array('type' => $options['collection_type']));
        $builder->add('save', 'submit', array('label' => 'Save'));
    }
    ...
}

我将使用$options数组来提供或打开和关闭其他功能,例如搜索过滤器和分页。
为了拥有一个方便的界面来显示列表,如:
{{ list(list) }}

我创建了Twig扩展:
class ListExtension extends \Twig_Extension
{
    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('list', array($this, 'listFunction'), array('is_safe' => array('html'), 'needs_environment' => true))
        );
    }

    public function listFunction(\Twig_Environment $env, FormView $form)
    {
        return $env->resolveTemplate($this->defaultTemplate)->renderBlock('list', array('form' => $form));
    }
    ...
}

它渲染了“list”Twig块。我也会以同样的方式添加其他子块。这个扩展提供了比“form”块更大的自由。
我将列表扩展注册为服务:
# app/config/services.yml
services:
    my.twig.list.extension:
        class: MyBundle\Twig\Extension\ListExtension
        arguments: ["::my_theme.html.twig"]
        public: false
        tags:
            - { name: twig.extension }

现在我只需要创建一个ListType的表单,并将行实体的数组传递给它。
感谢Elias Van Ootegem指导我正确的方向。

1

APYdataGridBundle是解决这个问题的完美方案,在这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接