php - 登录symfony2后显示用户已经选择的单选按钮

标签 php forms symfony doctrine-orm

我是 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/

相关文章:

php - 将 .mdb 数据插入 SQL 时出现编码问题

javascript - 使用 jquery 在所有带有文本区域的表单中搜索提交按钮

php - 在 Nelmio Alice fixture 生成器中将参数设置为数组

php - Silex/Symfony 以编程方式登录

php - 如何使用 Magento 的 ORM 在我的自定义表和 magento 的表之间进行内部连接?

php - "Last Post By"用于论坛、加入、加入和加入负载

php - 为什么 var_dump 在 PHP7 中格式不正确?

php - 向 Laravel 表单添加自定义验证错误

drupal - 从内容创建页面中删除多余的东西 (Drupal 6.x)

symfony - 如何检查今天是否在嫩枝中的两个日期之间?