Добавление поля компании в сетку клиентов в бэк-офисе - PullRequest
0 голосов
/ 20 апреля 2020

Добавление нового поля 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, и я, конечно, не хочу ;-) Спасибо!

...