Seite 1 von 2

Module erzeugen

Verfasst: 03.11.2008 20:29
von vbboard
In der datenbank phpbb_modules werden ja die module abgelegt,
nun hab ich mir gedacht das man über:

Code: Alles auswählen

INSERT INTO `phpbb_modules` (`module_id`, `module_enabled`, `module_display`, `module_basename`, `module_class`, `parent_id`, `left_id`, `right_id`, `module_langname`, `module_mode`, `module_auth`) VALUES (190, 1, 1, 'impressum', 'acp', 2, 17, 18, 'IMPRESSUM', 'edit_impressum', '');
die module intregiert werden können, wobei das der code für das impressum von tobi wäre,
nun wenn man das modul per hand installiert funktioniert dies ja auch, aber dieser datenbank befehl, wie ich ihn per phpmyadmin ausgelesen haben funktioniert nicht, trotz selbes phpbb also vom code her nur andere datenbank, weiß einer woran das liegen kann?

Verfasst: 05.11.2008 06:53
von vbboard
keiner ne idee?

Verfasst: 05.11.2008 14:20
von gn#36
Schau dir mal das passende ACP Modul an. Da wird noch ein bisschen mehr gemacht als nur dieser simple SQL Befehl.
Vor allem müssen allerlei left_ids und right_ids angepasst werden da mit diesen die Hierarchie bestimmt wird in der die Module angeordnet werden. Einfach einfügen und parent angeben dürfte nicht gehen.

Dieses Modul könntest du auch benutzen um selbst das Update zu machen. Geht eigentlich recht einfach:

Code: Alles auswählen

require_once($phpbb_root_path . 'includes/acp/acp_modules.' . $phpEx);
$acp_modules = new acp_modules();
Dann die Daten vorbereiten und schließlich pro Modus:

Code: Alles auswählen

$acp_modules->update_module_data($module_data, true);

Verfasst: 05.11.2008 15:51
von issjut
Ich hab zufällig gerade ne Frage die ganz gut ins Thema passt. Wie genau sind denn dies left_ids und right_ids zu verstehen. irgendwie muss bei mir da mal schief gegangen sein und ich bekomme es über das ACP nicht mehr gerichtet. Wollte nun also in der datenbank die "_IDs" anpassen. Aber verstehe das System irgendwie nicht...

nehmen wir z.b. mal mein Modul "System" mit der module_id 27

Wie bekomme ich heraus werlche left_id und welche right_id da die richtige wäre??

Verfasst: 05.11.2008 16:23
von gn#36
Die left und right ids bauen eine Baumstruktur auf. Mit Hilfe dieser Baumstruktur ist dann festgelegt, an welcher Stelle und unterhalb welcher anderen Einträge sich ein Eintrag befindet. Da man eine echte Baumstruktur nicht direkt in der Datenbank speichern kann (das ist nur eine eindimensionale Liste, ein Baum besitzt i.a. mehrere Dimensionen) hilft man sich mit der left und right id.

Im Prinzip werden die Ids benutzt um Einträge "einzuklammern". Alle Einträge, die mit ihren Ids zwischen der left und right Id eines Eintrags liegen sind diesem Eintrag untergeordnet. Die Reihenfolge der Ids gibt gleichzeitig die Reihenfolge in der Liste vor wenn es mehrere Einträge auf gleicher Ebene gibt.

Weil das so nicht so einfach zu verstehen ist hier mal ein Beispiel mit 5 Foren:
  • Auf der obersten Ebene befinden sich die Foren 1 und 2
  • Dem Forum 1 untergeordnet sind die Foren 3 und 4
  • Unter Forum 4 ist noch Forum 5 angeordnet.
  • Die Foren sollen entsprechend ihrer Hierarchie dargestellt werden und in der Datenbank gespeichert werden, dabei sollen die Foren nach ihrer Zahl sortiert sein
Also optisch etwa so:

Code: Alles auswählen

 (Wurzel)
 /      \
1        2
| \
3  4
   |
   5
Um die Ids zu bestimmen würde ich dann so vorgehen:
  • Forum 1: left_id = 1 (erstes Forum auf oberster Ebene) right_id kann man noch nicht sagen.
  • Forum 2: kann man noch nichts zu sagen, da Forum 1 untergeordnete Elemente hat
  • Forum 3: ist Forum 1 untergeordnet und erster Eintrag, also left_id = 2. Gleichzeitig hat Forum 3 keine weiteren Kinder mehr, daher right_id = 3.
  • Forum 4: ist ebenfalls Forum 1 untergeordnet und kommt direkt nach Forum 3, daher left_id=4. right_id steht aber noch nicht fest da es noch Kinder hat.
  • Forum 5: ist Forum 4 untergeordnet und hat keine Kinder, daher left_id=5 und right_id = 6
  • zurück zu Forum 4: right_id kann jetzt festgesetzt werden da alle Kinder abgearbeitet wurden -> right_id = 7
  • zurück zu Forum 1: right_id = 8
  • zurück zu Forum 2: left_id = 9, da keine Kinder right_id = 10.
Im Ergebnis also:
  • Forum 1: 1 - 8
  • Forum 2: 9 - 10
  • Forum 3: 2 - 3
  • Forum 4: 4 - 7
  • Forum 5: 5 - 6
Wenn man jetzt z.b. alle Foren die zu Forum 1 gehören suchen will muss man nur nach Foren suchen deren left_id oder right_id zwischen 1 und 8 liegt.

Nachteil dieser Struktur ist allerdings dass sie bei Änderungen immer komplett neu aufgebaut werden muss. Da man üblicherweise aber nicht sonderlich häufig seine Foren ändert ist das zu verschmerzen.

