Seite 1 von 1

Eigene IF Abfragen und ACP Userverwaltung für Profilfelder

Verfasst: 24.08.2011 18:22
von dfalcon
Liebe Community,

Ich versuche gerade einen Mod zu erstellen und verwende phpbb 3.0.9 Ich habe keine anderen Mods installiert.

Ich habe ein neues Modul für das UCP erstellt. Es handelt sich dabei eigentlich um ein ganz einfaches Profilfeld (genau wie bei den Preferences z.B.), bei dem der Nutzer Ja oder Nein auswählen kann. Der Dateiname im Ordner includes/ucp lautet ucp_medals.php (auch die entsprechende info-Datei wurde erstellt und ist vorhanden).

In dieser Datei wird S_MEDAL definiert. Es wird in der Datenbank abgefragt, ob der entsprechende Eintrag 0 oder 1 hat. In der zugehörigen template-Datei ist dann folgender Code enthalten:

Code: Alles auswählen

	<fieldset>
	<!-- IF ERROR --><p class="error">{ERROR}</p><!-- ENDIF -->
	<dl>
		<dt><label for="medal1">{L_MEDAL}:</label></dt>
		<dd>
			<label for="medal1"><input type="radio" name="medal" id="medal1" value="1"<!-- IF S_MEDAL --> checked="checked"<!-- ENDIF --> /> {L_YES}</label> 
			<label for="medal0"><input type="radio" name="medal" id="medal0" value="0"<!-- IF not S_MEDAL --> checked="checked"<!-- ENDIF --> /> {L_NO}</label>
		</dd>
	</dl>
	</fieldset>
Das ganze sieht dann genauso aus, wie das normale Modul für Einstellungen im UCP. Das funktioniert auch alles einwandfrei. Datenbankeinträge sind in der Tabelle für die User vorhanden und die Einstellungen werden korrekt gespeichert.

Jetzt möchte ich gerne im User-Profil (template-Datei memberlist_view.html) abfragen, ob der User die Medallie hat (Wert 1 in DB) oder nicht (Wert 0 in DB). Wenn ja, soll sie angezeigt werden, wenn nicht, nicht. Ich dachte, ich könnte das in der memberlist_view.html mit der gleichen if-Abfrage (<!-- IF S_MEDAL -->Zeige Grafik<!-- ENDIF --> ) machen, wie oben, aber so einfach scheint das leider nicht zu sein - zumindest funktioniert das nicht, denn es wird nichts von dem angezeigt, was zwischen der Abfrage steht, egal ob der Wert in der Datenbank nun 1 ist oder 0.

Ich komme leider nicht drauf, wo ich stattdessen definieren müsste, was S_MEDAL ist, damit das auch der memberlist_view.html bekannt ist.

Über jede Hilfe, wäre ich wirklich dankbar!

Gruß,
dfalcon

Re: Eigene IF Abfragen in Template-Dateien

Verfasst: 24.08.2011 21:09
von modernist
Wenn du S_MEDAL in der memberlist.php definierst, dann kannst du's auch in der memberlist_view.html verwenden.

Re: Eigene IF Abfragen in Template-Dateien

Verfasst: 24.08.2011 22:47
von dfalcon
Danke für die Antwort!

In der php fürs UCP wurde der User global abgefragt. Ich denke mal, das geht jetzt nicht, sonst sehe ich meine eigenen Einstellungen.

Ich weiß leider nicht, wie ich genau den User von dem aktuell aufgerufenen Profil bekomme, um von ihm dann den Eintrag in der Datenbank abfragen zu können.

Bisher habe ich eben diesen Code benutzt (Beispiel):

Code: Alles auswählen

$medaldata = array(
	'medal'	=> request_var('medal', (bool) $user->data['user_medal']),
);
Nur die global abgefragte Variable $user wird hier ja dann wohl nicht richtig sein.

Für das UCP-Modul habe ich dem zugehörigen Template die Variablen mit diesem Code zugewiesen:

Code: Alles auswählen

$template->assign_vars(array(
'S_MEDAL'  => $medaldata['medal'])

Re: Eigene IF Abfragen in Template-Dateien

Verfasst: 24.08.2011 23:08
von D@ve
dfalcon hat geschrieben:Danke für die Antwort!

In der php fürs UCP wurde der User global abgefragt. Ich denke mal, das geht jetzt nicht, sonst sehe ich meine eigenen Einstellungen.

Ich weiß leider nicht, wie ich genau den User von dem aktuell aufgerufenen Profil bekomme, um von ihm dann den Eintrag in der Datenbank abfragen zu können.

Bisher habe ich eben diesen Code benutzt (Beispiel):

Code: Alles auswählen

$medaldata = array(
	'medal'	=> request_var('medal', (bool) $user->data['user_medal']),
);
Nur die global abgefragte Varibale $user wird hier ja dann wohl nicht richtig sein.

Das findest Du in der memberlist.php so ab Zeile 400:

Code: Alles auswählen

	case 'viewprofile':    
.
.
.
		// Get user...
		$sql = 'SELECT *
			FROM ' . USERS_TABLE . '
			WHERE ' . (($username) ? "username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'" : "user_id = $user_id");
		$result = $db->sql_query($sql);
		$member = $db->sql_fetchrow($result);
 
Danach hast Du den hiesigen User in der Variable $member stehen und kannst darauf zugreifen. Wenn Du weitere Felder in der DB angelegt hast, hast Du die auch automatisch in dem Array stehen.
Hier würde ich auch ansetzen.

Wenn Du Template-Variablen überall verwenden willst, setzt Du die am besten in der page_header() oder page_footer() Funktion (functions.php).

Re: Eigene IF Abfragen in Template-Dateien

Verfasst: 25.08.2011 00:13
von dfalcon
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.