blöcke mit eigenem Inhalt und Strucktur

am 07.02.2015 - 16:29 Uhr in
Hallo zusammen.
Ich möchte gern in meinem Header einen Block haben, mit individuellem Inhalt und Strucktur.
Ist ein Gast auf der Seite dann soll Folgendes da sein:
- eine h2 mit Willkommen Gast
- Ein Button für Regetrieren und ein Button für Login
Ist ein User auf der Seite dann soll Folgendes da sein:
- eine h2 mit Willkommen Username
- Ein Button für Mein Profil und ein Button für Logout
- ein Feld, wo die Userpunkte des Nutzers stehen
1. Wie binde ich meine "block-userlogin.tpl.php" ein, dass diese dann auch in der Region "userlogin" als block template angewendet wird?
2. Muss ich für die Region "userlogin" über Strucktur / Blöcke auch noch einen Block anlegen?
2.1. Wenn ja, wie bekomme ich da meinen Inhalt rein, das dieser dann auch Individuell für jeden Nutzer ist?
2.2. Wenn nein, wie bekomme ich den Inhalt dann in diesen Block?
3. Ich möchte gerne für die Menübutton auf das vorhandene Usermenü von Drupal zurückgreifen.
Ich hoffe es ist verständlich ausgedrückt, und jemand kann mir ausführlicher beschreiben, wie ich an die Sache herangehen muss, ohne mir links zu den üblichen Drupalhandbüchern zu schicken. Diese habe ich bereits durchgelesen und komme mit den Erklärungen nicht wirklich klar, da mein englisch im Fachbereich Webdesign nicht perfekt ist..
- Anmelden oder Registrieren um Kommentare zu schreiben
Das sind viele Fragen in
am 07.02.2015 - 20:10 Uhr
Das sind viele Fragen in einer zusammengefasst. Entsprechend schwer kann es werden, Dir all die Auskünfte zu geben, die Du brauchen kannst.
Schauen wir mal...
Um Gästen und angemeldeten Benutzern zwei verschiedene Blöcke anbieten zu können, legst Du auch zwei Blöcke an. Der erste ist ein Textblock und hat eben den Titel "Hallo Gast" sowie die zwei Buttons als HTML im Textbereich. Den Block fügst Du in die Header-Region ein und gibst ihr als rollenbasierte Berechtigung mit, das nur "anonyme" Besucher diesen Block sehen.
Für angemeldete Benutzer gibt es einen Block "User menu", der vom user.module bereit gestellt wird und schon mal die Links "Mein Konto" und "Abmelden" enthält. Weitere Module können Links in diesem Menüblock hinzufügen. Du siehst eben diesen Block auch hier auf dieser Website oben links.
In Deinem Fall solltest Du mit PHP-Code zu Werke gehen: Du erstellst ein Modul und implementierst den Hook
hook_block_view_alter(&$data, $block)
. Dort kannst Du die Anzeige des Blocks "User menu" beliebig umbauen und z.B. den Titel in "Hallo #Name#" ändern. Dieser Block "User menu" wird sowieso nur bei angemeldeten Benutzrn angezeigt, somit hast Du zwei verschiedene Anzeigen für Gäste und angemeldete Benutzer.Da Du geschrieben hast, dass Du die Blöcke in den Header bekommen wilst. Üblicherweise nutzt man dafür eine Region "header" (oder so) eines Themes. Eine Region "User login" ist dafür unüblich. Oder hast Du Dir eine solche Region eingebaut? Pack "einfach" die beiden o.g. Blöcke in die Header-Region. Ein Template "block-userlogin.tpl.php" würde ich dafür erstmal nicht bauen/kopieren, da die von Dir gewünschten Änderungen vor dem Theming erldigt werden können, nicht beim Theming.
Das war schon mal ein guter
am 07.02.2015 - 21:19 Uhr
Das war schon mal ein guter Anfang Dirk.
Ja in meinem Header habe ich eine region namens User Login. Das ist soweit vorbereitet.
Also komme ich um das Modul schreiben nicht herum. Damit hatte ich schon mal angefangen.
Gibt es denn auch Deutsche tut seiten, wo so etwas gut erklärt ist?
Speziell jetzt zu dem Willkommen Gast Block. Im Body kann ich dann im plan text einfach mein html code eingeben? oder muss ich das per php machen?
Zur letzten Frage: Ja, Du
am 07.02.2015 - 22:04 Uhr
Zur letzten Frage: Ja, Du kannst direkt HTML dort eingeben. Dann solltest Du aber das textformat auf "Full HTML" stellen. Mit "Filtered HTML" (oder so) bekommst Du nur Bruchteile Deiens HTMLs ausgegeben.
Für den Rest wende Dich am besten an den Chat (Channel #drupal.de auf ird.freenode.net), dann kannst Du gern kleine Fragen stellen udn findest viele Entwickler, die das schon gemacht haben.
Ich würde das anders
am 07.02.2015 - 22:49 Uhr
Ich würde das anders angehen.
Wenn du einen Block mit mehreren Funktionalitäten haben willst, z.B. in Abhängigkeit davon, ob jemand eingeloggt ist oder nicht, dann nehme als Textformat "PHP-Filter" und dann schreibst du die Sachen selbst.
Damit hast du die größtmögliche Flexibilität.
Gruß
Berthold
So geht das natürlich auch.
am 07.02.2015 - 23:04 Uhr
So geht das natürlich auch. ich persönlich würde den PHP-Filter jedoch aus Sicherheitsbedenken auf keiner meiner Sites aktivieren.
Ok. Den PHP Filter habe ich
am 08.02.2015 - 00:04 Uhr
Ok. Den PHP Filter habe ich auch aus.
Gibt es denn eine Deutsche erklärung, wo die ganzen hook funktionen etwas näher erklärt sind?
Man kann ja dieses Textformat
am 08.02.2015 - 02:29 Uhr
Man kann ja dieses Textformat nur für Admins zulassen.
Meinst du wirklich, dass man damit so ein großes Sicherheitsloch reißt ?
Da würde mich die Meinung auch hier im Forum interessieren.
Ich habe mich jetzt
am 08.02.2015 - 12:47 Uhr
Ich habe mich jetzt entschieden.
Ich werde das ganze in einem Eigenen Modul dchreiben. So ist es dann auch einfacher, das ganze um funktionen zu erweitern.
Zu dem was ich brauch:
Nach login....
Usernamen
Userpoints
Link zur Profilseite
Link zum Abmelden
Da meine PHP Kenntnisse noch nicht so groß sind, versuch ich das mal mit meiner logik aufzubauen. Wenn da fehler sind, dann berichtigt mich mal bitte.
--> User loggt sich ein
--> Modul holt sich die Userdaten (uid, username) und gibt diese mit return zurück
--> anhand der uid sucht das Modul den Punktestand aus der userpoints datenbank und gibt diese per return zurück.
Somit habe ich uid, username und punktestand.
Wie kann ich denn dem Modul nun sagen, das es einen Block generieren soll, der auch unter Strucktur / blöcke auswählbar ist und nur von angemeldeten Usern sichtbar ist?
Desweiteren möchte ich, dass die Daten der Abfrage nicht drupal mässig mit content rausgeschmissen werden, sondern folgendermassen:
<div class="welcome">
<h3>Willkommen <?php print $username ?><h3>
</div>
<div class="points">
<p>Du hast Aktuell <?php print $userpoints ?>
</div>
<div class="menu">
<a href="LINK ZUM KONTROLLZENTRUM DES NUTZERS">Mein Profil</a>
<a href="LINK ZUM ABMELDEN DES NUTZERS">Logout</a>
</div>
Wenn mir jemand die nötigen Funktionen dazu nennen könnte, wäre ich sehr dankbar dafür :-)
Mystery schrieb Ich habe mich
am 08.02.2015 - 21:08 Uhr
Ich habe mich jetzt entschieden.
Ich werde das ganze in einem Eigenen Modul dchreiben. So ist es dann auch einfacher, das ganze um funktionen zu erweitern.
Gute Entscheidung!
Wenn mir jemand die nötigen Funktionen dazu nennen könnte, wäre ich sehr dankbar dafür :-)
Du musst die Hooks hook_block_info() und
hook_block_view() implementieren.
Es gibt ein Projekt examples.module, in dem im Modul
block_example
beispielhaft ein Block erstellt wird: http://cgit.drupalcode.org/examples/tree/block_example/block_example.module - das kann eine Vorlage für Dich sein. Du brauchst allerdings nur beide oben genannten Hooks implementieren.torfnase schrieb Man kann ja
am 08.02.2015 - 21:14 Uhr
Man kann ja dieses Textformat nur für Admins zulassen.
Meinst du wirklich, dass man damit so ein großes Sicherheitsloch reißt ?
Man kann darüber streiten, ob ein Admin in der Lage ist, sicheren Code in so ein Textfeld zu schreiben. Und was jemand anstellen kann, dem es gelingt, mit Adminberechtigung übers Frontend PHP-Code in eine Seiten einer Website einzuschleussen.
Ich würde nicht mal mir selbst trauen. Und benutze es deshalb nicht. Für allgemeingültige Aussagen müssen wir andere Drupaler finden. ;)
Danke dirk. Das werde ich mir
am 08.02.2015 - 21:45 Uhr
Danke dirk. Das werde ich mir mal ganz genau angucken.
Klingt auf jeden fall genau nach dem, was ich suche. Da muss ich dann nur noch die Datenbankabfrage ordentlich hinbekommen, und dann sollte das hoffentlich funktionieren
Noch mal zur Diskussion
am 09.02.2015 - 08:50 Uhr
Noch mal zur Diskussion PHP-Code in Blöcken für Admins zulassen.
Wenn man dam Admin nicht zutraut, sicheren Code in den Block zu schreiben, dann darf er aber auch keine Module schreiben, oder?
Und wenn sich jemand unberechtigterweise Admin-Zugang auf die Seite verschafft, dann ist das Kind so und so in Brunnen gefallen...
Ich habe es inzwischen auch verinnerlicht und schreibe lieber Module.
Allerdings so ganz verstanden habe ich die Begründungen nicht bis ins Letzte...
Sorry Mystery, ist ja eigentlich OffTopic...aber halt dennoch immer wieder eine interessante Frage.
Es sei dir verziehen
am 09.02.2015 - 10:03 Uhr
Es sei dir verziehen montviso, wenn du noch was passendes zu meiner Problematik hast. :-)
Speziell die Datenbank Abfragen im Modul.
Lg
montviso schrieb Noch mal zur
am 09.02.2015 - 10:14 Uhr
Noch mal zur Diskussion PHP-Code in Blöcken für Admins zulassen.
Wenn man dam Admin nicht zutraut, sicheren Code in den Block zu schreiben, dann darf er aber auch keine Module schreiben, oder?
Es ist wie immer eine Ermessensfrage: Bei der Modulentwicklung schreibe ich PHP-Code in einem Editor oder einer IDE, habe Syntax highlighting, Code completion, Syntax checks und hoffentlich Tests. Im Frontend habe ich eine Textbox.
Und wenn sich jemand unberechtigterweise Admin-Zugang auf die Seite verschafft, dann ist das Kind so und so in Brunnen gefallen...
Es ist ein Unterschied, ob jemand mit Adminberechtigung Content ändern/löschen, User anlegen oder das Sitelayout umbauen kann, oder ob er dank SQL-Statements Direktzugriff auf die Datenbank und die gesamte Codebasis hat. Schlimm ist beides, aber es ist schlimm in Abstufungen. Oder?
Ein paar Grundkenntnisse in
am 09.02.2015 - 10:15 Uhr
Ein paar Grundkenntnisse in SQL solltest Du dazu schon haben. Ich baue mir bei solchen Anforderungen einfach einen View, der mein Problem löst und lasse mir von Views die erzeugte Abfrage anzeigen. Die überarbeite ich dann noch etwas, denn es geht manches einfacher, wenn man die Abfrage gezielt aufbaut, als bei einer einer generischen Erzeugung. Diese so gewonnene Abfrage kannst Du dann noch mit phpMyAdmin überprüfen.
@Mystery, ich schau mir das
am 09.02.2015 - 10:26 Uhr
@niebegeg.net , ja, stimmt, zwischen Schwarz und Weiß gibt es auch "Schlimm" in Graustufen. ;-)
Wenn ich in Versuchung gerate, mal schnell ein paar Zeilen Code in Blocks zu schreiben, dann ist das nicht mehr, als ein paar Zeilen ausgeben, z.B. einen Usernamen oder eine kurze Berechnung.
Sobald der Code komplexer wird, würde ich auch jederzeit ein Modul vorziehen, das ich im IDE schreibe und debugge.
Früher habe ich das mal in einem Projekt so gelöst:
Datei im System abgelegt und im IDE bearbeit und per include() im Block einbinden.
Aber ich sehe das auch nicht mehr unbedingt als die sauberste Methode, nur sehr pratkisch.
@Mystery, kannst Du Deine
am 09.02.2015 - 10:35 Uhr
@Mystery, kannst Du Deine Frage zur Datenbank-Abfrage noch mal konkreter stellen?
Ich verstehe nicht so genau, wo Du da hängst - auch nicht nach Lesen des Threads.
Geht es z.B. um das Thema userpoints?
Wo kommen die her?
Handelt es sich um das Modul User points?
https://www.drupal.org/project/userpoints
Dann mußt Du Dich mal mit der API beschäftigen.
http://api.worldempire.ch/api/userpoints/userpoints.api.php/group/userpo...
Da gibt es z.B. die Funktion userpoints_get_current_points().
Der gibst Du als Argument die ID des Users mit.
Da habe ich auf die Schnelle ein Beispiel gefunden, wie die Funktion eingesetzt wird:
http://drupal.stackexchange.com/questions/88888/how-can-i-check-whether-...
Im Beispiel gehts um Rules, sicher findest Du noch mehr.
Ganz genau dieses User Point
am 09.02.2015 - 11:33 Uhr
Ganz genau dieses User Point modul nutze ich.
Ich werde die abfrage mal schreiben, und dann hier posten. Wenn da fehler auftreten, könnt ihr mir diese ja berichtigen und ggf. auch erklären, warum das falsch ist.
Ich bin nicht sicher, ob Dir
am 09.02.2015 - 11:50 Uhr
Ich bin nicht sicher, ob Dir das klar geworden ist aus meinen Links:
Da es eine API gibt (Sammlung hilfreicher Funktionen für dieses Modul), mußt Du nicht selbst eine Datenbankabfrage schreiben, sondern kannst einfach die genannte Funktion ausgeben lassen.
Also ganz wenig Code.
Doch das ist mir klar, Mir
am 09.02.2015 - 12:16 Uhr
Doch das ist mir klar, Mir geht es auch eher um den Syntax und das es dann auch das ausgibt, was ich möchte :-)
PHP ist leider nicht meine Stärke und bis jetzt hatte ich auch wenig mit funktionen in bezug auf php zu tun.
Hier mal der Code. Laut Drewamweaver sind keine Syntax fehler drin.
<?php
function userlogin_username_alter(&$name, $account) {
$user = user_load($account->uid);
return $name;
}
function userpoints_get_current_points($uid = NULL, $tid = NULL) {
$points = drupal_static(__FUNCTION__, array());
if (!$uid) {
global $user;
$uid = $user->uid;
}
// 0 is a valid value for the Uncategorized category.
if (!isset($tid)) {
$tid = userpoints_get_default_tid();
}
if (!isset($points[$uid][$tid])) {
if ($tid === 'all') {
$points[$uid][$tid] = (int) db_query('SELECT points FROM {userpoints_total} WHERE uid = :uid', array(':uid' => $uid))->fetchField();
}
else {
$points[$uid][$tid] = (int) db_query('SELECT points FROM {userpoints} WHERE uid = :uid AND tid = :tid', array(':uid' => $uid, ':tid' => $tid))->fetchField();
}
}
return $points[$uid][$tid];
}
print ("Willkommen " . $name);
print ("Du hast Aktuell " . $points . " Punkte");
?>
Du mußt die Funktionen nicht
am 09.02.2015 - 12:30 Uhr
Du mußt die Funktionen nicht komplett übernehmen, sondern nur ausgeben.
Das wäre dann in etwas sowas:
<?php
global $user;
$username = $user->name;
$userid = $user->uid;
$userpoints = userpoints_get_current_points($userid, 'all');
print "Willkommen ". $username.<br>Du hast ".$userpoints." Punkte.";
?>
Ah ok. Das ist natürlich ne
am 09.02.2015 - 12:35 Uhr
Ah ok. Das ist natürlich ne bessere Variante.
Danke für die Zusammenfassung der Funktion :-)