2014-12-10 2 views
2

Symfony2를 처음 사용합니다. 나는 fosuserbundle을 사용하여 작은 프로젝트를 만들었다. 등록, 로그인, 로그인 후 또는 등록 및 로그 아웃 후 선택하고 제출하는 라디오 버튼으로 구성된 2 개의 폼이있다. 컨트롤러 액션 코드가 사용자가 로그인 한 후 (사용자가 이전에 로그인하여 선택한 경우) 양식에 사용자가 이미 선택한 라디오 버튼을 표시하거나 기본 선택된 라디오 버튼이있는 기본 양식을 표시하려는 경우 (새 방금 로그인 한 사용자이며 이전에 라디오 버튼을 선택하지 않은 사용자). 내 프로젝트의 코드는 링크 코드와 매우 유사하다 : - How to display the user's already selected radio buttons after logging in symfony2symfony2에 로그인 한 후 사용자가 이미 선택한 라디오 버튼을 표시합니다.

코드는 다음과 같습니다 -

이있는 "구독"엔티티 : -

<?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'; 
} 
} 

, 나는 이벤트 (예 : 이벤트 ID)가 그를 가져 오기 위해 노력하고 있어요 사용자가 데이터베이스에서 선택한 후 "formtype"에 전달하여 이러한 이벤트 (즉, 이벤트 id)를 사용하고 로그인 한 후 원래의 라디오 버튼을 선택한 양식을 표시합니다. 그러나 오류가 발생합니다. 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/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'); 
} 
} 
+0

서브 스크립 션과 사용자간에 관계가 있습니까? Beucase 당신이 그것을 필요로하고 난 귀하의 코드에서 사용자 엔티티와 어떤 정의를 볼 수 없었다? –

답변

2

업데이트 답 :

참고 : 나는 (내가 주석을 사용하는 방법을 기억하지 않습니다) 교리 매핑을 만들기 위해 YML 포맷을 사용합니다.

1 단계 :

만들기 관계형 테이블

이벤트 :

event.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 

사용자 :

user.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 :

컨트롤러

<?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(); 
,369

형태 만들기

4 단계 :

보기 :

{{ form_widget(form) }} 

가 좋아,이 예제는 어떻게 설정하고 제출 자동으로 양식에 사용자 선택을받을 보여줍니다. 엔티티를 저장할 필요가 없습니다.

+0

Hey, R. Canser Yanbakan 위 코드를 게시했습니다. –

+0

모든 엔티티 간의 관계가 설정되었습니다. 주석을 사용했습니다. 사용자가 이미 라디오 버튼을 체크하고 동일한 사용자가 다시 로그인하면 이전에 확인한 라디오 버튼이 표시되도록 컨트롤러 액션 코드를 원했습니다. 그렇지 않은 경우 사용자가 라디오 버튼을 선택하지 않고 로그인하면 "Default"라디오 버튼이 선택된 "Default form"이 표시되어야합니다. -> "data =>"5 "를 사용하여"SubscriptionsType " 항상 위의 옵션 중 아무 것도 "Default"라디오 버튼으로 확인되지 않습니다. –

+0

기본 아이디어는 사용자 엔티티가 여기 키가되어야한다는 것입니다. 그 선택으로 무엇을하고 싶습니까? 양식에 표시 하시겠습니까? 컨트롤러에서 사용 하시겠습니까? 사용자와 선택 항목 사이에 이미 관계가 있다면 $ user-> getSelection()과 같이 쉽게 선택할 수 있습니다. 이를 위해 쿼리 빌더를 사용할 필요가 없습니다. –

관련 문제