OpenCart自动生成商品排序号:将倒序改为正序1至N
问题描述
我不是开发人员,麻烦耐心解答。我在GitHub上找了一款已停止维护的OCMOD代码,正在OpenCart 3.0.3.6和3.0.3.8测试环境中测试。当前XML文件会给数据库里排序号(sort_order)为0的商品自动生成排序号,规则是从5000倒序生成(4999…1…-50000及更小值)。我需要把它改成从1到N的正序生成规则。
原OCMOD代码如下:
<file path="admin/controller/catalog/product.php"> <operation> <search><![CDATA[ $data['sort_order'] = $this->request->post['sort_order']; ]]></search> <add position="after"><![CDATA[ } elseif ((!empty($product_info)) && ($product_info['sort_order'] == 0)) { $data['sort_order'] = ( 5000 - $this->request->get['product_id'] );]]></add> </operation> <!-- Automatic Product Sort Number --> <operation> <search><![CDATA[ $data['sort_order'] = 1; ]]></search> <add position=" replace"><![CDATA[ $data['sort_order'] = 0;]]></add> </operation> </file>
修改方案
要实现从1开始的正序排序号生成,只需要修改原OCMOD代码里的两个关键部分:
1. 替换倒序生成逻辑
原代码里的5000 - $this->request->get['product_id']是倒序生成的核心,直接改成正序逻辑即可:
- 如果你的商品ID是从1开始递增的,直接用商品ID作为排序号,修改后的代码段:
<add position="after"><![CDATA[ } elseif ((!empty($product_info)) && ($product_info['sort_order'] == 0)) { $data['sort_order'] = $this->request->get['product_id'];]]></add> - 如果需要严格从1开始连续递增(不管商品ID是否连续),需要先查询当前数据库里最大的排序号,再加1。这时候要同时修改控制器和模型:
控制器里的代码段改成:
然后给商品模型添加一个获取最大排序号的方法,在OCMOD里加这段代码:<add position="after"><![CDATA[ } elseif ((!empty($product_info)) && ($product_info['sort_order'] == 0)) { $this->load->model('catalog/product'); $max_sort_order = $this->model_catalog_product->getMaxSortOrder(); $data['sort_order'] = $max_sort_order + 1;]]></add><file path="admin/model/catalog/product.php"> <operation> <search><![CDATA[ public function getProducts($data = array()) { ]]></search> <add position="before"><![CDATA[ public function getMaxSortOrder() { $query = $this->db->query("SELECT MAX(sort_order) as max_sort FROM " . DB_PREFIX . "product"); return $query->row['max_sort'] ? $query->row['max_sort'] : 0; }]]></add> </operation> </file>
2. 还原初始排序号(可选)
原代码把新商品默认排序号从1改成了0,如果你希望新添加商品时默认从1开始,把对应的operation改回原来的设置:
<operation> <search><![CDATA[ $data['sort_order'] = 1; ]]></search> <add position="replace"><![CDATA[ $data['sort_order'] = 1;]]></add> </operation>
或者直接删掉这个operation,保留系统默认的初始值。
最终完整OCMOD代码
方案一:用商品ID作为正序排序号
<file path="admin/controller/catalog/product.php"> <operation> <search><![CDATA[ $data['sort_order'] = $this->request->post['sort_order']; ]]></search> <add position="after"><![CDATA[ } elseif ((!empty($product_info)) && ($product_info['sort_order'] == 0)) { $data['sort_order'] = $this->request->get['product_id'];]]></add> </operation> <!-- 不需要默认设为0的话,可以删掉下面这段 --> <!-- <operation> <search><![CDATA[ $data['sort_order'] = 1; ]]></search> <add position="replace"><![CDATA[ $data['sort_order'] = 0;]]></add> </operation> --> </file>
方案二:严格连续递增排序号
<file path="admin/controller/catalog/product.php"> <operation> <search><![CDATA[ $data['sort_order'] = $this->request->post['sort_order']; ]]></search> <add position="after"><![CDATA[ } elseif ((!empty($product_info)) && ($product_info['sort_order'] == 0)) { $this->load->model('catalog/product'); $max_sort_order = $this->model_catalog_product->getMaxSortOrder(); $data['sort_order'] = $max_sort_order + 1;]]></add> </operation> <!-- 可选:还原新商品默认排序号为1 --> <operation> <search><![CDATA[ $data['sort_order'] = 1; ]]></search> <add position="replace"><![CDATA[ $data['sort_order'] = 1;]]></add> </operation> </file> <file path="admin/model/catalog/product.php"> <operation> <search><![CDATA[ public function getProducts($data = array()) { ]]></search> <add position="before"><![CDATA[ public function getMaxSortOrder() { $query = $this->db->query("SELECT MAX(sort_order) as max_sort FROM " . DB_PREFIX . "product"); return $query->row['max_sort'] ? $query->row['max_sort'] : 0; }]]></add> </operation> </file>
内容的提问来源于stack exchange,提问作者carloslozada
相关产品推荐
相关产品推荐

