如何在PrestaShop 8+中创建自定义产品类型?
PrestaShop 新增自定义产品类型的实现方案
核心实现步骤
1. 注册自定义产品类型
在模块的install()方法中,调用PrestaShop内置的ProductType类添加新类型,同时在uninstall()方法中完成清理:public function install() { return parent::install() && $this->registerHook('actionProductFormModifier') && $this->registerHook('actionProductAdd') && $this->registerHook('actionProductUpdate') && ProductType::add([ 'name' => [ Configuration::get('PS_LANG_DEFAULT') => '自定义产品类型' ], 'has_attributes' => false, // 根据需求设置是否支持属性 'has_discounts' => true, // 是否支持折扣 'has_images' => true, // 是否支持图片 ]); } public function uninstall() { $productType = ProductType::getByName('自定义产品类型'); if ($productType) { $productType->delete(); } return parent::uninstall(); }2. 扩展产品编辑表单
通过actionProductFormModifier钩子,在产品编辑页面添加自定义字段,仅当产品类型为自定义类型时显示:public function hookActionProductFormModifier($params) { $product = $params['object']; if ($product->id_product_type == ProductType::getIdByName('自定义产品类型')) { $fields = [ 'custom_product_field' => [ 'type' => 'text', 'label' => $this->l('自定义字段'), 'name' => 'custom_product_field', 'desc' => $this->l('自定义产品类型的专属配置'), 'required' => true, 'col' => 6, 'default_value' => $product->custom_product_field ?? '' ] ]; // 将字段插入到价格字段之后 array_splice($params['fields']['price'], 1, 0, $fields); } }3. 保存自定义数据
先在模块安装时给产品表新增字段,再通过actionProductAdd和actionProductUpdate钩子保存表单数据:// 安装时添加字段 public function install() { // ... 保留之前的注册代码 if (!Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'product` ADD `custom_product_field` VARCHAR(255) NULL')) { return false; } return true; } // 卸载时删除字段 public function uninstall() { // ... 保留之前的清理代码 Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'product` DROP COLUMN `custom_product_field`'); return true; } // 统一数据保存逻辑 public function hookActionProductAdd($params) { $this->saveCustomProductData($params['id_product']); } public function hookActionProductUpdate($params) { $this->saveCustomProductData($params['id_product']); } private function saveCustomProductData($idProduct) { if (Tools::isSubmit('custom_product_field') && Product::getProductType($idProduct) == ProductType::getIdByName('自定义产品类型')) { Db::getInstance()->update( 'product', ['custom_product_field' => pSQL(Tools::getValue('custom_product_field'))], ['id_product' => (int)$idProduct] ); } }4. 前端展示自定义内容
通过displayProductAdditionalInfo钩子,在产品详情页展示自定义类型的专属信息:public function hookDisplayProductAdditionalInfo($params) { $product = $params['product']; if ($product->id_product_type == ProductType::getIdByName('自定义产品类型') && !empty($product->custom_product_field)) { return '<div class="custom-product-info"><strong>'.$this->l('自定义信息').':</strong> '.$product->custom_product_field.'</div>'; } return ''; }
完整示例模块结构
customproducttype/ ├─ customproducttype.php ├─ views/ │ └─ templates/ │ └─ front/ │ └─ product/ │ └─ custom_info.tpl (可选,用于复杂展示) └─ config.xml
config.xml示例:
<?xml version="1.0" encoding="UTF-8"?> <module> <name>customproducttype</name> <displayName><![CDATA[自定义产品类型]]></displayName> <version><![CDATA[1.0.0]]></version> <description><![CDATA[为PrestaShop添加自定义产品类型]]></description> <author><![CDATA[开发者名称]]></author> <tab><![CDATA[front_office_features]]></tab> <confirmUninstall><![CDATA[确定要卸载该模块吗?]]></confirmUninstall> <is_configurable>0</is_configurable> <need_instance>0</need_instance> </module>
内容的提问来源于stack exchange,提问作者NukDokPlex
相关产品推荐
相关产品推荐

