WHMCS 7.x 开发小经验小结-修改首页、修改菜单、简化注册

WHMCS是个很出名的IDC供应商管理系统,但是由于是加密程序,很多东西改起来不容易。比如你想做个注册页面,你就没法子做,因为你不知道密码的加密方式。不过有一些东西还是可以自定义的。

自定义首页

由于是加密程序,所以index.php你无法修改,怎么办呢?下面提供几个方案解决这个问题。

子站处理

要么把whmcs放一个子域名,比如user.xx.com

要么把whmcs放一个子目录,或者www.xx.com/user/

但是这两种建议是安装之前想好,否则的话,就要去更新授权了。要去购买的地方提交更改。

默认首页处理

静态首页:直接放index.html,一般这个会是默认首页。

动态首页:修改nginx或者apache服务器的配置文件,让默认首页改为home.php

  1. # nginx 例子
  2. server_name sdtclass.com www.sdtclass.com;
  3. index home.php index.html index.htm index.php default.html default.htm default.php;

如果是虚拟主机,并且是apache服务器的,也可以用.htaccess定义默认首页。

  1. # .htaccess例子
  2. Directory Index home.php index.html index.php

重写index.php

有的人不喜欢重写定义首页,比如我。因为潜意识里index才是首页呢。而且WHMCS里,首页也是指向index.php,所以我提供了另一个思路。

保存index.php,然后新建一个index.php,这样可以自定义首页的内容了。但是,,,WHMCS比较新的版本里,很多地址打开都依赖index.php。所以我们需要做一个处理。

比如公告页面的菜单连接是:index.php?rp=/announcements

但是,其实 http://www.sdtclass.com/announcements.php 就可以打开(不用复制了,这是举例)。代码又是加密的,我们又无法修改菜单里的连接,怎么办呢?所以我们只好写个PHP来处理了。

  1. <?php
  2. //判断是否有参数
  3. if($_GET) {
  4.     //rp参数
  5.     $url = $_GET['rp'];
  6.     //判断是否是rp这个参数
  7.     if($url) {
  8.         //重定向
  9.         Header("Location: $url.php");
  10.         exit// 退出
  11.     }
  12. }
  13. ?>
  14. //如果上面不成立,会输出下面内容。下面是首页内容

测试了可行是可行,发现下载页的不一样,不是download.php,而是downloads.php。于是。。

  1. <?php
  2. if($_GET) {
  3.     $url = $_GET['rp'];
  4.     if($url) {
  5.         //判断是否是下载页,如果是则定义链接。
  6.         if($url == '/download') {
  7.             Header("Location: downloads.php");
  8.             exit;
  9.         }
  10.         Header("Location: $url.php");
  11.         exit// 退出
  12.     }
  13. }
  14. ?>
  15. // 首页内容

然后好像就完美了?后来发现,不行啊,有的带id参数啊。于是乎用了stripos函数,这个函数是用于判断字符串里是否有这个字符。

  1. stripos(string,find,start)

可以参考:http://www.php.net/manual/zh/function.stripos.php

或者参考:http://www.w3school.com.cn/php/func_string_stripos.asp

实际应用如下:

  1. <?php
  2. if($_GET) {
  3.     $url = $_GET['rp'];
  4.     if($url) {
  5.         if($url == '/download') {
  6.             Header("Location: downloads.php");
  7.             exit;
  8.         }elseifstripos($url, '/announcements/') !== false){
  9.             //判断如果URL含有这部分字符,也就是新闻页的字符
  10.             $pid = mb_substr($url,15 ); //提取第15个和后面的,也就是id
  11.             Header("Location: announcements.php?id=$pid");
  12.             //重定向到重新拼接的URL
  13.             exit;
  14.         }
  15.         Header("Location: $url.php");
  16.         exit// 退出
  17.     }
  18. }
  19. ?>
  20. // 首页内容

你以为事情真的那么简单吗,我也想啊。。然后我发现帮助中心的URL就比较特殊了。。

