DbConfigurationProvider mit GORM - config 1.13

Anmerkungen, Fragen und Hinweise zur Konfiguration dürfen in diesem Forum gepostet werden. // Notes, questions, and hints on the configuration can be posted here.
Antworten
welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

DbConfigurationProvider mit GORM - config 1.13

Beitrag von welworx » 17.12.2010, 07:26:50

Liebes Forum,

ich habe mich ein wenig mit den neuen Konfigurationsmechanismen auseinander gesetzt, die ich nebenbei sehr gut finde, und wollte fragen ob es möglich ist, dass man die Datenbank Tabelle, die man für den DbConfigurationProvider benötigt mit dem GORM erstellen und auch nutzen kann. (Das hätte den großen vorteil, dass man sie nachher einfach mit anderen tabellen verknüpfen könnte, um zb zugriffsrechte auf die texte oder so zu definieren.)

Weiters möchte ich fragen, wie man wenn man

Code: Alles auswählen

<html:getstring namespace="widgets::calendar" config="labels.lang" entry="key3" />
verwendet, festlegen kann, welche sektion gewählt wird.


Meine Idee dahinter war, dass man nur gewissen Nutzern erlauben können soll, gewisse texte zu ändern.

LG Werner

EDIT: Das mit dem html:getstring habe ich umgangen, indem ich mir einfach einen eigenen taglib erstellt habe.

Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: DbConfigurationProvider mit GORM - config 1.13

Beitrag von Well » 17.12.2010, 17:09:43

Weiters möchte ich fragen, wie man wenn man

Code: Alles auswählen

<html:getstring namespace="widgets::calendar" config="labels.lang" entry="key3" />
verwendet, festlegen kann, welche sektion gewählt wird.
Die Sektion von html:getstring entspricht der eingestellten Sprache. (Standardsprache sollte "de" sein?!)

Die Sprache wird im Attribut __Language der Klasse APFObject gespeichert und kann bspw. über eine FC-Aktion (http://wiki.adventure-php-framework.org ... ion_ändern) oder in der Bootstraps Datei über die Methode setLanguage() (APFObject -> Frontcontroller/Page) gesetzt werden.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4537
Registriert: 04.11.2007, 16:13:53

Re: DbConfigurationProvider mit GORM - config 1.13

Beitrag von dr.e. » 18.12.2010, 14:56:45

Hallo Werner,

sorry für meine späte Antwort. Dafür aber etwas ausführlicher: :)
ich habe mich ein wenig mit den neuen Konfigurationsmechanismen auseinander gesetzt, die ich nebenbei sehr gut finde und wollte fragen ob es möglich ist, dass man die Datenbank Tabelle, die man für den DbConfigurationProvider benötigt mit dem GORM erstellen und auch nutzen kann. (Das hätte den großen vorteil, dass man sie nachher einfach mit anderen tabellen verknüpfen könnte, um zb zugriffsrechte auf die texte oder so zu definieren.)
Die Tabellen kannst du grundsätzlich mit dem GORM nutzen, sofern diese dem Schema entsprechen, das der GORM nutzt. Voraussetzung ist das Naming der PK-Spalte und der Tabelle. Hierfür ist der DbConfigurationProvider jedoch nicht gerüstet, da er zunächst eine andere Zielsetzung hat, sprich die Konfiguration soll komplett mit Hilfe der ConfigurationProvider-Implementierung verwaltbar sein.

Möchtest du also eine GUI anbieten, reicht es, ein einfaches Formular zu bauen, mit dem die Werte editiert werden können. Lesen uns Speichern kannst du direkt über den ConfigManager. Einziger Haken: für das Anbieten eines Auswahl-Formulars musst du die Inhalte manuell mit einem Statement selektieren.

Um das per GORM nutzbar zu machen würde sich anbieten, basierend auf dem DbConfigurationProvider einen eigenen Provider zu implementieren, der ein Datenbank-Schema nutzt, das auf dem GORM basiert. Modelliert man die Konfigurationen als Objekte (siehe Configuration-Interface), würdest du ein Configuration-, ein Namespace, ein Context-, ein Attribute- und ein Language-Objekt in einer GORM-Config abbilden und bist damit frei die Inhalte per GORM generisch zu verwalten. Natürlich braucht es noch die entsprechenden Beziehungen. Soll das Schema einfacher ein, kannst du auch "nur" mit einem Configuration-Objekt arbeiten, das Sprache, Namespace und Context als Attribute modelliert.

Diesen Provider kannst du dann für eine beliebige Endung (z.B. ".db") registrieren und verwenden. Da die Konfigurationen pro Request im Speicher gecached werden, sollte das von der Performance auch passen. Falls nicht, einfach noch den MemcacheConfigurationProvider zwischenschalten.
Meine Idee dahinter war, dass man nur gewissen Nutzern erlauben können soll, gewisse texte zu ändern.
Dafür kannst du ja basierend auf dem UMGT die Nutzung einschränken. Alternativ kannst du auch unterschiedliche Configuration-Stores anlegen - solche für System- und solche für Benutzer-Texte. Alternativ tut es auch ein Flag in der Tabelle, das die Unterscheidung trifft. Dann kann dein Backend die User-Texte zur Änderung anbieten und die anderen kannst nur du anpassen. Das hätte den Vorteil, dass du ein und den selben Mechanismus zum Auslesen nutzen kannst.
EDIT: Das mit dem html:getstring habe ich umgangen, indem ich mir einfach einen eigenen taglib erstellt habe.
Du liest also aus zwei unterschiedlichen Quellen ein? Das würde ich vermeiden, denn dann musst du im Tag ja immer die beiden Quellen abfragen.
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: DbConfigurationProvider mit GORM - config 1.13

