Opencart 3完美静态化

、去除url中分类目录

1、修改catalog文件夹下,controller > product > category.php

'href'        => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url)

删除其中的 “ . $this->request->get[‘path’] ” 改为如下:

‘href’ => $this->url->link(‘product/product’, ‘path=’ . ‘&product_id=’ . $result[‘product_id’] . $url)

2、修改catalog文件夹下,controller > startup > seo_url.php
大概在第82行至86行:

if ($query->num_rows && $query->row['keyword']) {
						$url .= '/' . $query->row['keyword'];

						unset($data[$key]);
					}
修改为:
if ($query->num_rows && $query->row['keyword']) {
                        if($key == 'product_id'){
                            $url = '/' . $query->row['keyword'];
                        }else{
                            $url .= '/' . $query->row['keyword'];
                        }

                        unset($data[$key]);
                    }

二、URL静态化

1、修改catalog文件夹下,controller > startup > seo_url.php

找到
unset($data[$key]);
				}
在其后增加:
elseif ($key == 'route') {
                    $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "seo_url WHERE `query` = '" . $this->db->escape($value) . "'");
                    if ($query->num_rows) {
                        $url .= '/' . $query->row['keyword'];
                        unset($data[$key]);
                    }
                }

2、数据库查询
在数据库中,SQL里输入以下查询,如有遗漏,可以按规则新增即可。

INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'common/home', ''); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/wishlist', 'wishlist.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/account', 'my-account.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'checkout/cart', 'shopping-cart.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'checkout/checkout', 'checkout.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/login', 'login.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/logout', 'logout.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/order', 'order-history.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/newsletter', 'newsletter.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'product/special', 'specials.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'affiliate/account', 'affiliates.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'checkout/voucher', 'gift-vouchers.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'product/manufacturer', 'brands.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'information/contact', 'contact-us.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/return/insert', 'request-return.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'information/sitemap', 'sitemap.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/forgotten', 'forgot-password.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/download', 'downloads.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/recurring', 'recurring.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/return', 'returns.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/transaction', 'transactions.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/register', 'create-account.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'product/compare', 'compare-products.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'product/search', 'search.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/edit', 'edit-account.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/password', 'change-password.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/address', 'address-book.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/reward', 'reward-points.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'affiliate/edit', 'edit-affiliate-account.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'affiliate/password', 'change-affiliate-password.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'affiliate/payment', 'affiliate-payment-options.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'affiliate/tracking', 'affiliate-tracking-code.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'affiliate/transaction', 'affiliate-transactions.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'affiliate/logout', 'affiliate-logout.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'affiliate/forgotten', 'affiliate-forgot-password.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'affiliate/register', 'create-affiliate-account.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'affiliate/login', 'affiliate-login.html');
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/voucher', 'account-voucher.html'); 
INSERT INTO oc_seo_url (store_id, language_id, query, keyword) VALUES (0, 1, 'account/return/add', 'account-return-add.html');

关于opencart模块应用中,js引用的一些思考

跟传统的最优的页面结构有所区别,opencart的js或者局部css引用,会在单独模块下引入。
一般,大家共识的最优的方案,即css在页面head部分引入,js在页面footer后面引入。

其实,这个问题很简单,就是opencart的扩展方式就是模块,即开即用,随时弃用。
一开始,我也忽略了这个问题。
我做模板时,按常规思路,把css全部在head部分引入,插件js,全部在footer文件里引入。
当我注意到浏览器控制台有报错时,我才想到,有些应用了插件的模块没有启用,js引入了,但是找不到对象。

再想想opencart官方demo的做法,一开始觉得不合常规的,现在也觉得很合理了。
虽然在页面中间引用js或css,不是最优化的方式,或者就是看起来很奇怪,但是,当不再使用这个模块时,页面也不会出现多余的js,优点就体现出来了。

当然,有全局公共的js文件,还是适合在head或者footer里引入的。
针对那些模块化的插件使用,还是在对应模块下引用为佳。

关于opencart新增一个布局模板的内容位置模块

2020年8月13日更新:此篇文章的广泛使用待验证,我在尝试添加左右两侧的布局时,能显示,但是无法保存布局中的更改。

