2013-07-29 22 views
8

ile'tablo Üyelik: Bu veritabanından sıra kadarıyla getiriliyor sonuçları çalışırSymfony2'nin Form Builder Seç karşısında ben 3 varlıklara sahip Meta

[Member] ----OneToMany----> [MemberCategory] ---ManyToOne---> [Category] 

ama Form Builder bir doğru formu oluşturmak için alamıyorum kontrolleri.

Üye tarafından kullanılan kategoriler için işaretlenmiş onay kutularının bulunduğu tüm kategorilerin bir listesini istiyorum. Sonunda öncelik alanını eklemek istiyorum.

Üye

class Member 
{ 
    protected $id; 

    @ORM\OneToMany(targetEntity="MemberCategory", mappedBy="member") 
    protected $categories; 
} 

Kategori

class Category 
{ 
    protected $id; 

    @ORM\Column(name="category_name", type="string", length=50, nullable=false, unique=true) 
    private $categoryName; 
} 

MemberCategory

class MemberCategory 
{ 
    @ORM\Id 
    @ORM\ManyToOne(targetEntity="Member") 
    @ORM\JoinColumns({ 
    @ORM\JoinColumn(name="member_id", referencedColumnName="id", onDelete="CASCADE") 
    private $member; 

    @ORM\Id 
    @ORM\ManyToOne(targetEntity="Category") 
    @ORM\JoinColumns({ 
    @ORM\JoinColumn(name="category_id", referencedColumnName="id", onDelete="CASCADE") 
    private $category; 

    @ORM\Column(name="priority", type="integer", nullable=true) 
    protected $priority; 
} 

Bariz att çalışmayan form oluşturucuyu boşaltır.

$builder->add('categories', 'entity', array(
    'class'  => 'SMWMemberBundle:Category', 
    'property'  => 'categoryName', 
    'multiple'  => true, 
    'expanded'  => true, 
    'required'  => false 
)); 

tüm kategorileri ile seçilmiş olsun, ama bu üye için MemberCategory seçilenler hiçbiri:

Ben kullanın.

Ben kullanıyorsanız:

$builder->add('categories', 'entity', array(
    'class'  => 'SMWMemberBundle:MemberCategory', 
    'property'  => 'category.categoryName', 
    'multiple'  => true, 
    'expanded'  => true, 
    'required'  => false 
)); 

Ben tüm kullanıcılar için seçilen tüm kategoriler olsun.

Bunun nasıl işe yaradığını bilen biri var mıdır, bu ilişkisel verilerde açık bir ortak modeldir ve SQL ve PHP'yi kullanmak kolay olacaktır.

Symfony 2.3 ve Doctrine'de düz bir ileri çözüm var mı?

cevap

1

Sen doğru kullanımı için form içinde

$builder->add('categories', 'entity', array(
     'class' => 'SMWMemberBundle:MemberCategory', 
     'property'  => 'category.categoryName', 
     'query_builder' => function(EntityRepository $er) use (?) { 
      return $er->createQueryBuilder(?) 

      // your query with a left join probably 

     } 
     'multiple'  => true, 
     'expanded'  => true, 
     'required' => false 
    )); 

Bkz belgelerine QueryBuilder kullanmanız gerekecektir. bir exmple için symfony2 form querybuilder with parameters'a bakın

+0

Eksiksiz Lütfen Cevap, ana bölüm cevabınız olarak yorumlanmıştır – Trix

3

Bu sorunu geçmişte nasıl çözdüğümü (örneğinize uygulanır) bu şekilde çözdüm, ancak bunu çözdüğüm şey bu yüzden sizin durumunuz için% 100 doğru olmayabilir.

<?php 

namespace Company\YourBundle\Form\Type; 

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

class MemberType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('members', 'collection', array(
       'type' => new MemberCategoryType(), 
       'allow_add' => true, 
       'allow_delete' => true, 
       'by_reference' => false,)); 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Company\YourBundle\Entity\Member' 
     )); 
    } 

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

Sonra kadar kategori eklemek için the documentation izleyebilir:

<?php  
namespace Company\YourBundle\Form\Type; 

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

class MemberCategoryType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('priority') 
      ->add('category', 'entity', 
        array('property' => 'name', 
         'class' => 'CompanyYourBundle:Category')) 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Company\YourBundle\Entity\MemberCategory' 
     )); 
    } 

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

Sonra Member tipi form içinde bu formu türünü ekleyin:

İlk aradığınız özelliklere uygun bir MemberCategory formu türünü oluşturmak üyelerinize ve her seferinde bir öncelik atamak istiyorsunuz.

+0

Belgeleme, kategoriler ekleyip kaldırmanın, istemci tarafı kodunun da dahil olduğu çok büyük bir sorun olacağını gösteriyor. Bu durum mu yoksa doktorları yanlış mı okuyorum? –

+0

Doğru okuyorsun! Yaptığım yol buydu, en iyi yol olduğundan emin değilim. Diğer cevaplara da bakacağım, çünkü resmi web sitesinde açık bir dokümantasyon olmadan, ortak bir model olmak konusunda size katılıyorum. – cheesemacfly

+1

Teşekkürler, Doktrin Dokümanları bu konuyla nasıl ilgilenileceğini açıklar: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html kullan 3). Ama bunu Symfony formuyla kullanmanın hiçbir faydası yok. –

0

Cheesemacfly'nin gönderdiği yazı o kadar da kötü değil, ama gömülü formu çağırmak ve yönetmek için karmaşık olabilir. Aslında, jus bir "Özel Depolarını" http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes

O find gibi Doctrine2() veya findBy ile ORM nesnesi() "kapma" için yeni yöntemler katacak oluşturmanız gerekir;

1) bir kurucu ekleyebilirsiniz) Varlık

namespace YourVendor\SMWMemberBundle\Entity; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity(repositoryClass="YourVendor\SMWMemberBundle\Entity\ProductRepository") 
* @ORM\Table(name="Category") 
*/ 
class Category{ 

3 için cutom depo Ekli sizin Bundle

<?php 
    namespace YourVendor\SMWMemberBundle\Repository; 
    use Doctrine\ORM\EntityRepository; 

    class CategoryRepository extends EntityRepository{ 

    public function UsedByMember($member){ 
    return $this 
     ->createQueryBuilder('c') 
     ->leftJoin('c.Member', 'mc') 
     ->where('mc.member = ?1') 
     ->setParameter(1, $member); 
} 

}

2) bir Depo Klasör yeni bir depo oluşturun Form sınıfına geçin ve de Entity Manager'ı ve sorgunuza gerekli olan değişkeni iletin:

012 Kumandanızda olarak

4), böyle formunuzu oluşturun:

$editForm = $this->createForm(new CategoryUserForm($em, $member), $category); 

bana sorular sormaya çekinmeyin, ben umut olduğum bu aradığınız budur;)

İlgili konular