Question

I have a build service contact on an entity of custom module

And it has 3 fields like pk,order_id.order_item.

And When try to apply setFilterGroups on SearchCriteria getting Error.

Uncaught TypeError: Argument 1 passed to Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor: :addFilterGroupToCollection() must be an instance of Magento\Framework\Api\Search\FilterGroup, instance of Magento\Framework\Api\Filter given, called in /var/www/html/vendor/magento/framework/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php on line 48 and defined in /var/www/html/vendor/magento/framework/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php: 59

Here my Repository class:

<?php

declare(strict_types=1);

namespace AmitBera\WarrantyCode\Model;

use AmitBera\WarrantyCode\Api\Data\TransactionInfoInterface;
use AmitBera\WarrantyCode\Api\Data\TransactionInfoSearchResultsInterface;
use AmitBera\WarrantyCode\Api\Data\TransactionInfoSearchResultsInterfaceFactory;
use AmitBera\WarrantyCode\Api\TransactionInfoRepositoryInterface;
use AmitBera\WarrantyCode\Model\ResourceModel\TransactionInfo as TransactionInfoResourceModel;
use AmitBera\WarrantyCode\Model\ResourceModel\TransactionInfo\CollectionFactory;
use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface;
use Magento\Framework\Api\FilterBuilder;
use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\Api\SearchCriteriaInterface;
use Magento\Framework\Api\SortOrderBuilder;
use Magento\Framework\Exception\CouldNotDeleteException;
use Magento\Framework\Exception\CouldNotSaveException;
use Magento\Framework\Exception\NoSuchEntityException;

class TransactionInfoRepository implements TransactionInfoRepositoryInterface
{

    /**
     * @var FilterBuilder
     */
    private $filterBuilder;

    /**
     * @var SortOrderBuilder
     */
    private $sortOrderBuilder;

    /**
     * @var SearchCriteriaBuilder
     */
    private $searchCriteriaBuilder;

    /**
     * @var CollectionProcessorInterface
     */
    private $collectionProcessor;

    /**
     * @var JoinProcessorInterface
     */
    private $extensionAttributesJoinProcessor;

    /**
     * @var TransactionInfoSearchResultsInterfaceFactory
     */
    private $transactionInfoSearchResultsInterfaceFactory;

    /**
     * @var TransactionInfoResourceModel
     */
    private $transactionInfoResourceModel;

    /**
     * @var CollectionFactory
     */
    private $collectionFactory;

    /**
     * @var TransactionInfoFactory
     */
    private $transactionInfoFactory;

    public function __construct(
        TransactionInfoFactory $transactionInfoFactory,
        TransactionInfoResourceModel $transactionInfoResourceModel,
        CollectionFactory $collectionFactory,
        JoinProcessorInterface $extensionAttributesJoinProcessor,
        CollectionProcessorInterface $collectionProcessor,
        SearchCriteriaBuilder $searchCriteriaBuilder,
        FilterBuilder $filterBuilder,
        SortOrderBuilder $sortOrderBuilder,
        TransactionInfoSearchResultsInterfaceFactory $transactionInfoSearchResultsInterfaceFactory
    ) {
        $this->transactionInfoFactory = $transactionInfoFactory;
        $this->collectionFactory = $collectionFactory;
        $this->transactionInfoResourceModel = $transactionInfoResourceModel;
        $this->transactionInfoSearchResultsInterfaceFactory = $transactionInfoSearchResultsInterfaceFactory;
        $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor;
        $this->collectionProcessor = $collectionProcessor;
        $this->searchCriteriaBuilder = $searchCriteriaBuilder;
        $this->sortOrderBuilder = $sortOrderBuilder;
        $this->filterBuilder = $filterBuilder;
    }

    /**
     * @inheritdoc
     */
    public function delete(TransactionInfoInterface $transactionInfo)
    {
        try {
            $this->transactionInfoResourceModel->delete($transactionInfo);
        } catch (\Exception $exception) {
            throw new CouldNotDeleteException(__($exception->getMessage()));
        }
        return true;
    }

