Я новичок в Symfony2 и использую fosuserbundle. Я создал небольшой проект с использованием fosuserbundle, который имеет регистрацию, логин, 2 формы, состоящие из переключателей, которые можно выбрать и отправить после входа в систему или регистрации и выхода из системы. После того, как пользователь войдет в систему и выбирает различные переключатели и нажимает кнопку «Отправить», он переводится на страницу «Страница успеха». Но в следующий раз, когда пользователь войдет в систему, будут отображаться ранее выбранные радиокнопки пользователя «NOT», но показана форма с установленными переключателями по умолчанию. Я хотел отобразить уже выбранные переключатели пользователя после входа пользователя в систему (если он выбрал его ранее, выполнив вход в систему) или по умолчанию (для нового пользователя, который только что вошел в систему и ранее не выбрал никаких переключателей).
Это объект «Подписки»:
<?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. События. Но это не так тесно связано с этой проблемой, поэтому для экономии места я не упомянул об этом здесь. В любом случае, отношения между различными объектами были установлены правильно
Это «SubscriptionsType»: –
<?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'; } }
Это контроллер (какой код необходимо записать в этом контроллере для решения вышеуказанной проблемы?): –
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/dh: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(); $form = $this->createForm(new SubscriptionsType, new Subscriptions()); $form->handleRequest($request); if ($form->isValid()) { //Save to the Database $subscriptions = $form->getData(); $em->persist($subscriptions); $em->flush(); return $this->redirect($this->generateUrl('institute_events_student_eventsregistered')); } if($current_date > date_format($date,"Y/m/dh:i:sa")) { return $this->render('InstituteEventsStudentBundle:Default:registrationsclosed.html.twig'); } else { $form = $this->createForm(new SubscriptionsType, 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'); }
}
В приведенном ниже контроллере я пытаюсь получить события (например, идентификатор события), которые пользователь выбрал из базы данных и передал их в «formtype», чтобы он использовал эти события (например, идентификатор события) и отображал исходное радио пользователя после того, как вы вошли в систему, но выдает ошибку. Может ли any1 помочь в том, как показать зарегистрированному пользователю свои выбранные значения переключателей ???
<?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/dh: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(); $form = $this->createForm(new SubscriptionsType($subscriptionsreg), new Subscriptions()); $form->handleRequest($request); if ($form->isValid()) { //Save to the Database $subscriptions = $form->getData(); $em->persist($subscriptions); $em->flush(); return $this->redirect($this->generateUrl('institute_events_student_eventsregistered')); } if($current_date > date_format($date,"Y/m/dh:i:sa")) { return $this->render('InstituteEventsStudentBundle:Default:registrationsclosed.html.twig'); } else { $form = $this->createForm(new SubscriptionsType, 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'); }
}
Это связано с тем, что каждый раз в контроллере создается новый объект Subscriptions
:
$subscriptions = new Subscriptions();
И вы даже не используете его в createForm
:
$form = $this->createForm(new SubscriptionsType, new Subscriptions());
Кроме того, нет смысла подписываться на Subscription
с вашим пользователем, которого я предполагаю, является Student
сущностью. Чтобы исправить это, вы должны сделать что-то вроде:
if (!($subscriptions = $this->getUser()->getSubscriptions())) { // This line may not be right $subscriptions = new Subscriptions(); $subscriptions->setStudents($this->getUser()); } $form = $this->createForm(new SubscriptionsType, $subscriptions);
Я подозреваю, что в вашем развитии есть другие «дыры», поэтому это не будет полным решением ваших проблем, но в нем рассматривается основной вопрос вашего вопроса.
Строка, которая может быть неправильной, также может быть примерно такой:
if (!($subscriptions = $em->getRepository('InstituteEventsStudentBundle:Subscriptions')->findBy(...))) {