М2.2 - Расширенный поиск - Поиск нескольких артикулов?


Я пытаюсь использовать расширенный поиск Magento, чтобы вернуть несколько артикулов.

Я пробовал методы через интерфейс/URL, такие как поиск с использованием кавычек, +, & и многое другое..

"SKU1""SKU2"
SKU1&SKU2
SKU1+SKU2
etc.

Но они всегда имеют тенденцию возвращать либо отсутствие результата, либо первый артикул и ничего больше. Есть ли способ изменить формулу расширенного поиска (и только версию расширенного поиска, поскольку у нас есть расширение, идеально работающее для регулярного использования, мы просто пытаемся использовать расширенный поиск как еще одно средство для выполнения этой дополнительной необходимости)

Будь то из внутреннего редактирования в /поставщике/magento/модуле-каталог-поиск/ или где-либо еще? Конечно, должно быть возможное/относительно простое решение.

ОБНОВИТЬ ИЗМЕНЕНИЯ:

Попытка использовать URL напрямую, заменив SKU1 и SKU2 соответствующими артикулами, не работает и выдает ошибку ниже. Попытка использовать форму расширенного поиска и поиск с пробелом между артикулами или запятая просто выдает ошибку, не найдя совпадений.

Ошибка в это время, которую я получаю, заключается в следующем;