    /**
     * @inheritdoc
     */
    public function deleteById($transactionId)
    {
        return $this->delete($this->getById($transactionId));
    }

    /**
     * @inheritdoc
     */
    public function getById($transactionId): TransactionInfoInterface
    {
        $transactionInfo = $this->transactionInfoFactory->create();
        $this->transactionInfoResourceModel->load($transactionInfo, $transactionId);

        if (!$transactionInfo->getId()) {
            throw new NoSuchEntityException(__('The transaction info with the "%1" ID doesn\'t exist.', $activationId));
        }
        return $transactionInfo;
    }

    /**
     * @inheritdoc
     */
    public function getList(SearchCriteriaInterface $searchCriteria = null): TransactioninfoSearchResultsInterface
    {
        $collection = $this->collectionFactory->create();

        if (null === $searchCriteria) {
            $searchCriteria = $this->searchCriteriaBuilder->create();
        }
        $this->extensionAttributesJoinProcessor->process($collection);
        $this->collectionProcessor->process($searchCriteria, $collection);


        $searchResult = $this->transactionInfoSearchResultsInterfaceFactory->create();
        $searchResult->setItems($collection->getItems());
        $searchResult->setTotalCount($collection->getSize());
        $searchResult->setSearchCriteria($searchCriteria);
        return $searchResult;
    }

    /**
     * @inheritdoc
     */
    public function save(\AmitBera\WarrantyCode\Api\Data\TransactionInfoInterface $transactionInfo)
    {
        try {
            $this->transactionInfoResourceModel->save($transactionInfo);
        } catch (\Exception $exception) {
            throw new CouldNotSaveException(
                __('Could not save the page: %1', $exception->getMessage()),
                $exception
            );
        }

        return $transactionInfo;
    }

    /**
     * @inheritDoc
     */

    public function saveActivationCodeToOrderGrid($orderId)
    {
        $this->transactionInfoResourceModel->assignActivationCodeToOrderGrid($orderId);
        return true;
    }
}

2. The Class where I have applied that and condition using filter Group

<?php

declare(strict_types=1);

namespace AmitBera\WarrantyCode\Plugin\Magento\Sales\Api;

use AmitBera\WarrantyCode\Api\TransactionInfoRepositoryInterface;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\Api\FilterBuilder;
use Magento\Framework\Api\Search\FilterGroup;
use Magento\Framework\Api\Search\FilterGroupBuilder;

class OrderRepositoryInterface
{

    /**
     * @var FilterGroupBuilder
     */
    private $filterGroupBuilder;

    /**
     * @var FilterGroup
     */
    private $filterGroup;
    /**
     * @var SearchCriteriaBuilder
     */
    private $searchCriteriaBuilder;

    /**
     * @var FilterBuilder
     */
    private $filterBuilder;

    /**
     * @var \AmitBera\WarrantyCode\Api\TransactionInfoRepositoryInterface
     */
    private $transactionInfoRepository;

    public function __construct(
      TransactionInfoRepositoryInterface $transactionInfoRepository,
      SearchCriteriaBuilder $searchCriteriaBuilder,
      FilterBuilder $filterBuilder,
      FilterGroupBuilder $filterGroupBuilder,      
      FilterGroup $filterGroup
    ){

        $this->transactionInfoRepository = $transactionInfoRepository;
        $this->filterBuilder = $filterBuilder;
        $this->searchCriteriaBuilder = $searchCriteriaBuilder;
        $this->filterGroup = $filterGroup;
        $this->filterGroupBuilder = $filterGroupBuilder;
    }   

