Symfony2动态表单mongodb [英] Symfony2 dynamic forms mongodb

查看:125
本文介绍了Symfony2动态表单mongodb的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

按照以下 http://symfony.com/中记录的示例进行操作doc/current/cookbook/form/dynamic_form_generation.html

我需要根据类别选择填充子类别字段. 我不明白为什么在/article/create中出现此错误:

I need to populate subcategory field according to the category selection. I don't understand why this error at /article/create:

FatalErrorException: Error: Call to a member function getSubCategories() on a non-object

表格:

namespace Cc\HitoBundle\Form\Type;

…

class ArticleType extends AbstractType
{
    private $registrationArticleListener;

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

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            …

            ->add('category', 'document', array(
                'label' => 'Category',
                'class' => 'Cc\HitoBundle\Document\Category',
                'property' => 'name',
            ));


        $builder->addEventSubscriber($this->registrationArticleListener);
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Cc\HitoBundle\Document\Article'
        ));
    }

    public function getName()
    {
        return 'article';
    }
}

我不了解食谱中的 AddNameFieldSubscriber()函数是什么

I don't understand what is the AddNameFieldSubscriber() function in the cookbook

侦听器:

The Listener:

namespace Cc\HitoBundle\Form\EventListener;

…

class RegistrationArticleListener implements EventSubscriberInterface
{
    /**
     * @var FormFactoryInterface
     */
    private $factory;

    /**
     * @var DocumentManager
     */
    private $dm;

    /**
     * @param factory FormFactoryInterface
     */
    public function __construct(FormFactoryInterface $factory, $mongo)
    {
        $this->factory = $factory;
        $this->dm = $mongo->getManager();
    }

    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::PRE_BIND => 'preBind',
            FormEvents::PRE_SET_DATA => 'preSetData',
        );
    }

    /**
     * @param event FormEvent
     */
    public function preSetData(FormEvent $event)
    {
        $agent = $event->getData();

        if (null === $article) {
            return;
        }

        $form = $event->getForm();
        $subCategories = $article->getCategory()->getSubCategories();

        $this->customizeForm($form, $subCategories);
    }

    public function preBind(FormEvent $event)
    {
        $data = $event->getData();
        $id = $data['event'];
        $agent = $this->dm
            ->getRepository('CcHitoBundle:Article')
            ->find($id);

        if ($article === null) {
            $msg = 'The event %s could not be found for you registration';
            throw new \Exception(sprintf($msg, $id));
        }
        $form = $event->getForm();
        $subCategories = $article->getCategory()->getSubCategories();

        $this->customizeForm($form, $subCategories);
    }

    protected function customizeForm($form, $subCategories)
    {

    }
}

我不明白我必须在customForm函数中添加什么.请帮我 !! =)

And I don't understand what I have to put in customizeForm function. Please help me !! =)

推荐答案

您收到非对象错误,因为您实际上没有在preBind或preSetData函数中创建$ article变量.看来您正在混淆$agent$article

You are getting the non-object error because you are not actually creating the $article variable in your preBind or preSetData functions. It looks like you are mixing up $agent and $article

public function preSetData(FormEvent $event)
{
    //here you have $agent
    $agent = $event->getData();
    //here you have $article
    if (null === $article) {
        return;
    }

    $form = $event->getForm();
    //here you have $article
    $subCategories = $article->getCategory()->getSubCategories();

    $this->customizeForm($form, $subCategories);
}

更改为:

public function preSetData(FormEvent $event)
{
    $article = $event->getData();
    // We can only set subcategories if a category is set
    if (null === $article->getCategory()) {
        return;
    }

    $form = $event->getForm();
    //...

在自定义表单功能中,您想要添加所需的字段,例如subCategories:

In customise form function you want to add the fields you need like subCategories:

//taken from the article OP referenced
protected function customizeForm($form, $subCatQueryBuilder)
{
    $formOptions = array(
        'class' => 'You\YourBundle\Entity\SubCategory',
        'multiple' => true,
        'expanded' => false,
        'property' => 'THE_FIELD_YOU_WANT_TO_SHOW',
         // I would create a query builder that selects the correct sub cats rather than pass through a collection of objects
        'query_builder' => $subCatQueryBuilder,
    );
    // create the field, this is similar the $builder->add()
    // field name, field type, data, options
    $form->add($this->factory->createNamed('subCategories', 'entity', null, $formOptions));
}

对于查询生成器:

/**
 * @param event FormEvent
 */
public function preSetData(FormEvent $event)
{
    $agent = $event->getData();

    if (null === $article->getCategory()) {
        return;
    }

    $form = $event->getForm();

   //Something like
   $category = $article->getCategory();
   $subCatQueryBuilder =  $this->dm
      ->getRepository("YourCatBundle:Subcategory")
      ->createQueryBuilder("sc")
      ->join("sc.category", "c")
      ->where("c.id = :category")
      ->setParameter("category", $category->getId());
   $this->customizeForm($form, $subCatQueryBuilder);
}

这篇关于Symfony2动态表单mongodb的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