2014-03-31 35 views
2

我有一個類別表和產品表。這些類別以產品形式在下拉選擇框中列出。當我編輯產品時,產品表中保存的類別應在產品編輯表單(選定=「選定」)下的類別下拉菜單中自動選擇。如何讓symfony 2自動選擇編輯動作中的下拉字段

我已經嘗試了empty_data和empty_value,但它們不起作用。

我正在尋找2天后的解決方案,但找不到任何教程或此類示例。我將非常感激,如果有人可以參考我的教程,也可以看到下面的代碼理清問題:

控制器

<?php 

// src/Scsp/CmsBundle/Controller/ProductController.php 

namespace Scsp\CmsBundle\Controller;  
use Scsp\CmsBundle\Entity\CategoryEntity; 
use Scsp\CmsBundle\Entity\ProductEntity; 
use Scsp\CmsBundle\Form\ProductForm; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 
use Symfony\Component\HttpFoundation\Session\Session; 

class ProductController extends Controller {  

    public function editAction($id, $request) { 

     $em = $this->getDoctrine()->getManager(); 
     $product = $em->getRepository('ScspCmsBundle:ProductEntity')->find($id); 

     if (!$product){ 
      throw $this->createNotFoundException('No product found for id ' . $id); 
     } 

     $productForm=new ProductForm($id); 

     $form = $this->createForm($productForm, $product, array(   
      'attr' => array('class' => 'form-horizontal') 
     )); 

     $form->handleRequest($request); 

     if ($request->isMethod('POST') && $form->isValid()) { 

       $product->setCategoryid(3);     

       $em->persist($product); 
       $em->flush();     
       $this->session->getFlashBag()->add('success', $product->getProducts() . ' successfully edited!'); 
       return $this->redirect($this->generateUrl('scsp_cms_products', array('action' => 'list', 'id' => 0)));   
     } 

     return $this->render('ScspCmsBundle:Default:form.html.twig', array(
        'form' => $form->createView(), 
        'page_title' => 'Edit product', 
        'type' => 'products', 
        'id' => $id 
     )); 
    } 

} 

產品實體:

<?php 

// src/Scsp/CmsBundle/Entity/ProductEntity.php 

namespace Scsp\CmsBundle\Entity; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity(repositoryClass="Scsp\CmsBundle\Repository\ProductRepository") 
* @ORM\Table(name="products") 
*/ 
class ProductEntity { 

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

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

    /** 
    * @ORM\Column(type="integer") 
    * @ORM\ManyToOne(targetEntity="CategoryEntity", inversedBy="products") 
    * @ORM\JoinColumn(name="categoryid", referencedColumnName="id") 
    */ 
    protected $categoryid; 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() { 
     return $this->id; 
    } 

    /** 
    * Set id 
    * 
    * @param string $id 
    * @return Id 
    */ 
    public function setId($id) { 
     $this->id = $id; 

     return $this; 
    } 

    /** 
    * Set products 
    * 
    * @param string $products 
    * @return ProductEntity 
    */ 
    public function setProducts($products) 
    { 
     $this->products = $products; 

     return $this; 
    } 

    /** 
    * Get products 
    * 
    * @return string 
    */ 
    public function getProducts() 
    { 
     return $this->products; 
    } 

    /** 
    * Set categoryid 
    * 
    * @param integer $categoryid 
    * @return ProductEntity 
    */ 
    public function setCategoryid($categoryid) 
    { 
     $this->categoryid = $categoryid; 

     return $this; 
    } 

    /** 
    * Get categoryid 
    * 
    * @return integer 
    */ 
    public function getCategoryid() 
    { 
     return $this->categoryid; 
    } 
} 

類別實體:

<?php 

// src/Scsp/CmsBundle/Entity/CategoryEntity.php 

namespace Scsp\CmsBundle\Entity; 
use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* @ORM\Entity(repositoryClass="Scsp\CmsBundle\Repository\CategoryRepository") 
* @ORM\Table(name="categories") 
*/ 
class CategoryEntity { 

    /** 
    * @ORM\OneToMany(targetEntity="ProductEntity", mappedBy="categorid") 
    */ 
    protected $products; 

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

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

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

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() { 
     return $this->id; 
    } 

    /** 
    * Set id 
    * 
    * @param string $id 
    * @return Id 
    */ 
    public function setId($id) { 
     $this->id = $id; 

     return $this; 
    } 

    /** 
    * Set categories 
    * 
    * @param string $categories 
    * @return Categories 
    */ 
    public function setCategories($categories) { 
     $this->categories = $categories; 

     return $this; 
    } 

    /** 
    * Get categories 
    * 
    * @return string 
    */ 
    public function getCategories() { 
     return $this->categories; 
    } 

    public function __toString() { 
     return $this->getCategories(); 
    } 

    /** 
    * Add products 
    * 
    * @param \Scsp\CmsBundle\Entity\ProductEntity $products 
    * @return CategoryEntity 
    */ 
    public function addProduct(\Scsp\CmsBundle\Entity\ProductEntity $products) 
    { 
     $this->products[] = $products; 

     return $this; 
    } 

