Überprüfen Sie, ob das Thema programmgesteuert aktiviert ist

9

Wie kann ich überprüfen, ob ein Thema in einer Drupal-Installation aktiviert ist? Ich suche etwas wie module_exists (), aber nach Themen. Ich konnte nichts in der Dokumentation finden.

Kyle
quelle

Antworten:

6

Verwenden Sie list_themes

Parameter

$ refresh : Gibt an, ob die Liste der Themen aus der Datenbank neu geladen werden soll. Der Standardwert ist FALSE.

Rückgabewert

Ein assoziatives Array der derzeit verfügbaren Themen. Die Schlüssel sind die Computernamen der Themen und die Werte sind Objekte mit den folgenden Eigenschaften:

  • Dateiname : Der Dateipfad und der Name der Info-Datei.
  • name : Der Maschinenname des Themas.
  • Status : 1 für aktivierte, 0 für deaktivierte Themen.
  • info : Der Inhalt der .info-Datei.
  • Stylesheets : Ein zweidimensionales Array, bei dem der erste Schlüssel für das Medienattribut (z. B. 'all') und der zweite für den Namen der Datei (z. B. style.css) verwendet werden. Der Wert ist ein vollständiger Dateipfad (z. B. theme / bartik / style.css). Nicht festgelegt, wenn in der .info-Datei keine Stylesheets definiert sind.
  • Skripte : Ein assoziatives Array von JavaScripts, das den Dateinamen als Schlüssel und den vollständigen Dateipfad als Wert verwendet. Nicht festgelegt, wenn in der Info-Datei keine Skripte definiert sind.
  • Präfix : Das Basis-Theme-Engine-Präfix.
  • engine : Der Maschinenname der Theme-Engine.
  • base_theme : Wenn dies ein Unterthema ist, der Computername des in der .info-Datei definierten Basisthemas. Andernfalls wird das Element nicht gesetzt.
  • base_themes : Wenn dies ein Unterthema ist, ein assoziatives Array der Vorfahren des Basisthemas dieses Themas, beginnend mit dem Basisthema dieses Themas, dem eigenen Basisthema des Basisthemas usw. Jeder Eintrag verfügt über einen Array-Schlüssel, der dem des Themas entspricht Maschinenname und ein Wert, der dem vom Menschen lesbaren Themennamen entspricht; Wenn im System kein Thema mit übereinstimmendem Computernamen vorhanden ist, lautet der Wert stattdessen NULL (und da das System nicht weiß, ob dieses Thema selbst ein Basisthema hat, wird das Array der Basisthemen beendet). Dies wird nicht festgelegt, wenn das Thema kein Unterthema ist.
  • Unterthemen : Ein assoziatives Array von Themen auf dem System, die entweder direkte Unterthemen sind ( dh sie deklarieren dieses Thema als ihr Basisthema), direkte Unterthemen von Unterthemen usw. Die Schlüssel sind die Maschine der Themen Namen und die Werte sind die vom Menschen lesbaren Namen der Themen. Dieses Element wird nicht festgelegt, wenn das System keine Themen enthält, die dieses Thema als Basisthema deklarieren.

Verwenden Sie path_to_theme , um ein aktives Thema zu erhalten.

Es kann auf das aktive Thema oder das Modul verweisen, das eine thematische Implementierung behandelt. Wenn es beispielsweise im Rahmen eines Theming-Aufrufs aufgerufen wird, hängt es davon ab, wo die Theming-Funktion ausgeführt wird. Wenn es von einem Modul implementiert wird, zeigt es auf das Modul. Wenn es aus dem aktiven Thema implementiert wird, zeigt es auf das aktive Thema. Wenn es außerhalb des Bereichs eines Themenaufrufs aufgerufen wird, zeigt es immer auf das aktive Thema.

niksmac
quelle
3

Die Daten werden tatsächlich genau an der gleichen Stelle gespeichert, der systemTabelle. Ich konnte keine vorhandene Funktion zum Überprüfen finden (obwohl es wahrscheinlich irgendwo eine gibt), aber dies sollte zur Not tun:

function theme_exists($theme_name) {
  $themes = list_themes();
  return isset($themes[$theme_name]) && $themes[$theme_name]->status == 1;
}
Clive
quelle
1
Ich hatte gerade genau das Gleiche eingegeben -_-, obwohl ich die Funktion wahrscheinlich nicht aufrufen würde theme_exists, um mögliche Probleme mit dem Themensystem zu umgehen
Chapabu
1
list_themes () führt bereits statisches Caching durch, daher ist dies in dieser Funktion wahrscheinlich nicht erforderlich.
Letharion
1
@Chapabu Ich mache gerne Dinge ... interessant;)
Clive
@ Letharion Sorry, habe gerade verstanden, was du meinst, wird das Bit entfernen
Clive
1
Ich habe nicht gemeint, dass diese Funktion nicht notwendig ist, ich finde sie großartig. Ich bezog mich auf Ihre eigene Aussage, dass es durch Caching verbessert werden könnte, was ich in diesem Fall nicht für hilfreich halte.
Letharion