携带字段分两种情况:
1、在模块A的相关信息创建与模块A关联的模块B记录时,除了显示模块A的名称、或编号、或主题,还需要显示模块A的其它信息。例如在客户的相关信息创建报价单时,除了在报价里显示客户名称,还需要显示客户的电话和地址。
2、在创建模块B记录时,模块A的信息是通过弹出框选择模块A的记录,选中后,模块B中除了显示模块A的名称、或编号、或主题,还需要显示模块A的其它信息。例如,创建报价单时,选择客户名称时,还需要把客户的电话和地址也选中到报价单中。
如图1所示:
第一种情况怎么解决呢?
第一种情况比较容易解决,只需要修改模块B中的EditView.php即可,例如报价模块里的modules/Quotes/EditView.php
添加的代码如下:- if(isset($_REQUEST['return_module']) && $_REQUEST['return_module']=='Accounts'){ //判断是从客户的相关信息创建报价,如果不是将不执行以下代码
- $focus->column_fields['account_id'] = $_REQUEST['return_id'];
- //return_id是客户的ID,把客户ID赋值给报价单的实例$focus
- require_once('modules/Accounts/Accounts.php');//把Accounts.php include进来
- $acct_focus = new Accounts();//生成客户的实例
- $acct_focus->retrieve_entity_info($_REQUEST['return_id'],"Accounts");//从数据库中获取客户的信息
- $focus->column_fields['phone']=$acct_focus->column_fields['phone']; //把客户的电话字段的值赋给报价单的实例$focus
- $focus->column_fields['address']=$acct_focus->column_fields['bill_street'];//把客户的地址字段的值赋给报价单的实例$focus
- }
复制代码 在赋值的时候,一定要知道模块B和模块A的相互对应的字段名称,例如客户模块的字段名称bill_street对应报价模块的字段名称address,2个模块的字段名称一般都不一样,因为模块B中字段很多是自定义字段,字段名称是已cf_开头的。
如何查看字段名称,请参看这里:http://www.crmone.cn/bbs/viewthread.php?tid=436&extra=page%3D1
以上代码要放在:
$focus->retrieve_entity_info相关代码的后面和
$smarty->assign("BLOCKS",getBlocks相关代码的前面,注意PHP的语法一定要正确。
第二种情况比较复杂,要分3个步骤:
第一步:创建获取模块A信息的PHP文件,例如客户模块的getAccountInfo.php,放在modules/Accounts/目录中,里面的代码如下:- <?php
- if(isset($_REQUEST['accountid']) && $_REQUEST['accountid'] != "")
- {
- require_once('modules/Accounts/Accounts.php');
- require_once("include/Zend/Json.php");
- $focus = new Accounts();
- $focus->retrieve_entity_info($_REQUEST['accountid'],"Accounts");//从数据库中获取客户的信息
- $json = new Zend_Json();
- $jsonaccount = $json->encode($focus->column_fields);//把客户的信息转成json支持的格式
- echo $jsonaccount; //把json转成的客户信息发送给浏览器客户端
- }
- die;
- ?>
复制代码 第二步:获取选择模块A时,选中模块A记录时执行的js脚本函数的名称,如图2所示:
浏览器一定要使用Firefox或遨游才能获取执行的js脚本函数的名称。
如图3和图4所示,就可以知道选中客户名称后执行的js脚本函数的名称为set_return_contact_address
如图4:
第三步:找到模块A的js文件的,例如客户模块下的modules/Accounts/Account.js文件,找到js文件中的第二步找到的js函数名称set_return_contact_address,在函数的最后加上以下代码:- if(window.opener.setAccountInfo != undefined)
- {
- window.opener.setAccountInfo(account_id);
- }
复制代码 注意在函数结尾的大括号前面。
目的是当执行完set_return_contact_address函数后,要调用模块B的js中的函数setAccountInfo函数,并把模块A的ID传给模块B的js中的js函数。setAccountInfo这个函数名称是自己定义的,模块A不一样,函数名称也可以不一样。
第四步:找到模块B的js文件,例如报价单的modules/Quotes/Quote.js文件,在Quote.js中增加setAccountInfo 函数,名称即为第三步中设定的js函数名称,2个函数名称一定要一样。
函数代码如下:- function setAccountInfo(accountid) {
- $("status").style.display="inline";//当执行这个函数时,显示执行状态图片
- new Ajax.Request(
- 'index.php',
- {queue: {position: 'end', scope: 'command'},
- method: 'post',
- postBody: 'module=Accounts&action=AccountsAjax&file=getAccountInfo&ajax=true&accountid='+encodeURIComponent(accountid),
- onComplete: function(response) {
- result = response.responseText;
- if(result != "") {
- accountarr = JSON.parse(result);//解析为js数组
- document.EditView.phone.value = accountarr["phone"];
- document.EditView.address.value = accountarr["bill_street"];
- $("status").style.display="none";
- }
- }
- });
- }
复制代码 以上js代码的作用是通过Ajax调用第一步中创建的php文件getAccountInfo.php,Postbody后面的参数file=getAccountInfo即表示调用第一步中创建的php文件,获取到客户属性后,使用json解析为一个数组,然后再把数据中的值赋给当前模块B的表单中对应字段的值,模块B字段名称和模块A字段名称与第一种情况下找到的字段是一样的,模块B和模块A也是一一对应的。
赋值成功后,隐藏执行状态的图片,具体代码为:$("status").style.display="none";
Js函数中需要注意的地方是postbody后面的参数,module对应的参数即为模块A的目录名称,action对应的参数为“模块A的目录名称”+“Ajax”,file后面的参数为第一步中创建的php文件名称,注意不带php后缀,accountid即为js函数的参数,是第三步中传过来的。
通过以上4个步骤,就可以把需要的字段的值传送到模块B中,不需要修改相关的php文件。
如果在修改中,有什么问题请与我们联系,谢谢支持! |