Exception #0 (Exception): Notice: Array to string conversion in /app/design/frontend/CleverSoft/core/Magento_CatalogSearch/templates/advanced/result.phtml on line 39
#0 [internal function]: Magento\Framework\App\ErrorHandler->handler(8, 'Array to string...', '/home/location...', 39, Array)
#1 /app/design/frontend/CleverSoft/core/Magento_CatalogSearch/templates/advanced/result.phtml(39): implode(',', Array)
#2 /vendor/magento/framework/View/TemplateEngine/Php.php(59): include('/home/location...')
#3 /vendor/magento/framework/View/Element/Template.php(270): Magento\Framework\View\TemplateEngine\Php->render(Object(Magento\CatalogSearch\Block\Advanced\Result), '/home/location...', Array)
#4 /vendor/magento/framework/View/Element/Template.php(300): Magento\Framework\View\Element\Template->fetchView('/home/location...')
#5 /vendor/magento/framework/View/Element/AbstractBlock.php(667): Magento\Framework\View\Element\Template->_toHtml()
#6 /vendor/magento/framework/View/Layout.php(558): Magento\Framework\View\Element\AbstractBlock->toHtml()
#7 /vendor/magento/framework/View/Layout.php(534): Magento\Framework\View\Layout->_renderBlock('catalogsearch_a...')
#8 /vendor/magento/framework/View/Layout.php(489): Magento\Framework\View\Layout->renderNonCachedElement('catalogsearch_a...')
#9 /vendor/magento/framework/View/Layout.php(585): Magento\Framework\View\Layout->renderElement('catalogsearch_a...')
#10 /vendor/magento/framework/View/Layout.php(536): Magento\Framework\View\Layout->_renderContainer('content')
#11 /vendor/magento/framework/View/Layout.php(489): Magento\Framework\View\Layout->renderNonCachedElement('content')
#12 /vendor/magento/framework/View/Layout.php(585): Magento\Framework\View\Layout->renderElement('content')
#13 /vendor/magento/framework/View/Layout.php(536): Magento\Framework\View\Layout->_renderContainer('main.content.wr...')
#14 /vendor/magento/framework/View/Layout.php(489): Magento\Framework\View\Layout->renderNonCachedElement('main.content.wr...')
#15 /vendor/magento/framework/View/Layout.php(585): Magento\Framework\View\Layout->renderElement('main.content.wr...')
#16 /vendor/magento/framework/View/Layout.php(536): Magento\Framework\View\Layout->_renderContainer('main')
#17 /vendor/magento/framework/View/Layout.php(489): Magento\Framework\View\Layout->renderNonCachedElement('main')
#18 /vendor/magento/framework/View/Layout.php(585): Magento\Framework\View\Layout->renderElement('main')
#19 /vendor/magento/framework/View/Layout.php(536): Magento\Framework\View\Layout->_renderContainer('columns_schedul...')
#20 /vendor/magento/framework/View/Layout.php(489): Magento\Framework\View\Layout->renderNonCachedElement('columns_schedul...')
#21 /vendor/magento/framework/View/Layout.php(585): Magento\Framework\View\Layout->renderElement('columns_schedul...')
#22 /vendor/magento/framework/View/Layout.php(536): Magento\Framework\View\Layout->_renderContainer('columns_schedul...')
#23 /vendor/magento/framework/View/Layout.php(489): Magento\Framework\View\Layout->renderNonCachedElement('columns_schedul...')
#24 /vendor/magento/framework/View/Layout.php(585): Magento\Framework\View\Layout->renderElement('columns_schedul...')
#25 /vendor/magento/framework/View/Layout.php(536): Magento\Framework\View\Layout->_renderContainer('columns')
#26 /vendor/magento/framework/View/Layout.php(489): Magento\Framework\View\Layout->renderNonCachedElement('columns')
#27 /vendor/magento/framework/View/Layout.php(585): Magento\Framework\View\Layout->renderElement('columns')
#28 /vendor/magento/framework/View/Layout.php(536): Magento\Framework\View\Layout->_renderContainer('main.content_sc...')
#29 /vendor/magento/framework/View/Layout.php(489): Magento\Framework\View\Layout->renderNonCachedElement('main.content_sc...')
#30 /vendor/magento/framework/View/Layout.php(585): Magento\Framework\View\Layout->renderElement('main.content_sc...')
#31 /vendor/magento/framework/View/Layout.php(536): Magento\Framework\View\Layout->_renderContainer('main.content')
#32 /vendor/magento/framework/View/Layout.php(489): Magento\Framework\View\Layout->renderNonCachedElement('main.content')
#33 /vendor/magento/framework/View/Layout.php(585): Magento\Framework\View\Layout->renderElement('main.content')
#34 /vendor/magento/framework/View/Layout.php(536): Magento\Framework\View\Layout->_renderContainer('page.wrapper')
#35 /vendor/magento/framework/View/Layout.php(489): Magento\Framework\View\Layout->renderNonCachedElement('page.wrapper')
#36 /vendor/magento/framework/View/Layout.php(585): Magento\Framework\View\Layout->renderElement('page.wrapper')
#37 /vendor/magento/framework/View/Layout.php(536): Magento\Framework\View\Layout->_renderContainer('root')
#38 /vendor/magento/framework/View/Layout.php(489): Magento\Framework\View\Layout->renderNonCachedElement('root')
#39 /vendor/magento/framework/View/Layout.php(954): Magento\Framework\View\Layout->renderElement('root')
#40 /vendor/magento/framework/Interception/Interceptor.php(58): Magento\Framework\View\Layout->getOutput()
#41 /vendor/magento/framework/Interception/Interceptor.php(138): Magento\Framework\View\Layout\Interceptor->___callParent('getOutput', Array)
#42 /vendor/magento/framework/Interception/Interceptor.php(153): Magento\Framework\View\Layout\Interceptor->Magento\Framework\Interception\{closure}()
#43 /generated/code/Magento/Framework/View/Layout/Interceptor.php(39): Magento\Framework\View\Layout\Interceptor->___callPlugins('getOutput', Array, Array)
#44 /vendor/magento/framework/View/Result/Page.php(257): Magento\Framework\View\Layout\Interceptor->getOutput()
#45 /vendor/magento/framework/View/Result/Layout.php(170): Magento\Framework\View\Result\Page->render(Object(Magento\Framework\App\Response\Http\Interceptor))
#46 /vendor/magento/framework/Interception/Interceptor.php(58): Magento\Framework\View\Result\Layout->renderResult(Object(Magento\Framework\App\Response\Http\Interceptor))
#47 /vendor/magento/framework/Interception/Interceptor.php(138): Magento\Framework\View\Result\Page\Interceptor->___callParent('renderResult', Array)
#48 /vendor/magento/framework/Interception/Interceptor.php(153): Magento\Framework\View\Result\Page\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Response\Http\Interceptor))
#49 /generated/code/Magento/Framework/View/Result/Page/Interceptor.php(26): Magento\Framework\View\Result\Page\Interceptor->___callPlugins('renderResult', Array, Array)
#50 /vendor/magento/framework/App/View.php(221): Magento\Framework\View\Result\Page\Interceptor->renderResult(Object(Magento\Framework\App\Response\Http\Interceptor))
#51 /vendor/magento/module-catalog-search/Controller/Advanced/Result.php(55): Magento\Framework\App\View->renderLayout()
#52 /vendor/magento/framework/App/Action/Action.php(107): Magento\CatalogSearch\Controller\Advanced\Result->execute()
#53 /vendor/magento/framework/Interception/Interceptor.php(58): Magento\Framework\App\Action\Action->dispatch(Object(Magento\Framework\App\Request\Http))
#54 /vendor/magento/framework/Interception/Interceptor.php(138): Magento\CatalogSearch\Controller\Advanced\Result\Interceptor->___callParent('dispatch', Array)
#55 /vendor/magento/framework/Interception/Interceptor.php(153): Magento\CatalogSearch\Controller\Advanced\Result\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#56 /generated/code/Magento/CatalogSearch/Controller/Advanced/Result/Interceptor.php(26): Magento\CatalogSearch\Controller\Advanced\Result\Interceptor->___callPlugins('dispatch', Array, Array)
#57 /vendor/magento/framework/App/FrontController.php(55): Magento\CatalogSearch\Controller\Advanced\Result\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))
#58 /vendor/magento/framework/Interception/Interceptor.php(58): Magento\Framework\App\FrontController->dispatch(Object(Magento\Framework\App\Request\Http))
#59 /vendor/magento/framework/Interception/Interceptor.php(138): Magento\Framework\App\FrontController\Interceptor->___callParent('dispatch', Array)
#60 /vendor/magento/module-store/App/FrontController/Plugin/RequestPreprocessor.php(94): Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#61 /vendor/magento/framework/Interception/Interceptor.php(135): Magento\Store\App\FrontController\Plugin\RequestPreprocessor->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#62 /vendor/magento/module-page-cache/Model/App/FrontController/BuiltinPlugin.php(73): Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#63 /vendor/magento/framework/Interception/Interceptor.php(135): Magento\PageCache\Model\App\FrontController\BuiltinPlugin->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#64 /vendor/magento/framework/Interception/Interceptor.php(153): Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#65 /generated/code/Magento/Framework/App/FrontController/Interceptor.php(26): Magento\Framework\App\FrontController\Interceptor->___callPlugins('dispatch', Array, NULL)
#66 /vendor/magento/framework/App/Http.php(135): Magento\Framework\App\FrontController\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))
#67 /vendor/magento/framework/App/Bootstrap.php(256): Magento\Framework\App\Http->launch()
#68 /index.php(39): Magento\Framework\App\Bootstrap->run(Object(Magento\Framework\App\Http\Interceptor))
#69 {main}

