You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:32:40