Skip to content

Commit

Permalink
search product filter
Browse files Browse the repository at this point in the history
  • Loading branch information
bigboss86 committed Jun 12, 2019
1 parent 19b66d4 commit 20da4a2
Show file tree
Hide file tree
Showing 6 changed files with 148 additions and 23 deletions.
73 changes: 73 additions & 0 deletions src/Controller/Action/ProductSearchAction.php
@@ -0,0 +1,73 @@
<?php

declare(strict_types=1);

namespace Odiseo\SyliusReportPlugin\Controller\Action;

use FOS\RestBundle\View\View;
use FOS\RestBundle\View\ViewHandler;
use FOS\RestBundle\View\ViewHandlerInterface;
use Sylius\Component\Core\Model\ProductInterface;
use Sylius\Component\Core\Repository\ProductRepositoryInterface;
use Sylius\Component\Locale\Context\LocaleContextInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

final class ProductSearchAction
{
/** @var ProductRepositoryInterface */
private $productRepository;

/** @var LocaleContextInterface */
private $localeContext;

/** @var ViewHandlerInterface */
private $viewHandler;

public function __construct(
ProductRepositoryInterface $productRepository,
LocaleContextInterface $localeContext,
ViewHandler $viewHandler
)
{
$this->productRepository = $productRepository;
$this->localeContext = $localeContext;
$this->viewHandler = $viewHandler;
}

public function __invoke(Request $request): Response
{
$locale = $this->localeContext->getLocaleCode();

$products = $this->getProducts($request->get('name', ''), $locale);
$view = View::create($products);

$this->viewHandler->setExclusionStrategyGroups(['Autocomplete']);
$view->getContext()->enableMaxDepth();

return $this->viewHandler->handle($view);
}

private function getProducts($query, $locale): array
{
$products = [];
$searchProducts = $this->productRepository->findByNamePart($query, $locale);

/** @var ProductInterface $product */
foreach ($searchProducts as $product) {
$productLabel = ucfirst(strtolower($product->getName()));
$isNew = count(array_filter($products, function ($product) use ($productLabel) {
return $product['name'] === $productLabel;
})) === 0;

if ($isNew) {
$products[] = [
'name' => $productLabel,
'id' => $product->getId(),
];
}
}

return $products;
}
}
9 changes: 7 additions & 2 deletions src/Filter/QueryFilter.php
Expand Up @@ -7,6 +7,7 @@
use Sylius\Component\Core\Model\AddressInterface;
use Sylius\Component\Core\Model\ChannelInterface;
use Sylius\Component\Core\Model\Customer;
use Sylius\Component\Core\Model\ProductInterface;

