Seite 2 von 4

Re: [3.3] Quick Activation in Profile

Verfasst: 16.04.2025 10:36
von chris1278
Hallo Joe. Ich mal die listner.php bearbeitet bezüglich einrückungen und klammersetzunngen. hier mal die von mir korrigierte version:

Code: Alles auswählen

<?php

namespace moemorox\qaip\event;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use const PROFILE_FIELDS_DATA_TABLE;


class listener implements EventSubscriberInterface
{
	protected $db;
	protected $language;
	protected $template;
	protected $user;
	protected $auth;

	public function __construct(
		\phpbb\db\driver\driver_interface $db,
		\phpbb\language\language $language,
		\phpbb\template\template $template,
		\phpbb\user $user,
		\phpbb\auth\auth $auth
	)
	{
		$this->db = $db;
		$this->language = $language;
		$this->user = $user;
		$this->auth = $auth;
		$this->template = $template;
		$this->language->add_lang('common', 'moemorox/qaip');
	}

	public static function getSubscribedEvents()
	{
		return [
			'core.memberlist_modify_view_profile_template_vars' => 'memberlist_modify_view_profile_template_vars',
		];
	}

	public function memberlist_modify_view_profile_template_vars($event)
	{
		$this->add_activate_url($event);
		$this->inject_email($event);
		$this->inject_website($event);
		$this->inject_ip($event);
	}

	public function add_activate_url($event)
	{
		$tpl = $event['template_ary'];

		// Admin check
		if (!$this->user->data['is_registered'] || !($this->auth->acl_get('a_') || $this->user->data['user_type'] == USER_FOUNDER))
		{
			return;
		}

		if (!isset($tpl['U_CANONICAL']))
		{
			return;
		}

		// Extract user_id from URL
		if (!preg_match('/[&|&amp;|\?]u=(\d+)/', $tpl['U_CANONICAL'], $matches))
		{
			return;
		}

		$user_id = (int) $matches[1];

		// Get user_actkey from DB
		$sql = 'SELECT user_actkey FROM ' . USERS_TABLE . ' WHERE user_id = ' . $user_id . ' AND user_type = 1;';
		$result = $this->db->sql_query($sql);
		$row = $this->db->sql_fetchrow($result);
		$this->db->sql_freeresult($result);

		if (!empty($row['user_actkey']))
		{
			$activate_link = generate_board_url() . "/ucp.php?mode=activate&u={$user_id}&k=" . $row['user_actkey'];

			$this->template->assign_vars([
				'U_ACTIVATE' => $activate_link,
				'L_USER_ACTIVATE' => $this->language->lang('USER_ACTIVATE')
			]);
		}
	}

	public function inject_email($event)
	{
		if (!$this->user->data['is_registered'] || !($this->auth->acl_get('a_') || $this->user->data['user_type'] == USER_FOUNDER))
		{
			return;
		}

		$tpl = $event['template_ary'];

		if (!isset($tpl['U_CANONICAL']))
		{
			return;
		}

		if (!preg_match('/[&|&amp;|\?]u=(\d+)/', $tpl['U_CANONICAL'], $matches))
		{
			return;
		}

		$user_id = (int) $matches[1];

		$sql = 'SELECT user_email FROM ' . USERS_TABLE . ' WHERE user_id = ' . $user_id;
		$result = $this->db->sql_query($sql);
		$row = $this->db->sql_fetchrow($result);
		$this->db->sql_freeresult($result);

		if (!empty($row['user_email']))
		{
			$this->template->assign_vars([
				'USER_REAL_EMAIL' => $row['user_email']
			]);
		}
	}

	public function inject_website($event)
	{
		if (!$this->user->data['is_registered'] || !($this->auth->acl_get('a_') || $this->user->data['user_type'] == USER_FOUNDER))
		{
			return;
		}

		$tpl = $event['template_ary'];

		if (!isset($tpl['U_CANONICAL']))
		{
			return;
		}

		if (!preg_match('/[&|&amp;|\\?]u=(\\d+)/', $tpl['U_CANONICAL'], $matches))
		{
			return;
		}

		$user_id = (int) $matches[1];

		$sql = "SHOW COLUMNS FROM " . PROFILE_FIELDS_DATA_TABLE . " LIKE 'pf_phpbb_website'";
		$result = $this->db->sql_query($sql);
		$exists = (bool) $this->db->sql_fetchrow($result);
		$this->db->sql_freeresult($result);

		if (!$exists)
		{
			return; // no website custom profile field
		}

		$sql = 'SELECT pf_phpbb_website FROM ' . PROFILE_FIELDS_DATA_TABLE . ' WHERE user_id = ' . $user_id;
		$result = $this->db->sql_query($sql);
		$row = $this->db->sql_fetchrow($result);
		$this->db->sql_freeresult($result);

		if (!empty($row['pf_phpbb_website']))
		{
			$this->template->assign_vars([
				'USER_WEBSITE_RAW' => $row['pf_phpbb_website'],
			]);
		}
	}

	public function inject_ip($event)
	{
		if (!$this->user->data['is_registered']	|| !($this->auth->acl_get('a_') || $this->user->data['user_type'] == USER_FOUNDER))
		{
			return;
		}

		$tpl = $event['template_ary'];

		if (!isset($tpl['U_CANONICAL']))
		{
			return;
		}

		if (!preg_match('/[&|&amp;|\\?]u=(\\d+)/', $tpl['U_CANONICAL'], $matches))
		{
			return;
		}

		$user_id = (int) $matches[1];

		$sql = 'SELECT user_ip FROM ' . USERS_TABLE . ' WHERE user_id = ' . $user_id;
		$result = $this->db->sql_query($sql);
		$row = $this->db->sql_fetchrow($result);
		$this->db->sql_freeresult($result);

		if (!empty($row['user_ip']))
		{
			$this->template->assign_vars([
				'USER_IP' => $row['user_ip'],
				'USER_IP_URL' => 'https://ipinfo.io/' . $row['user_ip'],
			]);
		}
	}
}

