Skip to main content

Erstellen und Verwenden benutzerdefinierter Steuerfelder

Lernziele

Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:

  • Erläutern, was ein benutzerdefiniertes Steuerfeld ist, und Beschreiben seiner Hauptattribute
  • Erstellen einer Klasse für ein benutzerdefiniertes Steuerfeld
  • Verwenden eines benutzerdefinierten Steuerfelds auf einer Visualforce-Seite
Hinweis

Hinweis

Lernen Sie auf Deutsch? Beginnen Sie die Aufgabe in einem Trailhead Playground in der Sprache Deutsch und verwenden Sie für die Navigation die in Klammern angegebenen Übersetzungen. Kopieren und fügen Sie nur die Angaben in Englisch ein, da zur Überprüfung der Aufgabe Daten in Englisch benötigt werden. Wenn Sie die Aufgabe in Ihrer deutschen Organisation nicht bestehen, empfehlen wir Ihnen folgende Vorgehensweise: (1) Stellen Sie das Gebietsschema auf USA um, (2) legen Sie Englisch als Sprache fest (Anweisungen dazu finden Sie hier) und (3) klicken Sie erneut auf die Schaltfläche "Check Challenge" (Aufgabe überprüfen).

Weitere Details dazu, wie Sie die übersetzte Trailhead-Umgebung optimal nutzen können, finden Sie unter dem Badge "Trailhead in Ihrer Sprache".

Einführung in benutzerdefinierte Steuerfelder

Fügen Sie ein benutzerdefiniertes Steuerfeld zu einer Visualforce-Seite hinzu, indem Sie den Namen der Steuerfeldklasse im Attribut controller von <apex:page> referenzieren.

Wenn Ihre Seite ein benutzerdefiniertes Steuerfeld verwendet, können Sie kein Standardsteuerfeld verwenden. Seiten verwenden ein anderes Attribut zum Festlegen des benutzerdefinierten Steuerfelds.

  1. Öffnen Sie die Developer Console und klicken Sie zum Erstellen einer neuen Visualforce-Seite auf File (Datei) | New (Neu) | Visualforce Page (Visualforce-Seite). Geben Sie ContactsListWithController als Seitenname ein.
  2. Ersetzen Sie im Editor jedes Markup durch Folgendes.
    <apex:page controller="ContactsListWithController">
        <apex:form>
            <apex:pageBlock title="Contacts List" id="contacts_list">
                <!-- Contacts List goes here -->
            </apex:pageBlock>
        </apex:form>
    </apex:page>
    Wenn Sie versuchen, diese Seite zu speichern, wird ein Fehler angezeigt, da ContactsListWithController noch nicht vorhanden ist. Keine Sorge, das wird als Nächstes behoben.

Erstellen einer benutzerdefinierten Steuerfeld-Apex-Klasse

Ein benutzerdefiniertes Steuerfeld ist einfach eine Apex-Klasse, die Sie mit der Developer Console selbst schreiben.

Es gibt jede Menge System- und Dienstprogrammklassen, die Sie beim Schreiben von benutzerdefinierter Steuerfeldlogik unterstützen. Die einzige Anforderung, damit eine Klasse als ein benutzerdefiniertes Steuerfeld verwendet werden kann, besteht darin, dass sie vorhanden ist.

  1. Öffnen Sie die Developer Console und klicken Sie auf File (Datei) | New (neu) | Apex Class (Apex-Klasse), um eine neue Apex-Klasse zu erstellen. Geben Sie ContactsListController als Klassennamen ein.

Ersetzen Sie im Editor jeden beliebigen Code durch Folgendes.

public class ContactsListWithController {
// Controller code goes here
}

Wie bei Visualforce-Seiten müssen Sie Ihre Änderungen an Apex speichern, wenn Sie welche vorgenommen haben. Es ist nicht viel und bewirkt auch noch nichts, aber dadurch verschwindet der Fehler auf der Visualforce-Seite.

  1. Wechseln Sie zurück zur Visualforce-Seite und speichern Sie sie erneut. Die Fehlermeldung sollte nicht mehr angezeigt werden und die Seite wird erfolgreich gespeichert.
  2. Klicken Sie auf Preview (Vorschau), um eine Vorschau Ihrer Seite anzuzeigen, die Sie anzeigen können, während Sie Änderungen vornehmen. Es sollte ein neues Fenster geöffnet werden, in dem die standardmäßige Salesforce-Seitenkopfzeile und -Randleistenelemente, aber noch keine Inhalte angezeigt werden.

