最近在做人人分销的二次开发,遇到奇葩客户,没办法,只能硬着头皮上,需要做一个后台设定可以设置是否默认会员自动升级的设置,然后就扒了一边微擎+人人分销v2的路由。记录分享下~
首先微擎目录下有app 和 web 目录,可以看出来是web是PC端控制路由,app就是手机端模块控制路由。这里以人人分销手机端为主,记录下app的路由。
微擎构建网址 【*/app/index.php?i=3&c=entry&m=ewei_shopv2&do=mobile】,在这个index.php文件里面,前半部分判断了网站的基础设置(站点状态、公众号状态等),在68行左右,出现了解析url获取路由的代码:
$controllers = array();
$handle = opendir(IA_ROOT . '/app/source/');
if(!empty($handle)) {
while($dir = readdir($handle)) {
if($dir != '.' && $dir != '..') {
$controllers[] = $dir;
}
}
}
if(!in_array($controller, $controllers)) {
$controller = 'home';
}
$init = IA_ROOT . "/app/source/{$controller}/__init.php";
if(is_file($init)) {
require $init;
;
}
解析出来,然后请求$init,打印$init发现是在*/app/source/entry/_init.php。
打开_init.php文件,直观看到先读取模块路径,接着判断了插件模块是否存在,然后创建引入了模块site.php文件,随后拼接了方法。
$eid = intval($_GPC['eid']);
if(!empty($eid)) {
$sql = 'SELECT * FROM ' . tablename('modules_bindings') . ' WHERE `eid`=:eid';
$entry = pdo_fetch($sql, array(':eid' => $eid));
$_GPC['m'] = $entry['module'];
} else {
$entry = array(
'module' => $_GPC['m'],
'do' => $_GPC['do'],
'state' => $_GPC['state'],
'direct' => 0
);
}
$moduels = uni_modules();
if (empty($moduels[$entry['module']])) {
message('您访问的功能模块不存在,请重新进入');
}
if(empty($entry) || empty($entry['do'])) {
message('非法访问.');
}
$_GPC['__entry'] = $entry['title'];
$_GPC['__state'] = $entry['state'];
define('IN_MODULE', $entry['module']);
$_W['current_module'] = $entry['module'];
$site = WeUtility::createModuleSite($entry['module']);
if(!is_error($site)) {
$method = 'doMobile' . ucfirst($entry['do']);
exit($site->$method());
}
exit();
所以这里看到拼接的方法是doMobile(web就是doWeb),所以访问site.php文件下的doMobileMobile()方法。接着打开人人分销根目录下的site.php文件,找到doMobileMobile()方法如下:
public function getMenus() {
global $_W;
return array(
array('title' => '管理后台', 'icon' => 'fa fa-shopping-cart', 'url' => webUrl())
);
}
public function doWebWeb() {
m('route')->run();
}
public function doMobileMobile() {
m('route')->run(false);
}
public function payResult($params) {
return m('order')->payResult($params);
}
发现里面只有三个方法,一直跟随的doMobileMobile()方法也在里面,但是又重新定向了路由。so,继续跟随,发现是人人分销的一个模块,所以到ewei_shopv2\core\model\ 目录下的route.php中查看。发现是先判断了登录、是否为插件路由,然后在对应到了相关的文件下,并默认一个main主方法。我们这里找到非插件路由定向。
$root = EWEI_SHOPV2_PLUGIN . $routes[0] . '/core/' . (($isweb ? 'web' : 'mobile')) . '/';
发现在core下面的mobile。继续跟随。
public function main() {
global $_W;
global $_GPC;
$openid = $_W['openid'];
$member = m('member')->getMember($openid);
if(!$member['mobile'] || !$member['realname'])
show_message('您没有绑定手机号!点击确认立即绑定', mobileUrl('member/info', array('mid' => $_GPC['mid'], 'backurl' => ($_W['isajax'] ? '' : $url))), 'error');
$this->diypage('home');
$uniacid = $_W['uniacid'];
$mid = intval($_GPC['mid']);
$index_cache = $this->getpage();
if (!(empty($mid))) {
$index_cache = preg_replace_callback('/href=[\\\'"]?([^\\\'" ]+).*?[\\\'"]/', function($matches) use($mid) {
$preg = $matches[1];
if (strexists($preg, 'mid=')) {
return 'href=\'' . $preg . '\'';
}
if (!(strexists($preg, 'javascript'))) {
$preg = preg_replace('/(&|\\?)mid=[\\d+]/', '', $preg);
if (strexists($preg, '?')) {
$newpreg = $preg . '&mid=' . $mid;
} else {
$newpreg = $preg . '?mid=' . $mid;
}
return 'href=\'' . $newpreg . '\'';
}
}
, $index_cache);
}
$shop_data = m('common')->getSysset('shop');
include $this->template();
}
到此为止,发现正是这里,然后就找到了我们所需要的文件。这里只是一个简单的例子,不过中间会用到好多下断点打印。望高手勿喷。
评论回复