drsxzut183207938 2016-03-24 05:49
浏览 35

symfony apply_filter无法在lexik表单过滤器上运行

I'm using the LexikFormFilterBundle to filter an entity and it's relation. I'm trying to add the apply_filter closure so I can modify the value of the field I have the filter on before the query is run. The closure never gets called no matter what I do. Can you guys please help me out or tell me maybe what is going on. Thanks.

TimesheetController.php

    <?php

    namespace Homecare\HomecareBundle\Controller;

    use Homecare\HomecareBundle\Form\TimesheetFilterType;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Homecare\HomecareBundle\Entity\CareGoals;
    use Homecare\HomecareBundle\Entity\User;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpFoundation\Session\Session;

    class TimesheetController extends Controller
    {


        public function indexAction(Request $request)
        {

            $form = $this->createForm(new TimesheetFilterType(), null, [
                'action' => $this->generateUrl('Homecare_HomecareBundle_dashboard_timesheets'),
                'method' => 'GET',
            ]);


            $filterBuilder = $this->getDoctrine()->getManager()->getRepository(
                'HomecareHomecareBundle:Timesheet'
            )->createQueryBuilder('t');
             //->join('t.recipient', 'r');

            $form->handleRequest($request);

            if ($form->isValid()) {

                $this->get('lexik_form_filter.query_builder_updater')
                     ->addFilterConditions($form, $filterBuilder);

                $timesheets = $filterBuilder->getQuery()->getResult();


               // dump($filterBuilder->getDql());
            }


            $timesheets = $filterBuilder->getQuery()->getResult();

            return $this->render(
                'HomecareHomecareBundle:Timesheet:index.html.twig',
                array(
                    'form' => $form->createView(),
                    'timesheets' => $timesheets
                )
            );

        } 

}

TimesheetFilterType.php

<?php
/**
 * Created by PhpStorm.
 * User: joshuacrawmer
 * Date: 3/23/16
 * Time: 4:49 PM
 */

namespace Homecare\HomecareBundle\Form;

use Ambta\DoctrineEncryptBundle\Encryptors\Rijndael256Encryptor;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Doctrine\ORM\Query\Expr;
use Doctrine\ORM\QueryBuilder;
use Lexik\Bundle\FormFilterBundle\Filter\FilterBuilderExecuterInterface;
use Lexik\Bundle\FormFilterBundle\Filter\Form\Type as Filters;
use Lexik\Bundle\FormFilterBundle\Filter\Query\QueryInterface;


class TimesheetFilterType extends AbstractType
{

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {


        $builder->add('recipient', Filters\CollectionAdapterFilterType::class, array(
            'entry_type'       => new RecipientFilterType(),
            'label' => false,
            'add_shared' => function (FilterBuilderExecuterInterface $qbe)  {

                $closure = function (QueryBuilder $filterBuilder, $alias, $joinAlias, Expr $expr) {
                    // add the join clause to the doctrine query builder
                    // the where clause for the label and color fields will be added automatically with the right alias later by the Lexik\Filter\QueryBuilderUpdater
                    $filterBuilder->join($alias . '.recipient', $joinAlias);
                    //$filterBuilder->join($alias . '.options', $joinAlias);
                };



                // then use the query builder executor to define the join and its alias.
                $qbe->addOnce($qbe->getAlias().'.recipient', 'r', $closure);
            },
            'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
                $encryptor = new Rijndael256Encryptor( 'ABCDEFGHIJKLMNOPQRSTUVWXZY123456' );

                if (empty($values['value'])) {
                    return null;
                }

                $paramName = sprintf('p_%s', str_replace('.', '_', $field));

                // expression that represent the condition
                $expression = $filterQuery->getExpr()->eq($field, ':'.$paramName);

                // expression parameters
                $parameters = array($paramName => $encryptor->encrypt($values['value'])); // [ name => value ]
                // or if you need to define the parameter's type
                // $parameters = array($paramName => array($values['value'], \PDO::PARAM_STR)); // [ name => [value, type] ]

                return $filterQuery->createCondition($expression, $parameters);


            },
        ));


    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'csrf_protection'   => false,
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'timesheet_filter';
    }

}
  • 写回答

1条回答 默认 最新

  • doulu2591 2016-03-24 18:32
    关注

    I figured it out guys. The 'apply_filter' actually needs to be added on the associations form type. Then it will work.

    评论

报告相同问题?

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