首页 > 解决方案 > 覆盖控制器形式 Prestashop 1.7.7

问题描述

请问,有没有人有 Prestashop 1.7.7 的管理员控制器覆盖示例(基于 symfony)

谢谢您的回答。

标签: symfonymoduleprestashop-1.7

解决方案


我为此创建了一个示例模块,可以从这里下载(在 Releases 下)。

覆盖特定路由的过程/adminXXXX/index.php/sell/orders/是这样的:

  1. 你在你的项目中创建了一个 Symfony 控制器(代码再往下一点)。我在里面创建它们src/Controller,这是约定。该控制器必须扩展PrestaShopBundle\Controller\Admin\FrameworkBundleAdminController。我使用作曲家自动加载器加载我的类,所以这里是设置:
"autoload": {
  "psr-4": {
    "Skaparate\\": "src/"
  },
  "classmap": [
    "sk_testmodule.php"
  ],
  "exclude-from-classmap": []
},
  1. 您需要config在项目的根目录中创建一个文件夹。这很重要,因为 PrestaShop 将从那里加载路由和服务。
  2. routes.yml在先前创建的文件夹中创建一个名为的文件。
  3. 在里面routes.yml定义你想要覆盖的路线。在这种情况下,路由被称为admin_orders_index,因此我们这样写:
   admin_orders_index:
     path: /sell/orders/
     # POST is required because admin_order_index is also setup as the grid reset return route.
     methods: [GET,POST]
     defaults:
        _controller: 'Skaparate\Controller\Admin\CustomOrdersController::indexAction'
       _disable_module_prefix: true
  1. 最后,这是实际的控制器:
<?php

namespace Skaparate\Controller\Admin;

if (!defined('_PS_VERSION_')) {
    die;
}

use PrestaShopBundle\Controller\Admin\FrameworkBundleAdminController;
use PrestaShopBundle\Security\Annotation\AdminSecurity;
use PrestaShopBundle\Security\Annotation\ModuleActivated;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;

class CustomOrdersController extends FrameworkBundleAdminController
{
    /**
     * Shows list of orders
     *
     * @param Request $request
     * @param OrderFilters $filters
     *
     * @return Response
     */
    public function indexAction(Request $request)
    {
        return $this->render(
            '@Modules/sk_testmodule/views/templates/admin/sell/order/index.html.twig',
            [
                'enableSidebar' => true,
            ]
        );
    }
}

该项目结构将是:

├── composer.json
├── composer.lock
├── config
│   └── routes.yml
├── README.md
├── sk_testmodule.php
├── src
│   └── Controller
│       └── Admin
│           └── CustomOrdersController.php
└── views
    └── templates
        └── admin
            └── sell
                └── order
                    └── index.html.twig

当然,您需要创建文件views/templates/admin/sell/orders/index.html.twig. 我把它放在维护 PrestaShop 结构的路径中,但这不是必需的。

作为参考,Symfony 路由定义在src/PrestaShopBundle/Resources/config/routes(相对于 PrestaShop 安装)。

问候!


推荐阅读