Beitrag von welworx » 20.12.2010, 12:25:43

Vielen Dank für die Antworten!

Ich habe mich dafür entschieden, einen eigenen Tag zu verwenden, da ich so sowohl die Sprache als auch die sektion nutzen kann. Somit brauche ich den html:getstring tag nicht mehr.

Das mit dem eigenen Provider klingt einleuchtend. Werd ich mir mal anschaun und auch gerne posten wenn ich fertig bin.
Dafür kannst du ja basierend auf dem UMGT die Nutzung einschränken. Alternativ kannst du auch unterschiedliche Configuration-Stores anlegen - solche für System- und solche für Benutzer-Texte. Alternativ tut es auch ein Flag in der Tabelle, das die Unterscheidung trifft. Dann kann dein Backend die User-Texte zur Änderung anbieten und die anderen kannst nur du anpassen. Das hätte den Vorteil, dass du ein und den selben Mechanismus zum Auslesen nutzen kannst.
Wie ist das mit den Configuration-Stores und der Flag gemeint? (verstehe nicht was dass sein soll)

Wie ließe sich das mit umgt einschränken? Ich hatte einfach vor die entsprechenden Einträge der Texte mit dem user, rechte oder role des umgt zu verknüpfen. Nur dazu müssen, soweit ich mir das gemerkt habe, doch beide tabellen mit dem GROM verwaltbar sein. Oder?
Du liest also aus zwei unterschiedlichen Quellen ein? Das würde ich vermeiden, denn dann musst du im Tag ja immer die beiden Quellen abfragen.
Wie ist das gemeint? Zur zeit schaut mein eigener Tag wie folgt aus und funktioniert einwandfrei, wobei ich das mit memcache noch nicht versucht habe.

Code: Alles auswählen

class cmsw_taglib_text extends Document {

    function cmsw_taglib_text() {
/*
 * parameter die benötigt werden:
 *
 * conifg zb: config="label.mem"
 * entry zb:  oder entry="seitentitel"
 * section zb: section="seitenname";
 *
 */
    }

    public function transform() {

        // check for attribute "namespace"
        $namespace = "cmsw::content";
        if ($namespace === null) {
            throw new InvalidArgumentException('[' . get_class($this) . '->transform()] No attribute '
                    . '"namespace" given in tag definition!', E_USER_ERROR);
        }

        // check for attribute "config"
        $configName = $this->getAttribute('config');
        if ($configName === null) {
            throw new InvalidArgumentException('[' . get_class($this) . '->transform()] No attribute '
                    . '"config" given in tag definition!', E_USER_ERROR);
        }

        // check for attribute "entry"
        $entry = $this->getAttribute('entry');
        if ($entry === null) {
            throw new InvalidArgumentException('[' . get_class($this) . '->transform()] No attribute '
                    . '"entry" given in tag definition!', E_USER_ERROR);
        }
        $section = $this->getAttribute('section');
        if ($entry === null) {
            throw new InvalidArgumentException('[' . get_class($this) . '->transform()] No attribute '
                    . '"section" given in tag definition!', E_USER_ERROR);
        }

        // get configuration
        $config = $this->getConfiguration($namespace, $configName);
        if ($config == null) {
            return (string) '';
        }

        #$this->__Language
        #print_r($config->getSection($section));

 
        $value = $config->getSection($section) === null ? null : $config->getSection($section)->getValue($entry);

        if ($value == null) {

            // get environment variable from registry to display nice error message
            $env = Registry::retrieve('apf::core', 'Environment');

            throw new InvalidArgumentException('[' . get_class($this) . '->transform()] Given entry "'
                    . $entry . '" is not defined in section "' .$section . '" in configuration "'
                    . $env . '_' . $configName . '" in namespace "' . $namespace . '" and context "'
                    . $this->getContext() . '"!', E_USER_ERROR);
        }
        return $value;
    }
}
Hintergrund warum ich das brauche:
Meine Templates enthalten alle den von mir erzeugten taglib an jenen stellen an denen Text sein soll. Weiters werden alle Templates für die nachfolgende verwaltung einmal eingelesen und alle benötigten Taglibs in der Config DB angelegt. Je nach Einstellung dürfen anschließend verschiedene Benutzer verschiedene Texte bearbeiten. Jeder dieser Texte kann, je nach verfügbaren Sprachen für die Seite, in verschiedenen Sprachen sein. Das Ziel hinter dem ganzen ist es, ein system zu kreieren, in dem man leicht Designs erstellen kann, den benutzern die möglichkeit bietet manches zu bearbeiten und zusätzlich es als entwickler einfach erweitern zu können.

LG

Antworten

Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 1 Gast