Die Entwicklung von VisualForce Seiten ist zwangsweise mit der Entwicklung von Apex-Controllern verbunden. Meistens greift man auf die Standard-Controller zurück und erweitert die Standard-Funktionalität wie z.B. "Save" oder "Close" um weitere Funktionen. Die neuen Funktionen werden in einer neuen Klasse entwickelt, die als "extensions" in die VisualForce Seite eingebunden ist, z.B.
Meistens muss entweder der aufgerufene Datensatz oder die mit diesem Datensatz verknüpften Datensätze modifiziert werden. Um eine Instanz des aufgerufenen Datensatzes zu erzeugen, stehen zwei Methoden zur Verfügung.
1) Klassische SOQL Methode:
Lead leadObj = [Select id, name, Firstname, Lastname from Lead where id=:idParameter limit 1];
in der "idParameter" zuerst berechnet werden muss:
2) getRecord Methode:
in der "stdController" bereits vom Konstruktor instanziiert wird:
Beide Methoden erfüllen ihren Zweck. Jedoch favorisiere ich die Benutzung der 2. Option.
Alle auf der VisualForce Seite eingebundenen Felder sind automatisch im "leadObj" vorhanden.
Werden allerdings weitere Felder benötigt, muss man das dem Standard Controller mit "addFields" mitteilen:
Das ganze optimiert, sieht im Controller wie folgt aus:
Damit sind alle Felder des Lead-Datensates jederzeit verfügbar, was hohe Dynamik mit sich bringt.
Zu berücksichtigen ist die gelb markierte Zeile if (!Test.isRunningTest())
Diese IF - Abfrage verhindert das Einfügen der Lead-Felder beim Testen.
Der Grund: Test-Methoden enthalten bereits alle für die weitere Berechnung benötigten Felder.
Ohne der oben erwähnten IF Abfrage steigt das System mit der Fehlermeldung aus:
System.SObjectException: You cannot call addFields when the data is being passed into the controller by the caller.
<apex:page
standardController="Lead"
extensions="LeadConvert">
Meistens muss entweder der aufgerufene Datensatz oder die mit diesem Datensatz verknüpften Datensätze modifiziert werden. Um eine Instanz des aufgerufenen Datensatzes zu erzeugen, stehen zwei Methoden zur Verfügung.
1) Klassische SOQL Methode:
Lead leadObj = [Select id, name, Firstname, Lastname from Lead where id=:idParameter limit 1];
in der "idParameter" zuerst berechnet werden muss:
idParameter = Apexpages.currentPage().getParameters().get('id');
2) getRecord Methode:
Lead leadObj
= (Lead)stdController.getRecord();
in der "stdController" bereits vom Konstruktor instanziiert wird:
public
LeadConvert(ApexPages.StandardController stdController)
Alle auf der VisualForce Seite eingebundenen Felder sind automatisch im "leadObj" vorhanden.
Werden allerdings weitere Felder benötigt, muss man das dem Standard Controller mit "addFields" mitteilen:
List<String>
listFields = new List<String>();
listFields.add('FirstName');
listFields.add('LastName');
stdController.addFields(listFields);
public
without
sharing
class LeadConvert {
public
Lead
leadObj{get;
set;}
/*
Constructor */
/*********************/
public LeadConvert(ApexPages.StandardController stdController){
//
Populate the lead fields, but not for the test class (test already
contains all needed fields)
if
(!Test.isRunningTest())
stdController.addFields(getFieldsFromObjectAsList('Lead'));
leadObj
= (Lead)stdController.getRecord();
}
/***
getFieldsFromObjectAsList() ***/
/*+++++++++++++++++++++++++++++++++++++++++++++++++*/
private list<String>
getFieldsFromObjectAsList(String objName){
list<String>
listFields = new
list<String>();
Map<String,
Schema.SObjectField> mapFields = Schema.getGlobalDescribe().get(objName).getDescribe().fields.getMap();
for(Schema.Sobjectfield
f : mapFields.values()){
listFields.add(f.getDescribe().getName());
}
return
listFields;
}
}
Damit sind alle Felder des Lead-Datensates jederzeit verfügbar, was hohe Dynamik mit sich bringt.
Zu berücksichtigen ist die gelb markierte Zeile if (!Test.isRunningTest())
Diese IF - Abfrage verhindert das Einfügen der Lead-Felder beim Testen.
Der Grund: Test-Methoden enthalten bereits alle für die weitere Berechnung benötigten Felder.
Ohne der oben erwähnten IF Abfrage steigt das System mit der Fehlermeldung aus:
System.SObjectException: You cannot call addFields when the data is being passed into the controller by the caller.
Kommentare
Kommentar veröffentlichen