ecstore有自己的app机制,类似wp的plugin,但是和wp的plugin比较起来,实在是差得有些远了。每一个app都有其自己的router路径,存在base_settings表里的sitemap下。这次我们需要添加一个wap的赠品页面,由于ec里自带的赠品页面没有wap页面,只有site,所以需要添加wap页面的控制器,这里没有用到默认的app安装方式进行安装。实际上这个app已经存在,只是没有wap端而已。操作过程中,新建控制器文件/gift/controller/wap/gift.php后,通过页面无法访问控制器文件,猜测可能是sitemaps的问题,于是追踪kernel代码,到达最后两句。
self::$__router = app::get($app)->router(); self::$__router->dispatch($path);
继续去查看router()方法后,这里的router()调用的是/wap/lib/router.php,在该文件里构造函数声明了sitemaps.
function __construct($app){
$this->app = $app;
$this->sitemap = app::get('wap')->getConf('sitemaps');
...
}
将这里的sitemap打印出来看,发现是数组形式的内容,具体是形成了各种router,但是很明显,没有gift_wap的router。
Array
(
[index] => Array
(
[0] => wap
[1] => default
[2] => 首页
[3] =>
[use_ssl] =>
)
[widgetsproinstance] => Array
(
[0] => wap
[1] => proinstance
[2] => 挂件实例展示
[3] =>
[use_ssl] =>
)
=> Array
(
[0] => b2c
[1] => wap_gallery
[2] => 全部商品
[3] =>
[use_ssl] =>
)
...
)
于是找到/wap/lib/application/module.php文件,install方法里有下面生成sitemaps的方法:
kernel::single('wap_module_base')->create_site_config();
最后看这个方法的原型,需要先读取modules表里的信息,而这个表的信息是app install的时候会添加进去的。
class wap_module_base
{
final public function create_site_config()
{
$conf = $this->assemble_config();
return $this->write_config($conf);
}
final public function assemble_config()
{
$rows = app::get('wap')->model('modules')->select()->where('enable = ?', 'true')->instance()->fetch_all();
if(is_array($rows)){
$conf = array();
foreach($rows AS $row){
$conf[$row['path']] = array($row['app'], $row['ctl'], $row['title'], trim($row['extension']),
'use_ssl' => $row['use_ssl'] === 'true' ? true : false);
}
return $conf;
}
return false;
}
final public function write_config($conf)
{
if(is_array($conf)){
return app::get('wap')->setConf('sitemaps', $conf);
}else{
return false;
}
}
}
至此,一切简单明了了,每个app install的时候会自动生成app的module,然后重建sitemap,如果你像tiandi一样没有用cmd机制的话,那么现在你也能手动创建sitemaps了
