Prestashop 1.7.5.2:为特定客户组添加专属商品列表入口
Prestashop 1.7.5.2 特定客户组专属商品功能实现思路
一、「我的账户」页面添加专属链接(仅客户组43可见)
- 模板修改:找到「我的账户」页面模板文件,路径一般为
themes/你的主题/templates/customer/account.tpl。在账户导航区域合适位置添加条件判断代码,仅当当前客户属于ID43的组时显示链接:
其中{if isset($customer) && in_array(43, $customer->getGroups())} <li><a href="{$urls.pages.my_account}?controller=custom_product_list">专属商品列表</a></li> {/if}custom_product_list是后续要自定义的控制器名称。 - 缓存清理:修改模板后,在后台「高级参数→性能」中清理Smarty缓存和页面缓存,确保修改生效。
二、创建专属商品列表控制器
- 新建控制器文件:在
controllers/front/目录下创建CustomProductListController.php,代码如下:class CustomProductListController extends FrontController { public function initContent() { parent::initContent(); // 验证客户权限,非目标组跳转回我的账户 if (!Context::getContext()->customer->isLogged() || !in_array(43, Context::getContext()->customer->getGroups())) { Tools::redirect('index.php?controller=my-account'); } // 替换为你指定的商品ID数组 $productIds = [12, 34, 56]; $products = []; foreach ($productIds as $idProduct) { $product = new Product($idProduct, true, Context::getContext()->language->id); if ($product->id) { $products[] = $product; } } $this->context->smarty->assign([ 'products' => $products, 'page_name' => 'custom_product_list' ]); $this->setTemplate('customer/custom_product_list.tpl'); } } - 创建商品列表模板:在
themes/你的主题/templates/customer/目录下创建custom_product_list.tpl,示例代码:{extends file=$layout} {block name='content'} <h1>专属商品列表</h1> <div class="products"> {foreach from=$products item=product} <div class="product-item"> <a href="{$product.link}">{$product.name}</a> <p>{$product.description_short}</p> {if $product.available_for_order} <form action="{$urls.pages.cart}" method="post"> <input type="hidden" name="id_product" value="{$product.id}"> <input type="hidden" name="token" value="{$static_token}"> <button type="submit" class="add-to-cart">加入购物车</button> </form> {else} <p>暂时无法购买</p> {/if} </div> {/foreach} </div> {/block}
三、限制商品仅客户组43可加入购物车
- 钩子拦截添加行为:在自定义模块中添加
actionBeforeCartAdd钩子,拦截非目标组的添加请求:
启用模块后,非目标客户组尝试添加指定商品会被拦截并提示错误。public function hookActionBeforeCartAdd($params) { $idProduct = $params['id_product']; // 与控制器中一致的允许购买商品ID数组 $allowedProductIds = [12, 34, 56]; $customer = Context::getContext()->customer; if (!$customer->isLogged() || !in_array(43, $customer->getGroups()) || !in_array($idProduct, $allowedProductIds)) { $params['die'] = true; Tools::displayError('您无权购买此商品'); } } - 详情页按钮控制:修改
themes/你的主题/templates/product/product.tpl,仅对目标组显示「加入购物车」按钮:{if isset($customer) && in_array(43, $customer->getGroups()) && in_array($product.id, [12,34,56])} <!-- 显示加入购物车按钮区域 --> {else} <p>您无权购买此商品</p> {/if}
四、权限加固(可选)
- 在控制器的
init方法中再次验证客户组,防止用户直接通过URL访问专属列表页面。 - 可利用Prestashop自带的客户组价格功能,为目标组设置专属商品价格。
内容的提问来源于stack exchange,提问作者Interstella5555
相关产品推荐
相关产品推荐

