[solved] Drop-Listenauswahl ins User-Profil einfügen

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB 3.0.x oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
dfalcon
Mitglied
Beiträge: 5
Registriert: 15.07.2011 15:10

[solved] Drop-Listenauswahl ins User-Profil einfügen

Beitrag von dfalcon »

EDIT: Ich muss leider vermedeln - bzw. für mich ist das natürlich gut -, dass ich es doch noch selbst hinbekommen habe! Tut mir leid, dass ich jetzt den Thread eröffnet habe, aber vielleicht hilft es jemandem, der ähnliches machen möchte. Ich stelle am Ende den korrekten Code rein, mit dem es geklappt hat.

Liebe Community!

Ich habe der Datei ucp_profile.php einen neuen Abschnitt hinzugefügt (ich bin mir nicht sicher, wie man das richtig nennt, jedenfalls einen Teil, der mit "case 'xyz':" beginnt und mit "break;" endet.). Das ist auch in der zugehörigen Datei im Unterordner info korrekt eingetragen.

Ein normales Profilfed zu erstellen, bei dem man Ja/Nein auswählt, oder eine Texteingabe vornimmt, ist kein Problem, aber ich möchte eine Auswahlliste zur Verfügung stellen, wie man es zB bei den Tagen beim Geburtsdatum kennt. Ich möchte das nicht über Custom-Profilefields lösen, weil die erste Auswahl eine weitere Bedingen soll. Außerdem habe ich dafür im Persönlichen Bereich/Profil, einen weiteres Untermenü "Charakter-Profil ändern" hinzugefügt - ist aus meiner Sicht eleganter.

Zum Verständnis:
Es geht hier um spielbare Klassen in einem MMORPG und die zugehörige Spezies. Jede Klasse kann nur bestimmte Spezies auswählen, dementsprechen muss sich das später bedingen, da aber bin ich leider noch gar nicht angekommen.

Ich schaffe es bisher nicht, die Werte für die Dropdown-Liste in der Datenbank zu speichern. Das korrekte auslesen scheint ebenfalls nicht zu funktionieren.

Ich habe bisher folgendes in die includes/ucp_profile.php eingetragen:

Code: Alles auswählen

			case 'profile_characters':

				include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);

				$data = array(
					'guild'			=> request_var('guild', $user->data['user_guild']),
					'charclass'		=> request_var('charclass', $user->data['user_characterclass']),
				);
				
				add_form_key('ucp_profile_characters');

				if ($submit)
				{
					$validate_array = array(
						'guild'			=> array('string', true, 3, 255),
					);
					
					$error = validate_data($data, $validate_array);


					if (!check_form_key('ucp_profile_characters'))
					{
						$error[] = 'FORM_INVALID';
					}

					if (!sizeof($error))
					{

						$sql_ary = array(
							'user_guild'		=> $data['guild'],
							'user_characterclass'	=> $data['charclass'],
						);
						
						$sql = 'UPDATE ' . USERS_TABLE . '
							SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
							WHERE user_id = ' . $user->data['user_id'];
						$db->sql_query($sql);


						meta_refresh(3, $this->u_action);
						$message = $user->lang['PROFILE_UPDATED'] . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
						trigger_error($message);
					}

					// Replace "error" strings with their real, localised form
					$error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error);
				}
				

			/* Klasseneinstellungen */
		        $s_class_type = $data['charclass'];
		        $class_types = array('n' => 'NONE', 'k' => 'KLASSE01', 's' => 'KLASSE02');
		        foreach ($class_types as $type => $lang)
		        {
		           	$selected = ($this->new_config['class_type'] == $type) ? ' selected="selected"' : '';
			        $s_class_type .= '<option value="' . $type . '"' . $selected . '>' . $user->lang[$lang] . '</option>';
	        	}


				$template->assign_vars(array(
					'S_CHAROPTIONS_CLASSES'	=> $s_class_type,
				));
			/* Ende Klasseneinstellungen */

				$template->assign_vars(array(
					'ERROR'		=> (sizeof($error)) ? implode('<br />', $error) : '',

					'GUILD'		=> $data['guild'],
				));

			break;
