【问题标题】:OpenCart module on product page based on route基于路线的产品页面上的 OpenCart 模块
【发布时间】:2013-11-08 17:00:59
【问题描述】:

我在左栏设置了2个模块,一个是类别,一个是制造商, 都有自己的布局:产品/类别和产品/制造商,

这很好用:浏览类别时,左栏中仅显示类别模块,而浏览制造商时,左栏中仅显示制造商模块。

但是在查看产品详细信息时,它只会显示分配给布局“产品”的模块, 这就是我无法弄清楚该怎么做的地方。 如果将布局“产品”添加到类别和制造商模块,那么(当然)两个模块都会显示,如何根据路由添加模块?

示例浏览类别:

1) 左栏只显示分类模块(这里都很好)

index.php?route=product/category&path=33

2) 进入产品:

index.php?route=product/product&path=33&product_id=31

现在显示分配给布局“产品”的所有模块,我只想要该模块 浏览Category时显示(step1)要显示

示例浏览制造商:

1) 左栏中仅显示制造商模块(这里都很好)

index.php?route=product/manufacturer

2) 输入与类别示例中相同的产品:

index.php?route=product/product&manufacturer_id=9&product_id=31

现在显示分配给布局“产品”的所有模块,我只想要该模块 浏览制造商时显示(步骤1)要显示

所以这是同一产品的两条不同路线:

index.php?route=product/product&path=33&product_id=31
index.php?route=product/product&manufacturer_id=9&product_id=31

但适用的布局是带有路径产品/产品的称为“产品”的布局

那么有没有办法将这两条不同的路线添加到两个不同的布局中,这样模块就可以正确显示或者我想错了?

对此的任何意见都会很棒

OpenCart 1.5.6

【问题讨论】:

    标签: php opencart


    【解决方案1】:

    这里有一些选择。您可以查看$_SERVER['HTTP_REFERER'] 标头,该标头可能不会被发送(因此不是 100% 可靠),或者您可以使用 session 来存储您来自哪里的键......例如,在列出类别时,在category 控制器中执行以下操作:

    $this->session->data['user_is_listing'] = 'category';
    

    如果用户跳转到manufacturer控制器中的制造商列表设置相同的键,不同的值:

    $this->session->data['user_is_listing'] = 'manufacturer';
    

    然后,在column_left 控制器中为这两个模块添加一个新检查(制造商和类别模块都必须分配到产品详细信息页面)并检查会话中存储的值关键user_is_listing...然后,要么允许模块渲染,要么不...

    编辑:好的,假设您自己的模块具有名称category1manufacturer1(如果您使用的是默认模块,那么名称将没有编号1)。现在,在左列中找到foreach ($extensions as $extension) { 循环,我们将这样修改它:

        foreach ($extensions as $extension) {
            $modules = $this->config->get($extension['code'] . '_module');
    
            if ($modules) {
                foreach ($modules as $module) {
                    if ($module['layout_id'] == $layout_id && $module['position'] == 'column_left' && $module['status']) {
                        if ($route == 'product/product' && in_array($extension['code'], array('category1', 'manufacturer1'))) {
                            if($this->session->data['user_is_listing'] == $extension['code'])) {
                                $module_data[] = array(
                                    'code'       => $extension['code'],
                                    'setting'    => $module,
                                    'sort_order' => $module['sort_order']
                                );
                            }
                        } else {
                            $module_data[] = array(
                                'code'       => $extension['code'],
                                'setting'    => $module,
                                'sort_order' => $module['sort_order']
                            );
                        }
                    }
                }
            }
        }
    

    现在存储在会话中的名称必须与该模块的名称相同。

    【讨论】:

    • 谢谢,但不确定“为这两个模块添加新检查”是什么意思?我将它们分配到产品详细信息页面(布局:产品,路线:产品/产品),所以值检查是否应该进入 if ($route == 'product/product' in column_left.php?
    • 好的,我卡在控制器 column_left.php 上。当 echo $this->session->data['user_is_listing'];我打印出正确的“制造商”和“类别”,但不知道如何渲染。
    • 更新:我在弄清楚如何渲染时使用 CSS 隐藏框,但遇到了一个新问题,如果从制造商那里离开类别并使用浏览器返回按钮返回制造商,所有起初看起来不错,但是当单击列表中的制造商时,类别会话会启动。这是此解决方案的预期行为吗?
    • 检查我编辑的答案。这只是一个提示,我没有测试代码,但它可能开箱即用......
    • 开箱即用完美!唯一的挫折是直接链接。如果您为 www.myshop.com/manufacturer/product01 添加书签,它将显示正确的面包屑但带有类别模块,除非您上次浏览的是制造商,在这种情况下 www.myshop.com/category/product01 直接链接将包含制造商显示菜单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2016-01-25
    • 2017-04-06
    相关资源
    最近更新 更多