WHMCS订购的专用/VPS服务器产品默认有几个选项,包括设置主机名、密码和ns地址。用户体验很差,只会增加用户的烦恼和麻烦。为了研究如何自动填充内容,我想摆脱选项验证,然后在提交后生成内容值。但是核心文件编辑起来好像不太容易,改动太大,无法强行删除,不如直接在页面生成。
创建WHMCS订单模板主题首先介绍一下WHMCS产品订购页面的模板文件路径:WHMCS根目录/templates/orderforms(目录下有几个样式主题,默认使用standard_cart)。模板文件的相应页面如下。
模板文件为了避免后续升级程序丢失所做更改的可能性,建议创建自定义主题(不用创建完整的主题,可以在要修改的页面上创建模板文件,其他页面继承使用父模板文件)。
创建一个自定义主题目录,假设名称为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>欢迎分享,转载请注明来源:内存溢出
评论列表(0条)