Имея код как есть; /приложение/дизайн/интерфейс/cleversoft/ядро/magento_catalogsearch/шаблоны/дополнительно/результат.phtml

<div class="search summary">
    <?php foreach (['left', 'right'] as $side): ?>
        <?php if (@$searchCriterias[$side]): ?>
            <ul class="items">
                <?php foreach ($searchCriterias[$side] as $criteria): ?>

    <?php $criteria['value'] = is_array($criteria['value']) ? implode(",",$criteria['value']) : $criteria['value']; ?>

                    <li class="item"><strong><?= $block->escapeHtml(__($criteria['name'])) ?>:</strong> <?= $block->escapeHtml($criteria['value']) ?></li>

    <script>console.log('testing if works');</script>

                <?php endforeach; ?>
            </ul>
        <?php endif; ?>
    <?php endforeach; ?>

Использование страницы расширенного поиска (/catalogsearch/advanced/) и поиск показывают сообщение в консоли, поэтому оно загружается, но отображается неправильно, так как оно не видит отдельные артикулы. Однако при попытке использовать точный URL-адрес и замена SKU1 на SKU2 - это когда появляется ошибка.

Я использую Magento CE 2.2.4 для ясности.

РЕДАКТИРОВАТЬ 2:

Успех! Вроде.:) Таким образом, приведенная ниже строка будет работать и предоставит три запрошенных артикула;

https://example.com/catalogsearch/advanced/result/?sku[in][]=SKU1&sku[in][]=SKU2&sku[in][]=SKU3

Что я сделал (и должен был удалить, чтобы попасть туда);