Auf den ersten Blick wirken die zwei neuen von Ihnen erstellten Elemente nicht sehr interessant. Auch wenn es sich zu 90 Prozent um Platzhaltercode handelt, sind die beiden Elemente –Visualforce-Seite und Apex-Steuerfeld – miteinander verbunden. Sobald Sie etwas mehr Code zum Steuerfeld hinzufügen, kann er durch Ihre Seite verwendet werden.

Über die Grundlagen hinaus

Sie haben möglicherweise bemerkt, dass diese benutzerdefinierte Steuerfeldklasse weder aus einer anderen Klasse erbt noch eine Oberfläche implementiert, die verspricht, die Anforderungen eines Visualforce-Steuerfelds einzuhalten. Selbst komplexe Steuerfelder nehmen diese Dinge nicht vor, da weder eine derartige Klasse vorliegt, aus der geerbt werden kann, noch eine Oberfläche zum Implementieren. Dadurch sind Sie beim Erstellen Ihrer eigenen Klassen und Oberflächen ungebunden, sobald es Ihre Erfahrung mit Apex zulässt.

Hinzufügen einer Methode zum Abrufen von Datensätzen

Erstellen Sie eine Getter-Methode, die eine SOQL-Abfrage ausführt, welche auf Ihrer Seite anzuzeigende Datensätze zurückgibt.

Der Hauptzweck der meisten Steuerfelder besteht darin, Daten für die Anzeige abzurufen oder Aktualisierungen für Daten zu verarbeiten. In diesem einfachen Steuerfeld müssen Sie nichts anderes vornehmen, als eine grundlegende SOQL-Abfrage auszuführen, die Kontaktdatensätze sucht und diese Datensätze auf der Visualforce-Seite verfügbar macht.

  1. Ersetzen Sie in der ContactsListWithController-Klasse die Kommentarzeile // Controller code goes here durch folgenden Code.
    private String sortOrder = 'LastName';
    public List<Contact> getContacts() {
        List<Contact> results = Database.query(
            'SELECT Id, FirstName, LastName, Title, Email ' +
            'FROM Contact ' +
            'ORDER BY ' + sortOrder + ' ASC ' +
            'LIMIT 10'
        );
        return results;
    }
    Dieser Code fügt eine private Membervariable, eine Zeichenfolge mit dem Namen sortOrder und die öffentliche Methode getContacts() hinzu. sortOrder ist ziemlich einfach nachzuvollziehen. Hierbei handelt es sich einfach um den Namen des Felds, nach dem die Kontakte sortiert werden. getContacts() ist ebenfalls ziemlich einfach. Wenn Sie Apex noch nicht kennen, ist das Parsen zunächst schwierig. Der Effekt der Methode besteht darin, eine SOQL-Abfrage auszuführen, um eine Liste von Kontaktdatensätzen abzurufen und diese Liste der Kontakte anschließend an den Methodenaufrufer zurückzugeben. Und wer wird der Aufrufer sein? Natürlich die Visualforce-Seite!
  2. Ersetzen Sie auf der ContactsListWithController-Seite die Kommentarzeile <!-- Contacts List goes here --> durch folgendes Markup.
    <!-- Contacts List -->
    <apex:pageBlockTable value="{! contacts }" var="ct">
        <apex:column value="{! ct.FirstName }"/>
        <apex:column value="{! ct.LastName }"/>
        <apex:column value="{! ct.Title }"/>
        <apex:column value="{! ct.Email }"/>
    </apex:pageBlockTable>
    Wenn Sie diese Seite speichern, sollte eine vertraut aussehende Tabelle von Kontaktinformationen angezeigt werden. Eine durch ein benutzerdefiniertes Steuerfeld gestützte Kontaktliste

Das Markup für die ContactsListWithController-Seite sollte recht vertraut aussehen. Mit Ausnahme des controller-Attributs des <apex:page>-Tags handelt es sich hierbei um nahezu den gleichen Code, den Sie zum Erstellen der Seite mit dem Standardsteuerfeld verwenden würden.

