如何将触发器转换为Apex类

时间:2016-08-12 09:20:12

标签: triggers salesforce apex

我需要将下面的触发逻辑转移到apex类。但是在顶级课程中我不能使用Trigger.New因为它会给出错误。一旦我在apex调用中给出逻辑,我可以在触发器中调用该方法,所以有人可以告诉我,如何将此触发器转换为顶点类?

trigger updatecontactrolecount on Opportunity(before insert, before update) {
     Boolean isPrimary;
     Integer iCount;
     Map < String, Opportunity > oppty_con = new Map < String, Opportunity > (); //check if the contact role is needed and add it to the oppty_con map
     for (Integer i = 0; i < Trigger.new.size(); i++) {
         oppty_con.put(Trigger.new[i].id,
             Trigger.new[i]);
     }
     isPrimary = False;
     for (List < OpportunityContactRole > oppcntctrle: [select OpportunityId from OpportunityContactRole where(OpportunityContactRole.IsPrimary = True and OpportunityContactRole.OpportunityId in : oppty_con.keySet())]) {
         if (oppcntctrle.Size() > 0) {
             isPrimary = True;
         }
     }
     iCount = 0;
     for (List < OpportunityContactRole > oppcntctrle2: [select OpportunityId from OpportunityContactRole where(OpportunityContactRole.OpportunityId in : oppty_con.keySet())]) //Query for Contact Roles
     {
         if (oppcntctrle2.Size() > 0) {
             iCount = oppcntctrle2.Size();
         }
     }
     for (Opportunity Oppty: system.trigger.new) //Check if  roles exist in the map or contact role isn't required 
     {
         Oppty.Number_of_Contacts_Roles_Assigned__c = iCount;
         Oppty.Primary_Contact_Assigned__c = isPrimary;
     }
 }

1 个答案:

答案 0 :(得分:1)

您可以使用TriggerHandler类在同一个地方管理所有触发事件: https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigger_Best_Practices

在你的触发器中调用你的独特课程:

trigger OpportunityTrigger on Opportunity (before insert,after insert,before update,after update, before delete,after delete) {
    try {
        new OpportunityTriggerHandler().run();
    }
    catch(Exception e) {
        System.debug(e);
    }

然后执行TriggerHandler中的所有逻辑:

public with sharing class OpportunityTriggerHandler extends TriggerHandler {
    private Map<Id, Opportunity> newOpportunityMap;
    private Map<Id, Opportunity> oldOpportunityMap;
    private List<Opportunity> newOpportunity;
    private List<Opportunity> oldOpportunity;

    public OpportunityTriggerHandler() {
        this.newOpportunityMap = (Map<Id, Opportunity>) Trigger.newMap;
        this.oldOpportunityMap = (Map<Id, Opportunity>) Trigger.oldMap;
        this.newOpportunity = (List<Opportunity>) Trigger.new;
        this.oldOpportunity = (List<Opportunity>) Trigger.old;
    }

    public override void beforeInsert() {
       for (Opportunity o : this.newOpportunity) {
            if (o.Name == '...') {
                //do your stuff
            }
        }
    }

    public override void afterInsert() {
        //...
    }

}