class QueryFilter
{
Expand Down Expand Up @@ -290,8 +291,12 @@ public function addUserPostcode(array $configuration = [], string $addressType =
public function addProduct(array $configuration = [], string $field = 'p.id'): void
{
if (isset($configuration['product']) && count($configuration['product']) > 0) {
$products = $configuration['product']->map(function (ProductInterface $product) {
return $product->getId();
})->toArray();

$this->qb
->andWhere($this->qb->expr()->in($field, $configuration['product']))
->andWhere($this->qb->expr()->in($field, $products))
;
}
}
Expand All @@ -300,7 +305,7 @@ public function addProduct(array $configuration = [], string $field = 'p.id'): v
* @param array $configuration
* @param string $field
*/
public function addProductCategory(array $configuration = [], string $field = 'pt.id'): void
public function addProductCategory(array $configuration = [], string $field = 'pt.taxon'): void
{
if (isset($configuration['productCategory']) && count($configuration['productCategory']) > 0) {
$this->qb
Expand Down
26 changes: 7 additions & 19 deletions src/Form/Builder/QueryFilterFormBuilder.php
Expand Up @@ -4,6 +4,7 @@

use Odiseo\SyliusReportPlugin\Form\Type\AddressAutocompleteChoiceType;
use Odiseo\SyliusReportPlugin\Form\Type\DataFetcher\TimePeriodType;
use Odiseo\SyliusReportPlugin\Form\Type\ProductAutocompleteChoiceType;
use Sylius\Component\Channel\Repository\ChannelRepositoryInterface;
use Sylius\Component\Core\Model\ChannelInterface;
use Sylius\Component\Core\Model\ProductInterface;
Expand Down Expand Up @@ -150,15 +151,15 @@ public function addChannel(FormBuilderInterface $builder)
public function addProduct(FormBuilderInterface $builder)
{
$builder
->add('product', ChoiceType::class, [
->add('product', ProductAutocompleteChoiceType::class, [
'label' => 'sylius.ui.product',
'multiple' => true,
'required' => false,
'remote_url' => $this->generator->generate('odiseo_sylius_report_plugin_admin_ajax_products'),
'choice_name' => 'name',
'attr' => [
'class' => 'fluid search selection withAjax',
//'data-list-url' => $this->generator->generate('odiseo_report_select_products')
'class' => 'sylius-autocomplete',
],
'multiple' => true,
'label' => 'sylius.ui.product',
//'choices' => $this->buildProductsChoices()
])
;
}
Expand All @@ -178,19 +179,6 @@ public function addProductCategory(FormBuilderInterface $builder)
;
}

protected function buildProductsChoices()
{
$choices = [];
$products = $this->productRepository->findAll();

/** @var ProductInterface $product */
foreach ($products as $product) {
$choices[$product->getName()] = $product->getId();
}

return $choices;
}

/**
* @return array
*/
Expand Down
44 changes: 44 additions & 0 deletions src/Form/Type/ProductAutocompleteChoiceType.php
@@ -0,0 +1,44 @@
<?php

declare(strict_types=1);

namespace Odiseo\SyliusReportPlugin\Form\Type;

use Sylius\Bundle\ResourceBundle\Form\Type\ResourceAutocompleteChoiceType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;

final class ProductAutocompleteChoiceType extends AbstractType
{
public function configureOptions(OptionsResolver $resolver): void
{
$resolver
->setRequired([
'remote_url',
])
->setDefaults([
'resource' => 'sylius.product',
'choice_value' => 'id',
])
;
}

public function buildView(FormView $view, FormInterface $form, array $options): void
{
$view->vars['remote_criteria_type'] = 'contains';
$view->vars['remote_criteria_name'] = $options['choice_name'];
$view->vars['remote_url'] = $view->vars['load_edit_url'] = $options['remote_url'];
}

public function getBlockPrefix(): string
{
return 'odiseo_product_autocomplete_choice';
}

public function getParent(): string
{
return ResourceAutocompleteChoiceType::class;
}
}
9 changes: 8 additions & 1 deletion src/Resources/config/routing/admin.yml
Expand Up @@ -20,4 +20,11 @@ odiseo_sylius_report_plugin_admin_ajax_postcodes:
methods: [GET]
defaults:
_format: json
_controller: odiseo_sylius_report.controller.action.postcode_search
_controller: odiseo_sylius_report.controller.action.postcode_search

odiseo_sylius_report_plugin_admin_ajax_products:
path: /ajax/products-search
methods: [GET]
defaults:
_format: json
_controller: odiseo_sylius_report.controller.action.product_search
10 changes: 9 additions & 1 deletion src/Resources/config/services/controller.yml
Expand Up @@ -22,4 +22,12 @@ services:
arguments:
- "@odiseo_sylius_report.repository.address"
- "@sylius.repository.country"
- "@fos_rest.view_handler.default"
- "@fos_rest.view_handler.default"

odiseo_sylius_report.controller.action.product_search:
class: Odiseo\SyliusReportPlugin\Controller\Action\ProductSearchAction
public: true
arguments:
- "@sylius.repository.product"
- "@sylius.context.locale"
- "@fos_rest.view_handler.default"

0 comments on commit 20da4a2

Please sign in to comment.