跳到内容
必威体育论坛必威精装下载APPRedfin解决方案的标志必威体育论坛必威精装下载APPRedfin解决方案的标志 联系
Salesforce标志在建筑上

在D7中将Salesforce数据作为分类法术语拉入

Salesforce套件是一组用于Drupal的模块,允许将数据从Salesforce拉入Drupal,以及将数据从Drupal推入Salesforce。模块api提供了一些非常有用的钩子,包括Salesforce Pull模块实现的_salesforce_pull_entity_presave钩子。在这篇博客文章中,我们将讨论如何使用该钩子将三个Salesforce自定义字段(选择列表)作为分类术语拉入Drupal。

创建一个自定义模块来存放名为_salesforce的钩子,并创建一个_salesforce。模块文件。在该文件中,加入从Salesforce Suite模块中的Salesforce .api.php复制的presave函数:

/**
*在实体被salesforce pull操作保存之前对其进行操作。
实现应该抛出一个SalesforcePullException来防止pull。

* @param实体美元
* Drupal实体对象。
* @param array $sf_object . * @param array $sf_object . *
* Salesforce查询结果数组。
* @param SalesforceMapping $sf_mapping . * /
*使用Salesforce映射来拉出这个记录

* @throws SalesforcePullException
*/
函数hook_salesforce_pull_entity_presave($entity, $sf_object, $sf_mapping) {
如果(! some_entity_validation_mechanism(实体)美元){
throw new SalesforcePullException('Refused to pull invalid entity.');

//使用虚构的Salesforce结果对象设置虚构的属性。
实体- > example_property = $ sf_object [' Lookup__r '] [' Data__c '];

看一下函数体中的示例代码,然后删除它。

钩子在salesforce_pull_process_records函数期间被调用,代码如下:

//允许模块在实体保存之前做出反应。
Module_invoke_all ('salesforce_pull_entity_presave', $wrapper->value(), $sf_object, $sf_mapping);

这就是我们用自定义代码进行干预的地方。通过这个钩子,我们可以访问从Salesforce查询的数据,以及即将保存到Drupal中的实体,所以这是在两个数据集之间进行任何转换的最佳时机。

我们必须解决的第一个问题是,默认情况下,Salesforce Pull模块在处理每个Salesforce记录时将创建一个新节点,而不是修改Drupal站点上的现有节点。如果你不想要这种行为,请添加以下代码:

//首先,不要创建新节点
如果(收取(实体- > is_new) & & $实体- > is_new = = TRUE) {
throw new SalesforcePullException('尝试创建一个新节点');

你可能还想看看_salesforce_pull_mapping_object_alter钩子以帮助预匹配节点。

然后,我们需要定义分类法词汇表:

/ /查找表
$ names_vids =阵列(
' exampleevocabularya ' =>数组('vid' => 1, 'field' => 'field_example_vocabulary_a'),
' exampleevocabularyb ' =>数组('vid' => 2, 'field' => 'field_example_vocabulary_b'),
' exampleevocabularyc ' =>数组('vid' => 3, 'field' => 'field_example_vocabulary_c'),
);

像这样从$sf_object中收集术语:

/ /收集方面
$传入=阵列(
' exampleevocabularya ' =>爆炸(';',$sf_object['Terms_A__c']) ?$ sf_object [' Terms_A__c ']:“),
' exampleevocabularyb ' => * * (';', $sf_object['Terms_B__c']) ?$ sf_object [' Terms_B__c ']:“),
' exampleevocabularyc ' =>爆炸(';',$sf_object['Terms_C__c']) ?$ sf_object [' Terms_C__c ']:“),
);

你需要清理传入的数据:

array_walk_recursive(传入的美元,“修剪”);
$incoming = array_map('array_filter', $incoming); / /输入数组

然后,我们需要对传入的术语进行迭代,如果Drupal中还不存在新术语,则创建新术语。最后,我们在需要的节点上设置tid:

Foreach ($incoming as $vname => $term_names) {
数组$ tid = ();
Foreach ($term_names as $term_name) {
$tid = taxonomy_get_term_by_name($term_name, $vname);
如果(空(tid)美元){
//如果我们还没有这个项,就添加它
$newterm = new stdClass();
newterm - > = $ term_name名称;
newterm - > vid = names_vids美元($ vname]['视频'];
taxonomy_term_save ($ newterm);
tid = newterm美元- > tid;

array_push (tid, tid美元);

//设置目标节点的tid
//首先取消所有已存在的tid
实体- > {$ names_vids [$ vname][‘领域’]}= array ();
//在这里使用$length,因为我们在循环中修改$tids
美元$长度= count (tid);
For ($i = 0;我<美元长度;$我+ +){
(tid = array_shift美元tid);
(tid =中的美元tid) [0];
实体- > {$ names_vids [$ vname][‘领域’]}[LANGUAGE_NONE] [$ i] [' tid '] = $ tid;

这将使您的Drupal节点(在每次cron运行时)与Salesforce对象上添加或删除的任何条款保持同步。

(如果你在让Salesforce在一次cron运行中完成整个队列时遇到困难,我推荐这篇博客文章作为故障排除提示:Drupal Salesforce没有更新记录.我们特别推荐队列UI模块。)

Baidu