Du hast z.b. Viel so gemacht:

Code: Alles auswählen

if (bedingung) {
    return;
}
die besserer Variante wäre:

Code: Alles auswählen

if (bedingung) 
{
    return;
}

Re: [3.3] Quick Activation in Profile

Verfasst: 16.04.2025 13:31
von Joe Kolade
Hallo, und vielen Dank für die vielen hilfreichen Hinweise!
Mein Sohn hat gestern in einer größeren Aktion die Code-Formatierung an die Vorgaben angepasst und einige Kleinigkeiten optimiert. Zudem sind die Templates jetzt "twiggy" und hinsichtlich einer besseren Übersichtlichkeit verbessert.
Ein neues Release wird in Kürze via Github veröffentlicht und natürlich im Startbeitrag mit neuer Versionsnummer angegeben.

Gruß Joe

Re: [3.3] Quick Activation in Profile

Verfasst: 16.04.2025 20:45
von Dref
Joe Kolade hat geschrieben: 15.04.2025 15:46 Danke! Kannst Du etwas konkretisieren, was mit "Konto direkt unter der IP-Adresse ablehnen" gemeint ist?
Die Möglichkeit, die Registrierung des Mitglieds über sein Profil abzulehnen.
Ich schlug vor, diesen Opt-out-Link direkt unter der IP-Adresse anzuzeigen

Re: [3.3] Quick Activation in Profile

Verfasst: 16.04.2025 22:11
von Joe Kolade
Du meinst "Benutzer löschen"? Die Möglichkeit, einen Benutzer (aufgrund seiner IP) "abzulehnen", ist mir aktuell nicht bekannt... :oops:

Re: [3.3] Quick Activation in Profile

Verfasst: 16.04.2025 22:14
von Dref
Wenn man ein Mitglied akzeptieren kann, das sich über sein Profil anmeldet, so kann man dieses Mitglied genauso ablehnen wie man es von der GPA aus tun kann

Re: [3.3] Quick Activation in Profile

Verfasst: 16.04.2025 23:02
von LukeWCS
@Joe

Zu der listener.php die euch chris1278 überarbeitet hat ein paar Worte: Chris hat diese Datei konform zu den offiziellen phpBB Programmier-Richtlinien gestaltet. In der Version 1.0.0 von euch, hat Ext Check noch 166 Richtlinienfehler bei dieser Datei gemeldet, bei Chris' Variante sind es nur noch 2. Das sind die Richtlinien nach denen alle arbeiten, die Ext Check nutzen.

@chris1278

Fast perfekt. :) Wie angedeutet, 2 Sachen passen noch nicht. Hier das Log vom PPSSE Prüfmodul:

Code: Alles auswählen

FILE: moemorox\qaip\event\listener.php
--------------------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 1 LINE
--------------------------------------------------------------------------------
 6 | ERROR | There must be one blank line after the last USE statement; 2
   |       | found;
 6 | ERROR | There must not be unused USE statements.
--------------------------------------------------------------------------------
1 sollte klar sein. 2 muss ich selber erst schauen, wenn die neue Version bereit steht, kann ich grad nicht aus dem Stand beantworten. Das klären wir aber dann im EC Thema, wenn Joe den ersten EC Bericht hat.

Re: [3.3] Quick Activation in Profile

Verfasst: 17.04.2025 10:58
von Schneeflocke
Vielen Dank für die Erweiterung :)

Re: [3.3] Quick Activation in Profile

Verfasst: 17.04.2025 15:36
von IMC
LukeWCS hat geschrieben: 16.04.2025 23:022 muss ich selber erst schauen,
Das Konstrukt kannte ich auch noch nicht. Deshalb habe ich mir das Gestern mal angeschaut.
use const wird wohl benutzt wenn man Konstanten aus anderen Namensräumen nutzen möchte.
https://www.php.net/manual/de/language. ... orting.php

Re: [3.3] Quick Activation in Profile

Verfasst: 17.04.2025 16:52
von LukeWCS
Merci Thorsten. Jupp, bin heute beim ersten Kaffee auch darauf gestossen, als ich das recherchiert habe. Da ich diese PPSSE Meldung bei einer Ext bisher noch nie gesehen habe in Kombination mit einer Konstanten, war ich reichlich irritiert. Und PPSSE war da wohl auch etwas irritiert, weil diese Fehlermeldung ist in Kombination mit einer Konstante sowas von nicht hilfreich. :lol: Sprich, dieser Fall ist gar nicht vorgesehen bei PPSSE, darum diese "unpräzise" Fehlermeldung die wir eigentlich von anderen Szenarien kennen.

@Joe

Diese Zeile hier benötigt ihr gar nicht:

Code: Alles auswählen

use const PROFILE_FIELDS_DATA_TABLE;
Diese könnt ihr komplett entfernen weil: PROFILE_FIELDS_DATA_TABLE ist eine globale Konstante von phpBB und muss deshalb nicht explizit in eurer Klasse bekannt gemacht werden.

Re: [3.3] Quick Activation in Profile

Verfasst: 17.04.2025 19:56
von Joe Kolade