Vielen Dank D@ve! Das hat wunderbar funktioniert, in der Memberlist. Da ich diese Variablen nur in der Profilansicht benötige, reicht das dort auch.
Um erstmal einen Einblick zu bekommen, wie man sowas bei phpbb überhaupt machen kann, hatte ich das Feld mit der Auswahl Ja/Nein, wie weiter oben geschrieben, im UCP eingebaut. Da ich aber nicht möchte, dass jeder User sie sich selber verleihen kann, ist es nur sinnvoll, das ausschließlich über das ACP zuzuweisen.
Ich habe mir angesehen, wie die acp_users.php aufgebaut ist, inklusive der zugehörigen Template-Dateien und der Info-Datei und versucht das für die Medals nachzuahmen. Als Vorlage dienten Hauptsächlich die Persönlichen Einstellungen (Prefs). Ich habe es auch geschafft, dass ich mit der Suchmaske (die man von "Benutzer und Gruppen -> Benutzer verwalten" kennt) registrierte Benutzer finde und auf die richtige Seite zur Zuweiseung der Medals weitergeleitet werde.
Leider werden Änderungen nicht gespeichert. An Stelle des Screens "Änderungen übernommen" komme ich immer zurück auf die Suchmaske.
Was ich noch nicht fertig habe, ist die zugehörige Language-File, die liegt nur leer im richtigen Ordner, damit keine Fehlermeldung kommt.
Ich stelle den Code, den ich verwendet habe hier mal rein:
includes/acp/info/acp_medals.php
Code: Alles auswählen
<?php
/**
*
* @package acp
* @version $Id$
* @copyright (c)
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
/**
* @package module_install
*/
class acp_medals_info
{
function module()
{
return array(
'filename' => 'acp_medals',
'title' => 'ACP_MEDALS_MANAGEMENT',
'version' => '1.0.0',
'modes' => array(
'medals' => array('title' => 'ACP_MEDALS', 'auth' => 'acl_a_user', 'display' => false, 'cat' => array('ACP_CAT_MEDALS')),
),
);
}
function install()
{
}
function uninstall()
{
}
}
?>
includes/acp/acp_medals.php
Code: Alles auswählen
<?php
/**
*
* @package acp
* @version $Id$
* @copyright (c)
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* @package acp
*/
class acp_medals
{
var $u_action;
function main($id, $mode)
{
global $config, $db, $user, $auth, $template, $cache;
global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix, $file_uploads;
$user->add_lang(array('posting', 'ucp', 'acp/users'));
$this->tpl_name = 'acp_medals';
$this->page_title = 'ACP_MEDALS_' . strtoupper($mode);
$error = array();
$username = utf8_normalize_nfc(request_var('username', '', true));
$user_id = request_var('u', 0);
$action = request_var('action', '');
$submit = (isset($_POST['submit'])) ? true : false;
add_form_key('acp_medals');
// Whois (special case)
if ($action == 'whois')
{
include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
$this->page_title = 'WHOIS';
$this->tpl_name = 'simple_body';
$user_ip = request_var('user_ip', '');
$domain = gethostbyaddr($user_ip);
$ipwhois = user_ipwhois($user_ip);
$template->assign_vars(array(
'MESSAGE_TITLE' => sprintf($user->lang['IP_WHOIS_FOR'], $domain),
'MESSAGE_TEXT' => nl2br($ipwhois))
);
return;
}
// Show user selection mask
if (!$username && !$user_id)
{
$this->page_title = 'SELECT_USER';
$template->assign_vars(array(
'U_ACTION' => $this->u_action,
'ANONYMOUS_USER_ID' => ANONYMOUS,
'S_SELECT_USER' => true,
'U_FIND_USERNAME' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&form=select_user&field=username&select_single=true'),
));
return;
}
if (!$user_id)
{
$sql = 'SELECT user_id
FROM ' . USERS_TABLE . "
WHERE username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'";
$result = $db->sql_query($sql);
$user_id = (int) $db->sql_fetchfield('user_id');
$db->sql_freeresult($result);
if (!$user_id)
{
trigger_error($user->lang['NO_USER'] . adm_back_link($this->u_action), E_USER_WARNING);
}
}
// Generate content for all modes
$sql = 'SELECT u.*, s.*
FROM ' . USERS_TABLE . ' u
LEFT JOIN ' . SESSIONS_TABLE . ' s ON (s.session_user_id = u.user_id)
WHERE u.user_id = ' . $user_id . '
ORDER BY s.session_time DESC';
$result = $db->sql_query_limit($sql, 1);
$user_row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
if (!$user_row)
{
trigger_error($user->lang['NO_USER'] . adm_back_link($this->u_action), E_USER_WARNING);
}
// Generate overall "header" for user admin
$s_form_options = '';
switch ($mode)
{
case 'medals':
include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
$data = array(
'ruhmeskreuz' => request_var('ruhmeskreuz', $user_row['user_ruhmeskreuz_medal']),
);
if ($submit)
{
if (!check_form_key('acp_medals'))
{
$error[] = 'FORM_INVALID';
}
if (!sizeof($error))
{
$sql_ary = array(
'user_ruhmeskreuz_medal' => $data['ruhmeskreuz'],
);
$sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
WHERE user_id = $user_id";
$db->sql_query($sql);
// Check if user has an active session
if ($user_row['session_id'])
{
// We'll update the session if user_allow_viewonline has changed and the user is a bot
// Or if it's a regular user and the admin set it to hide the session
if ($user_row['user_allow_viewonline'] != $sql_ary['user_allow_viewonline'] && $user_row['user_type'] == USER_IGNORE
|| $user_row['user_allow_viewonline'] && !$sql_ary['user_allow_viewonline'])
{
// We also need to check if the user has the permission to cloak.
$user_auth = new auth();
$user_auth->acl($user_row);
$session_sql_ary = array(
'session_viewonline' => ($user_auth->acl_get('u_hideonline')) ? $sql_ary['user_allow_viewonline'] : true,
);
$sql = 'UPDATE ' . SESSIONS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $session_sql_ary) . "
WHERE session_user_id = $user_id";
$db->sql_query($sql);
unset($user_auth);
}
}
trigger_error($user->lang['USER_PREFS_UPDATED'] . adm_back_link($this->u_action . '&u=' . $user_id));
}
// Replace "error" strings with their real, localised form
$error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error);
}
$template->assign_vars(array(
'S_MEDALPREFS' => true,
'S_MEDAL' => $data['medal'],
)
);
break;
}
// Assign general variables
$template->assign_vars(array(
'S_ERROR' => (sizeof($error)) ? true : false,
'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '')
);
}
}
?>
adm/styles/acp_medals.html
Code: Alles auswählen
<!-- INCLUDE overall_header.html -->
<a name="maincontent"></a>
<!-- IF S_SELECT_USER -->
<h1>{L_MEDALS_ADMIN}</h1>
<p>{L_MEDALS_ADMIN_EXPLAIN}</p>
<form id="select_user" method="post" action="{U_ACTION}">
<fieldset>
<legend>{L_SELECT_USER}</legend>
<dl>
<dt><label for="username">{L_FIND_USERNAME}:</label></dt>
<dd><input class="text medium" type="text" id="username" name="username" /></dd>
<dd>[ <a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a> ]</dd>
</dl>
<p class="quick">
<input type="submit" name="submituser" value="{L_SUBMIT}" class="button1" />
</p>
</fieldset>
</form>
<!-- ENDIF -->
<!-- IF S_MEDALPREFS -->
<form id="medal_prefs" method="post" action="{U_ACTION}">
<fieldset>
<legend>{L_MEDALS}</legend>
<dl>
<dt><label for="medal">{L_MEDAL}:</label></dt>
<dd><label><input type="radio" class="radio" name="medal" value="1"<!-- IF S_MEDAL --> id="medal" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
<label><input type="radio" class="radio" name="medal" value="0"<!-- IF not S_MEDAL --> id="medal" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
</dl>
</fieldset>
<fieldset class="quick">
<input class="button1" type="submit" name="update" value="{L_SUBMIT}" />
{S_FORM_TOKEN}
</fieldset>
</form>
<!-- ENDIF -->
<!-- INCLUDE overall_footer.html -->
Edit:
Ich weiß zwar immer noch nicht, warum das nicht geklappt hat, aber ich habe einen anderen Weg gefunden. Die Medals sind jetzt ein zusätzlicher Punkt im Dropdown-Menü der Nuterverwaltung. Das funktioniert, wie es sollte.