Anlegen und einfügen einer Tabelle mittels Migrations-Datei

In diesem Forum gibt es Starthilfe zum neuen Extension-System von phpBB 3.1/3.2. Fragen zur Entwicklung von Extensions und zur Konvertierung von phpBB 3.0.x MODs sind ebenfalls willkommen.
Benutzeravatar
chris1278
Mitglied
Beiträge: 3526
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von chris1278 »

Hallo, folgende Thematik. Ich hatte meine eine meiner Extensions bei phpbb.com zur Validierung eingereicht. Natürlich wie zu erwarten noch einige Fehler zu beseitigen.

Unter anderem hat man mir nahegelegt die Einträge der Datenbank nicht alle in die config Tabelle zu schreiben, sondern dafür eine eigene Tabelle zu machen.

Also habe ich die Extension [3.2] Social Media Icons an verschiedenen Positionen etwas abgespeckt auf 3 einträge und habe dann versucht das in eine Tabelle zu schreiben.

Mein Testforum läuft local auf meinem Rechner unter php 7.2 und forenversion phpbb 3.2.8

Nun ja mittels Migrationsdatei und nach etwas längerem experimentieren habe ich es geschafft eine Tabelle zu erstellen die ähnlich aufgebaut wie _config ist.

Code: Alles auswählen

public function update_schema()
	{
		return array(
			'add_tables'		=> array(
			$this->table_prefix . 'social_icons'	=> array(
					'COLUMNS'		=> array(
						'social_name'				=> array('VCHAR:255', ''),
						'social_value'				=> array('VCHAR:255', ''),
						'is_dynamic'				=> array('BOOL',  0),	
					),
					'PRIMARY_KEY'	=> array('social_name'),
					'KEYS'			=> array(
						'is_dynamic'			=> array('INDEX', 'is_dynamic'),
					),

				),
				
			)
		);
	}

Mittels diesem Code wird eine Tabelle generiert mit dem Namen social_icons.

Das passt auch eigentlich.

Nun, wenn mein Gedanken Gang nicht falsch ist müsste nach Vorlage für die config Tabelle nur der Migration Befehl angepasst werden.

Also das Format, was ich normalerweise nutze, um Einträge zu machen, sieht folgendermaßen aus:

Code: Alles auswählen

array('config.add', array('social_icons_enable', 1)),
mit dieser Angabe wird auch der wert "social_icons_enable" mit 1 gefüllt in die Tabelle Config geschrieben.

Also habe ich mir gedacht, da ich eine neue Tabelle generiere die eigentlich dem Aifbau der config Tabelle nachempfunden ist müsste der Befehl eigentlich so aussehen um diesen Wert jetzt dot ein zu tragen:

Code: Alles auswählen

array('social_icons.add', array('social_icons_enable', 1)),
Allerdings wenn ich das so mache bekomme ich nur bei aktivierung folgende Fehlermeldung in einem Roten kasten angezeigt:

Während der Anpassung der Datenbank ist etwas falsch gelaufen und ein Fehler aufgetreten. Die Änderungen, die vor dem Fehler durchgeführt wurden, wurden so weit wie möglich rückgängig gemacht. Du solltest jedoch prüfen, ob dein Board fehlerfrei funktioniert.

Eine Migration ist ungültig. Ein undefiniertes Migrationstool wurde gefunden. („An undefined migration tool was encountered.“)

Zurück zur Liste der Erweiterungen

Die Tabelle wird dann nicht angelegt oder wieder gelöscht, und die Meldung erscheint.

Ich habe 3 Dateien für die Migration erstellt_

1. database.php <-Pastebin

-> Das ist der erste Schritt um die Tabelle selber zu erstellen.


2. acp_modul.php <-Pastebin

-> In der Datei werden die Module angelegt (in dem Fall nur das eine wegen Testzwecke)

3. initial.php <-Pastebin

-> Hier werden die Einträge in die Tabelle geschrieben.

Allerdings genau das funktioniert irgendwie nicht. Warum weiß ich leider nicht und komm auch nicht dahinter.

