2015-02-25 7 views
1

как в How to handle Symfony form collection with 500+ items У меня есть большая коллекция форм symfony. В упомянутой теме кто-то предлагает использовать разбивку на страницы для коллекции.Составление пагинации формы Symfony с KnpPaginatorBundle

Как я могу разместить такую ​​коллекцию форм с помощью knpPaginatorBundle?

Тип формы, как это

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('myType', 'collection', array(
      'type' => new MyType(), 
     )) 
    ; 
} 

Мой контроллер генерирует форму с коллекцией

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

, а затем я пытаюсь использовать постраничной навигации

$paginator = $this->get('knp_paginator'); 
$pagination = $paginator->paginate(
    $form['myType'], 
    $request->get('page', 1), 
    10 
); 

I думаю, что я использую неправильную цель для paginate ($ target), правильная цель в форме symfony collectio п?

ответ

1

Решение: Запросить все сущности коллекции, разбивать их на страницы и устанавливать атрибут данных коллекции в разбиение на страницы.

Контроллер:

$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)); 

тип Форма:

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, 
     )) 
    ; 
} 
+0

Я пытаюсь использовать это, подход, но это, похоже, может потерять некоторые данные при обновлении коллекционирования. Учитывая, что у вас есть два пользователя, редактирующих одну и ту же страницу коллекции. Один пользователь удаляет первый элемент из коллекции, а затем второй пользователь обновляет первый элемент в коллекции. Как только выполняется разбиение на страницы - второй элемент будет перезаписан обновленными данными первого элемента. – ScayTrase

+0

Он отлично работает на Symfony3, спасибо! – Felurian

0

Пример на Symfony3:

Каталог Контроллер

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

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 ! 
    )); 
} 

Мое мнение (products.html.twig)

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

коллекция Мои продукты теперь постраничную.