Themable Functions
am 24.09.2006 - 23:40 Uhr in
Wenn man themeable functions überschreiben möchte, stellt sich natürlich die Frage, welche überhaupt zur Verfügung stehen. Es gibt welche aus dem Drupal-Core Code und welche aus den bereitgestellten (contributed) Modulen. Die aus dem Drupal-Core sind hier http://api.drupal.org/api/4.7/group/themeable zu finden.
Hier ist allerdings die Frage wie aktuell die API-Dokumentation ist. Und, was ist mit den themeable functions der Module, die in einer Drupal Installation aktiviert sind? Im Code der Module suchen?
Nein.
Mit dem folgenden PHP-Snippet lassen sich alle themeable functions einer Drupal Installation ermitteln.
Die Namen der Funktionen geben Aufschluss darüber, zu welchem Modul diese gehören. Verbesserungen dieses Snippets wären eine bessere Sortierung und ein Filtern der nicht zum Core-Code gehörenden Funktionen.
Bei diesen könnte man dann zusätzlich auf die API verweisen (bspw. so):
<a href='http://api.drupal.org/api/HEAD/function/$function' target='_blank'>$function</a>
Und hier der Code für alle themeable functions einer Drupal Installation:
<?php
$functions = get_defined_functions();
foreach($functions['user'] as $function) {
if(substr($function,0,6)== 'theme_')
echo $function . '<br/>';
}
?>
- Anmelden oder Registrieren um Kommentare zu schreiben
Vielen Dank
am 27.09.2006 - 20:18 Uhr
Könntest du auch ein Beispiel einfügen, wie ich eine solche Funktion überschrieben kann ?
Währe dir dankbar! Beschäftige mich seit 9 Tagen mit Drupal, daher noch etwas Neuling ;-)
Themeable functions überschreiben
am 27.09.2006 - 20:56 Uhr
In der
template.php
des Themes - wenn nicht vorhanden einfach anlegen - die Funktion neu definieren und nach belieben anpassen.Variante 1:
Die Funktion
theme_box
sieht beispielsweise so aus:function theme_box($title, $content, $region = 'main') {
$output = '<h2 class="title">'. $title .'</h2><div>'. $content .'</div>';
return $output;
}
In der
template.php
könnte sie dann so aussehen:function phptemplate_box($title, $content, $region = 'main') {
$output = '<h3 class="subtitle">'. $title .'</h3><div>'. $content .'</div>';
return $output;
}
Beachte bitte die Umbenennung von
theme_box
inphptemplate_box
.Variante 2: (empfohlen)
In der
template.php
- wenn nicht vorhanden einfach anlegen - die Funktion einfangen und eine neue Template Datei dafür anlegen:function mythemename_box($title, $content, $region = 'main') {
return _phptemplate_callback('box', array('title' => $title, 'content' => $content, 'region ' => $region));
}
Im Themeverzeichnis die Datei
box.tpl.php
anlegen und beliebig anpassen:<h3 class="subtitle"><?php print $title ?></h3>
<div><?php print $content ?></div>
Beachte, dass
mythemename_
mit dem Namen des benutzten Themes und das erste Argument der Funktion_phptemplate_callback()
mit dem Dateinamen übereinstimmt, in diesem Fallbox
mitbox
.tpl.php
vg
--
sanduhrs - drupalcenter
-----------------------
http://erdfisch.de
--
sanduhrs · Stefan Auditor · Drupalcenter
http://drupal.org/user/28074 · http://association.drupal.org/user/646
Das nenne ich Support!
am 27.09.2006 - 21:18 Uhr
Drupal überzeugt mich immer mehr!
Auch hier vielen Dank für die Simple und verständliche Darstellungsweise.
Auf der Kommandozeile
am 02.12.2006 - 00:08 Uhr
Für den schnellen Überblick auf der Kommandozeile (Shell) ist dieser Einzeiler geeignet:
grep -rsH function\ theme_ *|awk -F '(:function | {)' '{ print $2"\t"$1 }' | sort
Es werden alle themeable functions der Dateien des aktuellen Verzeichnisses und seiner Unterverzeichnisse angezeigt. Ruft man ihn z.B. im Verzeichnis eines Moduls auf, werden nur die themeable functions dieses Moduls ausgegeben.
Toll
am 02.12.2006 - 00:33 Uhr
Da ja nicht alle eine Shell haben, wäre es doch toll, das über ein Modul oder PHP-Snippet zugänglich zu machen.
Für alle themeable functions geht das ja (s.o. oder hier: http://drupal.mdwp.de/system_info/themeable_functions).
Für die Themeable Functions eines speziellen Moduls hab ich da noch keine Lösung gefunden.
md - drupalcenter
--
http://drupal.mdwp.de
vg
md - DrupalCenter.de
mdwp* Drupal Consulting & Services
Für ohne Shell
am 02.12.2006 - 22:07 Uhr
Der obige Einzeiler war auch explizit für Shell-Benutzer gedacht. Er gibt übrigens auch den Pfad der Datei aus, in dem die Funktion deklariert wurde. Hat man keinen Shell-Zugang, läßt sich das ganze als PHP-Snippet verpackt in eine Drupal-Page schreiben. Die Variante von md ist allerdings wesentlich schneller, da sie nicht in Dateien suchen muß.
Ausgegeben werden im Erfolgsfall Funktion und dazu die Datei, in der sie deklariert ist. Die Ausgabe erfolgt als Description List, die sich mit etwas CSS sicher schön formatieren läßt. In der Variable $path kann das zu durchsuchende Verzeichnis angegeben werden. Es werden auch dessen Unterverzeichnisse durchsucht. Da das Ermitteln der Funktionen von der Existenz der UNIX-Befehle grep, awk und sort abhängt, läuft es möglicherweise nicht auf jedem Server.
<?php
$path = dirname($_SERVER['SCRIPT_FILENAME']);
print 'Themeable Functions im Verzeichnis <em>' .htmlentities($path). '</em> ermitteln...<br />';
$cmd = 'grep -rsH function\ theme_ ' . $path . '|awk -F \'(:function | {)\' \'{ print $2"\t"$1 }\' | sort';
if(exec($cmd, $functionList)) {
if (is_array($functionList)) {
print '<dl>';
foreach ($functionList as $zeile) {
$function = explode("\t", $zeile);
print '<dt>' . $function[0] . '</dt><dd>' . $function[1] . '</dd>';
}
print '</dl>';
}
else {
print 'Keine themeable function im Verzeichnis <em>' . htmlentities($path) . '</em> und dessen Unterverzeichnissen gefunden.';
}
}
else {
print 'Fehler beim Ausfuehren der Programmzeile<br /><code>' . htmlentities($cmd) . '</code>.';
}
?>
Drupal Funktionen
am 03.12.2006 - 18:40 Uhr
Falls die UNIX-Befehle nicht zur Verfügung stehen:
Ich hab mein neulich geschriebenes Modul - Anzeige aller Drupal Funktionen - ein wenig erweitert. Es werden jetzt auch schön übersichtlich die Funktionen aller aktivierten Module in Gruppen zusammengefasst und angezeigt.
Fall sich schon jemand ein Lesezeichen angelegt hat, so ist das leider nicht mehr gültig, da ich die URL-Pfade geändert habe. (system_info wurde zu drupal_info)
http://drupal.mdwp.de/drupal_info
md - drupalcenter
--
http://drupal.mdwp.de
vg
md - DrupalCenter.de
mdwp* Drupal Consulting & Services