Eventuell hat hier jemand einen Typ für mich woran der Fehler liegt.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von gn#36 »

Der Config Befehl ist ein Spezialbefehl, der nur für die config Tabelle funktioniert. Siehe auch Tools.

In deinem Fall brauchst du somit eine Sonderbehandlung, indem du den Migration Installer anweist, eine Sonderfunktion von dir aufzurufen, die die nötigen SQL Befehle dann durchführt:
https://area51.phpbb.com/docs/dev/3.1.x ... tml#custom
https://area51.phpbb.com/docs/dev/3.2.x ... tml#custom
Auf der verlinkten Seite ist auch ein Beispiel.

Übrigens kannst du das Dateneinfügen und die Datenbankänderung in der selben Migration machen, wenn du willst, update_schema wird vor update_data ausgeführt.

EDIT: Hier kannst du das ganze in einer meiner Migrations sehen: https://github.com/gn36/phpbb-ext-hooku ... _1_0_0.php
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
chris1278
Mitglied
Beiträge: 3526
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von chris1278 »

Hi gn36 Danke erst mal für diese Zeilen. ICh wollte deine Extension mal Probehalber auf meiner Lokalen Testumgebung installieren aber da gibts bei mir ne fehler meldung.

Es fehlen Abhängigkeiten, die von dieser Erweiterung benötigt werden. Bitte verwende composer, um die fehlenden Abhängigkeiten zu installieren oder verwende ein vollständiges Installationspaket.

Installieren wollte ich es auf phpbb 3.2.8 und php 7.2

oder mus ich dazu die 3.1er schiene von phpbb haben.
Benutzeravatar
chris1278
Mitglied
Beiträge: 3526
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von chris1278 »

Ich hab mir deine Vorlage mal angeschaut und Ich habs bisher noch nicht hinbekommen aber denke, ich versteh zumindest den Ansatz wie du das verfolgst:


Du benutzt an der Stelle wo die Funktion "update_data" angesprochen dieses Hier:

array('custom', array(array($this, 'notification_mails'))),

Wobei man in meinem Fall das 'notification_mails' durch was anderes ersetzen kann da dies so, was wie eine Sprungmarke ist. ich habe das dann so gemacht:

Code: Alles auswählen

public function update_data()
	{
		return array(
		
			array('custom', array(array($this, 'import_socialicons'))),

		);
	}

Damit habe ich denk ich schon mal den ersten Schritt gemacht.

Da du des Weiteren dort Insert into Befehl verwendest, habe ich mir mal den für einen Eintrag aus der Dumper Backup Funktion geholt.

Da meine Extension alles in die "CONFIG" Tabelle geschrieben hat habe ich mittels mysqldumper diese gebackupt und folgende Zeile rausgefischt:

INSERT INTO `phpbb_config` (`config_name`,`config_value`,`is_dynamic`) VALUES ('social_icons_enable','1','0');

Diese Zeile habe ich dann auf die Tabbele angepasst die ich mittels meiner extension erzeuge.

Das sieht dann so aus:
INSERT INTO `phpbb_socialicons` (`social_name`,`social_value`,`is_dynamic`) VALUES ('social_icons_enable','1','0');

Wenn ich dann dieses im mysqldumper per Befehl ausführe wird das so eingetragen wie ich es auch haben wollte.

So weiter also habe ich versucht das umzustezen wie du es gemacht hast.

Das sieht dann wie Folgt aus:

Code: Alles auswählen

	public function import_socialicons()
	{		
		$sqlary = array(

		"INSERT INTO " .  SOCIALICONS_TABLE . " (social_name`,`social_value`,`is_dynamic) VALUES ('social_icons_enable','1','0');",
		);
		foreach ($sqlary as $sql)
		{
			$this->db->sql_query($sql);
		}		
	}

Wenn ich dann die Extension aktiviere erstellt der die Tabelle socialicons aber der eintrag geht irgendwie schief.

https://prnt.sc/r6h6t0

Leider habe ich mehrer sachen versucht komme an dem punkt leider nicht mehr weiter.
Benutzeravatar
BNa
Valued Contributor
Beiträge: 3169
Registriert: 12.04.2010 23:51
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von BNa »