比如:http://www.xukhost.com/index.php?rp=/knowledgebase/15/755.html

好吧,这个,,只能正则了。。于是。。

  1. <?php
  2. if($_GET) {
  3.     $url = $_GET['rp'];
  4.     if($url) {
  5.         if($url == '/download') {
  6.             Header("Location: downloads.php");
  7.             exit;
  8.         }elseifstripos($url, '/announcements/') !== false){
  9.             $pid = mb_substr($url,15 );
  10.             Header("Location: announcements.php?id=$pid");
  11.             exit;
  12.         }elseif(preg_match('#/knowledgebase/(\d+)#i', $url$match)) {
  13.           $pid = $match[1];
  14.             Header("Location: knowledgebase.php?action=displayarticle&id=$pid");
  15.             exit;
  16.         }
  17.         Header("Location: $url.php");
  18.         exit// 退出
  19.     }
  20. }
  21. ?>
  22. // 首页内容

定义引用

经过这样的反复,反复,再反复,我都怀疑人生了。。。我觉得不行吧,既然能让index.php处理,何不直接让他处理呢?

所以也可以是,,,index.php改名,新的index判断是否有参数,如果是就引用这个,不是则输出首页内容。。

好吧,你以为我耍你们呢,其实这两个方案都是可以的。上面那个21行的代码暂时测试没问题。两个方案二选一啦。

自定义菜单

看了很久的模板代码,发现个问题,WHMCS新版本的菜单都是系统生成的了。。。但是,游客访问的话,菜单第一个是指向index.php,而登陆后的话,则是指向会员中心页,你说我这个地方翻译成什么都尴尬好吧?

后面我发现了,其实写死就好了。。。自己利用模板提供的判断方法,判断和引用即可。。

  1. {if $loggedin}
  2.     <ul class="nav nav-menu">
  3.         {include file="$template/includes/menu.tpl" navbar=$primaryNavbar}
  4.     </ul>
  5. {else}
  6.     <ul class="nav nav-menu">
  7.         {include file="$template/includes/menus.tpl"}
  8.     </ul>
  9. {/if}

上面menu.tpl是自带的,我写了个新的menus.tpl,然后这个新的就可以自己写菜单了。。。当然了,登陆页的菜单,也可以引用另一个文件来解决。这样两个菜单就都可以自定义了。不带navber参数即可。

WHMCS 7.x 开发小经验小结-修改首页、修改菜单、简化注册

简化注册

这个利用两个东西,一个是隐藏,一个是赋值。

比如,公司,地址2,这两个输入框不是必填,直接隐藏。

  1. <div class="form-group" style="display: none;">
  2.     <label class="col-sm-3 control-label" for="companyname">{$LANG.clientareacompanyname}</label>
  3.     <div class="col-sm-6">
  4.         <input type="text" name="companyname" id="companyname" value="{$clientcompanyname}" class="form-control"/>
  5.     </div>
  6. </div>

上面用CSS(display:none;),隐藏了整个输入框。可是呢必填项不仅仅要隐藏,而且要加默认值,这样就可以避免不填写带来的无法跳过验证了。(不加密多好,可以直接去掉判断字符串长度。。。)

  1. <div class="col-sm-6">
  2.     <input type="text" name="city" id="city" value="city" class="form-control" {if !in_array('city', $optionalFields)}required{/if} />
  3. </div>

这个value里的变量,改为写死的city,这时候就可以了。变量囊是你填写后注册不了的时候返回才输出的。所以改为写死的,然后加css隐藏即可。【不过我不建议隐藏,因为域名注册需要。】

官方文档和API

当然了,WHMCS官方也有提供API,可以修改的东西还是有不少的。也可以做插件的。

官方文档:https://docs.whmcs.com/Main_Page

API文档:https://developers.whmcs.com/api/

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

目前评论:1   其中:访客  0   博主  0

  1. avatar Ourboke联盟 1

    大神啊

评论加载中...

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

图片 表情