SharkyKZ wrote: ↑Fri Jan 17, 2025 7:01 pm
Post the code of Crewlist.php, not your passwords and personal info.
crewlist.php
Code: Select all
<?php
namespace Blazingimages\Plugin\User\Crewlist\Extension;
// No direct access to this file
defined('_JEXEC') or die;
// Import the Joomla plugin library
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Factory;
use Joomla\Database\DatabaseFactory;
use Joomla\Database\DatabaseInterface;
use Joomla\Database\ParameterType;
class Crewlist extends CMSPlugin
{
// Constructor
public function __construct(&$subject, $config = array())
{
parent::__construct($subject, $config);
}
/**
* Event that is triggered when a user is created, updated or deleted.
*
* @param array $context The context of the event (user.created, user.updated, user.deleted).
* @param object $user The user object.
*
* @return void
*/
public function onUserAfterSave($user, $isNew, $success, $msg)
{
// Ensure this function only runs if the user has been saved successfully.
if (!$success) {
return;
}
// Load plugin parameters
$crewlistDbName = $this->params->get('crewlistDbName');
$crewlistDbUser = $this->params->get('crewlistDbUser');
$crewlistDbPassword = $this->params->get('crewlistDbPassword');
$crewlistDBTable = $this->params->get('crewlistDBTable');
$crewlistAddress = $this->params->get('crewlistAddress');
$crewlistDomain = $this->params->get('crewlistDomain');
// Step 1: Create the comma separated list of emails
$tempCrewlist = $this->getCrewlistEmails();
// Step 2: Connect to the external database
$options = array(
'driver' => 'mysqli',
'host' => 'localhost',
'user' => $crewlistDbUser,
'password' => $crewlistDbPassword,
'database' => $crewlistDbName
);
$dbFactory = new DatabaseFactory();
$db = $dbFactory->getDriver('mysqli',$options);
$db->connect();
// Step 3: Check if a record with the crewlistAddress already exists
$query = $db->getQuery(true)
->select('*')
->from($db->quoteName($crewlistDBTable))
->where($db->quoteName('address') . ' = ' . $db->quote($crewlistAddress));
$db->setQuery($query);
$existingRecord = $db->loadObject();
// Step 4: Update or Insert the record as needed
if ($existingRecord) {
// Update existing record
$query = $db->getQuery(true)
->update($db->quoteName($crewlistDBTable))
->set([
$db->quoteName('goto') . ' = ' . $db->quote($tempCrewlist),
$db->quoteName('domain') . ' = ' . $db->quote($crewlistDomain),
$db->quoteName('active') . ' = 1'
])
->where($db->quoteName('address') . ' = ' . $db->quote($crewlistAddress));
$db->setQuery($query);
$db->execute();
} else {
// Insert new record
$query = $db->getQuery(true)
->insert($db->quoteName($crewlistDBTable))
->columns([
$db->quoteName('address'),
$db->quoteName('goto'),
$db->quoteName('domain'),
$db->quoteName('active')
])
->values(implode(',', [
$db->quote($crewlistAddress),
$db->quote($tempCrewlist),
$db->quote($crewlistDomain),
1
]));
$db->setQuery($query);
$db->execute();
}
}
/**
* Function to retrieve the comma separated list of emails where the custom field 'crewlist' equals 1
*
* @return string
*/
private function getCrewlistEmails()
{
$db = Factory::getContainer()->get(DatabaseInterface::class);
$db->connect();
$query = $db->getQuery(true)
->select($db->quoteName('uf.id'))
->from($db->quoteName('#__fields','uf'))
->where($db->quoteName('uf.context') . " = 'com_users.user' AND " . $db->quoteName('uf.name') . " = 'crewlist'");
$query->string = $query->__toString();
$db->setQuery($query);
$field_id = $db->loadResult();
if (!$field_id) {
$app = Factory::getApplication();
$app->enqueueMessage('The field "crewlist" does not exist. Please create it in user custom fields. The email list has not been updated', 'error');
return false;
} else {
$query = $db->getQuery(true)
->select('u.email')
->from('#__users AS u')
->join('LEFT', '#__fields_values AS ufv ON u.id = ufv.item_id AND ufv.field_id = :fieldID')
->bind(':fieldID',$field_id,ParameterType::INTEGER)
->where($db->quoteName('ufv.value') . ' = 1');
$query->string = $query->__toString();
$db->setQuery($query);
$emails = $db->loadColumn();
return implode(',', $emails);
}
}
}
provider.php
Code: Select all
<?php
/**
* @package Joomla.Plugin
* @subpackage User.Crewlist
*
* @copyright (C) 2023 Open Source Matters, Inc.
* @license GNU General Public License version 2 or later;
*/
\defined('_JEXEC') or die;
use Joomla\CMS\Extension\PluginInterface;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use Joomla\Event\DispatcherInterface;
use Blazingimages\Plugin\User\Crewlist\Extension\Crewlist;
return new class () implements ServiceProviderInterface {
/**
* Registers the service provider with a DI container.
*
* @param Container $container The DI container.
*
* @return void
*
* @since 4.4.0
*/
public function register(Container $container): void
{
$container->set(
PluginInterface::class,
function (Container $container) {
$plugin = new Crewlist(
$container->get(DispatcherInterface::class),
(array) PluginHelper::getPlugin('user', 'crewlist')
);
$plugin->setApplication(Factory::getApplication());
return $plugin;
}
);
}
};