【问题标题】:Symfony2 Custom Form. Miss ideasSymfony2 自定义表单。想念的想法
【发布时间】:2015-08-18 11:26:07
【问题描述】:

我有两个实体如下:

会员(姓名、名字):OneToMany -> 订阅

订阅(numberOfMounth):(ManyToOne -> 会员)

我想创建一个表单来加载成员列表。 并且对于每个成员,我可以选择订阅月数(numberOfMounth)。 在每个成员之前带有一个复选框以仅选择那些准备订阅的成员。最后是一个记录所有内容的按钮。

我首先通过添加字段集合(订阅)来创建表单。 但我想知道是否要为这个表单创建一个新实体。

其实我错过了一些想法。

我的实体和形式:

<?php

namespace Jack\AikidoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Jack\AikidoBundle\Member
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Jack\AikidoBundle\Entity\MemberRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Member
{

    /**
    * @var integer $id
    *
    * @ORM\Column(name="id", type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    private $id;

    /**
    * @var string $name
    *
    * @ORM\Column(name="member_name", type="string", length=255)
    */
    private $name;

    /**
    * @var string $firstname
    *
    * @ORM\Column(name="member_firstname", type="string", length=255)
    */
    private $firstname;


    /**
     * @ORM\OneToMany(targetEntity="Jack\AikidoBundle\Entity\Subscription", mappedBy="member", cascade={"persist", "remove"})
     */
    protected $subscriptions;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->subscriptions = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Member
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set firstname
     *
     * @param string $firstname
     * @return Member
     */
    public function setFirstname($firstname)
    {
        $this->firstname = $firstname;

        return $this;
    }

    /**
     * Get firstname
     *
     * @return string 
     */
    public function getFirstname()
    {
        return $this->firstname;
    }



    /**
     * Add subscriptions
     *
     * @param \Jack\AikidoBundle\Entity\Subscription $subscriptions
     * @return Member
     */
    public function addSubscription(\Jack\AikidoBundle\Entity\Subscription $subscriptions)
    {
        $this->subscriptions[] = $subscriptions;

        return $this;
    }

    /**
     * Remove subscriptions
     *
     * @param \Jack\AikidoBundle\Entity\Subscription $subscriptions
     */
    public function removeSubscription(\Jack\AikidoBundle\Entity\Subscription $subscriptions)
    {
        $this->subscriptions->removeElement($subscriptions);
    }

    /**
     * Get subscriptions
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getSubscriptions()
    {
        return $this->subscriptions;
    }
}

<?php

namespace Jack\AikidoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Jack\AikidoBundle\Subscription
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Jack\AikidoBundle\Entity\SubscriptionRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Subscription
{
    /**
     * @ORM\ManyToOne(targetEntity="Jack\AikidoBundle\Entity\Member", inversedBy="subscriptions")
     * @ORM\JoinColumn(name="member_id", referencedColumnName="id")
     */
    protected $member;
   /**
    * @var integer $id
    *
    * @ORM\Column(name="id", type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    private $id;


    /**
    * @var datetime $date
    *
    * @ORM\Column(name="date", type="datetime")
    */
      private $date;

    /**
    * @var integer $nbMonth
    *
    * @ORM\Column(name="nbMonth", type="integer")
    */
    private $nbMonth;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }



    /**
     * Set date
     *
     * @param \DateTime $date
     * @return Subscription
     */
    public function setDate($date)
    {
        $this->date = $date;

        return $this;
    }

    /**
     * Get date
     *
     * @return \DateTime 
     */
    public function getDate()
    {
        return $this->date;
    }

    /**
     * Set nbMonth
     *
     * @param integer $nbMonth
     * @return Subscription
     */
    public function setNbMonth($nbMonth)
    {
        $this->nbMonth = $nbMonth;

        return $this;
    }

    /**
     * Get nbMonth
     *
     * @return integer 
     */
    public function getNbMonth()
    {
        return $this->nbMonth;
    }

    /**
     * Set member
     *
     * @param \Jack\AikidoBundle\Entity\Member $member
     * @return Subscription
     */
    public function setMember(\Jack\AikidoBundle\Entity\Member $member)
    {
        $this->member = $member;

        return $this;
    }

    /**
     * Get member
     *
     * @return \Jack\AikidoBundle\Entity\Member 
     */
    public function getMember()
    {
        return $this->member;
    }


}

<?php

namespace Jack\AikidoBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class SubscriptionType extends AbstractType
{
        /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('date')
            ->add('nbMonth')

