SugarCRM发票添加逻辑钩子来计算线价

时间:2016-07-14 09:50:40

标签: php hook sugarcrm invoice

使用SugarCRM创建发票时,在发票明细中有单位和单价的数量。我想自动填充现场线价格,这只是上述两个字段的产物。 这是我在custom / modules / C_Inc_Invoice_Detail目录中添加的内容:

logic_hook.php

<?php

    $hook_version = 1;

    $hook_array = array();
    $hook_array['after_save'] = array();
    $hook_array['after_save'][] = array(
        1,
        'Auto Fill Line price',
        'custom/modules/C_Inv_Invoice_Detail/autofilllineprice.php',
        'AutoFillLinePrice',
        'autofilllineprice'
    );
    ?>

和autofilllineprice.php:

<?php
    //prevents directly accessing this file from a web browser
    if
    (!defined('sugarEntry') ||!sugarEntry) die('Not A Valid Entry Point');

    class AutoFillLinePrice {

    function autofilllineprice($bean, $event, $arguments){
    $line_price = $bean->unit_price * $bean->number_units;    
    }
    }
?>
你可以建议吗?

1 个答案:

答案 0 :(得分:0)

这篇文章没有直接回答这个问题,但它记录了完成类似要求所涉及的步骤。 SugarCE-6.5.22中的帐户模块的字段年度收入,它显示在 DetailView 中,如下所示。

Accounts Module - DetailView

以下是添加新字段所涉及的步骤,该字段显示转换为其他货币的此字段的值。

  1. 第一步是创建一个非db字段,该字段将保存此新货币的值。为此,我们需要创建两个文件,一个用于定义字段(&#34; custom_fields.php&#34;),另一个用于定义该字段的特定于语言的dispplay值(&#34; en_us_custom_fields.php&#34 )。这两个文件将在下面提到的位置创建。如果不存在,请创建所需的目录结构。
  2. 自定义\扩展\模块\帐户\分机\ Vardefs \ custom_fields.php

    <?php
    
        if (!defined('sugarEntry') ||!sugarEntry) die('Not A Valid Entry Point');
    
        $dictionary['Account']['fields']['annual_revenue_inr'] = array(
                    'name' => 'annual_revenue_inr',
                    'vname' => 'LBL_ANNUAL_REVENUE_INR',
                    'label'=>'LBL_ANNUAL_REVENUE_INR',
                    'type' => 'name',
                    'module' => 'Accounts',
                    'source' => 'non-db',
                    'studio' => array('detailview'=>true),
                    'default_value' => '',
                    'help' => 'Annual Revenue(INR)',
                    'comment' => 'Annual Revenue(INR)',
                    'reportable' => true,
                    'audited' => false,
                    'duplicate_merge' => false,
                    'importable' => 'true',         
                );
    
    ?>
    

    自定义\扩展\模块\帐户\分机\语言\ en_us_custom_fields.php

    <?php
    
        if (!defined('sugarEntry') ||!sugarEntry) die('Not A Valid Entry Point');
    
        $mod_strings['LBL_ANNUAL_REVENUE_INR'] = 'Annual Revenue(INR)';
    
    ?>
    

    添加这两个文件后,我们需要运行 Admin - &gt; Repair - &gt; Quick Repair and Rebuild 。完成后,如果我们打开管理员 - >工作室并展开帐户 - &gt;布局 - &gt; DetailView ,我们应该会看到我们的新内容在那里创建了字段。我们可以将它拖放到我们希望它出现的布局中,然后单击保存&amp;部署即可。

    Studio - Accounts Module DetailView Layout

    现在,这个新字段应该在帐户的详细信息视图中可见。

    1. 下一个任务是填充此新货币的值。这可以使用SugarCRM提供的逻辑钩子来实现。我们需要在从数据库中检索帐户数据后每次计算此字段的值。 after_retrieve 事件可用于此目的。首先,让我们创建一个php文件(&#34; annual_revenue_hook.php&#34;),其代码可以计算以下位置中此新货币字段的值。
    2. 自定义\扩展\模块\帐户\分机\钩\ annual_revenue_hook.php

      <?php
      
          if (!defined('sugarEntry') ||!sugarEntry) die('Not A Valid Entry Point');
      
          class AnnualRevenue {
      
              function computeAnnualRevenueINR($bean, $event, $arguments){
                  $bean->annual_revenue_inr = $bean->annual_revenue * 100; 
              }
      
          }
      
      ?>
      

      要注册上面的钩子,我们需要编辑模块的logic_hooks.php文件并添加以下行:

      自定义\模块\帐户\ logic_hooks.php

      //Create a new array that holds after_retrieve event hooks if not present already
      $hook_array['after_retrieve'] = Array(); 
      
      //Register our annual revenue hook for computing new currency value
      $hook_array['after_retrieve'][]= Array(1, 'Compute Annual Revenue in INR', 'custom/Extension/modules/Accounts/Ext/hooks/annual_revenue_hook.php','AnnualRevenue', 'computeAnnualRevenueINR'); 
      

      完成这些步骤后,我们应该会在详细信息视图中看到填充新货币的值,如下所示:

      New Field added to DetailView of Accounts

      也可以从相关模块获取数据。例如,我们需要计算与此帐户相关联的所有机会的总和,然后添加到我们的新字段中。以下是完成它的步骤:

      1. 第一步是获取模块之间的关系信息,在这种情况下,在帐户机会之间。我们需要打开文件 modules \ Accounts \ vardefs.php 并搜索机会。它应该给我们以下信息。

        'opportunities' =>
        array (
        'name' => 'opportunities',
        'type' => 'link',
        'relationship' => 'accounts_opportunities',
        'module'=>'Opportunities',
        'bean_name'=>'Opportunity',
        'source'=>'non-db',
            'vname'=>'LBL_OPPORTUNITY',
        ),
        
      2. 然后,我们可以打开管理员 - >工作室,展开帐户 - &gt;关系,找到关系类型,如下所示:

        Relationship between Accounts and Opportunities

        现在我们已经确定了关系信息,我们可以编辑现有的钩子,如下所示:

        自定义\扩展\模块\帐户\分机\钩\ annual_revenue_hook.php

        <?php
        
            if (!defined('sugarEntry') ||!sugarEntry) die('Not A Valid Entry Point');
        
            class AnnualRevenue {
        
                function computeAnnualRevenueINR($bean, $event, $arguments){
                    $bean->annual_revenue_inr = $bean->annual_revenue * 100;
                    $bean->load_relationship('opportunities');
                    $opportunities = $bean->opportunities->getBeans();
                    //Every account has multiple opportunities i.e array of Opportunity
                    foreach($opportunities as $opportunity){
                        $bean->annual_revenue_inr = $bean->annual_revenue_inr + $opportunity->amount;
                    }
                }
        
            }
        ?>
        

        上面的代码现在应该将annual_revenue乘以100,并将所有相关的机会与它相加,以计算year_revenue_inr的值。