prestashop - 将公司字段添加到后台的客户网格
问题描述
ps_address.company
向客户网格添加一个新字段,工作。但是当我在客户网格中搜索 aps_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()
from更改lastname
为c.lastname
,但那个 hack 也没有奏效。
我不应该更改 PrestaShop 核心代码,当然我也不想 ;-) 谢谢!
解决方案
我知道这是一篇旧文章,但我写这篇文章只是为了那些可能像我一样通过改变来到这里的人。我不知道您使用的是哪个版本的 PrestaShop,但从 1.7.0 开始,我想您可以更改
$searchQueryBuilder->addSelect(
'a.`company`',
'a.`lastname` AS lastname'
);
在函数 hookActionCustomerGridQueryBuilderModifier 中
$searchQueryBuilder->addSelect(
'a.`company`',
);
因为 Customer 类已经有 'lastname',所以你不应该再次将它添加到 select 子句中。
推荐阅读
- animation - 可以在没有重新渲染画布的情况下在画布上渲染动画 SVG 吗?
- tfs - Azure Devops 中的 VSTest 步骤未复制 AutoMapper.dll 的
- c++ - 从 C++ 调用 WDF 驱动程序
- android - 我的 iOS/Android 设备连接到什么 AppStore
- c# - 每当我在 Windows 中的 Unity 中创建新项目时,都会出现以下错误
- vba - 如何在 Ms Access 的组合框中单击按钮并打开与值相关的表单?
- reactjs - React Material UI:为什么原色与文档中的颜色不同?
- oracle - 编译存储过程时出错
- javascript - 隐藏的 html 视频元素的屏幕截图
- ios - 从 Cloud Firestore 获取纬度和经度并将它们作为注释添加到 Mapbox