Что работает сейчас;

<div class="search summary">
    <?php foreach (['left', 'right'] as $side): ?>
        <?php if (@$searchCriterias[$side]): ?>
            <ul class="items">
                <?php foreach ($searchCriterias[$side] as $criteria): ?>

                <?php endforeach; ?>
            </ul>
        <?php endif; ?>
    <?php endforeach; ?>
</div>

Что было удалено;

<li class="item"><strong><?= $block->escapeHtml(__($criteria['name'])) ?>:</strong> <?= $block->escapeHtml($criteria['value']) ?></li>

, который находился внутри цикла foreach. Не уверен, что это было идеально, но я попробовал и удаление так, чтобы все работало правильно. Я знал, что критерии были правильными, потому что выполнение print_r($criteria['value']); даст:

Array
(
    [in] => Array
        (
            [0] => SKU1
            [1] => SKU2
            [2] => SKU3
        )

)
Author: ne0nlight, 2019-03-20

1 answers

По умолчанию атрибут sku настроен для обеспечения поиска по подстановочным знакам, что означает, что запрос значения этого поля строится следующим образом sku LIKE '%[FIELD_VALUE]%'.

Поэтому, если вы хотите использовать другой тип поиска (т.Е. в вашем случае одним из решений было бы использовать IN (FIELD_VALUE1, FIELD_VALUE2) вставку sku LIKE '%[FIELD_VALUE]%'), вам нужно сначала изменить фильтр для поля артикула. Затем вы можете либо изменить форму для расширенного поиска (чтобы предоставить массив значений), либо управлять вводом с помощью плагина, прежде чем метод execute в контроллере Magento\CatalogSearch\Controller\Advanced\Result и разделите входные данные, чтобы получить необходимый массив.

Изменение конфигурации поиска:

  1. Скопируйте vendor/Magento/CatalogSearch/etc/search_request.xml в каталог etc вашего модуля (т. е. /app/code/Vendor/Module/etc/)

  2. Измените фильтр для атрибута sku с wildcardFilter на termFilter

  3. Измените версию вашего модуля и запустите php bin/magento setup:upgrade

После внесения этих изменений вы можете использовать массив для параметра sku с ключом in (который определяет тип запроса) и несколько значений для артикулов. Просто позвоните http://yourmagentohost/index.php/catalogsearch/advanced/result/?sku []=АРТИКУЛ1&артикул[]=АРТИКУЛ2 и получит результат.

Также есть небольшая проблема в шаблоне result.phtml, где использование массива для артикула вызывает ошибку, потому что ожидается строка, вам просто нужно сделать что-то вроде взрыва там, например, эта строка в цикле serachCriterias сделает это:

<?php $criteria['value'] = is_array($criteria['value']) ? implode(",",$criteria['value']) : $criteria['value']; ?>

Для перезаписи шаблон, необходимый для копирования исходного шаблона из vendor/magento/module-catalog-search/view/frontend/templates/advanced/result.phtml в каталог тем app/design/frontend/Vendor/themename/Magento_CatalogSearch/templates/advanced/result.phtml

Теперь вы можете изменить логику в форме, чтобы создавать такого рода запросы для вашего артикула, и все готово.

Если вы не хотите менять форму, вы можете использовать плагин перед методом execute в контроллере Magento\CatalogSearch\Controller\Advanced\Result, например, следующим образом:

namespace Vendor\Module\Plugin;

class AdvancedSearch
{
    protected $_context;

    public function __construct(
        Context $context
        ){
        $this->_context = $context;   

    }
    public function beforeExecute(\Magento\CatalogSearch\Controller\Advanced\Result $subject)
    {
        $request = $this->_context->getRequest();
        $queryValue = $request->getQueryValue();
        if (isset($queryValue['sku'])){
            $queryValue['sku'] = explode(" ", $queryValue['sku']);
        }
        $request->setQueryValue($queryValue);
    }
}

С этими изменениями вы сможете искать несколько артикулов, разделенных пробелом, но вы не сможете искать части артикулы (т. е. Подобные запросы). Настройка фильтра (например, фильтра с подстановочными знаками, если список артикулов не указан) в зависимости от вашего ввода, я думаю, будет более сложной.

 2
Author: HelgeB, 2019-03-27 21:13:01