            ->add('member', 'entity', array(
                'class' => 'JackAikidoBundle:Member',
                'property' => 'name',
                'multiple' => true,
                'expanded' => true,
            ))                 
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Jack\AikidoBundle\Entity\Subscription'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'subscription';
    }
}

新更新:我的控制器和视图

public function subscriptionAction()
{    
    $entity = new Subscription();

    $repository = $this->getDoctrine()
                       ->getRepository('JackAikidoBundle:Member');

    $members = $repository->findAll();

    $formBuilderPratSub = $this->createFormBuilder();

    //Make a loop for each $member
    foreach($members as $member)
    {
        $formBuilder = $this->get('form.factory')->createNamedBuilder(
                $member->getId(), 
                new SubscriptionType(), 
                $entity
                );
        $formBuilderPratSub->add($formBuilder);
    }
    //Create the form

    $form = $formBuilderPratSub->getForm();
    $form->add('submit', 'submit', array('label' => 'Create'));

    return $this->render('JackAikidoBundle:Aikido:souscription.html.twig', 
        array(
            'entity' => $entity,
            'forms'   => $form->createView(),
            'members' => $members,
    ));

}

我的看法:

    <table class="table">
        <thead>
            <tr>
                <th>Member ID</th>
                <th>Name</th>
                <th>Firstname</th>
                <th>Nb Month</th>
            </tr>
        </thead>
        <tbody>
            {% for member in members %}
                {% for form in forms %}
                    <tr>
                        <td>{{ member.id }}</td>
                        <td>{{ member.nom }}</td>
                        <td>{{ member.prenom }}</td>
                        <td>{{ form_row(form.nbMonth)}}</td>
                    </tr>

                {% endfor %}

            {% endfor %}
        </tbody>
    </table>
   <div>{{ form_row(forms.submit) }}</div> 

错误:

Method "nbMonth" for object "Symfony\Component\Form\FormView" does not exist in JackAikidoBundle:Aikido:souscription.html.twig at line 25 

这一行是:&lt;td&gt;{{ form_row(form.nbMonth)}}&lt;/td&gt;

我尝试:{{ form(forms)}} 只显示表单:

【问题讨论】:

  • 创建控制器以显示表单,而不是实体。
  • 如果您有每个成员的表单,您可以使用表单集合制作另一个表单:$builder-&gt;add('subscriptions', 'collection', array('type' =&gt; new SubscriptionType()));
  • 我再次更新我的帖子

标签: php forms symfony formbuilder


【解决方案1】:

我尝试了一些我认为不是好的方法:

在控制器中:

public function subscriptionAction(Request $request)
{    
    $repository = $this->getDoctrine()->getRepository('JackAikidoBundle:Member');
    $members = $repository->findAll();
    $em = $this->getDoctrine()->getManager();

    if ($request->getMethod() == 'POST') {
        $nbMonth = $this->getRequest()->get('nbMonth');
        $selectedMembers = $this->getRequest()->get('selectedMembers');

        for($i =0; $i < count($selectedMembers); $i++){
            $subscription = new Subscription();
            $subscription->setMonth((int)$nbMonth[$i]);
            $member = $repository->find($selectedMembers[$i]);
            $subscription->setMember($member);
            $em->persist($subscription);
        }
        $em->flush();

    } 
    return $this->render('JackAikidoBundle:Aikido:subscription.html.twig', 
        array(
            'members' => $members,
    ));  
}

在视图中:

<form  action='{{path('jack_aikido_subscription')}}' method="post">
    <table class="table table-bordered table-striped table-primary list-table">
        <thead>
            <tr>
                <th>Select</th>
                <th>Name</th>
                <th>Firstname</th>
                <th>Nb Month</th>
            </tr>
        </thead>
        <tbody>
            {% for member in members %}               
                    <tr>
                        <td>
                            <input type="checkbox"  name="selectedMembers[]" value="{{ member.id }}">
                        </td>
                        <td>{{ member.name }}</td>
                        <td>{{ member.firstname }}</td>
                        <td>
                            <select name="nbMonth[]">
                                <option value="0">Select</option>
                            {% for i in 1..12 %}
                                <option value="{{ i }}">{{ i }} month</option>
                            {% endfor %}    
                            </select>
                        </td>
                    </tr>
            {% endfor %}
        </tbody>
    </table>
    <input type="submit" name="save">    
</form> 

它有效,但我仍在等待最佳答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    相关资源
    最近更新 更多