User Relationship Actions
am 20.04.2012 - 10:30 Uhr in
Hallo,
nachdem ich feststellen musste dass der „User Relationship Action Block“ nur den Administratoren zu Verfügung gestellt wird habe ich mich mal ran gemacht und versucht auch Google etwas Brauchbares zum zusammenschnipseln zu bekommen. Dabei ist das hier heraus gekommen:
<?php
global $user;
global $relationships;
//global $language;
$profile_uid = arg(1);
//if users are friends and relationship has been approved
if ($relationships = user_relationships_load(array('between' => array($user->uid, $profile_uid),'approved' => 1)))
{
print "This user is a relationship";
}
//if a friend request has been made between the users, but hasn't been approved
else if ($relationships = user_relationships_load(array('between' => array($user->uid, $profile_uid),'approved' => 0)))
{
print "You have a pending relationship request with this user";
}
//if the page is not the own profilepage
elseif ($user->uid <> $profile_uid)
{
print "<a href=\"?q=";
// print $language->language;
print "/relationship/";
print $profile_uid;
print "/request/1\">";
print t('Request a relationship to this user');
print "</a><br/>";
}
?>
Diesen Code habe ich dann als PHP in einen Block eingebunden und unter "Only the listed pages " noch "user/* hinzugefügt. Funktioniert bei mir wunderbar. Vielleicht hilft es ja dem einen oder anderen.
Da ich nur ein Laie bin wäre es schön, wenn der eine oder anderen PHP-Guru da mal rüber fligt und diesen Code vielleicht weiter entwickelt, so dass er für eine möglichst große Anzahl an Usern Sinn macht bzw. „sauberer“ geschrieben ist.
Beste Grüße
Frank
- Anmelden oder Registrieren um Kommentare zu schreiben
Vorsicht mit User-Eingaben
am 22.04.2012 - 13:53 Uhr
Hallo,
wie ich in Drupal 7 überprüft habe (D6 könnte da abweichen) erscheint der Block, wenn der Benutzer das Recht hat, alle Relations des entsprechenden Typs zu sehen. Das mag aber nicht unbedingt sinnvoll sein für diese Funktion dieses weitreichende Recht zu vergeben.
Es gibt aber wahrscheinlich mehrere, sinnvollere Wege, das zu erreichen, was Du gerne hättest als Dein Snippet, wie z.B. den Block-Inhalt zu laden oder zu manipulieren, den user_relationships da bereit stellt. Somit halte ich es nicht für sinnvoll, Dein Code-Snippet weiter zu entwickeln. Vor allem könntest Du ein Feature-Request Issue auf drupal.org erstellen, die Deinem Usecase entgegen kommt.
Zu Deiner Programmierung:
Ganz wichtig: Du übernimmst mit arg(1) Informationen, die über den Pfad übergeben werden. Dabei besteht das Risiko, daß Schadcode in das System eingebracht wird, vor allem, wenn bei der Weiterverarbeitung Datenbankabfragen daraus generiert werden (SQL Injection).
Wenn Du nicht sicher weißt, ob die Funktion (in diesem Fall "user_relationships_load") die Parameter bereinigt, die Du ihr übergibst, solltest Du die Daten prüfen. Das wird bei numerischen Werten z.B. mit is_numeric() sichergestellt. Da diese Funktion ein TRUE or FALSE zurück liefert nutzt man diese in einer If Abfrage:
<?php
if (is_numeric(arg(1)) {
//Dein Code
}
?>
Die ungeprüfte Übernahme von arg() gehört meiner Meinung nach zu den häufigsten sicherheitskritischen Fehlern, die in Drupal gemacht werden, leider auch in vielen Code-Snippets, die man so mit Google findet. Lerne lieber aus offiziellem Code von drupal.org. Siehe auch http://drupal.org/writing-secure-code und http://drupal.org/node/101495
Es gibt die Meinung den PHP Filter komplett abzuschaffen. Neben Sicherheitsbedenken ist es vor allem schwer PHP in der Datenbank zu reparieren, wenn da mal ein Fehler auftaucht. Die Situation kann man verbessern, in dem man ein Custom Module erstellt und z.B. im Block nur das Ergebnis einer Funktion aufruft, die den komplexeren Code enthält:
<?php
echo _custom_myblock()
?>
Viele Grüße,
Carsten
# DrupalCenter-Moderator # https://www.drupal.org/u/c-logemann
# CTO der Nodegard GmbH: Tech. Concepts | Security + Availability Operations / Wir unterstützen IT-Abteilungen, Agenturen, Freiberufler:innen
Hallo und Danke für deine
am 22.04.2012 - 19:51 Uhr
Hallo und Danke für deine Rückmeldung...
Also zuerst einmal grundsätzlich:
Was hatte ich mit dem Module vor?
Es sollte jedem User die Möglichkeit bieten auf einer userseite zu sehen, ob eine relationship besteht bzw. eine beantragt ist. Falls nicht, sollte die Möglichkeit existieren eine anzulegen.
Ich konnte bei der Suche im Netz sehen, dass sehr viele Menschen genau nach so etwas gesucht haben. In sofern halte ich es schon für sinnvoll.
wie ich in Drupal 7 überprüft habe (D6 könnte da abweichen) erscheint der Block, wenn der Benutzer das Recht hat, alle Relations des entsprechenden Typs zu sehen
War mir jetzt so nicht klar aber macht das nicht auch Sinn, dass nur User das zu sehen bekommen, welche auch eine eingehen können?
Es gibt aber wahrscheinlich mehrere, sinnvollere Wege, das zu erreichen, was Du gerne hättest als Dein Snippet, wie z.B. den Block-Inhalt zu laden oder zu manipulieren, den user_relationships da bereit stellt. Somit halte ich es nicht für sinnvoll, Dein Code-Snippet weiter zu entwickeln.
Wenn so viele bessere Möglichkeiten gibt wäre es nett auf eine genauer ein zu gehen.
Vor allem könntest Du ein Feature-Request Issue auf drupal.org erstellen, die Deinem Usecase entgegen kommt.
Das stimmt natürlich, führt aber nicht zwingend zum Erfolg. Auch der zeitliche Rahmen ist da natürlich ein Argument. Die Entwickler der Module haben sicher auch eine Menge zu tun..
Ganz wichtig: Du übernimmst mit arg(1) Informationen, die über den Pfad übergeben werden. Dabei besteht das Risiko, daß Schadcode in das System eingebracht wird, vor allem, wenn bei der Weiterverarbeitung Datenbankabfragen daraus generiert werden (SQL Injection).
Danke für den Hinweis. Da ich aber im Grunde keine Ahnung von den Dingen habe wäre es ganz nett wenn du deinen Vorschlag
<?php
if (is_numeric(arg(1)) {
//Dein Code
}
?>
einmal in den Code oben einbinden könntest.
Es gibt die Meinung den PHP Filter komplett abzuschaffen. Neben Sicherheitsbedenken ist es vor allem schwer PHP in der Datenbank zu reparieren, wenn da mal ein Fehler auftaucht. Die Situation kann man verbessern, in dem man ein Custom Module erstellt und z.B. im Block nur das Ergebnis einer Funktion aufruft, die den komplexeren Code enthält:
Ich kann nachvollziehen, dass es besser ist so eine Sache in ein Modul einzubinden da die reine Abfrage weniger Schaden anrichten sollte. Aber wenn ich das Recht sehe braucht man den PHP-Filter dennoch. In sofern macht das Ding schon Sinn.
Die Idee dahinter war ja es mit Hinweisen besser zu machen (open source eben...).
Viele Grüße
Frank