CoreShop Filter - Create Custom Filter

1. We need to create 2 new files: - FormType for processing the Input Data - And a FilterConditionProcessorInterface, which checks if a cart fulfills the condition.

namespace AppBundle\Filter\Form\Type\Condition;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Type;

final class MyFilterCondition extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('myData', IntegerType::class, [
                'constraints' => [
                    new NotBlank(['groups' => ['coreshop']]),
                    new Type(['type' => 'numeric', 'groups' => ['coreshop']]),
                ],
            ])
        ;
    }
}

namespace AppBundle\Filter;

use CoreShop\Component\Address\Model\AddressInterface;
use CoreShop\Component\Core\Model\CarrierInterface;
use CoreShop\Component\Order\Model\CartInterface;

class MyFilterCondition extends FilterConditionProcessorInterface
{
    public function prepareValuesForRendering(FilterConditionInterface $condition, FilterInterface $filter, ListingInterface $list, $currentFilter)
    {
        //Prepare values for rendering HTML
    }

    public function addCondition(FilterConditionInterface $condition, FilterInterface $filter, ListingInterface $list, $currentFilter, ParameterBag $parameterBag, $isPrecondition = false)
    {
        //Add Condition to Listing

        return $currentFilter;
    }

}

2. Register MyFilterCondition as service with tag coreshop.filter.condition_type, type and form

app.coreshop.shipping_rule.condition.my_rule:
    class: AppBundle\Shipping\Rule\Condition\MyRuleConditionChecker
    tags:
      - { name: coreshop.shipping_rule.condition, type: my_rule, form-type: AppBundle\Shipping\Form\Type\Condition\MyRuleConfigurationType }

app.filter.condition_type.my_filter_condition:
    class: AppBundle\Filter\MyFilterCondition
    tags:
      - { name: coreshop.filter.condition_type, type: app-my-filter, form-type: AppBundle\Filter\Form\Type\Condition\MyFilterCondition}