PrestaShop 1.7下基于Knowband Marketplace模块实现用户自定义制造商
Alright, let's tackle this custom manufacturer creation feature for your Knowband Marketplace module in PrestaShop 1.7. I've broken down the steps to match the backend "Manufacturers & Brands" page logic, so users can either select an existing manufacturer or type in a new one to create it on the fly.
1. 修改前端商品提交模板
首先,我们需要把静态的制造商下拉框替换成支持自动补全现有制造商、同时允许输入新名称的输入组件。
找到模块的商品提交模板(通常路径为 modules/knowband_marketplace/views/templates/front/product_submit.tpl),定位到制造商下拉框部分,替换为以下代码:
<div class="form-group mb-3"> <label class="fw-bold">{l s='Manufacturer' mod='knowband_marketplace'}</label> <input type="text" name="manufacturer_name" id="manufacturer_name" class="form-control" placeholder="{l s='Enter manufacturer name or select from suggestions' mod='knowband_marketplace'}"> <input type="hidden" name="manufacturer_id" id="manufacturer_id" value=""> </div> {* 为现有制造商添加jQuery自动补全功能 *} <script> $(document).ready(function() { $('#manufacturer_name').autocomplete({ minLength: 2, source: function(request, response) { $.ajax({ url: '{$link->getAdminLink('AdminManufacturers')|escape:'html':'UTF-8'}', method: 'GET', data: { ajax: 1, action: 'searchManufacturer', query: request.term }, dataType: 'json', success: function(data) { response($.map(data, function(item) { return { label: item.name, value: item.id_manufacturer }; })); } }); }, select: function(event, ui) { $('#manufacturer_id').val(ui.item.value); $('#manufacturer_name').val(ui.item.label); return false; }, focus: function(event, ui) { $('#manufacturer_name').val(ui.item.label); return false; } }); }); </script>
这样用户既能享受和后台一致的自动补全体验,也能输入新的制造商名称。
2. 更新后端商品提交控制器
接下来,修改模块的商品提交控制器,处理用户提交的新制造商名称,实现“不存在则创建”的逻辑。
找到控制器文件(通常路径为 modules/knowband_marketplace/controllers/front/ProductSubmitController.php),在保存商品之前添加以下逻辑:
// 引入Manufacturer类(根据PrestaShop版本调整命名空间) use PrestaShop\PrestaShop\Core\Product\Manufacturer; // 获取用户提交的制造商数据 $manufacturerName = trim(Tools::getValue('manufacturer_name')); $manufacturerId = (int) Tools::getValue('manufacturer_id'); // 验证并处理制造商信息 if (!empty($manufacturerName)) { // 检查制造商名称格式是否合法 if (!Validate::isGenericName($manufacturerName)) { $this->errors[] = $this->module->l('Invalid manufacturer name. Please use a valid name.', 'productsubmitcontroller'); } elseif (strlen($manufacturerName) > 64) { $this->errors[] = $this->module->l('Manufacturer name cannot exceed 64 characters.', 'productsubmitcontroller'); } else { // 检查制造商是否已存在 $existingManufacturerId = Manufacturer::getIdByName($manufacturerName); if ($existingManufacturerId) { $manufacturerId = $existingManufacturerId; } elseif (empty($manufacturerId)) { // 创建新制造商 $newManufacturer = new Manufacturer(); $newManufacturer->name = $manufacturerName; $newManufacturer->active = 1; // 默认设置为激活状态 if (!$newManufacturer->add()) { $this->errors[] = $this->module->l('Failed to create the manufacturer. Please try again.', 'productsubmitcontroller'); } else { $manufacturerId = $newManufacturer->id; } } } } // 将制造商ID关联到商品(如果无有效制造商则设为0) $product->id_manufacturer = $manufacturerId ?: 0;
3. 添加错误提示与用户反馈
确保前端模板能显示后端返回的错误信息,比如在表单顶部添加以下代码:
{if $errors} <div class="alert alert-danger"> {foreach from=$errors item=error} <p>{$error}</p> {/foreach} </div> {/if}
这样用户在输入非法名称或制造商创建失败时,能及时看到提示。
4. 全面测试功能
完成代码修改后,务必测试所有场景:
- 选择现有制造商:验证商品是否正确关联到该制造商
- 输入新制造商名称:检查后台是否创建了新制造商,且商品已关联
- 输入非法名称:确认错误提示正常显示
- 不同用户角色测试(如果模块有权限控制):确保允许创建制造商的用户能正常使用该功能
内容的提问来源于stack exchange,提问作者fakejack

