如何使用 Prestashop 网络服务进行搜索

Abh*_*aju 6 search prestashop

我正在尝试使用 Prestashop 的网络服务为我的商店构建应用程序。对于搜索产品,众所周知,我们可以使用

http://store_url/api/search?query=keywords&language=1
Run Code Online (Sandbox Code Playgroud)

但是如果我搜索任何东西,它不会给我超过 10 个结果。我试过使用&limit&display。但没有任何作用。

如果有其他选择,请告诉我。

小智 5

我觉得你可以试试这样搜索产品:

http://store_url/api/products/?display=full&limit=2&filter[name]=[print]%
Run Code Online (Sandbox Code Playgroud)

您可以更改displaylimit

它来自Prestashop 网络服务文档

希望这可以帮助任何人。


Abh*_*aju 4

经过多次砸墙之后,我找到了解决方法。所以,问题出在位于 /classes/webservice 的这个文件中,

WebserviceSpecificManagementSearch.php
Run Code Online (Sandbox Code Playgroud)

在第 87 行附近,您会发现

$results = Search::find($this->wsObject->urlFragments['language'], $this->wsObject->urlFragments['query'], 1,1, 'position', 'desc', true, false);
Run Code Online (Sandbox Code Playgroud)

这是最后一个但第二个参数告诉搜索函数这是一个 ajax 搜索。弄虚作假是行不通的

相反,您需要转到 /classes/Search.php 并找到函数“find”。从第 278 行左右开始,您会发现:

if ($ajax)
    {
        $sql = 'SELECT DISTINCT p.id_product, pl.name pname, cl.name cname,
                    cl.link_rewrite crewrite, pl.link_rewrite prewrite '.$score.'
                FROM '._DB_PREFIX_.'product p
                INNER JOIN `'._DB_PREFIX_.'product_lang` pl ON (
                    p.`id_product` = pl.`id_product`
                    AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').'
                )
                '.Shop::addSqlAssociation('product', 'p').'
                INNER JOIN `'._DB_PREFIX_.'category_lang` cl ON (
                    product_shop.`id_category_default` = cl.`id_category`
                    AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').'
                )
                WHERE p.`id_product` '.$product_pool.'
                ORDER BY position DESC LIMIT 10');
        return $db->executeS($sql);
    }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,结果限制为 10。因此您需要一种方法来告诉函数它正在被 WebService 调用。所以我所做的就是这样的。这很简单。代替

ORDER BY position DESC LIMIT 10'
Run Code Online (Sandbox Code Playgroud)

使用:

ORDER BY position DESC LIMIT '.(($isWS)? '10000': '10')
Run Code Online (Sandbox Code Playgroud)

变量 $isWS 是布尔类型。因此,您必须将 find 函数的声明更改为:

public static function find($id_lang, $expr, $page_number = 1, $page_size = 1, $order_by = 'position',
    $order_way = 'desc', $ajax = false, $use_cookie = true, Context $context = null, $isWS = false)
Run Code Online (Sandbox Code Playgroud)

完成此操作后,您现在可以从 WebserviceSpecificManagementSearch 传递 $isWS 的值。因此在第 87 行将其更改为:

$results = Search::find($this->wsObject->urlFragments['language'], $this->wsObject->urlFragments['query'], 1,1, 'position', 'asc', true, false, null, true);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助任何遇到同样问题的人。