2013-04-05 26 views
6

Bir form koleksiyonundan boş kayıtları filtrelemek için çalışıyorum. Benim uygulamam ile 2 tane var, Competition ve League. Bir yarışmada sıfır veya daha fazla lig var.ZF2 Form Koleksiyonları - boş kayıtları filtrele

Bu yüzden bir Rekabet formu (CompetitionForm), bir Rekabet fieldset (CompetitionFieldset) ve Lig fieldset (LeagueFieldset) oluşturun.

CompetitionFieldset

CompetitionForm ilave edilir ve CompetitionFieldset kullanıcının 1 ya da daha fazla Leagues eklemek için izin Zend\Form\Element\Collection kullanır. Aşağıda her bir sınıf için geçerli kodu ekledim. Varsayılan olarak

, ben Zend\Form\Element\Collection öğe eklerken, ben 3.

için sayım seçeneği ayarlamak, CompetitionFieldset görünecek şekilde, bir yarış içerisinde 3 ligler için giriş alanlarını görüntülemek istediğiniz Ama bir kullanıcı kokan eğer Ligler için herhangi bir veri sağlama, onları görmezden gelmek istiyorum. Şu anda veritabanımda üç boş ilişkili lig var.

alanı için LeagueFieldset alanına InputFilter ayarlamam gerekirse, form doğrulanmayacaktır.

belki de benim varlıkları modellemek ve vb benim formları hidrat için Doctrine2 kullanıyorum bahsetmeliyiz

Ben içeri bile benim modellerde bazı ek kod ile çalışmak veya yapabilir eminim benim Denetleyiciyi formunu işlediğim yerdeyim, ama eminim ki filtreler kullanarak belki de daha iyi bir çözüm var.

Eğer herhangi biri beni doğru yönde gösterebilirse çok memnun olur.

Sağladığınız her türlü yardım için şimdiden çok teşekkürler.

:wq 
familymangreg 

Benim CompetitionForm

use Kickoff\Form\AbstractAdminForm; 
use Doctrine\Common\Persistence\ObjectManager; 
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; 
use Zend\Stdlib\Hydrator\ClassMethods; 

class CompetitionForm extends AbstractAdminForm 
{ 
    public function __construct(ObjectManager $objectManager) 
    { 
     parent::__construct($objectManager, 'competition-form'); 

     $fieldset = new CompetitionFieldset($objectManager); 
     $fieldset->setUseAsBaseFieldset(true); 
     $this->add($fieldset); 

     $this->add(array(
      'name' => 'submit', 
      'attributes' => array(
       'type' => 'submit', 
       'value' => 'Submit', 
       'id' => 'submitbutton', 
      ), 
     )); 
    } 
} 

Benim CompetitionFieldset

use Kickoff\Form\AbstractFieldset; 
use Kickoff\Model\Entities\Competition; 
use Doctrine\Common\Persistence\ObjectManager; 
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; 

class CompetitionFieldset extends AbstractFieldset 
{ 
    public function __construct(ObjectManager $objectManager) 
    { 
     parent::__construct($objectManager,'Competition'); 

     $this->setHydrator(new DoctrineHydrator($this->objectManager,'Kickoff\Model\Entities\Competition')) 
      ->setObject(new Competition()); 

     $this->setLabel('Competition'); 

     $this->add(array(
      'name' => 'name', 
      'options' => array(
       'label' => 'Competition name (e.g. Premier League)',     
      ), 
      'attirbutes' => array(
       'type' => 'text', 
      ), 
     )); 

     $this->add(array(
      'name' => 'long_name', 
      'options' => array(
       'label' => 'Competition long name (e.g. Barclays Premier League)', 
      ), 
      'attirbutes' => array(
       'type' => 'text', 
      ), 
     )); 

     $leagueFieldset = new LeagueFieldset($objectManager); 
     $this->add(array(
      'type' => 'Zend\Form\Element\Collection', 
      'name' => 'leagues', 
      'options' => array(
       'label' => 'Leagues', 
       'count' => 3, 
       'should_create_template' => true, 
       'allow_add' => true, 
       'target_element' => $leagueFieldset, 
      ), 
     )); 
    } 
} 

Benim LeagueFieldset

use Kickoff\Form\AbstractFieldset; 
use Kickoff\Model\Entities\League; 
use Doctrine\Common\Persistence\ObjectManager; 
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; 
use Zend\InputFilter\InputFilterProviderInterface; 

class LeagueFieldset extends AbstractFieldset implements InputFilterProviderInterface 
{ 
    public function __construct(ObjectManager $objectManager) 
    { 
     parent::__construct($objectManager,'League'); 

     $this->setHydrator(new DoctrineHydrator($this->objectManager,'Kickoff\Model\Entities\League')) 
      ->setObject(new League()); 

     $this->setLabel('League'); 

     $this->add(array(
      'name' => 'name', 
      'options' => array(
       'label' => 'League name (e.g. First Qualifying Round)', 
      ), 
      'attirbutes' => array(
       'type' => 'text', 
      ), 
     )); 

     $this->add(array(
      'name' => 'long_name', 
      'options' => array(
       'label' => 'League long name (e.g. UEFA Champions League First Qualifying Round)', 
      ), 
      'attirbutes' => array(
       'type' => 'text', 
      ), 
     )); 
    } 

    public function getInputFilterSpecification() 
    { 
     return array(
      'name' => array(
       'required' => true, 
      ) 
     ); 
    } 

} 
+0

Lig modelinde, alanların boş olup olmadığını kontrol eden bir yöntem yazıp, daha sonra, bu girdileri denetlemeden önce DB girişlerine göndermeden önce, Ligi girişlerini yineleyin. Boşsa, kaydetme. Muhtemelen boş saha kümelerinin hala doğrulayıcıları ve filtreleri çalıştıracağı için kontrol etmenin en etkili yeri değil ama işe yarayacaktı. –

+0

İlgili kodu, denetleyicinize ve doktrin birimlerinizdeki ilişkilendirmeye postalayabilir misiniz? – YRM

cevap

0

Sen EntityManager için geçirmeden önce, isteğinden veri almak 'olduğunu gerek kesin. Boş kayıtları filtrelemek için kendi onayınızı eklemeniz yeterlidir. Gönderme formu olayını yakalayacak ve gönderilmeden önce boş alanları silecek javascript filtreleri de sağlayabilirsiniz.