Php 基于路由的产品页面OpenCart模块

Php 基于路由的产品页面OpenCart模块,php,opencart,Php,Opencart,我在左栏设置了两个模块,一个是类别模块,一个是制造商模块, 都有自己的布局:产品/类别和产品/制造商 这可以正常工作:浏览类别时,只有类别模块显示在左栏中,而浏览制造商时,只有制造商模块显示在左栏中 但在检查产品详细信息时,它只会显示分配给布局“产品”的模块, 这是我无法思考该做什么的地方。 如果将布局“产品”同时添加到类别和制造商模块,那么(当然)会显示这两个模块,如何根据路线添加模块 浏览类别示例: 1) 只有类别模块显示在左栏中(这里都很好) 2) 输入产品: index.php?rout

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

这可以正常工作:浏览类别时,只有类别模块显示在左栏中,而浏览制造商时,只有制造商模块显示在左栏中

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

浏览类别示例:

1) 只有类别模块显示在左栏中(这里都很好)

2) 输入产品:

index.php?route=product/product&path=33&product_id=31
现在显示了分配给布局“产品”的所有模块,我只需要该模块 浏览要显示的类别(步骤1)时显示

浏览制造商示例:

1) 左栏仅显示制造商模块(此处均为良好)

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

这里有一些选项。您可以查看
$\u服务器['HTTP\u REFERER']
标题,该标题可能无法发送(因此不是100%可靠),或者您可以使用会话存储您来自何处的密钥。。。例如,在列出类别时,在
category
controller中执行以下操作:

$this->session->data['user_is_listing'] = 'category';
如果用户跳转到
manufacturer
controller中列出的制造商,则设置相同的键,不同的值:

$this->session->data['user_is_listing'] = 'manufacturer';
然后,在
列\u左侧
控制器中为这两个模块添加一个新的检查(制造商和类别模块都必须分配到产品详细信息页面),并检查会话中
用户\u列表下存储的值。。。然后,是否允许模块渲染

编辑:好的,让我们假设您自己的模块有名称
类别1
制造商1
(如果您使用默认模块,那么名称将没有编号
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'在列_left.php中?好的,我被困在控制器列_left.php中。当echo$this->session->data['user_is_listing']时,我得到了正确的“制造商”och“类别”打印出来,但不确定如何渲染。更新:我在计算如何渲染时使用CSS隐藏框,但遇到了一个新问题,如果从制造商处转到类别,并使用浏览器返回按钮返回制造商处,起初看起来一切正常,但当单击列表中的制造商时,类别会话开始。是吗此解决方案的预期行为?请检查我编辑的答案。这不仅仅是一个提示,我没有测试代码,但它可能是开箱即用的…开箱即用的完美!唯一的挫折是直接链接。如果你将www.myshop.com/manufacturer/product01作为书签,它将显示正确的面包屑,但带有类别模块,除非是y我们上次浏览的是制造商,在这种情况下,www.myshop.com/category/product01 direct link将显示制造商菜单。
$this->session->data['user_is_listing'] = 'manufacturer';
    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']
                        );
                    }
                }
            }
        }
    }