Ajouter une action spécifique dans une liste de la partie administration dans Prestashop 1.7.8 +
Dans certains cas, il est nécessaire d’ajouter une action spécifique dans une liste de l’administration de Prestashop, l’ajout de cette dernière depuis un module nécessite plusieurs actions à mener.
A l’instar de ce qui a été indiqué dans le billet traitant de l’ajout d’une colonne dans les listes de l’admin, nous allons devoir utiliser le hook ActionOrderGridDefinitionModifier afin d’ajouter l’action en question en y intégrant le code suivant :
// Add bulk action to generate delivery slips
$definition->getBulkActions()->add(
(new SubmitBulkAction('delivery_slip_bulk_action'))
->setName($this->l('Generate delivery slips'))
->setOptions([
'submit_route' => 'aitoto_delivery_slips',
])
);
Une fois que cette action est ajoutée (attention à bien enregistrer l’utilisation du hook), il reste 2 étapes, la première va être d’ajouter un répertoire config à la racine du module, puis d’y placer un fichier routes.yml, ce dernier devant contenir quelques informations :
aitoto_delivery_slips:
path: aitoto/delivery_slips_generate
methods: [POST,GET]
defaults:
_controller: 'AdminAiTotoDeliverySlipController::generate'
Il faut indiquer le nom de la route (celle utilisée dans les options de l’action ajoutée, ici aitoto_delivery_slips), le path est le suffixe de l’url appelée, attention pour les methods, il se peut qu’il ne faille mettre que l’une ou l’autre en fonction des cas, enfin dans defaults, _controller doit contenir à la fois le nom du contrôleur ainsi que la fonction a appeler.
Dernière étape, créer le contrôleur appelé, ici nous allons créer un contrôleur spécifique et le placer dans le répertoire override/controllers/admin.
Ce contrôleur devra contenir le code a exécuter et surtout la fonction définie dans le fichier routes.yml :
<?php
use PrestaShopBundle\Controller\Admin\FrameworkBundleAdminController;
class AdminAiTotoDeliverySlipController extends FrameworkBundleAdminController
{
public function generate($orders = null)
{
if (!$orders) {
$orders = $_REQUEST['order_orders_bulk'];
}
if (!empty($orders)) {
foreach ($orders as $order_id) {
$order = new Order((int)$order_id);
// Generate first delivery slip if needed
if (!$order->hasInvoice()) {
$order->setDeliverySlip();
} else {
$order_invoice_id = (int)Db::getInstance()->getValue('SELECT id_order_invoice FROM '._DB_PREFIX_.'order_invoice WHERE id_order = '.(int)$order_id);
$order->delivery_number = $order->getDeliveryNumber($order_invoice_id);
$order->update();
}
}
}
// Generate PDF
$this->generateBulkDeliverySlipsPDF($orders);
// Return to orders list if needed
if ($_REQUEST['order_orders_bulk']) {
$context = Context::getContext();
$url = $context->link->getAdminLink('AdminOrders');
Tools::redirectAdmin($url);
}
}
public function generateBulkDeliverySlipsPDF($orders)
{
$order_invoice_list = Db::getInstance()->executeS(
'SELECT oi.* FROM '._DB_PREFIX_.'order_invoice oi LEFT JOIN '._DB_PREFIX_.'orders o ON (o.id_order = oi.id_order) WHERE o.id_order IN ('.implode(',', $orders).')'.Shop::addSqlRestriction(Shop::SHARE_ORDER, 'o').
'ORDER BY oi.delivery_date ASC'
);
$order_invoice_collection = ObjectModel::hydrateCollection('OrderInvoice', $order_invoice_list);
$pdf = new AdminPdfController();
$pdf->generatePDF($order_invoice_collection, PDF::TEMPLATE_DELIVERY_SLIP);
}
}
Dans ce fichier, nous allons gérer la ou les actions que nous souhaitons ajouter, dans l’exemple nous allons générer les bons de livraison des commandes sélectionnées, à noter un paramètre est ajouté à la fonction generate afin de l’appeler directement, un test est ajouté en début de fonction afin de vérifier la présence de ce dernier ou non.
Ce billet est maintenant terminé, en espérant qu’il pourra aider certains à ajouter leurs propres actions dans les listes de l’admin.