    /** 
    * Remove products 
    * 
    * @param \Scsp\CmsBundle\Entity\ProductEntity $products 
    */ 
    public function removeProduct(\Scsp\CmsBundle\Entity\ProductEntity $products) 
    { 
     $this->products->removeElement($products); 
    } 

    /** 
    * Get products 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getProducts() 
    { 
     return $this->products; 
    } 
} 

產品形態:

<?php 

// src/Scsp/CmsBundle/Form/ProductForm.php 

namespace Scsp\CmsBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use \Scsp\CmsBundle\Entity\ProductEntity; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 
use Symfony\Component\Form\FormInterface; 

class ProductForm extends AbstractType 
{ 
    private $id; 


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

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 

     if($this->id>0){ 

      $builder->add('id', 'text', 
        array(
         'label' => false,       
         'attr' => array(
            'class' => 'form-control', 
            'readonly' => 'readonly' 
           ) 
         ) 
      ); 
     }  

     $builder  
      ->add('products', 'text', 
        array(
         'label' => false,       
         'max_length' => 100, 
         'attr' => array(
            'class' => 'form-control', 
            'autocomplete' => 'off' 
           ) 
         ) 
       ) 

      ->add('categoryid', 'entity', array(
       'label' => false, 
       'class' => 'ScspCmsBundle:CategoryEntity', 
       'property' => 'categories', 
       'data'=>$builder->getData()->getCategoryId(), 
       'attr' => array(
       ) 
        ) 
      ) 

      ->add('save', 'submit',array(
        'attr' => array(
          'formnovalidate' => 'formnovalidate', 
          'class' => 'btn btn-primary', 
          'label' => 'Save Changes' 
         ) 
        ) 
       ) 

      ->getForm(); 
    } 

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

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'empty_data' => 'Scsp\CmsBundle\Entity\CategoryEntity' 
     )); 
    }   

} 

回答

0

我看到很多事情錯在你的表單類型,然而,你在尋找的是字段定義的data選項:

->add('categoryid', 'entity', 
     array(
      'label' => false, 
      'class' => 'ScspCmsBundle:CategoryEntity', 
      'property' => 'categories', 
      'data' => $builder->getData()->getCategoryId() 
     ) 
    ) 

這至少當正常使用entity字段類型時,data字段必須包含selectvalue屬性,它是categoryId。我不知道這是否會與你當前的設置一起工作!

+0

@Amberto我嘗試過,但仍然無法實現目標。你可以用一些例子或代碼解釋$ options-> getData() - > getCategoryId()嗎? – Salman

+0

對不起,我的男生有一個錯字。它不是'$ options',而是'$ builder'。例如,當執行'$ this-> buildForm(new MyType(),$ data)'''',$ builder->時,執行'builder-> getData()'會爲您提供傳遞給表單的原始數據。 getData()'將完全返回傳遞'$ data'的數據。在你的情況下,一個'產品'實例;那麼你可以使用'$ data-> getCategoryId()'。 –

+0

我是symfony 2的新手,適合您的善意幫助。我已更新原始文章中的產品表格(參見上文)。 $ builder-> getData() - > getCategoryId()返回產品表中保存的類別標識,但在下拉列表中該類別在產品的編輯操作中仍未選中。 – Salman

1
categoryid 

不是一個實體,所以你必須在ProductEntity添加一個名爲category財產和stablish關係多對一那裏,代碼:

/** 
* @ORM\Column(type="integer") 
* @ORM\ManyToOne(targetEntity="CategoryEntity", inversedBy="products") 
* @ORM\JoinColumn(name="categoryid", referencedColumnName="id") 
*/ 
protected $categoryid; 

必須取代

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

/** 
* @var CategoryEntity 
* @ORM\ManyToOne(targetEntity="CategoryEntity", inversedBy="products") 
* @ORM\JoinColumn(name="categoryid", referencedColumnName="id") 
*/ 
protected $category; 

//Here generate the get and the set customized 
/** 
* @return CategoryEntity 
*/ 
public function getCategory() 
{ 
    return $this->category; 
} 

/** 
* @param CategoryEntity $category 
* @return $this 
*/ 
public function setCategory($category) 
{ 
    //this is the owning side 
    //all changes will be detected 
    //in this side by doctrine 
    $category->addProduct($this); 
    $this->category= $category; 

    //The line below is important to set the categoryid 
    //field in the product table 
    $this->setCategoryid($category->getId()); 
    return $this; 
} 

現在在產品表取代:

->add('categoryid', 'entity', array(
      'label' => false, 
      'class' => 'ScspCmsBundle:CategoryEntity', 
      'property' => 'categories', 
      'data'=>$builder->getData()->getCategoryId(), 
      'attr' => array(
      ) 
       ) 
     ) 

由:

->add('category', 'entity', array(
      'label' => false, 
      'class' => 'ScspCmsBundle:CategoryEntity', 
      'property' => 'categories', 
      'attr' => array(
      ) 
       ) 
     ) 

這一切,盡情享受吧!