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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:31:10