[solved] Drop-Listenauswahl ins User-Profil einfügen
Verfasst: 10.09.2011 17:44
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:
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:
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:
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"
hinzugefügt zur includes/ucp/info/ucp_profile.php:
template-Datei, gehört in das template-Verzeichnis eures Templates. Muss richtig benannt werden.
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.
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;
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>
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
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;
Code: Alles auswählen
'profile_characters' => array('title' => 'UCP_PROFILE_CHARACTER_INFO', 'auth' => '', 'cat' => array('UCP_PROFILE')),
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" />
<input type="submit" name="submit" value="{L_SUBMIT}" id="button2" />
{S_FORM_TOKEN}
</fieldset>
</form>
<!-- INCLUDE ucp_footer.html -->