Eigene IF Abfragen und ACP Userverwaltung für Profilfelder

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

Eigene IF Abfragen und ACP Userverwaltung für Profilfelder

Beitrag 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
Zuletzt geändert von dfalcon am 25.08.2011 00:15, insgesamt 1-mal geändert.
modernist
Ehemaliges Teammitglied
Beiträge: 2202
Registriert: 12.01.2009 10:44

Re: Eigene IF Abfragen in Template-Dateien

Beitrag von modernist »

Wenn du S_MEDAL in der memberlist.php definierst, dann kannst du's auch in der memberlist_view.html verwenden.
dfalcon
Mitglied
Beiträge: 5
Registriert: 15.07.2011 15:10

Re: Eigene IF Abfragen in Template-Dateien

Beitrag 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'])
Benutzeravatar
D@ve
Ehemaliges Teammitglied
Beiträge: 3842
Registriert: 28.08.2002 19:33
Wohnort: Bretzfeld
Kontaktdaten:

Re: Eigene IF Abfragen in Template-Dateien

Beitrag 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).
There are only 10 types of people in the world: Those who understand binary, and those who don't
dfalcon
Mitglied
Beiträge: 5
Registriert: 15.07.2011 15:10

Re: Eigene IF Abfragen in Template-Dateien

Beitrag 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.
Antworten

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