新年
快乐

垃圾堆中的精品

垃圾堆中的精品

关于人人分销/人人商城的二次开发路由解析

最近在做人人分销的二次开发,遇到奇葩客户,没办法,只能硬着头皮上,需要做一个后台设定可以设置是否默认会员自动升级的设置,然后就扒了一边微擎+人人分销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();
}

到此为止,发现正是这里,然后就找到了我们所需要的文件。这里只是一个简单的例子,不过中间会用到好多下断点打印。望高手勿喷。

评论回复

回到顶部