2016-05-08 9 views
-1

Im Moment versuche ich Theming für mein Yii2-basiertes Projekt zu implementieren. Wie ich das Ding jetzt sehen:Yii2 einen Pfad Alias ​​aus Informationen in DB gespeichert

  1. Der Benutzer wählt aus der Liste auf der Einstellungen Seite im Backend eine Anwendung Thema.
  2. Mit yii2-settings speichere ich alle Konfigurationsdaten in der DB (ziemlich einfach).
  3. In der Anwendung bootstrap.php Ich erstelle neue Alias ​​namens @theme. Im Grunde sollte es uns zu einem Basispfad des Anwendungsthemas führen (benutzt in der Suche Pfade, Vermögensverwalter, e.t.c.).
  4. Nach offiziellen Dokumentation, das ist, wie ich meine Ansicht Komponente konfiguriert:

    'view' => [ 
        'theme' => [ 
         'basePath' => '@theme', 
         'baseUrl' => '@theme', 
         'pathMap' => [ 
          '@app/views' => '@theme', 
          '@app/widgets' => '@theme/widgets', 
          '@app/modules' => '@theme/modules', 
         ], 
        ], 
    ], 
    

Ein Problem, das ich habe ist mit S.3. Nach yii2-settings Dokumentation, die ist, wie ich die Einstellungen lesen soll:

$theme = Yii::$app->settings->get('name', 'general'); 
Yii::setAlias('@theme', realpath(dirname(__FILE__)."/../../themes/$theme")); 

Aber natürlich ist es für mich arbeiten ist nicht wegen yii2-Einstellungen Komponente noch nicht initialisiert hat, als bootstrap.php genannt wird. Ich habe versucht, es später in der init() -Methode von meinem Basis-Controller zu initialisieren, dann passen Sie andere Aliase manuell an, aber ich fühle mich so etwas "unrein", und es schlägt immer noch fehl, weil @theme Alias ​​auch verwendet wird in Asset-Datei, die Yii2 zu veröffentlichen beginnt vor dem Aufruf der Init-Methode des Controllers.

Hat jemand also irgendwelche Gedanken darüber, wie man den Code so wenig wie möglich "hackt"? Ich weiß, dass ich die Konfiguration einfach in eine Datei verschieben und sie dann manuell vor der Anwendungsinitialisierung lesen könnte, aber es ist immer noch nicht so, wie ich es möchte. Vielleicht gibt es eine Möglichkeit, einige Systemkomponenten zu überschreiben, um den Alias ​​nach dem Laden der db-Komponente, aber vor der Konfiguration der Ansichtskomponenten festzulegen. Oder lädt Yii diese Komponenten in einer anderen Reihenfolge? Sowieso. Jede Hilfe wäre willkommen!

+0

http://stackoverflow.com/questions/32689230/yii2-params-access-innerhalb-lokal-config-file-in-common-directory –

Antwort

1

Sie könnten eine Application Event in Bootstrap versuchen:

\Yii::$app->on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) { 
    $theme = Yii::$app->settings->get('name', 'general'); 
    Yii::setAlias('@theme', realpath(dirname(__FILE__)."/../../themes/$theme")); 
}); 

OR in der Konfigurationsdatei:

[ 
    'on beforeRequest' => function ($event) { 
     // ... 
    }, 
] 

Von Yü 2 docs:

EVENT_BEFORE_REQUEST Dieses Ereignis wird ausgelöst, bevor eine Anwendung Griffe eine Anfrage. Der tatsächliche Name des Ereignisses lautet beforeRequest.

Wenn dieses Ereignis ausgelöst wird, wurde die Anwendungsinstanz konfiguriert und initialisiert. So ist es ein guter Ort, um Ihren benutzerdefinierten Code über den Event-Mechanismus einzufügen, um den Request-Handling-Prozess abzufangen. In der Ereignisbehandlungsroutine können Sie beispielsweise die Eigenschaft yii \ base \ Application :: $ language basierend auf einigen Parametern dynamisch auf setzen.

+0

Vielen Dank! Dieser hat gut für mich funktioniert. Der erste Ansatz funktioniert nicht, weil die App beim Starten des Bootstrap-Skripts noch nicht initialisiert wurde, aber das Konfigurieren des Ereignisses in einer Konfigurationsdatei funktioniert gut für mich. Beendet mit dieser kniffligen Sache ist, dass ich 'Fake' @ Theme-Pfad innerhalb eines Bootstrap noch zu deklarieren, oder Yii kann einfach nicht die Basispfade konfigurieren. Aber das Ändern des @ Thema-Alias ​​ändert auch die anderen Aliase automatisch, also hoffe, dass ich keine anderen Probleme bei der Verwendung dieses Hacks habe: P – lehadnk

-1

Hier ist die endgültige Lösung:

config/bootstrap.php:

// Setting a temporary path for components configuration - will be changed later 
Yii::setAlias('@theme', realpath(dirname(__FILE__)."/../../themes/")); 

config/main.php

'components' => [ 
     'view' => [ 
      'theme' => [ 
       'basePath' => '@theme', 
       'baseUrl' => '@theme', 
       'pathMap' => [ 
        '@app/views' => '@theme', 
        '@app/widgets' => '@theme/widgets', 
        '@app/modules' => '@theme/modules', 
       ], 
      ], 
     ], 
], 
'on beforeRequest' => function ($event) { 
     $theme = Yii::$app->settings->get('theme', 'general'); 
     Yii::setAlias('@theme', realpath(dirname(__FILE__)."/../../themes/$theme")); 
}, 
+0

Das ist, was ich beantwortet habe, nicht? Ihre Konfiguration ist genau die gleiche und Sie haben das "on beforeRequest" -Ereignis wie gesagt benutzt. Wenn ja, könnte meine Antwort als Ihre Wahl markieren? So funktioniert stackoverflow ;-) – slinstj

Verwandte Themen