修改 WHMCS 订单模板,使之自动填充选项内容

修改 WHMCS 订单模板,使之自动填充选项内容,第1张

修改WHMCS订单模板,使之自动填充选项内容

WHMCS订购的专用/VPS服务器产品默认有几个选项,包括设置主机名、密码和ns地址。用户体验很差,只会增加用户的烦恼和麻烦。为了研究如何自动填充内容,我想摆脱选项验证,然后在提交后生成内容值。但是核心文件编辑起来好像不太容易,改动太大,无法强行删除,不如直接在页面生成。

创建WHMCS订单模板主题

首先介绍一下WHMCS产品订购页面的模板文件路径:WHMCS根目录/templates/orderforms(目录下有几个样式主题,默认使用standard_cart)。模板文件的相应页面如下。

模板文件 对应页面 products.tpl 查看产品类别和包含的产品 adddomain.tpl 域名注册顺序第一步 addons.tpl 查看产品附加服务(登录用户) domainrenewals.tpl 显示用户帐户中的域名以提供续订 configureproductdomain.TPL 选择域名(产品附带的域名) domainoptions.tpl 显示域名可用性检查结果 configureproduct.tpl 查看产品配置信息(在添加购物车之前) configuredomains.tpl 域名配置,设置ns地址或自定义字段 ordersummary.tpl 检查购物车的内容和总产品订单 viewcart.tpl 显示订单内容并开始结账流程 login.tpl 登录已注册的帐户 complete.tpl 结账流程的最后一步 注意:以上模板文件是订购流程的主要页面,模块。由页面加载的tpl文件也在目录中被细分。

为了避免后续升级程序丢失所做更改的可能性,建议创建自定义主题(不用创建完整的主题,可以在要修改的页面上创建模板文件,其他页面继承使用父模板文件)。

创建一个自定义主题目录,假设名称为custom_cart。红色字符是自己修改的Web目录路径。

mkdir/var/www/whmcs/templates/orderforms/custom_cart

然后在目录下创建theme.yaml配置文件,指定父主题,比如继承默认主题,内容如下。

config: parent:standard_cart

将要修改的模板文件复制到自定义主题目录,例如修改模板页面configureproduct.tpl

cp/var/www/whmcs/templates/orderforms/standard_cart/configureproduct.tpl/var/www/whmcs/templates/orderforms/custom_cart/configureproduct.tpl

启用自定义主题在WHMCS,在设置->:一般设置->;在“订购”选项卡下设置默认订单模板。或者在指定的产品组中设置,路径设置-->产品/服务-->;产品/服务->;编辑产品组->:订单模板.

随机生成HostName选项值

这里主机名使用uniqid()函数生成一个微秒级的时间戳,考虑到多线程和系统时间可能影响唯一性(实际重复的可能性极低,uniqid()时间戳精确到百万分之一秒),在字符串前面加上两个随机数(由mt_rand(10,99)生成)。添加蓝色参数设置字段不可编辑,浏览器自动补全功能可禁用。

<divclass="col-sm-6"> <divclass="form-group"> <labelfor="inputHostname">{$LANG.serverhostname}</label> <inputtype="text"name="hostname"class="form-control"id="inputHostname"value="host.{uniqid(mt_rand(10,99),false)}.com"readonly="readonly"autocomplete="off"placeholder="servername.yourdomain.com"> </div> </div>

如果想利用WHMCS内置的Smarty模板系统的存储变量生成随机数,可以使用{$smarty.now}生成UNIX时间戳(精确到秒,可以用date_format转换成友好的时间格式)。

如果不想在服务器端用PHP生成随机数,也可以用JS代码生成。这里有几个简单的例子。

随机生成RootPassword选项值

因为密码需要是不可预测的,并且尽可能随机和复杂,所以它们不能用时间戳来生成。可以通过random+hash+intercept函数生成,比如将特定范围内的随机数转换成md5字符串,然后从中截取12位字符。

<?phpechosubstr(md5(mt_rand(100000,999999)),0,12);?>

如果想生成更复杂的东西(包括大写字母和特殊字符),可以用str_shuffle()函数对预置的字符进行随机加扰(其随机算法随PHP的版本不同而不同,PHP7.1已经从默认的librand变成了Mersennetwister),然后从中截取所需长度的字符串。这种方法生成的密码每个字符只出现一次(其中易混淆的字符被删除),预置的字符可以重复添加以增加可能性。

<?phpechosubstr(str_shuffle("2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ!@#$%^&*~()-_{}+="),0,12);?>

以上两种方法都是比较简单的密码生成方法,可以满足一般的安全需求。为了寻求更安全的随机值,可以使用random_bytes()或openssl_random_pseudo_bytes()函数来生成它们。前者需要PHP7,后者需要PHP5。

修改方法和之前一样。密码输入元素在模板文件中找到,PHP密码生成函数设置在内容值中。

<divclass="col-sm-6"> <divclass="form-group"> <labelfor="inputRootpw">{$LANG.serverrootpw}</label> <inputtype="password"name="rootpw"class="form-control"id="inputRootpw"value="{substr(str_shuffle('2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ!@#$%^&*~()-_{}+='),0,12)}"readonly="readonly"autocomplete="off"> </div> </div> 设置NameServer选项值

NS地址对于一般只卖主机产品的商家来说用处不大,直接设置一个固定的默认值就可以了。

<divclass="col-sm-6"> <divclass="form-group"> <labelfor="inputNs1prefix">{$LANG.serverns1prefix}</label> <inputtype="text"name="ns1prefix"class="form-control"id="inputNs1prefix"value="ns1.example.com"readonly="readonly"autocomplete="off"placeholder="ns1"> </div> </div> <divclass="col-sm-6"> <divclass="form-group"> <labelfor="inputNs2prefix">{$LANG.serverns2prefix}</label> <inputtype="text"name="ns2prefix"class="form-control"id="inputNs2prefix"value="ns2.example.com"readonly="readonly"autocomplete="off"placeholder="ns2"> </div> </div> 隐藏 ConfigureServer选项内容块

修改后刷新页面,看看是否正常工作。如果没有问题,添加CSS样式隐藏页面选项。

<divclass="sub-heading"style="display:none;"> <span>{$LANG.cartconfigserver}</span> </div> <divclass="field-container"style="display:none;"> ... </div>

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/743874.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-29
下一篇 2022-04-29

发表评论

登录后才能评论

评论列表(0条)

保存
{label} {label} {label}