首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用KnpPaginatorBundle对Symfony窗体集合进行分页

使用KnpPaginatorBundle对Symfony窗体集合进行分页
EN

Stack Overflow用户
提问于 2015-02-25 12:35:25
回答 2查看 4.1K关注 0票数 3

就像在How to handle Symfony form collection with 500+ items中一样,我有一个很大的symfony表单集合。在提到的线程中,有人建议对集合使用分页。

如何使用knpPaginatorBundle分页这样的表单集合?

表单类型如下

代码语言:javascript
复制
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('myType', 'collection', array(
            'type' => new MyType(),
        ))
    ;
}

我的控制器用集合生成一个窗体。

代码语言:javascript
复制
$form = $this->createForm(new MyFormCollectionType());

然后我试着用分页器

代码语言:javascript
复制
$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate(
    $form['myType'],
    $request->get('page', 1),
    10
);

我认为我对分页($target)使用了错误的目标,在symfony表单集合中正确的目标是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-20 08:33:20

Symfony3上的示例:

目录控制器

代码语言:javascript
复制
// I want to paginate products (my collection)
$products = $catalog->getProducts();   // ArrayCollection

// Pagination
$paginator  = $this->get('knp_paginator');
$pagination = $paginator->paginate($products, $request->query->getInt('page', 1), 10);

// build the form with catalog data
$form = $this->createForm(CatalogProductType::class, $catalog, array("pagination" => $pagination));

// [...]

// show page
return $this->render('catalogs/products.html.twig', array(
    'catalog'    => $catalog,
    'form'       => $form->createView(),
    'pagination' => $pagination
));

目录格式(CatalogProductType)

代码语言:javascript
复制
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('products',   CollectionType::class, array(
            'entry_type'    => ProductType::class,
            'data'          => $options['pagination'],
            'allow_add'     => true,
            'allow_delete'  => true,
            'prototype'     => true,
            'label'         => false,
            'by_reference'  => false
        ))
        ->add('save', SubmitType::class, array(
            'attr'    => array('class' => 'button-link save'),
            'label'   => 'Validate'
        ))
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class'    => 'AppBundle\Entity\Catalog',
        'pagination'    => null    // Don't forget this !
    ));
}

My view (products.html.twig)

代码语言:javascript
复制
<div class="navigation">{{ knp_pagination_render(pagination) }}</div>

{% if pagination.getTotalItemCount > 0 %}
    {% for widget in form.products.children %}
        {# Refers to a Twig macro #}
        {{ _self.prototype_product(widget) }}
    {% endfor %}
{% else %}
    <div class="error">The is no product in this catalog</div>
{% endif %}

我的产品收藏现在分页了。

票数 4
EN

Stack Overflow用户

发布于 2015-02-25 16:24:49

解决方案:查询集合的所有实体,对这些实体进行分页,并将集合的数据属性设置为分页值。

主计长:

代码语言:javascript
复制
$allEntities = $em->getRepository('MyBundle:Entity')->findAll();
$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate(
    $allEntities,
    $request->get('page', 1),
    10
);

$form = $this->createForm(new MyFormCollectionType($pagination));

表格类型:

代码语言:javascript
复制
private $data;

public function __construct($data) {
    $this->data = $data;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('myType', 'collection', array(
            'type' => new MyType(),
            'data' => $this->data,
        ))
    ;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28719184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档