Nano Hash - криптовалюты, майнинг, программирование

Создайте форму с флажком для каждого объекта в коллекции доктрин.

Я показываю html-таблицу для отфильтрованной коллекции сущностей, и я хочу отобразить флажок в каждой строке как часть формы, которая добавит выбранные сущности в переменную сеанса.

Я думаю, что каждый флажок должен иметь идентификатор объекта в качестве значения, и я получу массив идентификаторов из данных поля формы (хорошо, поэтому значение должно быть косвенной ссылкой на объект, но ради простота).

Я попытался создать тип формы с одним полем типа объекта, сопоставленным со свойством id объекта и встроенным в другой тип формы, который имеет поле типа коллекции.

class FooEntitySelectByIdentityType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('foo_id', 'entity', array(
            'required'  => false,
            'class'    => 'MeMyBundle:FooEntity',
            'property' => 'id',
            'multiple' => true,
            'expanded' => true
        ));
    }

# ...

а также

class FooEntitySelectionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('identity', 'collection', array(
            'type'   => new FooEntitySelectByIdentityType,
            'options'  => array(
                'required' => false,
                'multiple' => true,
                'expanded' => true,
                'attr'     => array('class' => 'foo')
            ),
        ));
    }

# ...

а в контроллере создается форма с коллекцией сущностей в качестве исходных данных

$form = $this
    ->createForm(
        new \Me\MyBundle\Form\Type\FooEntitySelectionType,
        $collection_of_foo
    )
    ->createView()
;

Когда форма отображается, для поля идентификатора отображается одна метка, но нет виджетов.

Возможно ли вообще использовать поля типа сущности и коллекции именно таким образом? Если да, то что я могу делать неправильно?


Ответы:


1

Думаю, это ответит на ваш вопрос.

Забудьте FooEntitySelectionType. Добавьте параметр поля property_path к FooEntitySelectByIdentityType и установите для параметра data_class значение null:

class FooEntitySelectByIdentityType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('foo_id', 'entity', array(
            'required'      => false,
            'class'         => 'MeMyBundle:FooEntity',
            'property'      => 'id',
            'property_path' => '[id]', # in square brackets!
            'multiple'      => true,
            'expanded'      => true
        ));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'      => null,
            'csrf_protection' => false
        ));
    }

# ...

и в вашем контроллере создайте FooEntitySelectByIdentityType:

$form = $this
    ->createForm(
        new \Me\MyBundle\Form\Type\FooEntitySelectByIdentityType,
        $collection_of_foo
    )
    ->createView()
;

а затем в действии контроллера, которое получает данные POSTed:

$form = $this
    ->createForm(new \Me\MyBundle\Form\Type\FooEntitySelectByIdentityType)
;
$form->bind($request);
if ($form->isValid()) {
    $data = $form->getData();
    $ids  = array();
    foreach ($data['foo_id'] as $entity) {
        $ids[] = $entity->getId();
    }
    $request->getSession()->set('admin/foo_list/batch', $ids);
}

и, наконец, в вашем шаблоне ветки:

{# ... #}
{% for entity in foo_entity_collection %}
    {# ... #}

    {{ form_widget(form.foo_id[entity.id]) }}

    {# ... #}
01.02.2013
  • это работает! Недостатком всего этого метода является то, что $form->getData() возвращает массив, содержащий набор сущностей, а не простые целочисленные идентификаторы, но я полагаю, что преимущество заключается в том, что в сеансе не может быть недопустимых идентификаторов. спасибо @jah! 01.02.2013
  • Имейте в виду, что этот подход не работает, если вы пытаетесь использовать строки в качестве идентификаторов. Затем EntityChoiceList создаст целочисленные индексы для дочерних элементов, а вызов form_widget вызовет исключение. :( 17.03.2014
  • Я тоже сталкиваюсь с этой бедой. Есть ли более простой способ решить эту простую проблему? 19.07.2016
  • это решение работает очень медленно со многими объектами, см. мой другой вопрос stackoverflow.com /вопросы/42469902/ 28.02.2017

  • 2

    Если кто-то ищет решение для Symfony >= 2.3

    Вы должны изменить это:

        $data = $form->getData();
        $ids  = array();
        foreach ($data['foo_id'] as $entity) {
            $ids[] = $entity->getId();
        }
    

    к этому:

        $data = $form['foo_id']->getData();
        $ids = array();
        foreach ($data as $entity) {
            $ids[] = $entity->getId();
        }
    
    12.04.2014

    3

    Я создаю комплект Symfony для рендеринга набора сущностей в виде таблицы флажков настраиваемым способом. Хотя с тех пор, как этот вопрос был задан, прошло некоторое время, я надеюсь, что это может помочь другим с такой же проблемой.

    18.04.2016
  • Я использую этот Bundle, и я должен сказать, что это довольно круто! Спасибо! 18.11.2016
  • какова производительность вашего пакета при попытке отобразить до 1000 записей одновременно? Я планирую использовать обработку на стороне сервера datatables, чтобы ограничить количество записей, отображаемых при каждой загрузке страницы, однако кажется, что когда я использую приведенные выше другие ответы, мне нужно создать свой тип сущности со всеми возможными вариантами, которые он может ожидать, а не только изначально ограничивался первой страницей записей. У меня проблемы с производительностью, связанные с этим. 11.03.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..