如何在PrestaShop 1.7中重写Controller类及利用重写功能修改默认功能?
Hey there! Let's break down how to handle controller overrides and modify default functionality in PrestaShop 1.7—this is a super common task, so I'll walk you through it step by step with clear examples.
PrestaShop's override system lets you tweak core controllers without editing original files (critical for keeping your store updatable). Here's how to do it:
Step 1: Get the Folder Structure Right
All overrides live in the override/ directory at your store's root. For controllers, mirror the core folder structure:
- Front-end controllers: Core files are in
controllers/front/, so your override goes tooverride/controllers/front/ - Admin controllers: Core files are in
controllers/admin/, so your override goes tooverride/controllers/admin/
If the target folder doesn't exist, just create it—no big deal.
Step 2: Create Your Override File
Let's use the front-end ProductController (powers product pages) as an example. Create a file named ProductController.php in override/controllers/front/.
The basic structure looks like this:
<?php class ProductController extends ProductControllerCore { // Your custom code will go here }
Important rule: Your class name must match the core controller exactly, and it extends the [ControllerName]Core class (the core implementation we're overriding).
Step 3: Override Specific Methods
You don't need to rewrite the entire controller—only the methods you want to change. For example, adding a custom message to the product page:
<?php class ProductController extends ProductControllerCore { public function initContent() { // First, call the parent method to keep all default product page functionality (highly recommended!) parent::initContent(); // Add your custom logic here—assign a smarty variable for a custom message $this->context->smarty->assign('custom_product_message', 'Hey, thanks for checking out this product!'); } }
If you want to completely replace a method (e.g., change how product data loads), skip calling parent::initContent()—but be careful, this can break things if you don't replicate necessary core logic.
Step 4: Refresh PrestaShop's Cache
After creating the override file, tell PrestaShop to use it:
- Go to your back office > Advanced Parameters > Performance
- Click the Clear cache button (or manually delete
cache/class_index.php)
This regenerates the class index, so PrestaShop picks up your overridden controller instead of the core one.
Overrides aren't just for controllers—you can tweak models, core classes, or use hooks for lightweight changes. Let's cover the most common scenarios:
A. Overriding a Model
Models handle data retrieval/manipulation. For example, modifying how products are fetched for category pages:
- Create
override/classes/Product.php - Structure the file like this:
<?php class Product extends ProductCore { // Override the getProducts() method for listing pages public static function getProducts($id_lang, $start, $limit, $order_by = 'id_product', $order_way = 'DESC', $id_category = false, $only_active = false, Context $context = null) { // Get default product list from core $products = parent::getProducts($id_lang, $start, $limit, $order_by, $order_way, $id_category, $only_active, $context); // Modify results—add a custom "sale badge" flag foreach ($products as &$product) { $product['is_custom_sale'] = ($product['price'] < 50) ? true : false; } return $products; } }
Don't forget to clear cache after creating this file.
B. Use Hooks for Lightweight Modifications
Hooks let you inject code at specific points without overriding entire classes—great for small tweaks. For example, adding custom content to the cart page:
- Use an existing module or create a new one (start with PrestaShop's module creator if you're new)
- Register the hook in your module's
install()method:
public function install() { return parent::install() && $this->registerHook('displayCartFooter'); }
- Add the hook method to your module's main file:
public function hookDisplayCartFooter($params) { // $params contains cart object and context data return $this->display(__FILE__, 'views/templates/hook/cart_custom_note.tpl'); }
- Create the template file
views/templates/hook/cart_custom_note.tpl:
<div class="custom-cart-note"> <p>Pro tip: Use code SAVE10 for 10% off your first order!</p> </div>
This is safer than full overrides because it doesn't replace core code—just adds to it.
C. Overriding Admin Controllers
Tweak back-office functionality (like adding a custom field to product edit forms) with this approach:
- Create
override/controllers/admin/AdminProductsController.php - Extend the core class and add customizations:
<?php class AdminProductsController extends AdminProductsControllerCore { public function renderForm() { // Add a custom text field to the product edit form $this->fields_form[0]['form']['inputs'][] = [ 'type' => 'text', 'label' => $this->l('Custom Product Tag'), 'name' => 'custom_tag', 'col' => 6, 'desc' => $this->l('Add a custom tag for internal use'), ]; // Call parent method to render the form with your new field return parent::renderForm(); } }
Clear cache, and you'll see your new field in the back office's product edit page.
内容的提问来源于stack exchange,提问作者ZealousWeb