Verfasst: 05.11.2008 16:50
von issjut
hey schonmal vielen dank für die ausführliche Beschreibung!

Bevor ich nun loslege hab ich mir mal die Struktur von anderen Modulen angeschaut... allerdings kann ich dein Beispiel da nicht so recht wiederfinden.

Nehmen wir mal z.b. das Modul mit der ID 1, ist ja das ACP_CAT_GENERAL, es hat die left_id 1 und die right_id 64

die modul_id 64 hat bei mir aber z.b das modul "Beitrags-Symbole" und die 1 eben das besagte ACP_CAT_GENERAL

also gehe ich mal davon aus, dass die modul_ids nicht mit denen der left oder right_ids gleichzusetzen sind. Wie komme ich dann aber z.b. zu der left_id beim Modul ACP_CAT_SYSTEM (ist bei mir die id_27)? Das erste modul wäre die ja ACP_AUTOMATION (mod_id 28 ). Aber da module_id ja anscheinend nicht gleich left oder right_id, welche ist es dann)

P.S.: Ich habe im Modul System keine neuen Module hinzugefügt, vielleicht genügt es auch wenn du mir sagst, welche left und right_ids dort standartmäßig angegeben werden müssten (das selbe dann natürlich auch für alle untermodule dieses Moduls), denn da schein meon problem zu liegen. Wäre aber natürlich trotzdem schön, wenn ich es verstehen würde

Verfasst: 05.11.2008 16:52
von vbboard
aber wen ich eine datei nehme die ins phpbb schon intregiert ist z.b. so:

Code: Alles auswählen

INSERT INTO phpbb_modules` (`module_id`, `module_enabled`, `module_display`, `module_basename`, `module_class`, `parent_id`, `left_id`, `right_id`, `module_langname`, `module_mode`, `module_auth`) VALUES (189, 1, 1, 'zebra', 'ucp', 168, 52, 53, 'UCP_ZEBRA_FOES', 'foes', '');
dann funktioniert das doch auch?

Verfasst: 05.11.2008 17:09
von gn#36
issjut hat geschrieben:hey schonmal vielen dank für die ausführliche Beschreibung!

Bevor ich nun loslege hab ich mir mal die Struktur von anderen Modulen angeschaut... allerdings kann ich dein Beispiel da nicht so recht wiederfinden.

Nehmen wir mal z.b. das Modul mit der ID 1, ist ja das ACP_CAT_GENERAL, es hat die left_id 1 und die right_id 64

die modul_id 64 hat bei mir aber z.b das modul "Beitrags-Symbole" und die 1 eben das besagte ACP_CAT_GENERAL

also gehe ich mal davon aus, dass die modul_ids nicht mit denen der left oder right_ids gleichzusetzen sind. Wie komme ich dann aber z.b. zu der left_id beim Modul ACP_CAT_SYSTEM (ist bei mir die id_27)? Das erste modul wäre die ja ACP_AUTOMATION (mod_id 28 ). Aber da module_id ja anscheinend nicht gleich left oder right_id, welche ist es dann)

P.S.: Ich habe im Modul System keine neuen Module hinzugefügt, vielleicht genügt es auch wenn du mir sagst, welche left und right_ids dort standartmäßig angegeben werden müssten (das selbe dann natürlich auch für alle untermodule dieses Moduls), denn da schein meon problem zu liegen. Wäre aber natürlich trotzdem schön, wenn ich es verstehen würde
Die Modul ID hat mit left und right absolut überhaupt nichts zu tun! Schau dir oben mein Beispiel an. left und right ID hängen nur von der Modulposition im Modulbaum ab, von sonst nichts. Viel genauer als oben kann ich dir das nicht erklären. Im Prinzip hast du eine Baumstruktur (Anordnung der Module wie sie dargestellt werden), willst die aber irgendwie in eine Liste einsortieren und hinterher die Baumstruktur auch wieder auslesen können. Du denkst da glaube ich an "von Modul zu Modul hangeln" nach dem Motto: "Ich bin bei Modul C, links davon liegt B (also left_id = B) und rechts davon E (right_id = E), das ist aber hier nicht der Fall!
Hier läuft es nach dem Motto: "left_id ist 1, right_id ist 8, also haben alle untergeordneten Module eine left_id zwischen 2 und 6 und eine right_id zwischen 3 und 7." Ich muss nur noch nach left_id sortieren und hole die Module gleich in der richtigen Reihenfolge zur Darstellung aller Module aus der Datenbank.

Wie die IDs ursprünglich lauten können kriegst du am besten aus einer frischen phpBB Installation. Ich müsste dafür erst mal ein phpBB neu installieren dann die Daten extrahieren und posten, also kannst du das auch gleich selbst machen ;)
vbborard hat geschrieben:aber wen ich eine datei nehme die ins phpbb schon intregiert ist z.b. so:
Schau dir die Funktion an und schau was sie macht... Wichtig sind vor allem aber auch die left und right IDs. Die müssen neu Aufgebaut werden wenn du das Modul nicht auf oberster Ebene ganz hinten dran hängst.

Verfasst: 05.11.2008 17:11
von vbboard
also oberste ebene wäre z.b. ne neue kategorie oben erzeugen?

hmm in der funktion macht er das:

Code: Alles auswählen

UPDATE ' . MODULES_TABLE . "
					SET left_id = left_id + 2, right_id = right_id + 2
soll das heißen das sobald ein neues moduel hinzukommt er die left_id um 2 erhöhrt und die right id auch?

Verfasst: 05.11.2008 17:24
von gn#36
Genau das steht da. :roll: Allerdings bei sämtlichen Einträgen in der Tabelle. Auf die Weise kann man das Modul nach ganz oben setzen. Wenn man das anders sortieren will muss man diese Anweisung eingrenzen (WHERE)