返回列表 回复 发帖

如何处理模块之间携带字段的问题?

携带字段分两种情况:
1、在模块A的相关信息创建与模块A关联的模块B记录时,除了显示模块A的名称、或编号、或主题,还需要显示模块A的其它信息。例如在客户的相关信息创建报价单时,除了在报价里显示客户名称,还需要显示客户的电话和地址。
2、在创建模块B记录时,模块A的信息是通过弹出框选择模块A的记录,选中后,模块B中除了显示模块A的名称、或编号、或主题,还需要显示模块A的其它信息。例如,创建报价单时,选择客户名称时,还需要把客户的电话和地址也选中到报价单中。
如图1所示:
tiaoshi.png
2009-11-12 13:57


第一种情况怎么解决呢?
第一种情况比较容易解决,只需要修改模块B中的EditView.php即可,例如报价模块里的modules/Quotes/EditView.php
添加的代码如下:
  1. if(isset($_REQUEST['return_module']) &&  $_REQUEST['return_module']=='Accounts'){ //判断是从客户的相关信息创建报价,如果不是将不执行以下代码
  2. $focus->column_fields['account_id'] = $_REQUEST['return_id'];
  3. //return_id是客户的ID,把客户ID赋值给报价单的实例$focus
  4. require_once('modules/Accounts/Accounts.php');//把Accounts.php include进来
  5. $acct_focus = new Accounts();//生成客户的实例
  6. $acct_focus->retrieve_entity_info($_REQUEST['return_id'],"Accounts");//从数据库中获取客户的信息
  7. $focus->column_fields['phone']=$acct_focus->column_fields['phone']; //把客户的电话字段的值赋给报价单的实例$focus
  8. $focus->column_fields['address']=$acct_focus->column_fields['bill_street'];//把客户的地址字段的值赋给报价单的实例$focus
  9. }
复制代码
在赋值的时候,一定要知道模块B和模块A的相互对应的字段名称,例如客户模块的字段名称bill_street对应报价模块的字段名称address2个模块的字段名称一般都不一样,因为模块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/目录中,里面的代码如下:
  1. <?php
  2. if(isset($_REQUEST['accountid']) && $_REQUEST['accountid'] != "")
  3. {
  4. require_once('modules/Accounts/Accounts.php');
  5. require_once("include/Zend/Json.php");
  6. $focus = new Accounts();
  7. $focus->retrieve_entity_info($_REQUEST['accountid'],"Accounts");//从数据库中获取客户的信息
  8. $json = new Zend_Json();
  9. $jsonaccount = $json->encode($focus->column_fields);//把客户的信息转成json支持的格式
  10. echo $jsonaccount; //把json转成的客户信息发送给浏览器客户端
  11. }
  12. die;
  13. ?>
复制代码
第二:获取选择模块A时,选中模块A记录时执行的js脚本函数的名称,如图2所示:
account1.png
2009-11-12 13:57


浏览器一定要使用Firefox或遨游才能获取执行的js脚本函数的名称。
如图3和图4所示,就可以知道选中客户名称后执行的js脚本函数的名称为set_return_contact_address
account2.png
2009-11-12 13:57


如图4
account3.png
2009-11-12 13:59

第三步:找到模块Ajs文件的,例如客户模块下的modules/Accounts/Account.js文件,找到js文件中的第二步找到的js函数名称set_return_contact_address,在函数的最后加上以下代码:
  1. if(window.opener.setAccountInfo != undefined)
  2. {
  3. window.opener.setAccountInfo(account_id);
  4. }
复制代码
注意在函数结尾的大括号前面。
目的是当执行完set_return_contact_address函数后,要调用模块Bjs中的函数setAccountInfo函数,并把模块AID传给模块Bjs中的js函数。setAccountInfo这个函数名称是自己定义的,模块A不一样,函数名称也可以不一样。
第四步:找到模块Bjs文件,例如报价单的modules/Quotes/Quote.js文件,在Quote.js中增加setAccountInfo 函数,名称即为第三步中设定的js函数名称,2个函数名称一定要一样。
函数代码如下:
  1. function setAccountInfo(accountid) {
  2.         $("status").style.display="inline";//当执行这个函数时,显示执行状态图片
  3.         new Ajax.Request(
  4.         'index.php',
  5.         {queue: {position: 'end', scope: 'command'},
  6.         method: 'post',
  7.         postBody: 'module=Accounts&action=AccountsAjax&file=getAccountInfo&ajax=true&accountid='+encodeURIComponent(accountid),
  8.         onComplete: function(response) {
  9.                 result = response.responseText;
  10.                 if(result != "") {
  11.                         accountarr = JSON.parse(result);//解析为js数组
  12.                         document.EditView.phone.value = accountarr["phone"];
  13.                         document.EditView.address.value = accountarr["bill_street"];
  14.                         $("status").style.display="none";
  15.                 }

  16.                 }

  17.                 });
  18. }
复制代码
以上js代码的作用是通过Ajax调用第一步中创建的php文件getAccountInfo.phpPostbody后面的参数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文件。
如果在修改中,有什么问题请与我们联系,谢谢支持!
国内最简单易用的CRM-易客CRM
返回列表