www_archline_hu/deployed/tflearn/libraries/techfry/src/TfUser.php
LÁZÁR Imre AI Agent f67e0a20ee feat(deployed): add TF Learn 1.7.5 (no-source, vetted live)
TF Learn (Tech Fry) + techfry library 1.3.4; login-gated, no repo -> deployed files.

Signed-off-by: LÁZÁR Imre <imre@illusion.hu>
Assisted-by: claude-code@claude-opus-4-8
2026-07-16 11:24:46 +02:00

473 lines
13 KiB
PHP

<?php
/*
* @package Tech Fry Library
* @license https://www.gnu.org/licenses/gpl-3.0.en.html
*/
namespace TechFry\Library;
defined('_JEXEC') or die;
use Joomla\CMS\Authentication\Authentication;
use Joomla\CMS\Authentication\AuthenticationResponse;
use Joomla\CMS\Application\ApplicationHelper;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\User\User;
use Joomla\CMS\User\UserHelper;
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;
class TfUser
{
// 01. Returns user id from user email
public static function find_user($email)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select($db->quoteName('id'))
->from($db->quoteName('#__users'))
->where('LOWER(' . $db->quoteName('email') . ') = LOWER(' . $db->quote($email) . ')');
$db->setQuery($query);
$user_id = $db->loadResult();
return $user_id ? $user_id : false;
}
// 02. Create new joomla user
public static function create_user($data)
{
$params = ComponentHelper::getParams('com_users');
$user = new User();
$userdata = array();
$data['email'] = strtolower($data['email']);
// Set username
if (!isset($data['username']) || empty($data['username']))
{
$data['username'] = $data['email'];
}
// Set name
if (!isset($data['name']) || empty($data['name']))
{
$data['name'] = strstr($data['email'], '@', true);
}
// Set password for new users
if (!isset($data['password']) || empty($data['password']))
{
$userdata['password'] = UserHelper::genRandomPassword();
}
// Set require password reset
if (isset($data['requireReset']))
{
$userdata['requireReset'] = $data['requireReset'];
}
else
{
$userdata['requireReset'] = 0;
}
$userdata['username'] = $data['username'];
$userdata['name'] = $data['name'];
$userdata['email'] = $data['email'];
// User activation
$useractivation = $params->get('useractivation');
if (($useractivation == 1) || ($useractivation == 2))
{
$userdata['activation'] = ApplicationHelper::getHash(UserHelper::genRandomPassword());
$userdata['block'] = 1;
}
else
{
$userdata['block'] = 0;
}
// Set user groups
if (!isset($data['groups']) || empty($data['groups']))
{
$user_group = $params->get('new_usertype', 2);
$data['groups'] = array($user_group);
}
$userdata['groups'] = $data['groups'];
// Set custom fields
if (isset($data['com_fields']) && !empty($data['com_fields']))
{
$userdata['com_fields'] = $data['com_fields'];
}
// Bind the data
if (!$user->bind($userdata))
{
Factory::getApplication()->enqueueMessage($user->getError());
return false;
}
// Store the data
if (!$user->save())
{
Factory::getApplication()->enqueueMessage($user->getError());
return false;
}
return $user;
}
// 03. Updates existing joomla user
public static function update_user($data, $updates = array(), $block = 0)
{
$user = Factory::getUser($data['id']);
$userdata = array();
foreach ($updates as $update)
{
if (!empty($data[$update]))
{
$userdata[$update] = $data[$update];
}
}
if (!in_array('block', $updates))
{
$userdata['block'] = $block;
}
// Set custom fields
if (isset($data['com_fields']) && !empty($data['com_fields']))
{
$userdata['com_fields'] = $data['com_fields'];
}
// Bind the data
if (!$user->bind($userdata))
{
Factory::getApplication()->enqueueMessage($user->getError());
return false;
}
// Store the data
if (!$user->save())
{
Factory::getApplication()->enqueueMessage($user->getError());
return false;
}
return $user;
}
// 04. Save user custom field
public static function save_custom_field($field_id, $user_id, $value)
{
$fieldModel = Factory::getApplication()->bootComponent('com_fields')->getMVCFactory()->createModel('Field', 'Administrator', ['ignore_request' => true]);
$result = $fieldModel->setFieldValue($field_id, $user_id, $value);
return $result;
}
// 05. Get user custom field
public static function get_custom_field($field_id, $user_id)
{
$fieldModel = Factory::getApplication()->bootComponent('com_fields')->getMVCFactory()->createModel('Field', 'Administrator', ['ignore_request' => true]);
$value = $fieldModel->getFieldValue($field_id, $user_id);
return $value;
}
// 06. Filter users
public static function filter_users($filters, $userfilters, $email = null)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query
->select($db->quoteName(array('a.id')))
->from($db->quoteName('#__users', 'a'))
->where($db->quoteName('a.block') . ' = ' . $db->quote(0))
->order('a.id ASC');
// Joomla Users Table
if (is_array(json_decode($filters, true)) && (json_last_error() == JSON_ERROR_NONE))
{
$filters = json_decode($filters);
}
$filters_arr = (array) $filters;
if (!empty($filters_arr))
{
foreach ($filters_arr as $filter_obj)
{
$filter = (array) $filter_obj;
// Case 1: Filter value is given
if (($filter['where_field'] != '') && ($filter['where_value'] != ''))
{
if ($filter['isDate'])
{
$date = Factory::getDate('now -' . $filter['where_value'] . ' day');
$filter['where_value'] = $date->toSQL();
}
$query->andWhere($db->quoteName('a.' . $filter['where_field']) . ' ' . $filter['where_operator'] . ' ' . $db->quote($filter['where_value']));
}
// Case 2: Filter value is not given (Example: IS NULL)
elseif (!empty($filter['where_field']) && empty($filter['where_value']))
{
$query->andWhere($db->quoteName('a.' . $filter['where_field']) . ' ' . $filter['where_operator']);
}
}
}
// Users Custom Fields
if (is_array(json_decode($userfilters, true)) && (json_last_error() == JSON_ERROR_NONE))
{
$userfilters = json_decode($userfilters);
}
$userfilters_arr = (array) $userfilters;
if (!empty($userfilters_arr))
{
foreach ($userfilters_arr as $filter_obj)
{
$filter = (array) $filter_obj;
// Case 1: Filter is for Joomla User Group
if ($filter['where_field'] == 'group_id')
{
$query->join('INNER', $db->quoteName('#__user_usergroup_map', 'd') . ' ON (' . $db->quoteName('a.id') . ' = ' . $db->quoteName('d.user_id') . ')')
->andWhere($db->quoteName('d.group_id') . ' ' . $filter['where_operator'] . ' ' . $db->quote($filter['where_value']));
}
// Case 2: When filter is for Joomla Users Custom Fields
elseif (is_numeric($filter['where_field']))
{
$query->join('INNER', $db->quoteName('#__fields_values', 'c') . ' ON (' . $db->quoteName('a.id') . ' = ' . $db->quoteName('c.item_id') . ')')
->andWhere($db->quoteName('c.field_id') . ' = ' . $db->quote($filter['where_field']))
->andWhere($db->quoteName('c.value') . ' ' . $filter['where_operator'] . ' ' . $db->quote($filter['where_value']));
}
}
}
if ($email != null)
{
$query->andWhere($db->quoteName('a.email') . ' = ' . $db->quote($email));
$query->setLimit('1');
}
$db->setQuery($query);
$users = $db->loadColumn();
return $users;
}
// 07.
public static function check_otp($user_id, $otpkey)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query
->select($db->quoteName('registerDate'))
->from($db->quoteName('#__users'))
->where($db->quoteName('id') . ' = ' . $db->quote($user_id))
->setLimit('1');
$db->setQuery($query);
$register_date = $db->loadResult();
$date = Factory::getDate($register_date);
$user_otpkey = $date->toUnix();
return ($user_otpkey == $otpkey) ? Factory::getUser($user_id) : false;
}
// 08. Get User Groups
public static function get_user_groups($user_id)
{
$ugs = UserHelper::getUserGroups($user_id);
$arr = array();
foreach ($ugs as $ug)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select($db->quoteName('title'))
->from($db->quoteName('#__usergroups'))
->where($db->quoteName('id') . ' = ' . $db->quote($ug));
$db->setQuery($query);
$group = $db->loadResult();
$arr[] = $group;
}
return $arr;
}
// 09. Delete user
public static function delete_user($user_id)
{
$user = Factory::getUser($user_id);
$user->delete();
}
// 10. Add user to group
public static function add_user_to_group($user_id, $group_id)
{
return UserHelper::addUserToGroup($user_id, $group_id);
}
// 11. Remove user from group
public static function remove_user_from_group($user_id, $group_id)
{
return UserHelper::removeUserFromGroup($user_id, $group_id);
}
// 12. Get fields
public static function get_fields($grouped = false)
{
$fields = FieldsHelper::getFields('com_users.user');
if ($grouped)
{
// Organizing fields according to their group
$fieldsPerGroup = array(0 => array());
foreach ($fields as $field)
{
if (!array_key_exists($field->group_id, $fieldsPerGroup))
{
$fieldsPerGroup[$field->group_id] = array();
}
$fieldsPerGroup[$field->group_id][] = $field;
}
return $fieldsPerGroup;
}
else
{
return $fields;
}
}
// 13. Block user
public static function block_user_email($email)
{
$user_id = self::find_user($email);
if (!$user_id)
{
return false;
}
$user = Factory::getUser($user_id);
if ($user->block)
{
return false;
}
$userdata = array();
$userdata['id'] = $user_id;
$userdata['block'] = 1;
$userdata['requireReset'] = 0;
$user = self::update_user($userdata, array('block', 'requireReset'));
return $user;
}
// 14. Login user
public static function login_user($user_id)
{
$app = Factory::getApplication();
$user = Factory::getUser($user_id);
if (!empty($user->activation))
{
return false;
}
if ($user->block)
{
return false;
}
$status_success = Authentication::STATUS_SUCCESS;
$response = new AuthenticationResponse();
$response->status = $status_success;
$response->error_message = '';
$response->email = $user->email;
$response->type = 'tf-login';
/*
// Run the user plugins
$options = array(
'remember' => true,
'action' => 'core.login.site',
);
PluginHelper::importPlugin('user');
$results = Joomla::runPlugins('onUserLogin', [(array) $response, $options], $app);
if (in_array(false, $results, true) == false)
{
// Set the user in the session, letting Joomla! know that we are logged in.
Factory::getApplication()->getSession()->set('user', $user);
// Trigger the onUserAfterLogin event
$options['user'] = $user;
$options['responseType'] = $response->type;
// The user is successfully logged in. Run the after login events
Joomla::runPlugins('onUserAfterLogin', [$options], $app);
return;
}
*/
Factory::getApplication()->getSession()->set('user', $user);
}
// 15. Get total users in a group
public static function total_users_by_group($group_id)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('COUNT(DISTINCT map.user_id)')
->from($db->quoteName('#__user_usergroup_map', 'map'))
->join('LEFT', $db->quoteName('#__users', 'u') . ' ON ' . $db->quoteName('u.id') . ' = ' . $db->quoteName('map.user_id'))
->where($db->quoteName('map.group_id') . ' = ' . $db->quote($group_id))
->where($db->quoteName('u.block') . ' = 0');
$db->setQuery($query);
$total = $db->loadResult();
return $total;
}
}