`is_dynamic)

Hier fehlt ein back-tick.

Hier auch social_name`

Also schonmal

`is_dynamic`)

und

`social_name`

Back-tick's ` sollten (zumindest bei SQL-Anweisungen), eigentlich garnicht benutzt werden,
sondern am besten Hochkommata '

Die hast Du auch weiter hinten verwendet. Wenn aber, dann alles homogen, also > entweder - oder :wink:

also zb.

'is_dynamic')

Variablen sind natürlich, so wie Du es gemacht hast, richtig:

". SOCIALICONS_TABLE . "

Zusätzlicher Hinweis:
Wie Du weißt, ist manchmal eine Durchmischung von " und ' bei SQL-Anweisungen nötig.
Hierbei immer auf eine korrekte Syntax achten, sonst hagelts Fehlermeldungen. Da verzeiht SQL nix..
Benutzeravatar
chris1278
Mitglied
Beiträge: 3526
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von chris1278 »

OK dann versuch ich das was du geschrieben hast mal umzusetzen. Dann müsste die Zeile eigentlich so aussehen:

Code: Alles auswählen

"INSERT INTO  " .  SOCIALICONS_TABLE . " ('social_name', 'social_value', 'is_dynamic') VALUES ('social_icons_enable', '1', '0');",
Habe die ` entfernt und durch ' ersetzt.

Der komplette code sieht jetzt so aus aber der meldet immer noch syntax fehler:

Code: Alles auswählen

<?php


namespace chris1278\social\migrations;

class initial extends \phpbb\db\migration\migration
{

	public function effectively_installed()
	{
		return isset($this->config['social_icons_version']) && version_compare($this->config['social_icons_version'], '0.1.0', '>=');
	}

	static public function depends_on()
	{
		return array('\chris1278\social\migrations\acp_modul');
	}

	


	public function update_data()
	{
		return array(
		
			array('custom', array(array($this, 'import_socialicons'))),

		);
	}
	
	public function import_socialicons()
	{
		
		$sqlary = array(
		"INSERT INTO  " .  SOCIALICONS_TABLE . " ('social_name', 'social_value', 'is_dynamic') VALUES ('social_icons_enable', '1', '0');",
		);
		
		foreach ($sqlary as $sql)
		{
			$this->db->sql_query($sql);
		}
		
	}
}
Benutzeravatar
BNa
Valued Contributor
Beiträge: 3169
Registriert: 12.04.2010 23:51
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von BNa »

Poste doch mal die aktuelle Fehlermeldung.

Ersetze aber erstmal testweise das

Code: Alles auswählen

		$sqlary = array(
		"INSERT INTO  " .  SOCIALICONS_TABLE . " ('social_name', 'social_value', 'is_dynamic') VALUES ('social_icons_enable', '1', '0');",
		);
mit dem

Code: Alles auswählen

		$sqlary = array(
		"INSERT INTO  " .  SOCIALICONS_TABLE . " ('social_name', 'social_value', 'is_dynamic') VALUES ('social_icons_enable', '1', '0');"
		);
oder

Code: Alles auswählen

		$sqlary = array(
		"INSERT INTO  " .  SOCIALICONS_TABLE . " (social_name, social_value, is_dynamic) VALUES ('social_icons_enable', '1', '0');"
		);
Benutzeravatar
chris1278
Mitglied
Beiträge: 3526
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von chris1278 »

Hier die Fehlermeldung als screenshot nachgereicht.

https://prnt.sc/r6p1vb

werde das andere mal testen und berichtem.

Automatisch dem Beitrag hinzugefügt nach 12 Minuten 19 Sekunden. Bitte Regel für „Topic-Bumping“ beachten. Danke.

Ok also die Lösung des ganzen sieht wie folgt aus.

Code: Alles auswählen

$sqlary = array(
		"INSERT INTO  " . $this->table_prefix . 'socialicons' . " (social_name, social_value, is_dynamic) VALUES ('social_icons_enable', '1', '0');",
		"INSERT INTO  " . $this->table_prefix . 'socialicons' . " (social_name, social_value, is_dynamic) VALUES ('social_icons_enable2', '1', '0');",
		);
BNa und zwar hast du mich darauf gebracht mit deiner zweiten versuch Zeile. Allerdings mit . SOCIALICONS_TABLE . krieg ich das nicht hin. Drum hab ich das aus dem wwh Extension genommen damit spreche ich auch direkt die Tabelle an und das Resultat ist das des dann so ausschaut:

https://prnt.sc/r6p49l

In der Tabelle (socialicons) befinden sich dann diese beiden Einträge. Allerdings muss in der Zeile zum Schluss das abschließende , bleiben damit der die nächste Zeile erkennt.

Auf jeden Fall danke schön für deine Hilfe und das hier war eigentlich der Fehler, weil der Teil muss in dieser Variante so aussehen
(social_name, social_value, is_dynamic).

So nun kann ich mich dran machen den nächsten schritt zu gehen.
Benutzeravatar
BNa
Valued Contributor
Beiträge: 3169
Registriert: 12.04.2010 23:51
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von BNa »

Cool, das es nun wuppt.
chris1278 hat geschrieben: 24.02.2020 03:35Allerdings mit . SOCIALICONS_TABLE . krieg ich das nicht hin
Scheint so, als ob das auch inzwischen "Old-School" ist.
Kommt wohl noch aus den 3.0.*-Zeiten, wo Board-Konstanten,
also auch Tabellen-Namen über die constants.php definiert wurden.

Möglicherweise wirds wohl noch als Fallback ne Zeit mitgeschleppt:
https://www.phpbb.com/community/viewtopic.php?t=2302846
https://www.phpbb.com/community/viewtop ... #p13999576
Benutzeravatar
chris1278
Mitglied
Beiträge: 3526
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von chris1278 »

So jetzt hab ich nur das Problem das ich die listener und die Modul Datei davon entwöhnen muss das in die config Tabelle zu schreiben bzw. zu lesen und über meine Tabelle zu gehen.

Falls da jemand eine Idee hat wie man des umsetzen könnte ich poste mal hier beide Dateien als Pastebin

Meine Listener.php

und:

meine modul datei aus dem acp Verzeichnis der ext.

Ich bitte hier freundlich um Hilfe und danke auf jeden Fall für eure Geduld.


Ich muss dazu sagen, dass ich leider kein Programmierer bin. Das, was ich bisher erreicht habe, habe ich alles erreicht in dem ich vorhandene Sachen angepasst habe. Diese Vorlage z.B. Stammt von Kirk (er weis das ich das benutzt habe) es war das Gerüst der Topposter extension, welches ich umgebaut habe. Das war meine erste Extension wo ich Datenbank und Admin Modul dabei hatte. Das was ich bisher verstanden habe, verstehe ich weil ich es durch Testen rausgefunden habe wie die zusammenhänge sind. Nur leider reicht das nicht um eine Funktion wie ich diese im listener und modul Bereich brauche von null zu schreiben. Da mir auch keine Extension bekannt ist, die eine true/false Option in eigener Tabelle schreibt kann ich dieses mal leider nix nach bauen bzw. durch Anschauen verstehen. Daher bitte ich hier freundlich um hilfe. Evtl. Ist ja jemandem eine Extension bekannt wo ich das anschauen kann.

Ich habe z.B. die Tabelle so gebaut das diese genau so ist wie die config tabelle (natürlich habe ich die namen da nicht in config_name oder
config_value genommen damit es keine Missverständnisse gibt. Ich benutze eigentlich auch nur zwei arten Variabelen. einmal die Art die fragt ob ja oder nein Also mit wert 1 oder 0 und die andere ist halt für texteingabe aus dem adminbereich in das template zu bringen sprich ich gebe im acp dann die url ein und diese ist dann im template hinterlegt.

Daher würde es schon helfen, wenn ich eine extension sehen könnte wo evtl. diese true/flase variabel auch über dem author seiner eigenen tabelle gefragt wird.
Antworten

Zurück zu „Extension Bastelstube“