我是 Symfony2 的新手。我使用 fosuserbundle 创建了一个小项目,它有一个注册、登录、2 个由单选按钮组成的表单,用于在登录或注册后选择和提交以及注销。 我希望 Controller 操作代码在用户登录后在表单中显示用户已选择的单选按钮(如果他之前通过登录选择了它)或显示默认选择单选按钮的默认表单(对于新用户)谁刚刚登录并且之前没有选择任何单选按钮)。我的项目的代码与链接上的代码非常相似:- How to display the user's already selected radio buttons after logging in symfony2
代码是:-
这是“订阅”实体:-
<?php
namespace InstituteEvents\StudentBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="subscriptions")
*/
class Subscriptions {
/**
* @ORM\Id
* @ORM\Column(name="id",type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var integer
* @ORM\Column(name="Event1", type="integer")
* @ORM\ManyToOne(targetEntity="Events")
* @ORM\JoinColumn(name="Event1", referencedColumnName="id")
**/
protected $event1;
/**
* @var integer
* @ORM\Column(name="Event2", type="integer")
* @ORM\ManyToOne(targetEntity="Events")
* @ORM\JoinColumn(name="Event2", referencedColumnName="id")
**/
protected $event2;
/**
* @var integer
* @ORM\Column(name="Event3", type="integer")
* @ORM\ManyToOne(targetEntity="Events")
* @ORM\JoinColumn(name="Event3", referencedColumnName="id")
**/
protected $event3;
/**
* @ORM\OneToOne(targetEntity="Students")
* @ORM\JoinColumn(name="id", referencedColumnName="id")
**/
protected $students;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set id
*
* @param integer $id
* @return Subscriptions
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
/**
* Set event1
*
* @param integer $event1
* @return Subscriptions
*/
public function setEvent1($event1)
{
$this->event1 = $event1;
return $this;
}
/**
* Get event1
*
* @return integer
*/
public function getEvent1()
{
return $this->event1;
}
/**
* Set event2
*
* @param integer $event2
* @return Subscriptions
*/
public function setEvent2($event2)
{
$this->event2 = $event2;
return $this;
}
/**
* Get event2
*
* @return integer
*/
public function getEvent2()
{
return $this->event2;
}
/**
* Set event3
*
* @param integer $event3
* @return Subscriptions
*/
public function setEvent3($event3)
{
$this->event3 = $event3;
return $this;
}
/**
* Get event3
*
* @return integer
*/
public function getEvent3()
{
return $this->event3;
}
}
注意:- 还有 2 个实体,即:- 1. 学生 2. 事件。但它与这个问题的关系并不是那么密切,所以为了节省篇幅,我在这里不再提及。无论如何,各个实体之间的关系已经设置正确
这是“订阅类型”:-
<?php
namespace InstituteEvents\StudentBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class SubscriptionsType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('event1', 'choice', array('choices' => array('1' => 'Tourism', '2' => 'Food party', '3' => 'South korean food', '4' => 'Cooking', '5' => 'None of the above'), 'data' => '5', 'expanded' => true, 'multiple' => false))
->add('event2', 'choice', array('choices' => array('6' => 'Cricket', '7' => 'Football', '8' => 'Hockey', '9' => 'Baseball', '10' => 'Polo', '5' => 'None of the above'), 'data' => '5', 'expanded' => true, 'multiple' => false))
->add('event3', 'choice', array('choices' => array('11' => 'Game 1', '12' => 'Game 2', '13' => 'Game 3', '14' => 'Game 4', '15' => 'Game 5', '5' => 'None of the above'), 'data' => '5', 'expanded' => true, 'multiple' => false))
->add('register', 'submit');
}
public function getName()
{
return 'subscriptions';
}
}
在下面的 Controller 中,我试图获取用户从数据库中选择的事件(即事件ID)并将其传递给“formtype”,以便它使用这些事件(即事件ID)并显示用户登录后原始单选按钮选择的表单。但它会引发错误。任何人都可以帮助了解如何向登录用户显示他/她选择的单选按钮值???
<?php
namespace InstituteEvents\StudentBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use InstituteEvents\StudentBundle\Entity\Subscriptions;
use InstituteEvents\StudentBundle\Form\Type\SubscriptionsType;
use Symfony\Component\HttpFoundation\Request;
class DefaultController extends Controller {
/**
* This action displays the form for the events of day 1.
*
* @param Request $request
* @return A Confirmation page on success
*/
public function eventsoneAction(Request $request) {
//Get current time and date
date_default_timezone_set('Europe/Paris');
$current_date = date('Y/m/d h:i:s a', time());
//Set expiration date
$deadline1 = $this->container->getParameter('deadline_day1');
$date=date_create($deadline1,timezone_open("Europe/Paris"));
$em = $this->getDoctrine()->getManager();
$subscriptions = new Subscriptions();
//Check if events already selected
$repository = $this->getDoctrine()
->getRepository('InstituteEventsStudentBundle:Subscriptions');
$query = $repository->createQueryBuilder('p')
->select('p.event1','p.event2','p.event3','p.event4')
->where('p.id = p.getId()')
->getQuery();
$subscriptionsreg = $query->getResult();//This contains users selected radio buttons(if any) and this is being passed to the formtype "SubscriptionsType"
$form = $this->createForm(new SubscriptionsType($subscriptionsreg), $subscriptions);
$form->handleRequest($request);
if ($form->isValid()) {
//Save to the Database
$em = $this->getDoctrine()->getManager();
$em->persist($subscriptions);
$em->flush();
return $this->redirect($this->generateUrl('institute_events_student_eventsregistered'));
}
if($current_date > date_format($date,"Y/m/d h:i:s a")) {
return $this->render('InstituteEventsStudentBundle:Default:registrationsclosed.html.twig');
}
else {
$form = $this->createForm(new SubscriptionsType($subscriptionsreg), new Subscriptions());
return $this->render('InstituteEventsStudentBundle:Default:eventsday1.html.twig', array('form' => $form ->createView()));
}
}
/**
* This action displays the Confirmation page on success.
*
* @param Request $request
* @return A Confirmation page on success
*/
public function eventsregisteredAction() {
return $this->render('InstituteEventsStudentBundle:Default:eventsregistered.html.twig');
}
}
最佳答案
更新答案:
注意:我将使用 yml 格式来制作学说映射(我不记得如何使用注释)。
第 1 步:
创建关系表
事件:
事件.orm.yml
InstituteEvents\StudentBundle\Entity\Event:
type: entity
table: events
manyToMany:
users:
targetEntity: InstituteEvents\StudentBundle\Entity\User
mappedBy: events
fields:
id:
type: integer
length: 11
id: true
generator:
strategy: AUTO
title:
type: string
length: 255
nullable: false
用户:
用户.orm.yml
InstituteEvents\StudentBundle\Entity\User:
type: entity
table: users
gedmo:
soft_deleteable:
field_name: deleted_at
manyToMany:
events:
targetEntity: InstituteEvents\StudentBundle\Entity\Event
joinTable:
name: user_event_selections
joinColumns:
user_id:
referencedColumnName: id
inverseJoinColumns:
event_id:
referencedColumnName: id
fields:
id:
type: integer
length: 11
id: true
generator:
strategy: AUTO
created_at:
type: datetime
nullable: false
gedmo:
timestampable:
on: create
updated_at:
type: datetime
nullable: true
gedmo:
timestampable:
on: update
deleted_at:
type: datetime
nullable: true
第 2 步:
创建表单:
<?php
namespace InstituteEvents\StudentBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('events', 'entity', array('label' => 'Selections', 'class' => 'InstituteEvents\StudentBundle\Entity\Event', 'property' => 'title', 'expanded' => true, 'multiple' => true))
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'InstituteEvents\StudentBundle\Entity\User'
));
}
public function getName()
{
return 'user';
}
}
第 3 步:
Controller
<?php
// codes...
public function profileAction(Request $request)
{
$user = $this->getUser();
$form = $this->createForm(new UserType(), $user);
$form->handleRequest($request);
if($form->isSubmitted()) {
if($form->isValid()) {
$em->persist($user);
$em->flush();
}
}
}
// send this to your view.
$form_view = $form->createView();
第 4 步:
查看:
{{ form_widget(form) }}
好的,这些示例向您展示了如何在表单提交时自动设置和获取用户选择。您不必保存任何实体。
关于php - 登录symfony2后显示用户已经选择的单选按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27398572/