Der Unterschied besteht darin, was geschieht, wenn der Ausdruck {! contacts } ausgewertet wird. Auf dieser Seite übersetzt Visualforce diesen Ausdruck in einen Aufruf zur getContacts()-Methode Ihres Steuerfelds. Diese Methode gibt eine Liste der Kontaktdatensätze zurück, was genau dem entspricht, was <apex:pageBlockTable> erwartet.

Die getContacts()-Methode wird durch eine Getter-Methode aufgerufen. Dies ist ein allgemeines Muster, wobei {! someExpression } in Ihrem Visualforce-Markup automatisch eine Verbindung mit einer Methode mit dem Namen getSomeExpression () in Ihrem Steuerfeld herstellt. Hierbei handelt es sich um die einfachste Möglichkeit für Ihre Seite, auf die für die Anzeige benötigten Daten zuzugreifen.

Hinzufügen einer neuen Aktionsmethode

Erstellen Sie Aktionsmethoden in Ihrem benutzerdefinierten Steuerfeld, um auf Benutzereingaben auf der Seite zu reagieren.

Das Anzeigen von Daten ist toll, aber das Reagieren auf Benutzeraktionen ist für eine Webanwendung entscheidend. Mit einem benutzerdefinierten Steuerfeld können Sie beliebig viele benutzerdefinierte Aktionen erstellen, die Sie auf einer Seite unterstützen möchten, indem Sie Aktionsmethoden verfassen, um auf Benutzeraktivitäten zu reagieren.

  1. Fügen Sie in der ContactsListWithController-Klasse unter der getContacts()-Methode die folgenden beiden Methoden hinzu.
    public void sortByLastName() {
        this.sortOrder = 'LastName';
    }
    public void sortByFirstName() {
        this.sortOrder = 'FirstName';
    }
    Diese beiden Methoden ändern den Wert der privaten Variablen sortOrder. sortOrder wird in der SOQL-Abfrage verwendet, die Kontakte abruft, und durch das Ändern von sortOrder ändert sich die Reihenfolge der Ergebnisse.
  2. Ersetzen Sie auf der ContactsListWithController-Seite die beiden <apex:column>-Tags für ct.FirstName und ct.LastName durch das folgende Markup.
    <apex:column value="{! ct.FirstName }">
        <apex:facet name="header">
            <apex:commandLink action="{! sortByFirstName }"
                reRender="contacts_list">First Name
            </apex:commandLink>
        </apex:facet>
    </apex:column>
    <apex:column value="{! ct.LastName }">
        <apex:facet name="header">
            <apex:commandLink action="{! sortByLastName }"
                reRender="contacts_list">Last Name
            </apex:commandLink>
        </apex:facet>
    </apex:column>
    Auch wenn das Erscheinungsbild gleich bleibt, ändert sich die Sortierreihenfolge für die Liste mit den Kontakten, wenn Sie jetzt auf die Spaltenüberschriften "First Name" und "Last Name" klicken. Sehr schön.

Das neue Markup fügt jeder der <apex:column>-Komponenten zwei verschachtelte Komponenten hinzu. <apex:column> selbst weist eine Überschrift mit unformatiertem Text auf, aber auf die Überschrift soll geklickt werden können. Mit <apex:facet> können die Inhalte der Spaltenüberschrift beliebig festgelegt werden. Und wir benötigen einen Link, der die richtige Aktionsmethode aufruft. Der Link wird mithilfe der <apex:commandLink>-Komponente erstellt, wobei das Attribut action auf einen Ausdruck festgelegt wird, der auf die Aktionsmethode in unserem Steuerfeld verweist. (Beachten Sie, dass Aktionsmethoden im Gegensatz zu Abrufmethoden genauso benannt werden wie der Ausdruck, der auf sie verweist.)

Wenn auf den Link geklickt wird, löst er die Aktionsmethode im Steuerfeld aus. Die Aktionsmethode ändert die private Variable für die Sortierreihenfolge und dann wird die Tabelle erneut gerendert. Beim erneuten Rendern der Tabelle wird {! contacts } neu ausgewertet, wobei die Abfrage in der jeweils festgelegten Sortierreihenfolge erneut ausgeführt wird. Das Endergebnis besteht darin, dass die Tabelle in der Reihenfolge sortiert wird, die durch den Klick des Benutzers angefordert wurde.

