2016-05-20 9 views
2

Kann ein Enum-Feld mit DataExtension überladen werden?Overload Enum in SilverStripe DataExtension

class Order extends DataObject { 
    private static $db=array('Status'=>"Enum('Unpaid, Paid','Unpaid')"; 
} 

class OrderExtension extends DataExtension { 
    private static $db=array('Status'=>"Enum('Unpaid, Paid, Cancelled','Unpaid')"; //doesn't work 
} 
+1

Angenommen, Sie haben in der Konfiguration 'OrderExtension' auf' Order' angewendet, und das fehlende ')' am Ende ist nur ein Tippfehler im Beispiel? –

+0

Haben Sie versucht, dev/build damit zu starten? Was ist passiert? Entweder beschwört SS bei dev/build, dass Sie versuchen, eine Spalte mit dem gleichen Namen hinzuzufügen, oder es wird die Spaltenkonfiguration des Feldes ändern. Vergessen Sie nicht, '_config/config.yml' oder' _config/extensions.yml' mit einem Verweis auf Ihren neuen Decorator zu aktualisieren, oder das Klassenmanifest von SS hat keine Kenntnis von Ihrer Klasse. – theruss

+0

RobbieAverill - Ja, nur Tippfehler in meinem Beispiel. @theruss - Ich war sicher, dass ich meine Erweiterung in config.yml hatte und einen dev/build gemacht habe, aber es hat nichts getan. Auch von der SS keine Beschwerden. Ich werde es heute noch einmal testen. Danke euch beiden. –

Antwort

5

Ich konnte nicht herausfinden, wie die augmentDatabase() Methode, um zu arbeiten, aber mit einem Kollegen nach dem Gespräch schlug er vor config.yml verwenden und dies der Trick.

+0

Wow. Ich wusste nicht, dass das funktionieren könnte. – theruss

3

Dies scheint mit den Methoden, die wir bisher besprochen haben, nicht möglich zu sein. Ich habe den OP-Code implementiert und festgestellt, dass die Tabelle des dekorierten Objekts (in diesem Fall "Order") nicht wie erwartet aktualisiert wurde.

Ich kann einen Grund dafür, warum dies nicht über eine DataExtension implementiert wird, vorausgesetzt, dass Devs mit einigen Kern-Logik Schraube, die auf bestimmte Tabelle und Spalte Spezifikationen beruht Schraube.

Ich habe ein wenig graben und festgestellt, dass was OP will ist möglich, aber mit ein wenig Code. Betrachten Sie die folgende Seite: https://docs.silverstripe.org/en/3.3/reference/dataextension/#custom-database-generation schlägt vor, eine augmentDatabase() Methode auf der benutzerdefinierten DataExtension zu definieren.

Es scheint jedoch keine detaillierten Dokumente zu geben, was als nächstes zu tun ist. Stattdessen rät die obige Seite, die Kern-Versioned-Erweiterung auszuchecken, die, nachdem ich mein gesamtes SS-Projekt bereift habe, die einzige DataExtension Unterklasse ist, die ich finden konnte, die eine augmentDatabase() Methode erklärte. Vorausgesetzt, dass Versioned mit x3 Tabellen für jede Klasse behandelt werden muss, die es verziert (SiteTree, SiteTree_Live, SiteTree_versions) dann ist seine Logik verpflichtet, ziemlich beteiligt zu sein. Ich vermute jedoch, dass für eine benutzerdefinierte Implementierung auf einem DataObject die Dinge ein wenig einfacher sein können. (Es sei denn, Sie versionieren auch DataObjects!).

Viel Glück :-)

+0

Der von Ihnen angegebene Link verweist auf eine andere Seite. Ich frage mich, ob Sie den ursprünglichen Link/die ursprüngliche Seite finden könnten? Ich fand [https://docs.silverstripe.org/en/4.0/developer_guides/model/data_types_and_casting/#overloading](https://docs.silverstripe.org/en/4.0/developer_guides/model/data_types_and_casting/# Überladung), die erwähnt, mit get oder Set . Auch hier wird nicht genau gesagt, wie dies zu tun ist. –

+0

Sorry, ich kann diese Seite nicht mehr finden. Nicht sicher über dich, aber ich arbeite besser von Arbeitsbeispielen als Schritt für Schritt Dokumentation :-) im Grunde; AFAIKT 'augmentDatabase()' führt die Änderungen aus, die Sie mit dieser Methode für dev/build an der DB vornehmen. Schauen Sie sich "Versioned" an und was Sie dafür tun können :-) – theruss

+0

Ich werde das überprüfen. Danke noch einmal. –