做笔记,留给自己以后看。

默认的一些布局排版不够用,就需要新增自定义位置,实现定制化模块。
默认的就左右上下。如果布局中出现上中下,中间又分了左右,中间的左右可能又有上中下的布局。这样的需求很常见,然后布局就不够用了。

新增一个的布局位置,还是需要去前端和后台两个对应的文件夹下修改文件。
catalog文件夹下:

1、controller文件夹,common, 复制一个content_top, 例如重命名为content_body.
修改文件内ControllerCommonContentTop为ControllerCommonContentBody,并全文查找content_top, 修改为content_body(共计两处需要修改)。

2、仍然是以上文件夹内,打开home.php文件,在对应位置新增行content_body即可。

3、view文件夹,theme, 对应主题模板的文件夹内,template, common, 复制content_top, 重命名为content_body.

4、至于新增布局的放置位置,需要去对应模板里修改。
例如首页,在common文件夹下,打开home.twig文件,把content_body新增到需要的位置即可。

admin文件夹下:

1、language文件夹,对应的语言包内,design, layout.php文件, 新增一行text_content_body.

2、view文件夹,template, design, 打开layout_form.twig文件。
找到id=”module-content-top”的table,并复制一个,重命名为id=”module-content-body”,修改这个table里的content_top为content_body(共计两处);修改相关字符content-top为content-body(共计两处)。

回到后台,规划设计里面,布局排版,打开首页,就可以看到新增了一个内容主体,添加需要的模块进去即可。

关于opencart后台新增模块的一些说明

关于opencart的一些教程说明,旨在为自己提供个笔记。
我不是专业开发者,纯粹是外行,自己做一点点小小的定制。

模块里适合做前端产品展示的,可自由选择产品的,就是featured这个模块了。
其他几个模块,例如latest,bestseller,special等,规则是既定的,最新产品,就是最后添加的几个,热卖,就是销量最高的等等。
所以,需要自由选择,就是featured这个模块。

新增模块就是在featured的基础上。
需要分别在前端展示和后台编辑两个部分新增对应文件。
切记,模块可识别的命名方式为下划线的方式,连字符无法识别。

catalog文件夹下,按文件夹名称排序:
1、controller, extension, module文件夹内,复制一个featured文件,重命名为featured_latest。
打开文件,修改名称,将ControllerExtensionModuleFeatured,改为ControllerExtensionModuleFeaturedLatest,全文查找featured,修改为featured_latest。

2、language文件夹下,找到对应语言的文件夹,extension, module, 复制对应文件,并修改文件内对应标题名称即可。

3、view文件夹下,theme, 对应主题名称的文件夹下,template, extension, module,复制对应文件,修改名称,然后打开文件,将写好的HTML模块,按文件规则修改好即可。

admin文件夹下,按文件夹名称排序:
1、controller, extension, module文件夹内,复制一个featured文件,重命名为featured_latest。
打开文件,修改名称,将ControllerExtensionModuleFeatured,改为ControllerExtensionModuleFeaturedLatest,全文查找featured,修改为featured_latest。

2、language文件夹下,找到对应语言的文件夹,extension, module, 复制对应文件,并修改文件内对应标题名称即可。

3、view文件夹下,template, extension, module,复制对应文件,修改名称。

回到后台,扩展功能里,打开扩展功能子模块,下拉选项里选择模组,就可以找到新增的模块了。

关于OpenCart 报错“currency.php”

如果OpenCart网站后台报告如下错误:model/localisation/currency.php on line 141
这是由于OpenCart开启汇率自动更新,而OpenCart默认提供的汇率接口失效所导致的。只要关闭汇率自动更新即可解决该问题。

关闭汇率自动更新的方法如下:
在OpenCart后台“系统设置”中点击“网店设置”,在右侧对应网站列表的后方点击编辑按钮。
随后在新开页面中选择“本地参数”选项卡,将表单中“自动更新汇率”选项选择为“否”,最后保存即可。

第四版本,修改完毕

一个人是孤独的!

即便是在朋友圈子里,我也是一个人。
完全没有相同职业的朋友。

尽管如此,我还是一个人默默地完成了。

去年九月完成了第一版,到今天,第四个版本,最终版,SCSS重构的最终版,在今天完成了。

颜色体系众多,为了便于使用,另外也导出了一个不含渐变色的精简版。

总结一下,在不压缩的情况下,包含必要注释,一共99896行,1.7Mb。

关于opencart2.3版本多语言分别显示的问题

标题不便写太长,我所要表达的就是,我要后台显示中文,前台显示日语。
我不是要多语言版本的网站,我只是想要一个显示日语的网站。
而opencart默认是英语,所以,我必须分别安装中文和日语语言包。并且在语言设置里开启三个语言。

那么,我在编辑商品分类的时候,也要同时填写三种语言的信息。我只需要日语,其他的就做了无用功。

好吧,其实就是语言包的问题了。
首先,默认是英语的,那么就以这个语言包为基础。
网站也无需安装多语言,网站设置也默认前后台都是英文。
然后……
后台,把admin文件夹里,language文件夹下中文语言包的名称,改成英语的名称,里面对应的引导文件名词同样由zh-cn改成en-gb。
前台,把catalog文件夹里,language文件夹下日语语言包的名称,改成英语的名称,同上,文件夹内引导文件的名称由japan改成en-gb。

如此,完美解决了我的需求,后台是中文,前台是日语。

SCSS,混合宏

混合宏的逻辑有点复杂,用法也挺多的,但是,真的很方便,很实用。
看了相关的文档,在自己的框架中,还是主要参考了bootstrap4的混合宏写法。
bootstrap4里面的混合宏层层关联,互相嵌套,各种变量,各种函数,需要全部理清来龙去脉才能知道具体怎么作用的。

主要是用来生成颜色,根据条件,生成不同颜色的按钮,或者其他场景的应用。
总之,还是要去理解清楚。
目前,大概的思路是清楚了,就是具体要多实践。

关于Sass的工作成果

一、创建了一个color变量库;
除基本色,另外包含19个色系,每个主色又包含约15种颜色渐变。
另外又覆盖了一百多个有名字的颜色。
并且,每个色系都增加maps函数,以便需要时调用。
同时针对常用社交icon,也预设了主色。
所有颜色值,均以十六进制颜色表达。

二、创建了一个class变量库
主要是css的属性进行预设变量。
涵盖几乎所有可能用到的属性。

以上,这两个变量库,理论上适用于任何使用Sass开发者。
后续按需增补。

完成3.0的Sass重构,接着……

划重点,论工作先后顺序的重要性!

之前考虑重构框架时,思索再三,还是决定先把3.0的重构一下,关键是旧版基本成型,而且已经使用在生产环境中。
这两天,再准备重构4.0的时候,我才发现,我的热情和精力可能被消耗殆尽了,已经很难平静的去做重构工作了。
这是因为,4.0版本虽是大版本的迭代,但还是蜕变于3.0版,绝大部分内容相同,只是命名和结构不同。

无奈,只好先搁置一段时间吧。
以后,尽量的权衡好工作的优先级再行动。

SCSS自动编译工具

windows下,使用koala实现Sass自动编译。
macOS下,使用codekit实现。

使用命令行命令:compass watch实现监听目录更改,自动编译。
但是,在windows下,大部分时间,监听都不是即时的,需要手动Ctrl+C,才会自动编译,而这个快捷键偏偏又是停止监听的快捷键。
尽管矛盾,但是,windows下的compass命令需要使用关闭的指令来威胁一下才会运行。

首选,还是推荐使用工具吧,koala是免费的,虽然没有codekit那么复杂的功能,但是简洁明了,足够用了。

以SCSS重构css framework

终于开始了,是的,心中默念了许久了,一直,迟迟不肯下手,这次算是终于下定决心去做了。

基本上,就在原基础上优化,最多的改变应该是对于颜色,除了少数不变的值,基本都给了变量名。
另外,就是嵌套,SCSS的结构看起来是简洁了很多。
输出的时候,暂时不压缩代码,毕竟,初次使用,保持格式化代码,有利于查漏补缺。

需要说明的是,增加变量,看似增加了工作量,但是,对于后期维护,却是节约了无非预估的时间。