Sprache per FC ändern - erweitert

Dieser Bereich dient dazu, eure Tricks und Erweiterungen vorzustellen, damit diese auch andere Anwender nutzen können. // This area can be used to publish your tricks and extensions to the APF to be used by other developers.
Antworten
welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Sprache per FC ändern - erweitert

Beitrag von welworx » 18.01.2011, 17:28:02

Meine eigentliche Idee war es eine Action zu schreiben die die Sprache in einer Applikation automatisch setzt.
Da ich aber dann gesehen habe, dass es sowas im wiki http://wiki.adventure-php-framework.org ... C3%A4ndernschon gibt, habe ich jene sachen eingebaut die, meinermeinung nach, sehr sinnvoll wären. (Da ich aber das meiste schon geschrieben habe, bevor ich mir den wiki artikel angesehen hab, sind die Variablen bezeichnungen ein wenig anders)


Eigentliche Action datei:
Unter extensions::language
language.php

Code: Alles auswählen

/**
 *  Frontcontroller Action, welche die mittels Url überlieferte Sprache setzt.
 *
 *
 *  @example
 * Konfiguration kann unter extensions::language::{CONTEXT} angepasst werden.
 * Die vorliegende DEFAULT_actionconfig.ini muss in dem entsprechenden Ordner liegen.
 * DEFAULT stellt die Standardumgebung dar und muss entsprechend angepasst werden.
 *
 * Folgende Zeile ist nach der Context definition in der Bootstrap datei nötig, damit
 * die erweiterung verwendet werden kann:
 * $fC = &Singleton::getInstance('Frontcontroller');
 * $fC->setContext('context');
 * $fC->registerAction('extensions::language', 'language');
 *
 */
import('tools::request', 'RequestHandler');
import('core::session', 'SessionManager');

class language extends AbstractFrontcontrollerAction {

    var $__Type = 'prepagecreate';
    var $__LanguageVar;
    var $__defaultLanguage;
    var $__possibleLanguages;

    function language() {

    }

    function run() {
        $Config = $this->getConfiguration('extensions::language', 'actionconfig.ini');
        $this->__LanguageVar = $Config->getSection('Config')->getValue('LanguageVar');
        $this->__defaultLanguage = $Config->getSection('Config')->getValue('defaultLanguage');
        $this->__possibleLanguages=explode(",",$Config->getSection('Config')->getValue('languages'));

        // load SessionManager
        $sessMgr = new SessionManager('Language');

        $lang = $this->__defaultLanguage;

// Sprache aus Url Filtern
        $UrlLanguage = RequestHandler::getValue($this->__LanguageVar);
        if ($UrlLanguage !== null) {
            $lang = $UrlLanguage;
        }
// ansonsten aus der Session laden
        else if (($SessionLanguage = $sessMgr->loadSessionData($this->__LanguageVar)) !== null) {
            $lang = $SessionLanguage;
        }

// Alle nicht mehr benötigten Variablen leeren.
        unset($UrlLanguage);
        unset($SessionLanguage);

        // Prüfen ob die ermittelte Sprache überhaupt vorhanden ist.
        if(!in_array($lang, $this->__possibleLanguages)){
            $lang=$this->__defaultLanguage;
        }

// Akutelle Sprache in der Session speichern.
        $sessMgr->saveSessionData('Language', $lang);

        // Sprache für alle anderen Actions überschreiben
        $actions = &$this->__ParentObject->getActions();
        foreach ($actions as $hash => $elem) {
            $actions[$hash]->set('Language', $lang);
        }
        // Sprache im Frontcontroller setzen
        $this->__ParentObject->set('Language', $lang);
    }

}

class languageInput extends FrontcontrollerInput {

    function languageInput() {

    }

}
Dazugehörende Config Datei:
{Environment}_actionconfig.ini

Code: Alles auswählen

[language]
FC.ActionNamespace = "extensions::language"
FC.ActionFile = "language"
FC.ActionClass = "language"
FC.InputFile = "language"
FC.InputClass = "languageInput"
FC.InputParams = ""

[Config]
LanguageVar="lang"
defaultLanguage="de"
languages="de,en"

Fragen, Wünsche, Ideen und Beschwerden sind herzlich willkommen :D

Viel Spaß damit!

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

Re: Sprache per FC ändern - erweitert

Beitrag von dr.e. » 19.01.2011, 00:45:23

Hi,

ich habe den Wiki-Eintrag ein wenig an die 1.12/1.13-API angepasst und __ParentObject durch getParentObject() sowie set('Language',...) durch setLanguage(...) ausgetauscht. Ansonsten ist deine Implementierung fast identisch und hilft immer dann, wenn die Sprache per FC-Action gesetzt werden soll.

Interessant finde ich, dass du sogar bekannte Sprachen definieren kannst. Das ist gegenüber der Wiki-Variante nochmal eine etwas höere Sicherheit.
Viele Grüße,
Christian

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

Re: Sprache per FC ändern - erweitert

Beitrag von welworx » 19.01.2011, 03:13:00

