Добавление нового поля ps_address.company
в сетку заказчика, работает. Но когда я ищу в сетке клиентов значение ps_customer.lastname
, оно выдает эту ошибку:
SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'lastname' in where clause is ambiguous
Все ясно, мы знаем, что MySQL не принимает это. Но первая часть класса Doctorine определена в коде PrestaShop, и я не знаю, где это можно изменить в моем модуле.
Вот что я пробовал:
/**
* Add column `company`
*/
public function hookActionCustomerGridDefinitionModifier(array $params)
{
/** @var GridDefinitionInterface $definition */
$definition = $params['definition'];
/** add/remove columns */
$definition
->getColumns()
->remove('newsletter')
->remove('active')
->remove('optin')
->addAfter(
'id_customer',
(new DataColumn('company'))
->setName($this->trans('Company'))
->setOptions([
'field' => 'company',
])
);
/** apply filters to columns */
$definition
->getFilters()
->add(
(new Filter('company', TextType::class))
->setAssociatedColumn('company')
->setTypeOptions([
'required' => false,
'attr' => [
'placeholder' => $this->trans('Company', [], 'Admin.Actions'),
],
])
);
}
/**
* Hook allows to modify Customers query builder and add custom sql statements.
*
* @param array $params
*/
public function hookActionCustomerGridQueryBuilderModifier(array $params)
{
/** @var QueryBuilder $searchQueryBuilder */
$searchQueryBuilder = $params['search_query_builder'];
/** @var CustomerFilters $searchCriteria */
$searchCriteria = $params['search_criteria'];
foreach ($searchCriteria->getFilters() as $filterName => $filterValue) {
if ('company' === $filterName && $filterValue) {
$searchQueryBuilder
->where('a.`company` = \'' . $filterValue . '\'')
->orWhere('a.`company` LIKE "%'.$filterValue.'%"');
$searchQueryBuilder->setParameter(':s', $filterValue);
}
}
$searchQueryBuilder->groupBy('c.`email`');
$searchQueryBuilder->addSelect(
'a.`company`',
'a.`lastname` AS lastname'
);
$searchQueryBuilder->leftJoin(
'c',
'`' . pSQL(_DB_PREFIX_) . 'address`',
'a',
'a.`id_customer` = c.`id_customer`'
);
}
Я также пытался изменить $filterName
, который я получаю с ->getFilters()
с lastname
на c.lastname
, но этот хак также не сработал.
Я не должен изменить основной код PrestaShop, и я, конечно, не хочу ;-) Спасибо!