it-swarm.com.de

Programmgesteuert die Startseite pro Site festlegen?

Ich habe eine Site, die eine 'gefälschte' Instanz mit mehreren Sites verwendet (ich denke, jemand anderes hat sie implementiert). Wir haben 3 Verzeichnisse in sites erstellt:

sites/site1 sites/site2 sites/site3

und in jedem settings.php in diesen Verzeichnissen enthält es das Original settings.php aus dem Standardverzeichnis.

Ich überschreibe das Thema erfolgreich in diesen Dateien, indem ich $config['system.theme']['default'] = 'theme2';

Wenn ich versuche, $config['system.site']['page']['front'] = '/node/239'; Auszuführen, funktioniert dies nur beim Cache-Flush.

Wenn ich zum Beispiel vor Ort 1 bin, wird die Startseite in der Benutzeroberfläche angezeigt.
Wenn ich dann zu site2.example.test Wechsle, sehe ich immer noch die Standard-Startseite anstelle der auf /node/239.
Wenn ich den Cache entleere, geschieht das Gegenteil. Die Homepage von Site 2 zeigt /node/239 und Site 1 auch.

Ich habe auch versucht, dies in einem Ereignis-Listener festzulegen:

public function kernel_request(Event $event) {
    $config = \Drupal::configFactory()->getEditable('system.site');
    $site_path = \Drupal::service('site.path');
    $site_path = explode('/', $site_path);
    $site_name = $site_path[1];

    if ($site_name === 'site2' && $event->getRequest()->getPathInfo() == '/') {
      $config->set('page.front', '/node/239')->save();
    }
    else {
      $config->set('page.front', '/home-content')->save();

    }
  }

Dies macht jetzt das Richtige, aber erst nachdem die Seite geladen und dann aktualisiert wurde.

Könnte mir jemand sagen, was der "richtige" Weg wäre, der nicht zwischengespeichert wird?

1
Jimmyb_1991

Vielen Dank an alle für Ihre Antworten.
Ich habe versucht, das Domain-Modul zu verwenden, vermeide es jedoch aus zwei Gründen:

  • Es befindet sich immer noch in Alpha14 und dies wird eine geschäftskritische Site sein
  • Ich konnte nicht herausfinden, wie die domänenspezifischen Konfigurationen festgelegt werden

Die Installation des Domänenmoduls und der Blick auf die Datei README) haben mich jedoch in die richtige Richtung gelenkt.

Für alle anderen, die eine andere Startseite pro Domain einrichten möchten:

  • Ich habe die Drupal Console) verwendet, um einen Event-Abonnenten für Kernal.request Zu generieren.
  • In der Methode getSubscribedEvents müssen Sie das Gewicht auf etwas größer als 30 festlegen, wodurch der Seiten-Cache und der dynamische Cache überschrieben werden.

    $events['kernel.request'] = ['kernel_request', '35'];
    
  • Ich habe die bearbeitbare Konfiguration für die Site-Einstellungen von erhalten

    $config = \Drupal::configFactory()->getEditable('system.site');
    
  • und der Site-Name, der in sites.php hinzugefügt wurde, indem:

    $site_path = \Drupal::service('site.path'); 
    $site_path = explode('/', $site_path);
    $site_name = $site_path[1];
    
  • Dann fügte die Logik hinzu:

    if ($site_name === 'site2') {
      $config->set('page.front', '/node/239')->save();
    }
    else {
      $config->set('page.front', '/main-content')->save();
    }
    

Der Schlüssel, den ich vermisst habe, war das Festlegen des Cache-Kontexts für Websites.
Sie müssen das default.services.yml Aus dem Verzeichnis sites/default Duplizieren und in services.yml Umbenennen (falls Sie diese Datei noch nicht haben).

Dann müssen Sie url.site Zum Array required_cache_contexts Hinzufügen, damit dies zu etwas ähnlichem wird wie:

required_cache_contexts: ['languages:language_interface', 'theme', 'user.permissions', 'url.site']

Denken Sie daran, den Cache zu leeren, und das sollte funktionieren!

3
Jimmyb_1991

eine 'gefälschte' Instanz mit mehreren Standorten

Das ist technische Schuld und jemand muss jetzt die bittere Pille schlucken, um sie zu reparieren.

Machen Sie es zu einer echten Multisite und legen Sie dann die Startseite wie gewohnt pro Instanz fest.

Ich hatte einmal das gleiche Problem und ich bereue es keine Sekunde lang, dass ich es endlich richtig gemacht habe.

  1. Duplizieren Sie die Datenbank für jede Instanz
  2. Kopiere das settings.php Datei in jede Instanz und passen Sie sie an
  3. Kopieren Sie das Konfigurationsverzeichnis für jede Instanz
  4. Kopiere das default/files Verzeichnis in jede Instanz.
  5. Beheb das sites.php Datei falls erforderlich

Das einzige, was ich am Ende etwas mehr beachten musste, waren einige fehlerhafte Dateipfade, insbesondere diejenigen, die direkt in Textkörpern geschrieben wurden. Aber das war es.

1
leymannx