Vérifiez si le thème est activé par programme

9

Comment puis-je vérifier si un thème est activé sur une installation Drupal? Je cherche quelque chose comme module_exists () mais pour des thèmes. Je n'ai rien trouvé sur la documentation.

Kyle
la source

Réponses:

6

Utilisez list_themes

Paramètres

$ refresh : Indique s'il faut recharger la liste des thèmes de la base de données. La valeur par défaut est FALSE.

Valeur de retour

Un tableau associatif des thèmes actuellement disponibles. Les clés sont les noms des machines des thèmes et les valeurs sont des objets ayant les propriétés suivantes:

  • nom : Le chemin du fichier et le nom du fichier .info.
  • nom : nom de la machine du thème.
  • état : 1 pour les thèmes activés, 0 pour les thèmes désactivés.
  • info : le contenu du fichier .info.
  • feuilles de style : un tableau à deux dimensions, utilisant la première clé pour l'attribut media (par exemple 'all'), la seconde pour le nom du fichier (par exemple style.css). La valeur est un chemin de fichier complet (par exemple, themes / bartik / style.css). Non défini si aucune feuille de style n'est définie dans le fichier .info.
  • scripts : un tableau associatif de JavaScripts, utilisant le nom de fichier comme clé et le chemin de fichier complet comme valeur. Non défini si aucun script n'est défini dans le fichier .info.
  • prefix : préfixe du moteur de thème de base.
  • moteur : nom de la machine du moteur de thème.
  • base_theme : S'il s'agit d'un sous-thème, le nom de machine du thème de base défini dans le fichier .info. Sinon, l'élément n'est pas défini.
  • base_themes : S'il s'agit d'un sous-thème, un tableau associatif des ancêtres du thème de base de ce thème, en commençant par le thème de base de ce thème, puis le propre thème de base du thème de base, etc. Chaque entrée a une clé de tableau égale à celle du thème. nom de la machine et une valeur égale au nom du thème lisible par l'homme; si un thème avec le nom de machine correspondant n'existe pas dans le système, la valeur sera plutôt NULL (et puisque le système ne saurait pas si ce thème lui-même a un thème de base, cela mettra fin au tableau des thèmes de base). Ceci n'est pas défini si le thème n'est pas un sous-thème.
  • sub_themes : un tableau associatif de thèmes sur le système qui sont soit des sous-thèmes directs (c'est-à-dire qu'ils déclarent que ce thème est leur thème de base), des sous-thèmes directs des sous-thèmes, etc. Les clés sont la machine des thèmes les noms et les valeurs sont les noms lisibles par l'homme des thèmes. Cet élément n'est pas défini s'il n'y a aucun thème sur le système qui déclare ce thème comme thème de base.

Utilisez path_to_theme pour obtenir un thème actif.

Il peut pointer vers le thème actif ou le module gérant une implémentation thématique. Par exemple, lorsqu'elle est invoquée dans le cadre d'un appel de thème, cela dépend de l'endroit où la fonction de thème est gérée. S'il est implémenté à partir d'un module, il pointera vers le module. S'il est implémenté à partir du thème actif, il pointera vers le thème actif. Lorsqu'il est appelé en dehors de la portée d'un appel à thème, il pointe toujours vers le thème actif.

niksmac
la source
3

Les données sont en fait conservées exactement au même endroit, la systemtable. Je n'ai pas pu trouver une fonction existante à vérifier (bien qu'il y en ait probablement une quelque part), mais cela devrait faire l'affaire:

function theme_exists($theme_name) {
  $themes = list_themes();
  return isset($themes[$theme_name]) && $themes[$theme_name]->status == 1;
}
Clive
la source
1
Je venais de terminer de taper exactement la même chose -_- bien que je n'appellerais probablement pas la fonction theme_existsjuste pour éviter les problèmes possibles avec le système de thème
Chapabu
1
list_themes () fait déjà une mise en cache statique, il n'y a donc probablement pas besoin de cela dans cette fonction.
Letharion
1
@Chapabu J'aime rendre les choses ... intéressantes;)
Clive
@Letharion Désolé juste ce que vous vouliez dire, supprimera ce bit
Clive
1
Je ne voulais pas dire que cette fonction n'était pas nécessaire, je pense que c'est génial. Je faisais référence à votre propre déclaration selon laquelle elle pourrait être améliorée avec la mise en cache, ce qui, je pense, ne serait pas utile dans ce cas.
Letharion