Hin und wieder stößt man auch bei Joomla an kleine Funktionalitätsprobleme. Joomla ist zwar das ideale Werkzeug um kleine bis mittlere Webprojekte umsetzen zu können, aber es bleiben halt manchmal Wünsche offen.
Bei der Umsetzung dieser WebSite hat es mich sehr gestört, dass der Menüpunkt Registrierung auch sichtbar war, wenn sich ein Kunde einloggt. Diesen verwirrt das nur.
Also habe ich mich mal dran gemacht und ein kleinen Hack durchgeführt.
Falls jemand interesse hat, hier die Lösung:
Aufgabenstellung:
Ein beliebiger Menüpunkt soll verschwinden wenn man eingeloggt ist und nur für öffentliche User sichtbar sein (also die, die nicht eingeloggt sind).
Lösung:
Teil 1 - Datenbank:
- Wir haben haben normalerweise 3 Zugriffebenen -> öffentlich, registriert und spezial. Hier gilt es jetzt noch eine vierte hinzuzufügen, welche ich in meinem Beispiel "loggedin" gennant haben. Ist aber völlig egal, da es ja nur im Backend zu sehen ist.
- Wir suchen die Tabelle #_groups (wobei #_ für das Datenbankprefix steht) und fügen hier einfach noch eine Gruppe hinzu; diese aber möglichst mit einer großen ID, damit wir in Zukunft auch noch mehr Gruppen anlegen können. In diesem Fall habe ich die ID 99 gewählt. Das hinzufügen in der Datenbank macht man am besten mit diesem Befehl:
INSERT INTO `#_groups` (`id`, `name`) VALUES ('99', 'loggedin'); - Ab jetzt sollte im Backend als Zugriffsebene folgendes aufweisen

Teil 2 - Dateien
- jetzt müssen wir natürlich die entsprechenden Bedingungen noch der Menüsteuerung zur Verfügung stellen.
-
Als erstes editieren wir die Datei -> modules/mod_mainmenu/tmpl/default.php und suchen uns die Zeile "
if ($child->attributes('access') > $user->get('aid', 0) {" (ca. Zeile 30). Diese müssen wir nun noch um unsere ID 99 Bedingung ergänzen. Sie sollte dann wie folgt aussehen: "if ($child->attributes('access') > $user->get('aid', 0) && $child->attributes('access') attributes('access') == '99' && $user->get('aid', 0) > 0) {". Wir haben der Bedingung nun mitgeteilt, dass es noch die Zugriffsid 99 zu berücksichtigen gibt. - Damit wir habe nach dem klicken auch dahin kommen, müssen wir noch die Zugriffsrechte des Menüs erweitern. Das erfolgt in der Datei -> libraries/joomla/application/menu.php. Dort suchen wir uns die Methode (function) authorize und fügen direkt nach der Zeile "
$menu =& $this->getItem($id);" folgenden Code ein: "if ($menu->access == 99) { $menu->access = 0; }". Jetzt haben wir die ID 99 wider zu einer 0 degradiert und somit für alle nicht registrierten Besucher zugänglich gemacht.
Das wars schon!
Wichtig: Bitte immer zuerst an einem Testsystem ausprobieren! Niemals an einem Livesystem. Und natürlich übernehme ich keine Garantien auf Vollständigkeit bzw. irgendwelche Haftungsansprüche. Wer's macht, machts auf eigenes Risiko.


Kommentare
wollte auch deinen Tipp vesuchen, aber irgendwas passt noch nicht. Habe
if ($child->attributes('access') > $user->get('aid', 0) && $child->attributes('access') < 99 || $child->attributes('access') == '99' && $user->get('aid', 0) > 0) {
eingefügt, aber bei mir wird das Login Formular jetzt IMMER ausgeblendet... nicht nur, wenn ich eingeloggt bin. Was mach ich falsch? Oder fehlt noch irgendwas? Beim 3. Punkt der Anleitung steht irgendwie nichts??
Grüße
Marian
Naja, das ist über zwei Wege möglich:
1. entweder Du codest es hard, d.h. du setzt Bedingungen mit Hilfe der der Server Variable {HTTP_HOST}
2. Man müsste ein Plugin schreiben welches komfortable Einstellmöglich keiten bietet -> das kostet aber Geld.
Ist auf jeden Fall nicht einfach über einen Blogkommentar zu lösen.
Grüße
Michael
ich habe ein ähnliches Problem, was muss ich tun damit deine Lösung dazu passt :)?
Ich möchte, dass ein paar bestimmte Menüpunkte unsichtbar/deaktiviert sind und nur über das Aufrufen einer Subdomain auf der Website eingeblendet werden. Hättest du einen Lösungstipp für mich?
- Ben
In der Doku hatte sich ein Fehler eingeschlichen (wie in den Kommentaren schon bemerkt). Habe diesen aber jetzt beseitigt:
Du suchst die Zeile: if ($child->attributes('access') > $user->get('aid', 0) {
und ersetzt diese mit der Zeile: if ($child->attributes('access') > $user->get('aid', 0) && $child->attributes('access') < 99 || $child->attributes('access') == '99' && $user->get('aid', 0) > 0) {
Grüße
Michael
ich habe noch eine Frage, da es bei mir leider immer noch nicht funktioniert.
Musste ich nur die Zeile "if ($child->attributes('access') > $user->get('aid', 0) && attributes('access') == '99' && $user->get('aid', 0) > 0) {" mit dieser Zeile "if ($child->attributes('access') > $user->get('aid', 0) && $child->attributes('access') == '99' && $user->get('aid', 0) > 0) {" austauschen oder gab es sonst noch einen Fehler?
nein, das "if" war drin - aber im Code von rsturm ist noch ein "$child->" mehr, welches ich dann eingefügt habe. Ist ja nicht schlimm, wie du schon sagst, Hauptsache funktioniert! :)
Ich hatte den Code schon angepasst. Sicher hast Du das "if" vor dem $child vergessen.
Aber egal, Hauptsache es funktioniert.
danke für das Tutorial! Leider hat es bei mir mit dem oben beschriebenen Weg nicht funktioniert (Website war danach komplett weiß), habe dann den Code von rsturm (mit dem $child->) eingefügt (das fehlt oben) und dann ging es. :)
Tatsache! Da hat sich der Fehlerteufel eingeschlichen. Habe das korrigiert.
Vielen Dank.
Michael Opre
die Zeile enthält einen Fehler, es ist ein "attributes('access')" vor der == '99' Abfrage zu viel.
Es muss folgendes eingefügt werden:
"if ($child->attributes('access') > $user->get('aid', 0) && $child->attributes('access') == '99' && $user->get('aid', 0) > 0) {"
Alle Kommentare dieses Beitrages als RSS-Feed.