2016-04-11 8 views
1

Ich verwende ein ModelAdmin, um Daten über das Gridfield anzuzeigen. Ich möchte ein Modell auf die gleiche Weise verwalten, aber von einer externen Datenbank.Gridfield, das Daten von externer Datenbank in Silverstripe enthält

In meinem Modell Admin Ich habe den Code, um das Modell zu nennen (Datenobjekt) i verwalten möchten:

private static $managed_models = array(
    'exampleModel' 
); 

Um die Daten in dieser zweiten Datenbank einfügen i innerhalb einer Funktion der follwing Code haben:

global $databaseConfig, $databaseConfig2; 
DB::connect($databaseConfig2); //connect to second database 
//do somee stuff 
DB::connect($databaseConfig); //return to default database 

Nur für den Test habe ich ein DataObject exampleModel verwendet und einige Felder definiert.

Auf diese Weise zeigt das Gridfield Ergebnisse von diesem Modell in meinem ModelAdmin, also funktioniert es, aber wie kann ich Resultate von meiner zweiten Datenbank in diesem Gridfield zeigen. ist es möglich ?

+1

https://github.com/nyeholt/silverstripe-external-content/ <- Ich habe nicht versucht, aber es klingt wie es wurde speziell für Ihre Bedürfnisse hergestellt. Alternativ wäre es am besten, einen Datenbank-Syncronizer einzurichten, denke ich. – Barry

Antwort

1

Dies ist ein interessantes Szenario, das in einer Standardkonfiguration von SilverStripe nicht standardmäßig möglich ist. Beachten Sie, dass zu jedem Zeitpunkt nur eine DB-Verbindung offen ist, wie es bei den meisten CMS-Systemen der Fall ist, und diese Verbindung verwendet das ORM in Ihren Modellen.

Allerdings sehe ich im Prinzip nicht, warum dies in SilverStripe nicht möglich wäre, aber es würde noch einige zusätzliche Klassen geben, die hinter Ihren Modellen geschrieben werden müssen, bevor es für Sie zufriedenstellend funktioniert. Jede Lösung würde auch darauf basieren, dass Sie in Ihren Modellen (alle Standard-GridField-Aktionen) in der jeweiligen Datenbank bearbeiten oder löschen möchten.

Die einzige Lösung, die in den Sinn kommt, ist SilverStripes integriertes Aspects-System zu verwenden - aber ich muss zugeben, dass ich es nie selbst benutzt habe. Die aspektorientierte Programmierung unterscheidet sich von der standardmäßigen Geschäftslogik-als-Klasse-OO-Programmierung, kann jedoch immer noch innerhalb eines OO-Paradigmas verwendet werden. Es erlaubt Entwicklern "punktuell zu schneiden" (horizontal über Klassenlogik zu schneiden und verschiedene Logik in einer anderen Klasse unter vordefinierten Szenarien zu verwenden).

Betrachten Sie es ein wenig wie ein Haken.

Betrachtet man das Aspect-System des SilverStripe und das Beispiel, das es verwendet (Siehe: https://docs.silverstripe.org/en/3.2/developer_guides/extending/aspects/), glaube ich, dass man das Beispiel zu Ihrer Verwendung modifizieren könnte. Das Beispiel erklärt, wie das ORM basierend auf DB-Lese- oder -Schreibvorgängen eine DB-Verbindung über eine andere verwenden sollte. Dies klingt ähnlich wie in Ihrem Szenario. Erwarten Sie, dass anstelle von "lesen" und "schreiben" der Arbiter der verwendeten Verbindung verwendet wird wäre das Modell - vielleicht durch die Implementierung einer spezifischen Schnittstelle.

Viel Glück :-)

+0

Sicherlich wäre es relativ üblich, separate Lese-/Schreibverbindungen in einem CMS zu haben? Vielleicht nur solche, die für hohe Belastung gebaut sind. Schöne Bezugnahme auf Aspekte dort - gut gelesen. –

+1

@RobbieAverill hätte man ja gedacht. Das Tolle an SilverStripe ist, dass es immer mindestens eine Möglichkeit gibt, eine Katze zu enthäuten - es ist ein CMS eines Entwicklers: Ich habe von OP gefolgert, dass sie eine native Lösung verlangten und die Antwort darauf ist - out of the box. Wenn OP jedoch Klassen ändern wollte, um Raw-SQL zu verwenden (über 'SQLSelect'), könnte das auch funktionieren: http://www.silverstripe.org/community/forums/customing-the-cms/show/13692 Aber alles "nur funktionieren" _einschließen_ Standard-ORM-Aufrufe wie 'DataObject :: get()' mit> 1 DB's, dann könnte so etwas wie Aspects funktionieren. – theruss