[gelöst] eigene PHP-Anweisungen in template.php funktionieren nicht
am 21.10.2009 - 15:59 Uhr in
Hey Leute, ich habe ein kleines Problem:
Wenn man einen neuen Node erstellt, wird ja angezeigt, wer diesen Beitrag wann verfasst hat.
Die Ausgabe dafür steht in der node.tpl.php mit "print $submitted".
Und im Beitrag steht dann Beispielsweise:
"Verfasst von Max Muster am 20. Oktober 2009 - 1:00"
Allerdings würde ich daran gerne eine kleine Änderung vornehmen.
Nämlich möchte ich den Benutzern meiner Seite sozusagen einen "Titel" bzw. eine Funktion innerhalb unseres Vereins zuweisen.
Und zwar war das so gedacht, dass es dafür ein Feld im Nutzerprofil gibt.
Ich lege also ein Feld für Benutzerprofile an und bei den meisten steht dort eben "Mitglied" drin.
Aber zum Beispiel bei Max Muster soll dort "Ausbildungsleiter" stehen, weil er eben bei uns der Ausbildungsleiter ist.
Wenn man das Profil der Leute aufruft, kann man diese Funktion also auch sehen.
Und ich möchte es jetzt so einrichten, dass bei einem neuen Beitrag die Funktion mit hinter dem Namen steht.
Also soll das ganze am Ende so aussehen:
"Verfasst von Max Muster, Ausbildungsleiter am 20. Oktober 2009 - 1:00"
Allerdings weiß ich nicht so recht, wie ich das machen kann =(
Kann man in der node.tpl.php irgendwie über $name oder $uid auf die Profilfelder zugreifen?
Oder kennt jemand einen anderen Weg, das ganze umzusetzen?
mfg Exterior
- Anmelden oder Registrieren um Kommentare zu schreiben
Du kannst die Funktion
am 21.10.2009 - 16:59 Uhr
Du kannst die Funktion function theme_node_submitted in der template.tpl.php überschreiben
function my_theme_node_submitted($node) {
// Da musst du nun das Profil laden profile_load_profile($user);
// Dein Feld $profile->dein_feld in die Ausgabe einbauen
return t('Submitted by !username on @datetime',
array(
'!username' => theme('username', $node),
'@datetime' => format_date($node->created),
));
}
Wo finde ich diese
am 21.10.2009 - 20:51 Uhr
Wo finde ich diese template.tpl.php?
In meinem Template "Pixture Reloaded" gibt es nur eine Datei namens "template.php" und dort drin taucht nicht einmal das Wort "submitted" auf =(
Empfehlung drupal handbuch
am 22.10.2009 - 08:04 Uhr
Meine empfehlung an dich währe du :( liesst :( dir das Theming handbuch auf drupalcenter durch dann kannst du auf jeden fall was mit dem kommentar oben anfangen :) drupal theming handbuch
zu 1. ja er meint die template.php
und zu 2. es ist ein beispiel für eine funktion die denn von dir gewollten effect haben sollte . du wirst sie nicht in der template.php finden sondern erst selbst schreiben müssen oder (kopieren ;) indem du mit dem devel modul auf die ausgabe von"Verfasst von Max Muster am 20. Oktober 2009 - 1:00 " drückst und dann im schwarzen fenster auf den funktions name ).
mytheme wird ersetzt durch deinen theme name. aber das wird alles besser und ausführlicher im handbuch erklärt
Danke für den Ratschlag
am 22.10.2009 - 10:27 Uhr
Danke für den Ratschlag =)
Also das erstellen von der Funktion hat super geklappt, somit ist ja fast alles in Ordnung.
Allerdings weiß ich jetzt nicht so recht, wie ich das gewünschte Feld in die Ausgabe bekomme =(
Muss ich dieses profile_load_profile($user) einer Variable zueisen?
Also so hier: $profile = profile_load_profile($user)?
Hab leider keine Ahnung, wie ich jetzt genau an das Profilfeld komme =(
Leider ein neues Problem
am 23.10.2009 - 20:51 Uhr
So, ich bin jetzt zwar an das Profilfeld rangekommen, aber die Variable $user ist wohl immer mit dem User belegt, der sich gerade die Seite anschaut. Das heißt, wenn ich das so mache, würden jedem User die eigenen Profildaten angezeigt, was ja recht sinnlos ist.
Also habe ich mal kurzerhand versucht, einen anderen Weg einzuschlagen:
Per PHP selbst eine Datenbank-Verbindung herstellen, die nötigen Felder abfragen, in Variablen abspeichern und ausgeben.
Soweit, so gut, allerdings stoße ich dabei an ein Problem =(
So sieht mein PHP-Script für die das Submitted aus:
<?php function pixture_reloaded_node_submitted($node) {
//Name für WHERE-Klausel ermitteln
$name = theme('username', $node);
$datum = format_date($node->created);
//MySQL-Verbindung aufbauen
$host = "localhost";
$usr = "Benutzername";
$pw = "Passwort";
$db = "Datenbank";
$verbindung = mysql_connect($host, $usr, $pw) or die ("Keine Verbindung zu der Datenbank möglich.");
mysql_select_db($db, $verbindung);
//MySQL-Abfrage erstellen und ausführen
$sql = "SELECT profile_values.value FROM profile_values INNER JOIN users ON profile_values.uid = users.uid WHERE (users.name LIKE '$name') AND ((profile_values.fid LIKE '7') OR (profile_values.fid LIKE '1') OR (profile_values.fid LIKE '2')) ORDER BY profile_values.fid;";
$result = mysql_query($sql);
//Die drei benötigten Felder in Variablen ablegen
$row = mysql_fetch_array($result);
$vorname = $row['value'];
$row = mysql_fetch_array($result);
$nachname = $row['value'];
$row = mysql_fetch_array($result);
$typ = $row['value'];
//Submitted-Ausgabe zusammenstellen
return ("Geschrieben von $vorname $nachname($typ) am $datum");?>
Funktioniert leider nicht so ganz und ich weiß nicht, warum =(
Wenn ich alles von meinem eigenen PHP-Teil in eine eigene test.php kopiere, welche dann so aussieht:
<?php
$host = "localhost";
$usr = "Benutzername";
$pw = "Passwort";
$db = "Datenbank";
$name = 'Max Muster';
$verbindung = mysql_connect($host, $usr, $pw) or die ("Keine Verbindung zu der Datenbank möglich.");
mysql_select_db($db, $verbindung);
$sql = "SELECT profile_values.value FROM profile_values INNER JOIN users ON profile_values.uid = users.uid WHERE (users.name LIKE '$name') AND ((profile_values.fid LIKE '7') OR (profile_values.fid LIKE '1') OR (profile_values.fid LIKE '2')) ORDER BY profile_values.fid;";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$vorname = $row['value'];
$row = mysql_fetch_array($result);
$nachname = $row['value'];
$row = mysql_fetch_array($result);
$typ = $row['value'];
echo "Verfasst von $vorname $nachname ($typ) am so-und-so-vielten";
?>
dann gibt mir die Datei test.php fehlerfrei "Verfasst von Max Muster (Ausbilder) am so-und-so-vielten" aus.
Aber wenn ich das ganze wie oben in die submitted-Funktion in der template.php einfüge, funktioniert es nicht mehr =(
Er gibt die Variablen meiner eigenen PHP-Anweisungen einfach nicht aus.
Das heißt, das obere Script gibt dann "Geschrieben von am 10.Oktober 2009 - 20:00" aus.
Die Variablen $name und $datum funktionieren ohne Probleme und lassen sich in "return t()" auch ausgeben, aber die Variablen, welche aus meiner eigenen Datenbank-Verbindung ausgegeben werden sollen, nämlich $vorname, $nachname und $typ, werden nicht ausgegeben, anscheinend werden sie gar nicht belegt.
Leider hab ich keine Ahnung, woran das liegen könnte =(
Wie gesagt, die PHP-Anweisung mit der Datenbankverbindung und auch die Variablen-Belegung funktioniert auf jeden Fall.
Aber sobald ich sie in diese Funktion in der template.php einfüge, klappt's nicht mehr =(
Bitte helft mir.
mfg Exterior
Also ich bin jetzt einen
am 24.10.2009 - 16:39 Uhr
Also ich bin jetzt einen Schritt weiter, aber so richtig hilft mir das auch nicht =(
Folgendes habe ich herausgefunden:
Wenn ich unter "Berechtigungen" einer Rolle erlaube, dass sie die Nutzerprofile anschauen darf, dann werden dieser Rolle meine ganzen eigenen Variablen ($vorname usw.) nicht mit ausgegeben.
Wenn ich allerdings verbiete, die Nutzerprofile einzusehen, dann werden die Variablen ausgegeben und alles klappt so, wie's soll.
Als Beispiel: Ich als Admin habe dort eine fehlerhafte Ausgabe, weil ich natürlich die Profile sehen darf.
Gäste allerdings dürfen keine Profile sehen. Als meine Freundin einfach mal die Seite besucht hatte, war bei ihr die Ausgabe in bester Ordnung.
Weiß jemand, woran das liegt?
Ich würde nämlich gerne beides verbinden: Profile anschauen dürfen UND eine fehlerfreie Ausgabe liefern.
Woran kann das denn liegen, dass die Variablen nicht ausgegeben werden, wenn man Profile einsehen darf?
mfg Exterior
So kannst du den user zum
am 24.10.2009 - 17:03 Uhr
So kannst du den user zum node ausgeben
// node id bestimmen
$nid = arg(1);
// node laden
$node = load_node($nid);
// user laden
$user = load_user($nid->uid);
//profil laden
$profile = load_profile($user);
Habe das Problem jetzt
am 01.11.2009 - 18:36 Uhr
Habe das Problem jetzt anders "gelöst".
Da ich nicht feststellen konnte, warum die PHP-Anweisung nicht ausgeführt wird, wenn man Leserechte auf die Nutzerprofile hat, habe ich allen diese Leserechte entzogen und mir mit Views eine eigene Profilseite gebastelt, die den Benutzer als Argument übergibt.
Tiger, kannst Du das ein wenig genauer erklären?
am 22.02.2011 - 16:06 Uhr
Ich komm da nicht weiter obwohl das genau meine Problemstellung betrifft.
Vielen Dank
Holla, das ist ja auch mal
am 22.02.2011 - 17:47 Uhr
Holla, das ist ja auch mal ein richtig alter Thread ^^
Was genau ist denn dein Problem und wie genau kommst du nicht weiter?
na ja, ich wollte die
am 22.02.2011 - 18:06 Uhr
na ja, ich wollte die theme_node_submitted in der template.tpl.php überschreiben.
Über $node->uid bekomme ich die uid des Authors. Jetzt wollte ich dem Template sagen, dass es mir doch bitte anstatt den Username der in $name steht ein feld aus dem Profilfeld ausgeben soll.
So jetzt hab ich die Funktion theme_node_submitted($node) und habe so gar keine Ahnung wie es weitergehen soll.
// node id bestimmen
$nid = arg(1);
// node laden
$node = load_node($nid);
// user laden
$user = load_user($nid->uid);
//profil laden
$profile = load_profile($user);
hab ich nix kapiert, wo kommt da was hin, und wo nicht?
(Übrigens hab ich ne Lösung mittlerweile. Das funktioniert ganz gut mit dem Realname Modul oder mit einem View - aber ich wollte das hier oben gerne kapieren.)
BTW, hast Du evtl noch eine Antwort auf http://www.drupalcenter.de/node/33732? ;-)