Code Problem

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: 3535
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Code Problem

Beitrag von chris1278 »

Hallo also ich würde gerne was umsetzen aber komme nicht mehr weiter und würde mich über einen rat oder Vorschlag freuen.

Folgender Sachverhalt.

Ich führe im HTML Template einen Button aus:

Code: Alles auswählen

<<form method="post" action="{{ S_ACTION }}"{{ S_FORM_ENCTYPE }}>
	<input class="button" type="submit" name="print_label" value="{{ lang('PRINT') }}" />
</form>
Welcher in der Listener einen if aufruf startet:

Code: Alles auswählen

if ($this->request->is_set_post('print_label'))
{
	echo 'test';
}

Soweit so gut.

Ich habe mit routing für diese funktion eine eigene html template datei angelegt welche ich aufrufen will.

Code: Alles auswählen

public function add_page_header_link($event)
{
	$this->template->assign_vars(array(
		'U_CS_SEARCH'		=>  $this->helper->route('qslmgr_print');
	));
}

So liesse sich die Seite als Link aufrufen das funktioniert zwar aber nicht das was ich möchte.

Ich möchte gerne das beim Drücken des Buttons eine neue Seite aufgeht mit einem Inhalt den ich übermittel.

Code: Alles auswählen

if ($this->request->is_set_post('print_label'))
{
	//generieren des Inhaltes
	$inhalt1 = '111',
	
	$this->template->assign_vars([
		'INHALT1'							=> 	$inhalt1,
	]);
	// Laden der Seite mit generiertem Inhalt
	$this->helper->route('qslmgr_print');
}
Also den Inhalt kann ich im Listener generieren aber wie rufe ich am ende der if Funktion die Seite mit besagtem Inhalt auf.

Hier scheitert es bei mir und ich komme nicht weiter.

Für Tipps oder Vorschläge wäre ich verbunden.
Benutzeravatar
IMC
Mitglied
Beiträge: 543
Registriert: 25.11.2018 20:32
Wohnort: Lüneburg
Kontaktdaten:

Re: Code Problem

Beitrag von IMC »

Hi Chris,

ich würde im action Attribut des Formulars die Routingadresse angeben und die POST Auswertungen in dem Controller durchführen. Der Code im Listener, und damit die Datenübergabe an deine andere Seite wäre damit nicht von Nöten. Vielleicht ist dies so für deinen Code anwendbar.
Gruß, Thorsten
Benutzeravatar
chris1278
Mitglied
Beiträge: 3535
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Code Problem

Beitrag von chris1278 »

Okay hier muss ich passen kannst du das vielleicht anhand eines Beispiels etwas erläutern ich kann wir da leider nicht ganz folgen.
Benutzeravatar
Kirk
Supporter
Supporter
Beiträge: 7874
Registriert: 24.05.2010 08:31
Kontaktdaten:

Re: Code Problem

Beitrag von Kirk »

Hi
Wenn du möchtest das beim Drücken des Buttons eine neue Seite aufgeht, warum machst du es nicht so:

Code: Alles auswählen

	<span class="button">
		<a href="{{ U_CS_SEARCH }}" role="menuitem">{{ lang('PRINT') }}</a>
	</span>
Benutzeravatar
IMC
Mitglied
Beiträge: 543
Registriert: 25.11.2018 20:32
Wohnort: Lüneburg
Kontaktdaten:

Re: Code Problem

Beitrag von IMC »

Hallo Chris,

ich habe das mal auf meinen Testboard in mein RecentTopics rein gefummelt um sicher zu sein das es funktioniert. Das heißt dass du einen Teil des Codes dort nachvollziehen musst.

Im Board hatte ich dein Formularbutton hinzugefügt.

Code: Alles auswählen

<form method="post" action="./app.php/rt/test">
	<input class="button" type="submit" name="print_label" value="Test Button" >
</form>
in dem page_controller für das Routing diesen Codeteil

Code: Alles auswählen

		switch ($page)
		{
			// Displays ResentTopics in a simple page for further use
			case 'test':
				global $request;
				
				if ($request->is_set_post('print_label'))
				{
					echo 'test';
					exit;
				}
			break;
		}