Alles, was mit guild zu tun hat, funktioniert. Das ist ein ganz normales Eingabefeld.

Für die Charakterklasse schreibe ich zuerst den aktuellen Wert, den die mysql-Datenbank für user_characterclass gespeichert hat in den array $data. Standardgemäß ist das n (das soll für none stehen).
Dann werden die Datenbankeinträge in der Datenbank geupdatet.
Der Bereich mit den Klasseneinstellungen kommt (das verstehe ich nicht, mit den Geburtsdaten war es aber auch so) erst danach.
Ich habe versucht mir anzuschauen, wie das in phpbb3 an anderen Stellen gemacht ist. Die jetzige Variante stammt aus den Einstellungen für das Neumarkieren eigener Beiträge, wo man Minuten, Sekunden und Tage auswählen kann, zu finden im ACP.
Ich muss für die Template-Datei die Optionen definieren, daher diese Schleife. Ich dachte, ich rufe erstmal den aktuellen Wert ab, den user_characterclass nun in der DB hatte.
Dann schreibe ich in einen array, welche Möglichkeiten es noch zur Auswahl gibt.

Danach fehlt mir dann leider das nötige Verständnis. Soweit ich weiß, ist foreach eine Schleife, die sich für jeden Wert wiederholt, der im array §class_types steht. Irgendwie müsste man dann überprüfen, welcher Wert aktuell beim User eingestellt ist, dafür wohl die Variable $selected. Wie diese Überprüfung funktioniert, verstehe ich leider nicht und ich nehme an, dass genau hier der Knackpunkt liegt, denn in der Zeile danach wird wohl in die Variable $s_class_type nur eingetragen, welche Optionen nun vorhanden sind und welche davon selected ist, also zB <option value="n" selected="selected">NONE</option><option value="k">KLASSE01</option><option value="s">KLASSE02</option>.

Am Ende wird dem template dann nur jene Variable zugewiesen. In der zugehörigen Template-Datei lässt sich das ja dann abrufen, wie im folgenden Code zu sehen:

Code: Alles auswählen

<fieldset>
	<!-- IF ERROR --><p class="error">{ERROR}</p><!-- ENDIF -->
	<dl>
		<dt><label for="guild">{L_UCP_GUILD}:</label></dt>
		<dd><input type="text" name="guild" id="guild" maxlength="255" value="{GUILD}" class="inputbox" /></dd>
	</dl>
		<dl>
			<dt><label for="bday_day">{L_CHARACTERCLASSES}:</label><br /><span>{L_CHARACTERCLASSES_EXPLAIN}</span></dt>
			<dd>
				<label for="bday_day">{L_CHARCLASS}: <select name="charclass" id="charclass">{S_CHAROPTIONS_CLASSES}</select></label> 
			</dd>
		</dl>
	</fieldset>
Es wird mir eine Auswahl angezeigt (drei Auswahl-Punkte), die ich leider nicht lesen kann ... ich muss wohl noch was in die language-file ucp.php eintragen, weiß aber noch nicht in welcher Form, das wäre auch eine meiner Fragen.

Das Aktualisieren der Auswahl funktioniert außerdem nicht, sprich Änderungen werden nicht in der Datenbank gespeichert.

Und auch das Abrufen, welcher Wert aktuell ausgewählt ist, scheint nicht zu funktionieren, soweit ich das beurteilen kann, ohne das da Text in der Dropdown-Liste steht. Die Auswahl zeigt jedenfalls immer auf den obersten Listeneintrag, was wohl n ist, egal ob ich manuell in der Datenbank k oder s eintrage.

Vielleicht müsst ihr noch wissen, wie ich die Spalte in der user-Tabelle eingestellt habe:

Code: Alles auswählen

Spalte: user_characterclass
Typ: VARCHAR
Länge/Set: 255
Standard: Wie definiert: n
Kollation: utf8_bin
Alles andere ist entweder leer oder es ist kein Haken gesetzt.

Für jede Hilfe, wäre ich sehr dankbar! :)



EDIT:

Hinzugefügt zur "includes/ucp/ucp_profile.php"

