我正在与Prestashop 1.5 Web服务进行沟通以列出产品及其过滤器对于基本案例而言非常简单,但是有多个类别:
答案 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()
之间添加管道|
来模拟!
。