Wie erwartet kam in der Ausgabe der erwartete Text. Auf diese Weise können auch mehrere Formulardaten ausgewertet werden.
Gruß, Thorsten
Benutzeravatar
chris1278
Mitglied
Beiträge: 3535
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Code Problem

Beitrag von chris1278 »

@kirk

Ja das hab ich versucht nutzt mir nix.


@imc

Werde ich mal versuchen.

@edit imc

Also ich hab das nicht ganz so gemacht wie du aber ich hab ne Lösung gefunden die das macht was ich will.

Ich hab meinen listener so angepasst jetzt so umgebaut:

Code: Alles auswählen

if ($this->request->is_set_post('print_label'))
		{
			$test = 'testen';
			$this->template->assign_vars([
				'TTT'	=> 'testen',
			]);
			$page	= 'print_qslmgr_body.html';
			return $this->helper->render($page);
		}
Jetzt gehts genau so wie ich das will. Danke für den Anstoss.
Benutzeravatar
chris1278
Mitglied
Beiträge: 3535
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Code Problem

Beitrag von chris1278 »

Ok letztes Problem konnte ich gut lösen dank eurer hilfe. Hätte jetzt ein weiteres Problem.

Ich würde gern umlaute ä ö ü usw. auch mit in die datenbank übertragen.

Bei normalen VARCHAR Tabellen scheint das zu gehen

Code: Alles auswählen

this->update_cs_value('vorname', $this->request->variable('cs_vorname', '', true), $cs_usserstamp);
Die variablen werden hier auch alle so gefüllt und übertragen. Tabelle dafür ist:

https://prnt.sc/f33KTwVuNM0F

Dort werden so wie oben beschrieben auch die Daten eingetrage.

Die Funktion zum Update ist diese hier:

Code: Alles auswählen

public function update_cs_value($value_name, $value_code, $hidden_stamp)
{
	$sql = 'UPDATE ' . $this->callsign_table . '
		SET ' . $value_name . ' = "' . $this->db->sql_escape($value_code) . '"
		WHERE csstamp = "' . $this->db->sql_escape($hidden_stamp) . '"';
	$this->db->sql_query($sql);
	return;
}

Der CSstamp wird in vorherigem schrit ermitttelt und mitgeschickt.

Der oben genannte Code so wie beschrieben funktioniert Tadelos.

Nur wenn ich in eine Tabelle wie diese hier:

https://prnt.sc/oq8hF1ecemCz

was mit ä ö ü übermitteln will dann wird das nicht eingetragen.

zur Übermittlung dies:

Code: Alles auswählen

$this->update_cs_value('bio', $this->request->variable('cs_bio', '',true), $cs_usserstamp);
Der übertragungsweg ist genau wie vorher nur wird das in der Datenbank nicht als solches geschrieben.

Daher vermute ich das es an der Art des Datenbank Eintrages als TEXT liegt.

Vielleicht hat hier jemand Abhilfe für mich.

@edit

Also ich hab jetzt mal testweise eine spalte mit bio2 und varchar 255 erstellt und da funktioniert das. Also muss bei der TEXT variante die Übertragung irgendwie anders formatiert werden.
Benutzeravatar
Mike-on-Tour
Supporter
Supporter
Beiträge: 1076
Registriert: 13.01.2020 21:09
Kontaktdaten:

Re: Code Problem

Beitrag von Mike-on-Tour »

Suche mal nach den Funktionen
  • generate_text_for_storage()
  • generate_text_for_edit()
  • generate_text_for_display()
Und ja, es hat einen Grund, warum ich dir zu deinem Problem 3 Funktionen genannt habe.
Benutzeravatar
chris1278
Mitglied
Beiträge: 3535
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Code Problem

Beitrag von chris1278 »

Ok ich hab erst im forum gesucht aber ich denke ich bin fündig geworden. Du meinst wahrscheinlich so was wie der crizzo bei about us gemacht hat:

Code: Alles auswählen

$aboutus_text = generate_text_for_display(
	$aboutus_data['aboutus_info'],
	$aboutus_data['aboutus_info_uid'],
	$aboutus_data['aboutus_info_bitfield'],
	$aboutus_data['aboutus_info_flags']
);
Ok das muss ich mir beizeiten mal genauer anschauen.