Code: Alles auswählen

			case 'profile_characters':

				include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);

				$data = array(
					'guild'			=> request_var('guild', $user->data['user_guild']),
					'charclass'		=> request_var('charclass', (!empty($user->data['user_characterclass'])) ? $user->data['user_characterclass'] : 'n'),
				);
				
				add_form_key('ucp_profile_characters');

				if ($submit)
				{
					$validate_array = array(
						'guild'			=> array('string', true, 3, 255),
						'charclass'		=> array('string', false, 1, 1),
					);
					
					$error = validate_data($data, $validate_array);


					if (!check_form_key('ucp_profile_characters'))
					{
						$error[] = 'FORM_INVALID';
					}

					if (!sizeof($error))
					{

						$sql_ary = array(
							'user_guild'		=> $data['guild'],
							'user_characterclass'	=> $data['charclass'],
						);
						
						$sql = 'UPDATE ' . USERS_TABLE . '
							SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
							WHERE user_id = ' . $user->data['user_id'];
						$db->sql_query($sql);


						meta_refresh(3, $this->u_action);
						$message = $user->lang['PROFILE_UPDATED'] . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
						trigger_error($message);
					}

					// Replace "error" strings with their real, localised form
					$error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error);
				}
				
				/* Klasseneinstellungen */

				$s_class_type = '';
		        $class_types = array('n' => 'NONECLASS', 'k' => 'KNIGHT', 's' => 'SMUGGLER');
		        foreach ($class_types as $type => $lang)
		        {
					$selected = ($data['charclass'] == $type) ? ' selected="selected"' : '';
			        $s_class_type .= '<option value="' . $type . '"' . $selected . '>' . $user->lang[$lang] . '</option>';
	        	}


				$template->assign_vars(array(
					'S_CHAROPTIONS_CLASSES'	=> $s_class_type,

				));
				/* Ende Klasseneinstellungen */

				$template->assign_vars(array(
					'ERROR'		=> (sizeof($error)) ? implode('<br />', $error) : '',

					'GUILD'		=> $data['guild'],
				));

			break;
hinzugefügt zur includes/ucp/info/ucp_profile.php:

Code: Alles auswählen

'profile_characters'	=> array('title' => 'UCP_PROFILE_CHARACTER_INFO', 'auth' => '', 'cat' => array('UCP_PROFILE')),
template-Datei, gehört in das template-Verzeichnis eures Templates. Muss richtig benannt werden.

Code: Alles auswählen

<!-- INCLUDE ucp_header.html -->

<form id="ucp" method="post" action="{S_UCP_ACTION}"{S_FORM_ENCTYPE}>

<h2>{L_TITLE}</h2>

<div class="panel" style="padding: 15px 15px;">
	<div class="inner">
	<p>{L_PROFILE_INFO_NOTICE}</p>

	<fieldset>
	<!-- IF ERROR --><p class="error">{ERROR}</p><!-- ENDIF -->
	<dl>
		<dt><label for="guild">{L_UCP_GUILD}:</label></dt>
		<dd><input type="text" name="guild" id="guild" maxlength="255" value="{GUILD}" class="inputbox" /></dd>
	</dl>
		<dl>
			<dt><label for="characterclasses">{L_CHARACTERCLASSES}:</label><br /><span>{L_CHARACTERCLASSES_EXPLAIN}</span></dt>
			<dd>
				<label for="charclass">{L_CHARCLASS}: <select name="charclass" id="charclass" style="width: 4em;">{S_CHAROPTIONS_CLASSES}</select></label> 
			</dd>
		</dl>
	</fieldset>

	</div>
</div>

<fieldset class="submit-buttons">
	{S_HIDDEN_FIELDS}<input type="reset" value="{L_RESET}" name="reset" id="button2" />&nbsp; 
	<input type="submit" name="submit" value="{L_SUBMIT}" id="button2" />
	{S_FORM_TOKEN}
</fieldset>
</form>

<!-- INCLUDE ucp_footer.html -->
Wegen den language files muss ich noch schauen, aber ich habe bereits eine Theorie. Ansonsten muss man das Ganze nur noch im ACP als Modul fürs UCP einstellen.
Antworten

Zurück zu „[3.0.x] Mod Bastelstube“