Über die Grundlagen hinaus

Der Überschriftentext für die Spalten mit den Vornamen und Nachnamen ist in diesem Markup ist hartcodiert. Aber was ist, wenn nicht alle Ihre Benutzer Englisch verwenden? Die standardmäßige Salesforce-Benutzeroberfläche verfügt über übersetzte Versionen der Feldnamen aller Standardobjekte und Sie können eigene Übersetzungen für benutzerdefinierte Objekte angeben. Wie würden Sie auf diese zugreifen? Probieren Sie statt dem unformatierten Text dieses Markup aus: <apex:outputText value="{!$ObjectType.Contact.Fields.FirstName.Label }"/>. Dies ist die richtige Art und Weise, auf die Bezeichnung eines Felds zu verweisen, selbst wenn in Ihrer gesamten Organisation dieselbe Sprache verwendet wird, da sie automatisch aktualisiert wird, sobald sich der Feldname jemals ändert.

Weitere Infos

Mit benutzerdefinierten Steuerfeldern und der Apex-Sprache können Sie im Prinzip alles Erdenkliche auf Ihren Visualforce-Seiten vornehmen.

Getter-Methoden beziehen Daten aus Ihrem Steuerfeld und stellen sie auf Ihrer Seite zur Verfügung. Es gibt entsprechende Setter-Methoden, mit denen Sie Werte zurück von Ihrer Seite zu Ihrem Steuerfeld übermitteln können. Analog zu Getter-Methoden versehen Sie Ihre Setter-Methoden mit dem Präfix "set". Davon abgesehen sind sie nur Methoden, die ein Argument aufweisen.

Eine Alternative zu Getter- und Setter-Methoden ist die Verwendung von Apex-Eigenschaften. Eigenschaften sind eine Art Kombination einer Variablen mit Getter- und Setter-Methoden mit einer Syntax, die sie deutlicher zusammen gruppiert. Eine einfache Eigenschaft, die ein benutzerdefiniertes Objekt referenziert, kann wie im Folgenden aufgeführt deklariert werden.

public MyObject__c myVariable { get; set; }

Eigenschaften können öffentlich oder privat sein. Zudem können sie schreibgeschützt oder sogar lesegeschützt sein, indem die Get- oder Set-Methode ausgelassen wird. Sie können zudem Implementierungen für die Get- oder Set-Methoden erstellen, wenn Sie eine zusätzliche Logik ausführen möchten, die über das einfache Speichern und Abrufen eines Werts hinausgeht.

Eigenschaften sind eine allgemeine Funktion von Apex, sie sind nicht spezifisch für Visualforce. Apex ist eine vollständige Programmiersprache. Sie ist nicht nur der natürliche Partner für das Erstellen komplexer Visualforce-Seiten, sondern wird auch in vielen anderen Entwicklungskontexten der Lightning-Plattform verwendet. Weitere Informationen über die verschiedenen vollständigen Apex-Verwendungsmöglichkeiten finden Sie in den entsprechenden Apex-Themen und in den Ressourcen am Ende dieser Seite.

Der Lebenszyklus einer Visualforce-Anforderung und -Antwort kann anfangs komplex erscheinen. Es ist besonders wichtig zu verstehen, dass es keine bestimmte Reihenfolge gibt, in der Getter- oder Setter-Methoden (oder Eigenschaften, sofern sie welche verwenden) aufgerufen werden. Daher müssen Sie zwischen ihnen keine Reihenfolge-der-Ausführung-Abhängigkeiten festlegen. Es sind noch viele weitere Details in den entsprechenden Abschnitten des Visualforce Developer Guide verfügbar, und zwar insbesondere im Kapitel Custom Controllers and Controller Extensions.

Ressourcen

Teilen Sie Ihr Trailhead-Feedback über die Salesforce-Hilfe.

Wir würden uns sehr freuen, von Ihren Erfahrungen mit Trailhead zu hören: Sie können jetzt jederzeit über die Salesforce-Hilfe auf das neue Feedback-Formular zugreifen.

Weitere Infos Weiter zu "Feedback teilen"