@edit

Also bei meinen SQL abfragen für die eigene Tabelle meldet es immer Fehler aber ich hab das anders Lösen können.

Mein SQL eintrag sieht entsprechend so aus:

Code: Alles auswählen

$this->update_cs_value('bio', $this->request->variable('cs_bio', '', 'UTF-8'), $cs_usserstamp);
Damit werden jetzt Umlaute korrekt eingetragen.

Da die Eintragungen nur in die eigene Tabelle erfolgen passt das so.
Benutzeravatar
chris1278
Mitglied
Beiträge: 3535
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Code Problem

Beitrag von chris1278 »

So bisher konnte ich alles soweit lösen. ich hätte jetzt folgende frage.

Ich würde gerne bei der Registrierung etwas in die Datenbank schreiben. Mit eigenem SQL code.

Und zwar möchte ich einmal einen wert in eine bestimmt benutzer spalte einfügen in der users tabelle. Es geht da um einen bestimmten zeitstempel auf den die werte der zweiten (eigene tabelle beruhen).

Für die bestehenden user hab ich das schon gelöst da wird direkt bei login gecheckt ob wert vorhanden ist andernfalls wird eingetragen.

Der code sieht dann so aus:

Code: Alles auswählen

if (empty($this->user->data['csstamp']) && $this->user->data['user_id'] != ANONYMOUS)
{
	$cs_timestamp	= time();

	$sql = 'UPDATE ' . USERS_TABLE . '
	SET csstamp = "' . $this->db->sql_escape($cs_timestamp) . '"
	WHERE user_id = "' . $this->db->sql_escape($this->user->data['user_id']) . '"';
	$this->db->sql_query($sql);

	$sql_ary = [];

	$sql_ary[] = [
		'csstamp'				=> $cs_timestamp,
		'callsign_1'			=> '',
		'callsign_2'			=> '',
		'callsign_3'			=> '',
		'callsign_4'			=> '',
		'callsign_5'			=> '',
		'vorname'				=> '',
		'nachname'				=> '',
		'street'				=> '',
		'plz'					=> '',
		'city'					=> '',
		'country'				=> '',
		'email'					=> '',
		'flag'					=> '',
		'qslmgrcallsign '		=> '',
		'homepage'				=> '',
		'twitter'				=> '',
		'skype'					=> '',
		'bio'					=> '',
		'lat_n'					=> '',
		'lat_n_deg'				=> '',
		'lat_n_min'				=> '',
		'lat_n_sec'				=> '',
		'len_e'					=> '',
		'len_e_deg'				=> '',
		'len_e_min'				=> '',
		'len_e_sec'				=> '',
		'pic'					=> '',
		'tech'					=> '',
		'gridsq'				=> '',
		'itzone'				=> '',
		'cqzone'				=> '',
		'qslmgr'				=> 0,
		'qslvorname'			=> '',
		'qslnachname'			=> '',
		'qslstreet'				=> '',
		'qslcity'				=> '',
		'qslcountry'			=> '',
	];

	$this->db->sql_multi_insert($this->callsign_table, $sql_ary);
}
Das funktioniert soweit. Wenn also ein nutzer der im Forum schon regestreirt hat noch keinen wert in der Spalte $this->user->data['csstamp'] hat wird entsprechend einer eingetragen und ein eintrag in die rufzeichen tabelle auch gemacht. Dieser zeitstempel bekommt der user auch nie zu gesicht das dient lediglich als verbindung und zuordnung mit den user und der rufzeichen tabelle.

Jetzt wollte ich natürlich die 5 Rufzeichen schon so machen das diese bei regestreirung in die rufzeichen tabelle eingetragen werden. Der Code oben würde auch dafür funktionieren. Das Prorblem ist natürlich der eintrag in die user Tabelle da darf der aufruf natürlich erst erfolgen wenn der Benutze mit den anderen standdard angeaben angelegt wurde vom forum. Dazu würde ich gern wissen welches core.event ich nehmen mus um den code während der regestrierung auszuführen aber erst nach dem der benutzer angelegt wurde.
Antworten

Zurück zu „Extension Bastelstube“