Silverstripe: Enum-Werte eines Objektfelds als Array holen

Heute kam die Frage auf, wie Feldwerte eines Enumfelds aus einem DataObject ausgelesen werden können.

Im konkreten Fall wollen wir aus dem folgenden Code die Werte für das Feld "Salutation" als Array zurückbekommen:

class Customer extends Member {
public static $db = array(
'Salutation' => 'Enum("Firma,Herr,Frau","Frau")'
);
}

Da es sich bei dem Feld "Salutation" um ein Silverstripe Enumfeld handelt,könnten wir dessen Methode "enumValues()" nutzen, welche uns die Feldwerte als Array zurückliefert, also genau das tut, was wir wollen.

Da die Variable $db aber nur ein statisches Array ist, das lediglich definiert, wie ein Feld auszusehen hat, aber keinen Zugriff auf das Feldobjekt selbst bietet, nutzen wir die Silverstripe-Magie, um uns ganz einfach das entsprechende Feldobjekt zu holen:

singleton('Customer')->dbObject('Salutation')->enumValues();

Dieser Aufruf liefert uns das gewünschte Ergebnis:

Array(
    [Firma] => Firma,
    [Herr]  => Herr,
    [Frau]  => Frau
)

Der Hebel ist die Methode "dbObject" aus der Klasse "DataObject" (in "/sapphire/core/model/DataObject.php"), welche in der Lage ist, zu dem angegebenen Feld aus dem Array "$db" das entsprechende Feldobjekt zu liefern.

Tags: