在Prestashop 1.5中列出具有多个类别的产品

时间:2016-02-18 16:26:47

标签: prestashop prestashop-1.5

我正在与Prestashop 1.5 Web服务进行沟通以列出产品及其过滤器对于基本案例而言非常简单,但是有多个类别:

  1. 我可以获得属于1类和2类的产品列表吗?
  2. 我可以获得属于1类或2类的产品清单吗?

1 个答案:

答案 0 :(得分:0)

有关您的信息,请参阅classes/webservice/WebserviceRequest中的Prestashop 1.5过滤器管理流程:

/**
 * get SQL retrieve Filter
 *
 * @param string $sqlId
 * @param string $filterValue
 * @param string $tableAlias = 'main.'
 * @return string
 */
protected function getSQLRetrieveFilter($sqlId, $filterValue, $tableAlias = 'main.')
{
    $ret = '';
    preg_match('/^(.*)\[(.*)\](.*)$/', $filterValue, $matches);
    if (count($matches) > 1)
    {
        if ($matches[1] == '%' || $matches[3] == '%')
            $ret .= ' AND '.bqSQL($tableAlias).'`'.bqSQL($sqlId).'` LIKE "'.pSQL($matches[1].$matches[2].$matches[3])."\"\n";
        elseif ($matches[1] == '' && $matches[3] == '')
        {
            if (strpos($matches[2], '|') > 0)
            {
                $values = explode('|', $matches[2]);
                $ret .= ' AND (';
                $temp = '';
                foreach ($values as $value)
                    $temp .= bqSQL($tableAlias).'`'.bqSQL($sqlId).'` = "'.bqSQL($value).'" OR ';
                $ret .= rtrim($temp, 'OR ').')'."\n";
            }
            elseif (preg_match('/^([\d\.:-\s]+),([\d\.:-\s]+)$/', $matches[2], $matches3))
            {
                unset($matches3[0]);
                if (count($matches3) > 0)
                {
                    sort($matches3);
                    $ret .= ' AND '.$tableAlias.'`'.bqSQL($sqlId).'` BETWEEN "'.pSQL($matches3[0]).'" AND "'.pSQL($matches3[1])."\"\n";
                }
            }
            else
                $ret .= ' AND '.$tableAlias.'`'.bqSQL($sqlId).'`="'.pSQL($matches[2]).'"'."\n";
        }
        elseif ($matches[1] == '>')
            $ret .= ' AND '.$tableAlias.'`'.bqSQL($sqlId).'` > "'.pSQL($matches[2])."\"\n";
        elseif ($matches[1] == '<')
            $ret .= ' AND '.$tableAlias.'`'.bqSQL($sqlId).'` < "'.pSQL($matches[2])."\"\n";
        elseif ($matches[1] == '!')
            $ret .= ' AND '.$tableAlias.'`'.bqSQL($sqlId).'` != "'.pSQL($matches[2])."\"\n";
    }
    else
        $ret .= ' AND '.$tableAlias.'`'.bqSQL($sqlId).'` '.(Validate::isFloat(pSQL($filterValue)) ? 'LIKE' : '=').' "'.pSQL($filterValue)."\"\n";
    return $ret;
}

从这一点我们可以注意到,与official documention所说的不同:

  • 我们可以在值之间使用管道OR来模拟|条件。
  • 我们可以模拟值BETWEEN之间的,条件。
  • 我们可以模拟LIKE %%条件,其值为%的前导值或/和后续值{。}}。
  • 我们可以在值前面模拟> >条件。
  • 我们可以在值前面模拟< <条件。
  • 我们可以在值前面模拟!= !条件。

但我找不到模拟AND条件的解决方案。如果您发现有人可以随时更新此答案。

您可以轻松覆盖此方法,以添加自己的AND过滤器。

Prestashop 1.6与!条件略有不同:

} elseif ($matches[1] == '!') {
     $multiple_values = explode('|', $matches[2]);
     foreach ($multiple_values as $value) {
         $ret .= ' AND '.$tableAlias.'`'.bqSQL($sqlId).'` != "'.pSQL($value)."\"\n";
     }
}
  • 我们可以通过在每个值与前导NOT IN()之间添加管道|来模拟!