2015-07-03 2 views
0

Я новичок в Symfony2 и я должен создать избранную форму из 3 таблиц/объектов:Symfony2 выбор формы с Entity отношений

**Game table:** 
id,another_column 
game_1, 2 
game_2, 4 
game_3, 10 
game_4, 1 

**Score table:** 
id,user_id,game_id 
1,4,game_1 
2,4,game_3 

После аутентификации пользователя (я использую сверток пользователя СОФ) , Я должен создать форму выбора со всеми неиграемыми играми. В этом случае моя выбранная форма должна иметь два варианта (game_2 и game_4).

ScoreFormType.php

<?php 
/** 
* @package evaluation 
*/ 
namespace GameBundle\Form\Type; 

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

class ScoreFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('game'); 
    } 

    public function getName() 
    { 
     return 'game_score'; 
    } 
} 

DefaultController.php

<?php 

namespace AppBundle\Controller; 

use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\EntityRepository; 
use GameBundle\Entity\Score; 
use GameBundle\Form\Type\ScoreFormType; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 

class DefaultController extends Controller 
{ 
    /** 
    * @return \Symfony\Component\HttpFoundation\Response 
    */ 
    public function indexAction(Request $request) 
    {  
     $m = $this->getDoctrine()->getManager(); 
     $parameters = []; 
     if (null !== $this->getUser()) { 
      $score = new Score(); 
      $score 
       ->setUser($this->getUser()) 
       ->setPoints(rand(1,50)) 
      ; 
      $form = $this->createForm(new ScoreFormType(), $score); 

      $parameters['form'] = $form->createView(); 
     } 

     return $this->render('AppBundle::index.html.twig', $parameters); 
    } 

} 

Есть ли пример, который может мне помочь? Я пытался провести исследование, но ничего не значил.

спасибо.

+1

Это больше беспокоит вопрос о db относительно вашей установки. Вы должны найти документацию symfony2 в поле сущности и запросить игры, исключенные из содержания таблицы баллов. – DerStoffel

ответ

0

Вы должны сначала получить ваши игры из базы данных затем добавить их в форму с:

$form = $this->createForm(new ScoreFormType(), $games);

В вашем ScoreFormType.php создать это:

public function __construct($aYourGames = array()) 
{ 
    $this->aYourgames = $aYourGames['Your data']; 
} 

Создать «выберите ":

->add('games', 'choice', array(
      'required' => true, 
      'label' => 'games', 
      'choices' => $this->aYourgames 
      ) 
     ) 

Вы также можете назвать класс на ваш выбор, это поможет при использовании Javascript:

'attr' => array('class' => 'govChoice'), 
0

я предполагаю следующие субъекты:

игры:

class Game 
{ 
    private $id; 
    private $title; 
} 

забившая:

class Score 
{ 
    private $id; 
    private $user_id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Game") 
    */ 
    private $game_id; 
} 

FormType:

<?php 
/** 
* @package evaluation 
*/ 
namespace GameBundle\Form\Type; 

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

class ScoreFormType extends AbstractType 
{ 

    private $user; 

    public function __construct($user) 
    { 
     $this->user = $user; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $user = $this->user; 

     $builder->add('game', 'entity', array(
         'class' => 'GameBundle:Game', 
         'property' => 'title', 
         'query_builder' => function (EntityRepository $er) use ($user) { 
           return $er->createQueryBuilder('game') 
            ->where('game.id NOT IN(SELECT score.game_id FROM GameBundle:Score score WHERE score.user_id = :user')) 
            ->setParameter('user', $user) 
            ->orderBy('game.title', 'ASC'); 
        )); 
    } 

    public function getName() 
    { 
     return 'game_score'; 
    } 
} 

контроллера по умолчанию:

<?php 

namespace AppBundle\Controller; 

use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\EntityRepository; 
use GameBundle\Entity\Score; 
use GameBundle\Form\Type\ScoreFormType; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 

class DefaultController extends Controller 
{ 
    /** 
    * @return \Symfony\Component\HttpFoundation\Response 
    */ 
    public function indexAction(Request $request) 
    {  
     $m = $this->getDoctrine()->getManager(); 
     $parameters = []; 
     $form = $this->createForm(new ScoreFormType($this->getUser())); 

     $parameters['form'] = $form->createView(); 

     return $this->render('AppBundle::index.html.twig', $parameters); 
    } 

} 

Может быть, вам нужно немного возиться с запросом в форме, но это было бы одна возможность решить ее с основными инструментами предоставляемый компонентом формы.

Смежные вопросы