2016-04-06 14 views
0

Bir varlık havuzundan bir sonuç kümesini filtrelemek için Lexik Form Filtre Paketi kullanıyorum. Bir Varlığın Tüm Özelliklerinde Anahtar Kelime Bul, Symfony2

namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Lexik\Bundle\FormFilterBundle\Filter\Form\Type as Filters; 

class ItemFilterType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name', Filters\TextFilterType::class) 
      ->add('description', Filters\TextFilterType::class); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'csrf_protection' => false, 
      'validation_groups' => array('filtering') 
     )); 
    } 

    public function getBlockPrefix() 
    { 
     return 'item_filter'; 
    } 
} 

bu filtrenin varsayılan davranışı gereğince, filtre koşulları taktıktan sonra inşa edilmiştir nihai sorgu aşağıdaki koşul yapıya sahip olacaktır.

SELECT * FROM AppBundle\Entity\Item a WHERE 
a.name = 'nameValue' 
AND a.description = 'descriptionValue' 

(geleneksel dizin yapısı varsayalım)

Benim görevim filtre forma bir daha fazla alan eklemektir. Bu herhangi bir özelliğe eklenmeyecektir. Filtre formunun gönderilmesi üzerine, bu giriş, varlığın tüm özellikleri ile aranmalıdır. Diğer bir deyişle, ortaya çıkan sorgu böyle bir şey olmalı.

SELECT * FROM AppBundle\Entity\Item a WHERE 
a.name LIKE '%nameValue%' 
OR a.description LIKE '%descriptionValue%' 

o eğer daha iyidir bu yüzden, Lexik Filtre filtre verilerini (oturum kullanılarak) tutar şekilde uymaları tercih

(anahtar kelimeler VEYA ve burada GİBİ. Unutmayın) Bunu bu filtreyi kullanarak başarabilirim. Ama ne tür bir özel alan yaratmam gerektiğine ve durum oluşturucu mantığını nasıl değiştirebileceğime dair bir fikrim yok. Bu anahtar kelime belirli bir mülke eklenmediğinden, bu filtre kullanılarak bu mümkün mü?

+0

Sen dinleyicisi kullanmıyorsun? – darkomen

+0

Yorumunuz için teşekkür ederiz @darkomen. Filtreyi uygulamak için varsayılan yolu geçersiz kılmak için bu yaklaşımı aldım. Altta yatan varlık ne olursa olsun meta verileri kullanarak durumu oluşturma problemim hala var. –

cevap

2

Tüm filtre türlerinin 'apply_filter' seçeneğini arıyorsunuz.
Belgeler burada görülebilir Lexik Form Filters - Customize Condition Operators

Anahtar kelime filtren bu şekilde görünüyor, 5 alanda arama; $ alanları sizin querybuilder oluşturmak için

->add('keyword', TextFilterType::class, array(
    'required' => false, 
    'attr' => array(
     'placeholder' => 'Keyword..' 
    ), 
    'apply_filter' => function(QueryInterface $filterQuery, $field, $values) { 
     if($values['value'] === null || $values['value'] === '') { 
      return null; 
     } 

     /** @var Expr $expr */ 
     $expr = $filterQuery->getExpr(); 

     $fields = [ 
      'exhibitorName', 
      'exhibitorStandNumber', 
      'address.city', 
      'address.postcode', 
      'address.country', 
     ]; 

     $params = []; 
     $expression = $expr->orX(); ///andX for must match all 




     foreach($fields as $field) { 
      $paramName = sprintf('p_%s', str_replace('.','_', $field)); 
      $ex = $expr->like($field, ':' . $paramName); 
      $expression->add($ex); 
      $params[$paramName] = '%' . $values['value'] . '%'; 
     } 

     return $filterQuery->createCondition($expression, $params); 
    } 
)) 
İlgili konular