Request Quote

Adding a new column in PrestaShop new Symfony admin controller grid page with module

Prestashop 1.7.x.x now have a new admin controller page on Symfony architecture where now listing is displayed with PrestaShop grid component.

So if we need to add any new column in the list using the module we need to follow not new hooks provided, there are two hooks mainly,

‘actionCustomerGridDefinitionModifier’ to add a new column

‘actionCustomerGridQueryBuilderModifier’ to provide data to the column

In my example, I am adding a normal text type display column on the customer controller,

For this, we need to use these namespaces

use PrestaShop\PrestaShop\Core\Grid\Column\Type\DataColumn;
use PrestaShop\PrestaShop\Core\Grid\Filter\Filter;
use Symfony\Component\Form\Extension\Core\Type\TextType;

And in the hook function, this is the example code,

public function hookActionCustomerGridDefinitionModifier(array $params)
{
    /** @var GridDefinitionInterface $definition */
    $definition = $params['definition'];

    $definition
        ->getColumns()
        ->addAfter(
            'optin',
            (new DataColumn('mobile'))
                ->setName($this->l('Mobile number'))
                ->setOptions([
                    'field' => 'mobile',
                ])
        )
    ;

    // For search filter
    $definition->getFilters()->add(
        (new Filter('mobile', TextType::class))
        ->setAssociatedColumn('mobile')
    );
}

the above code looks simple and understandable 🙂

/**
     * 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'];

        $searchQueryBuilder->addSelect(
            'IF(wcm.`mobile` IS NULL,0,wcm.`mobile`) AS `mobile`'
        );

        $searchQueryBuilder->leftJoin(
            'c',
            '`' . pSQL(_DB_PREFIX_) . 'wk_customer_mobile`',
            'wcm',
            'wcm.`id_customer` = c.`id_customer`'
        );

        if ('mobile' === $searchCriteria->getOrderBy()) {
            $searchQueryBuilder->orderBy('wcm.`mobile`', $searchCriteria->getOrderWay());
        }

        foreach ($searchCriteria->getFilters() as $filterName => $filterValue) {
            if ('mobile' === $filterName) {
                $searchQueryBuilder->andWhere('wcm.`mobile` = :mobile');
                $searchQueryBuilder->setParameter('mobile', $filterValue);

                if (!$filterValue) {
                    $searchQueryBuilder->orWhere('wcm.`mobile` IS NULL');
                }
            }
        }
    }

This code is providing the actionCustomerGridDefinitionModifier hook a custom data of customer entity.

Now you can see your column here like this,

PrestaShop also provided multiple column types, you can refer to this and use accordingly.

. . .

Comments (2)

Add Your Comment

  • langziyang
    add new column and use sql is ok,but if only want add new column likt option,do not has sql,how to do that
    • Dheeraj Sharma
      then do not use the second hook, ‘actionCustomerGridQueryBuilderModifier’,
  • css.php
    Hire Us!
    Brief us about your requirements and we'll get back to you.
    Woo! Hooy!
    We have just recieved your project brief and our expert will contact you shortly.
    Send Again
    Close