Das mit den bekannten sprachen dachte ich mir ist eine praktische funktion. wenn man dies an einer zentralen stelle machen würde, könnte man so leicht eine applikation ala CMS zb schreiben, und dann auch einfach aufsetzten.

Ich finde das konzept des Apf super mit den verschiedenen Config dateien, aber eine zentrale Config die quasi immer eingelesen wird wäre glaube ich sehr praktisch. (Mir ist schon klar das man das selbst sehr leicht realisieren kann) Muss aber auch dazu sagen dass ich mir noch keine gedanken zu den nachteilen gemacht hab.

Es wäre aber glaube ich sehr praktisch, wenn man viele einzellne "Module" verwendet die mehr oder weniger die selben Einstellungen brauchen, wie zb mögliche Sprachen, namen von variablen, standard DB verbindung usw.

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

Re: Sprache per FC ändern - erweitert

Beitrag von dr.e. » 20.01.2011, 10:19:08

Hi,

zentrale Konfigurationen haben Vor- und Nachteile. Bei einigen Dingen ist das sinnvoll (DB-Verbindungen), bei anderen (eigenes Modul) sehe ich das mehr als Nachteil, da eine zu große Kopplung zwischen dem APF und dem Modul/der Komponente entstehen würde. Für die DB-Verbindungen ist der ConnectionManager der zentrale Einstieg jedes Moduls und dieser konfiguriert die Connections zentral für eine Applikation.

Für ein CMS würde ich persönlich nochmal eine eigene Komponente realisieren, die eine zentrale CMS-Konfiguration bereitstellt. Diese kann dann von allen Komponenten des CMS gerne genutzt werden. Aufwandstechnisch ist das IMHO neutral, da du einfach nur eine zentrale Konfiguration unter dem Namespace deiner Wahl anlegen und in den einzelnen Komponenten nutzen kannst. Damit erreichst du dann ja quasi das, was du beschrieben hast. Sie wird immer geladen und du kannst von überall drauf zugreifen. Du musst dir nur immer bewusst sein, dass das Abhängigkeiten schafft. Diese sind oft gut und notwendig, sofern du jedoch sowas wie Plugins für dein CMS realisieren möchtest, sollte man vorsichtig mit globalen Einstellungen umgehen, da sonst schnell direkte Abhängigkeiten zwischen Plugin A und B auftauchen. Ist A kommerziell und B frei, habe ich als Anwender von B ein Problem. :) Das ist sicher überzeichnet, aber soll deutlich machen, welche Überlegungen hier mitspielen sollten.

Dinge wie Sprachen & Co. kannst du aber immer in einer zentralen Konfiguration ablegen, in deiner Action und in weiteren Komponenten / Plugins / Modulen nutzen. Mehr als ein

Code: Alles auswählen

$this->getConfiguration('namespace','file.ext')
ist es ja nicht zu tippen.
Viele Grüße,
Christian

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

Re: Sprache per FC ändern - erweitert

Beitrag von welworx » 20.01.2011, 14:43:00

Ich bin dabei eine Anwendung zu schreiben, die auch in einem unterordner abgelegt werden kann.

Sprich alles wird nur über domain.at/apf/ erreicht.

Leider funktionieren dann auf anhieb ein paar sachen nicht mehr. (zb bei aktiven url rewriting wird gleich apf als variablennname verwendet). Es wäre daher meinermeinung sehr praktisch, wenn man für das ganze apf eine config datei hätte wo man sowas definieren kann, und die dann alle module auch berücksichtigen (zb bei der linkerstellung oder so). Vlt gibts sowas in der art schon, gefunden hab ichs jedenfalls nicht.

Bei vielen sachen spielt das vermutlich ohnehin keine rolle, da sie eh an oberster stelle liegen. Aber alleine beim testen am lokalen webserver ist es ein wenig mühsam.

Das man nicht alles in eine config datei wirft, sondern dass wenn möglich für jedes modul extra macht ist auch wieder klar und auch sehr sinnvoll.

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

Re: Sprache per FC ändern - erweitert

Beitrag von dr.e. » 22.01.2011, 19:33:22

Hallo Werner,

das URL-Rewriting ist grundsätzlich davon abhängig, dass du einen eigenen VHOST anlegst. Das URL-Schema sieht vor, dass jeder ungerade Pfad-Abschnitt ein Parameter und jeder gerader der Wert des vorangegangenen ungeraden ist. Damit hast du bei einem Unterordner zunächst verloren.

Zu lösen ist das mit einem eigenen Input-Filter, der den ersten Pfad-Abschnitt einfach entfernt und damit das Rewriting mit dem generischen Format wieder ermöglicht. Alternativ könntest du auch die unter http://wiki.adventure-php-framework.org ... hne_Filter beschriebene Möglichkeit nutzen um den ersten Teil zu entfernen.
Bei vielen sachen spielt das vermutlich ohnehin keine rolle, da sie eh an oberster stelle liegen. Aber alleine beim testen am lokalen webserver ist es ein wenig mühsam.
Warum deaktivierst du lokal das URL-Rewriting nicht einfach? Sofern du konsequent LinkHandler/FrontControllerLinkHandler nutzt, sollte das ebenso funktionieren.
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste