2013-11-12 3 views
0

Я должен создать форму из продуктов и коллекции с текстовыми полями как массив из TechCharТекстовые поля в коллекции Symfony2

Entity

Продукт

<?php 

namespace Homework\Bundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Homework\Bundle\Entity\TechChar; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* @ORM\Entity 
* @ORM\Table(name="products") 
*/ 
class Product { 

    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="string", name="name") 
    */ 
    protected $name; 

    /** 
    * @ORM\Column(type="string", name="brand") 
    */ 
    protected $brand; 

    /** 
    * @ORM\Column(type="decimal", name="price") 
    */ 
    protected $price; 

    /** 
    * @ORM\Column(type="integer", name="is_active") 
    */ 
    protected $isActive; 

    /** 
    * @ORM\ManyToMany(targetEntity="TechChar") 
    * @ORM\JoinTable(name="products_tech_char", 
    *  joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="tech_char_id", referencedColumnName="id")} 
    *  ) 
    */ 

    protected $techChar; 

    public function __construct() { 
     $this->techChar = new ArrayCollection(); 
    } 

    public function getId() { 
     return $this->id; 
    } 

    public function getName() { 
     return $this->name; 
    } 

    public function getBrand() { 
     return $this->brand; 
    } 

    public function getPrice() { 
     return $this->price; 
    } 

    public function getIsActive() { 
     return $this->isActive; 
    } 

    public function getTechChar() { 
     return $this->techChar; 
    } 

    public function setName($name) { 
     $this->name = $name; 
    } 

    public function setBrand($brand) { 
     $this->brand = $brand; 
    } 

    public function setPrice($price) { 
     $this->price = $price; 
    } 

    public function setIsActive($isActive) { 
     $this->isActive = $isActive; 
    } 

    public function setTechChar($techChar) { 
     $this->techChar = $techChar; 
    } 

} 

TechChar

<?php 

namespace Homework\Bundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="tech_char") 
*/ 
class TechChar { 

    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="string", name="name") 
    */ 
    protected $name; 

    /** 
    * @ORM\OneToMany(targetEntity="Product", mappedBy="id") 
    */ 
    protected $product; 

    public function getId() { 
     return $this->id; 
    } 

    public function getName() { 
     return $this->name; 
    } 

    public function setName($name) { 
     $this->name = $name; 
    } 
    public function getProduct() { 
     return $this->product; 
    } 

    public function setProduct($product) { 
     $this->product = $product; 
    } 


} 

Также я создал FormType

namespace Homework\Bundle\Forms; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 
class FormType extends AbstractType { 
public function buildForm(FormBuilderInterface $builder, array $options) { 
     $em = $this->getDoctrine()->getManager(); 
     $techChar = $em->getRepository("HomeworkBundle:TechChar")->findAll(); 
     echo '<pre>'; 
     print_r($techChar); 
     echo '</pre>'; 
     $builder->add('Namesss'); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) { 
     $resolver->setDefaults(array(
      'data_class' => 'HomeWork\Bundle\Entity\TechChar', 
     )); 
    } 

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

} 

И PanelColntroller

class PanelController extends Controller { 
    public function addProducts(Request $request) { 
     $product = new Product(); 
     $em = $this->getDoctrine()->getManager(); 
//  $techChars = $em->getRepository("HomeworkBundle:TechChar")->findAll(); 
     $form = $this->createFormBuilder($product) 
       ->add('Name', 'text') 
       ->add('Brand', 'choice', array(
        'choices' => array('hitachi' => 'Hitachi', 'midea' => 'Midea', 'panasonic' => 'Panasonic', 'ligi' => 'LG'))) 
       ->add('Price', 'text') 
       ->add('isActive', 'checkbox') 
       ->add('techChar','collection',array('type'=>new FormType())) 
       ->add('save', 'submit') 
       ->getForm(); 

     if ($form->isValid()) { 

      $em->persist($form->getData()); 
      $em->flush(); 
     } 
     return $this->render('HomeworkBundle:Default:add.html.twig', array('form' => $form->createView())); 
    } 

} 

Я должен сделать текстовые поля, где метки 'имя' из TechChar Пример: http://centur.bg/Form.png

ответ

0

Я бы отделил вашу проблему в 3-х лиц:

class Product { 
    /** @ORM\OneToMany(targetEntity="Product") */ 
    protected $productTechChars; 
} 

class ProductTechChar { 
    /** @ORM\ManyToOne(targetEntity="Product") */ 
    protected $product; 
    /** @ORM\ManyToOne(targetEntity="Product") */ 
    protected $techChar; 
    /** @ORM\ManyToOne(type="string") */ 
    protected $textField; 
} 

class TechChar { 
    /** @ORM\OneToMany(targetEntity="Product") */ 
    protected $productTechChars; 
} 

Нравится у вас есть «TechChar» Entity со списком технического имени charaterics, и затем вы используете «ProductTechChar», чтобы сделать мост между этими двумя объектами и задать свое текстовое поле.

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