【问题标题】:Sylius Grid EntityFilter - sort or use repositorySylius Grid EntityFilter - 排序或使用存储库
【发布时间】:2019-04-03 14:10:29
【问题描述】:

我在我的一个 Sylius 网格配置中添加了一个大型实体过滤器。除了class 名称之外,我还没有找到任何配置选项,从外观上看,选项值只是按 ID 排序的。有没有办法使用存储库方法或至少提供排序字段?我需要为此使用自定义过滤器吗?

【问题讨论】:

    标签: symfony sylius


    【解决方案1】:

    您可以定义要在 YAML 文件上使用的存储库方法以及要发送到该方法的参数:

    sylius_grid:
        grids:
            app_user: # Your grid name
                driver:
                    name: doctrine/orm
                    options:
                        class: "%app.model.user%"
                        repository:
                            method: myCustomMethod
                            arguments:
                                id: resource.id
                sorting:
                    name: asc
                limits: [10, 25, 50, 100]
    

    查看 Sylius Grid Bundle 文档了解更多信息:Configuration Reference

    【讨论】:

    • 对不起,但这定义了网格本身的存储库方法,主实例。我想要的是过滤器定义的类似选项,即过滤器:城市:类型:实体 form_options:类:Sylius\Component\Addressing\Model\City #repository:#method:getCities 但这不起作用。
    • 您将需要一个类型、过滤器,然后标记服务:name: sylius.grid_filter, type: my_entity_type, form_type: AppBundle\Grid\Filter\MyEntityFilterType,然后您可以使用过滤器:my_entity_type,如果这是您需要的,我将使用我的工作代码编辑我的答案有
    • @SantiBarbat 嘿,我知道 1 年已经过去了,但我需要你所说的,你能分享一下这个信息吗?谢谢!
    【解决方案2】:

    这是定义新类型的方法:

    final class CustomFilterType extends AbstractType {
    
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add(
            'shop',
            EntityType::class,
            [
                'class' => Shop::class,
                'label' => false,
                'multiple' => true, //if you need multiple selection
                'query_builder' => function (EntityRepository $er) {
                   return $er->createQueryBuilder('s');
                   // define your query builder here
                },
                'choice_label' => function ($shop) { /** @var $shop Shop */
                    return $shop->getName();
                },
            ]
        );
    }
    
    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix(): string
    {
        return 'sylius_grid_filter_entity_multiple';
    }
    }
    

    然后在你的 services.yaml 中:

    app.grid_filter.custom_filter:
        class: Sylius\Component\Grid\Filter\SelectFilter
        tags: [{
                   name: 'sylius.grid_filter',
                   type: 'custom_type',
                   form_type: App\Form\Grid\Filter\CustomFilterType
               }]
    

    最后,在您的网格定义中:

            filters:
                shops:
                    type: custom_type
                    label: app.ui.shops
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      相关资源
      最近更新 更多