    /**
     * Get gift message
     *
     * @param \Magento\Sales\Api\OrderRepositoryInterface $subject
     * @param \Magento\Sales\Api\Data\OrderInterface $resultOrder
     * @return \Magento\Sales\Api\Data\OrderInterface
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function afterGet(
        \Magento\Sales\Api\OrderRepositoryInterface $subject,
        \Magento\Sales\Api\Data\OrderInterface $resultOrder
    ) {
        $resultOrder = $this->getOrderItemActivationCodes($resultOrder);
        return $resultOrder;
    }

    private function getOrderItemActivationCodes(\Magento\Sales\Api\Data\OrderInterface $order)
    {
         $orderItems = $order->getItems();

        if (null !== $orderItems) {

            /** @var \Magento\Sales\Api\Data\OrderItemInterface $orderItem */
            foreach ($orderItems as $orderItem) {
                $extensionAttributes = $orderItem->getExtensionAttributes();
                if ($extensionAttributes && $extensionAttributes->getActivationCodes()) {
                    continue;
                }

                $transactionInfos= $this->getActivationCodeForOrderItem((int)$order->getEntityId(),$orderItem);

                if($transactionInfos->getTotalCount() < 0){
                    continue;
                }

                /** @var \Magento\Sales\Api\Data\OrderItemExtension $orderItemExtension */
                $orderItemExtension = $extensionAttributes
                    ? $extensionAttributes
                    : $this->orderItemExtensionFactory->create();
                $orderItemExtension->setActivationCodes($transactionInfos->getItems());
                $orderItem->setExtensionAttributes($orderItemExtension);                

            }   
        }    
        return $order;
    }

    /**
     * Get an order item activation code info
     * @param int $orderId
     * @param \Magento\Sales\Api\Data\OrderItemInterface $orderItem
     * @return \AmitBera\WarrantyCode\Api\Data\TransactionInfoSearchResultsInterface
     */
    private function getActivationCodeForOrderItem($orderId,$orderItem)
    {

        $orderFilter = $this->filterBuilder
                ->setField('order_id')->setValue($orderId)->setConditionType('eq')
                ->create();
        $orderFilterGroup = $this->filterGroupBuilder->addFilter($orderFilter)->create();

        $orderItemFilter =$this->filterBuilder->setField('item_id')->setValue((int)$orderItem->getItemId())
                ->setConditionType('eq')->create();

        $orderItemFilterGroup = $this->filterGroupBuilder->setFilters([$orderItemFilter])->create();

        $this->searchCriteriaBuilder->setFilterGroups([$orderFilterGroup,$orderItemFilter]);

        $searchCriteria = $this->searchCriteriaBuilder->setPageSize(5)->setCurrentPage(1)->create();

        $transactionInfos= $this->transactionInfoRepository->getList($searchCriteria);
        return $transactionInfos;

    }
}

I have tried to apply a simple condition like:

Order=X and Order_item_id=Y

But it does not work.

Anybody has an idea. where I doing the mistake

Error:

Argument 1 passed to Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor: :addFilterGroupToCollection() must be an instance of Magento\Framework\Api\Search\FilterGroup, instance of Magento\Framework\Api\Filter

Était-ce utile?

La solution

Try the following code:

private function getActivationCodeForOrderItem($orderId, $orderItem)
{

    $orderFilter = $this->filterBuilder
        ->setField('order_id')->setValue($orderId)->setConditionType('eq')
        ->create();
    $orderFilterGroup = $this->filterGroupBuilder->setFilters([$orderFilter])->create();

    $orderItemFilter =$this->filterBuilder->setField('item_id')->setValue((int)$orderItem->getItemId())
        ->setConditionType('eq')->create();
    $orderItemFilterGroup = $this->filterGroupBuilder->setFilters([$orderItemFilter])->create();

    $this->searchCriteriaBuilder->setFilterGroups([$orderFilterGroup, $orderItemFilterGroup]);

    $searchCriteria = $this->searchCriteriaBuilder->setPageSize(5)->setCurrentPage(1)->create();

    $transactionInfos= $this->transactionInfoRepository->getList($searchCriteria);
    return $transactionInfos;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top