控制器劫持
如下图所示:
上述的效果是怎样实现的呢?劫持究竟是怎么一会事?怎样劫持?这样的问题会出现在我们的脑海里。我们首先来分析一下上例的劫持过程和劫持点。上例中“编辑”链接是指向b2c_ctl_admin_goods_editor这个class的edit方法。原代码如下:
<?php
...
function edit($goods_id){
$this->goods_id = $goods_id;
$oGoods = &$this->app->model('goods');
$goods = $oGoods->dump($goods_id,'*','default');
$this->_editor($goods['type']['type_id']);
if(is_numeric($goods['store'])) $goods['store'] = (float)$goods['store'];
if(is_array($goods['product'])){
foreach($goods['product'] as $k=>$v){
$goods['product'][$k]['store'] = $v['store']!==null ? (float)$v['store'] : '';
}
}
$this->pagedata['productkey'] = serialize(array_keys($goods['product']));
$this->pagedata['goods'] = $goods;
$this->pagedata['app_dir'] = app::get('b2c')->app_dir;
if(!is_array($goods['adjunct']))
$this->pagedata['goods']['adjunct'] = unserialize($goods['adjunct']);
else
$this->pagedata['goods']['adjunct'] = $goods['adjunct'];
foreach($oGoods->getLinkList($goods_id) as $rows){
if($rows['goods_1'] == $goods_id){
$aLinkList[] = $rows['goods_2'];
$linkType[$rows['goods_2']] = array('manual'=>$rows['manual']);
}else{
$aLinkList[] = $rows['goods_1'];
$linkType[$rows['goods_1']] = array('manual'=>$rows['manual']);
}
}
$oUrl = kernel::single('site_route_app');
$goods_url = app::get('site')->router()->gen_url( array( 'app'=>'b2c','real'=>1,'ctl'=>'site_product','args'=>array($goods_id) ) );
$goods_url = substr( $goods_url , strlen( app::get('site')->base_url() ) );
$url = $oUrl->fetch_static( array( 'static'=>$goods_url ) );
$this->pagedata['goods_static'] = $url['static'];
$this->pagedata['goods']['glink']['items'] = $aLinkList;
$this->pagedata['goods']['glink']['moreinfo'] = $linkType;
$this->pagedata['goods']['goods_setting'] = $goods['goods_setting'];
$this->pagedata['IMAGE_MAX_SIZE'] = IMAGE_MAX_SIZE;
$this->singlepage('admin/goods/detail/frame.html');
...
}
在app\shangchao\services.xml加入如下代码:
<services> ... <service id="desktop_controller_display.b2c.admin_goods_editor.edit"> <class>shangchao_ctl_admin_goods_editor</class> </service> ... </services>
在app\controller\admin\goods\目录下添加文件editor.php主要代码如下:
<?php
class shangchao_ctl_admin_goods_editor extends b2c_ctl_admin_goods_editor{
function get_file(){
//$this->xiangou_add();
$goods_id=$this->pagedata['goods']['goods_id'];
$db = &kernel::database();
$supplier_name=$db->selectrow('select sdb_shangchao_goods_supplier.supplier_id,sdb_shangchao_supplier.supplier_name from sdb_shangchao_goods_supplier,sdb_shangchao_supplier where sdb_shangchao_goods_supplier.supplier_id=sdb_shangchao_supplier.supplier_id and goods_id="'.$goods_id.'"');
$supplier_name;
$obj_editor = kernel::single('b2c_ctl_admin_goods_editor');
$obj_editor->pagedata['supplier_name']=$supplier_name['supplier_name'];
$obj_editor->pagedata['supplier_id']=$supplier_name['supplier_id'];
if(isset($obj_editor->pagedata['sections']['basic'])){
$obj_editor->pagedata['sections']['basic']['app'] = 'shangchao';
}
return 'admin/goods/detail/frame.html';
}
...
D:\php\shangchao\app\base>cmd update Scanning local Applications... ok. ?Updating base_application_service@shangchao. Installing service passport Installing service pam_login_listener Installing service pam_account_login_name Installing service api_signup Installing service desktop_controller_display.b2c.admin_goods_editor.edit Installing service desktop_controller_display.b2c.admin_goods_virtualcat.addNew Installing service desktop_controller_display.b2c.admin_goods_virtualcat.edit Installing service b2c.order.act_ext_btn Installing service site_controller_display.b2c.site_cart.loginbuy Installing service site_controller_display.b2c.site_gallery.index Installing service member_index Installing service b2c_addtocart_check Installing service b2c_promotion_solution_tpl_apps Installing service b2c_cart_render_items_apps Installing service b2c_cart_render_items_goods_apps Installing service api.shangchao.goods ... Installing service b2c_mdl_goods.filter Installing service b2c_mdl_goods.extends_cols Applications database and services is up-to-date, ok.