| Current Path : /var/www/html/components/com_osmembership/controller/ |
| Current File : /var/www/html/components/com_osmembership/controller/groupmember.php |
<?php
/**
* @package Joomla
* @subpackage Membership Pro
* @author Tuan Pham Ngoc
* @copyright Copyright (C) 2012 - 2026 Ossolution Team
* @license GNU/GPL, see LICENSE.php
*/
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\User\UserHelper;
use Joomla\Database\DatabaseDriver;
use Joomla\Utilities\ArrayHelper;
use OSSolution\MembershipPro\Admin\Event\Profile\GetProfileData;
class OSMembershipControllerGroupmember extends OSMembershipController
{
use OSMembershipControllerData;
public function __construct(MPFInput $input = null, array $config = [])
{
parent::__construct($input, $config);
$this->registerTask('apply', 'save');
}
/**
* Export group members into a CSV file
*/
public function export()
{
$this->csrfProtection();
$canManage = OSMembershipHelper::getManageGroupMemberPermission();
if (!$canManage)
{
$this->setRedirect(Uri::root(), Text::_('OSM_NOT_ALLOW_TO_MANAGE_GROUP_MEMBERS'));
return;
}
set_time_limit(0);
/* @var OSMembershipModelGroupmembers $model */
$model = $this->getModel('groupmembers');
$model->set('limitstart', 0)
->set('limit', 0);
$rows = $model->getData();
if (count($rows) == 0)
{
$Itemid = OSMembershipHelperRoute::findView('groupmembers', $this->input->getInt('Itemid', 0));
$this->setRedirect(
Route::_('index.php?option=com_osmembership&view=groupmembers&Itemid=' . $Itemid, false),
Text::_('OSM_NO_GROUP_MEMBERS_TO_EXPORT')
);
return;
}
$planIds = array_unique(array_column($rows, 'plan_id'));
if (count($planIds) == 1)
{
$rowFields = OSMembershipHelper::getProfileFields($planIds[0], true);
}
else
{
$rowFields = OSMembershipHelper::getProfileFields(0, true);
}
foreach ($rowFields as $i => $field)
{
if (!$field->show_on_group_member_form || $field->hide_on_export)
{
unset($rowFields[$i]);
}
}
$rowFields = array_values($rowFields);
$fieldIds = [];
foreach ($rowFields as $rowField)
{
if ($rowField->is_core)
{
continue;
}
$fieldIds[] = $rowField->id;
}
$fieldValues = $model->getFieldsData($fieldIds);
$fields = [
'id',
'plan',
'username',
];
$i = 0;
foreach ($rowFields as $rowField)
{
$fields[] = $rowField->name;
if ($rowField->is_core)
{
unset($rowFields[$i]);
}
$i++;
}
$fields[] = 'created_date';
$fields[] = 'from_date';
$fields[] = 'to_date';
$fields[] = 'published';
$fields[] = 'membership_id';
$dateFields = ['created_date', 'from_date', 'to_date'];
foreach ($rows as $row)
{
$row->plan = $row->plan_title;
foreach ($dateFields as $dateField)
{
if ((int) $row->{$dateField})
{
$row->{$dateField} = HTMLHelper::_('date', $row->{$dateField}, 'Y-m-d');
}
else
{
$row->{$dateField} = '';
}
}
foreach ($rowFields as $rowField)
{
$fieldValue = $fieldValues[$row->id][$rowField->id] ?? '';
$row->{$rowField->name} = $fieldValue;
}
}
$filePath = OSMembershipHelper::callOverridableHelperMethod(
'Data',
'excelExport',
[$fields, $rows, 'group_members_list']
);
if ($filePath)
{
$this->processDownloadFile($filePath);
}
}
/**
* Display form to allow adding new group member
*
* @return void
*/
public function add()
{
$this->input->set('view', 'groupmember');
$this->input->set('layout', 'default');
$this->display();
}
/**
* Display form to allow editing group member
*
* @return void
*/
public function edit()
{
$this->csrfProtection();
$cid = $this->input->get('cid', [], 'array');
$cid = ArrayHelper::toInteger($cid);
$this->input->set('id', $cid[0]);
$this->input->set('view', 'groupmember');
$this->input->set('layout', 'default');
$this->display();
}
/**
* Method to allow adding new member to a group
*/
public function save()
{
$this->csrfProtection();
$config = OSMembershipHelper::getConfig();
$task = $this->getTask();
$cid = $this->input->post->get('cid', [], 'array');
$cid = ArrayHelper::toInteger($cid);
$memberId = $cid[0];
$this->input->post->set('id', $memberId);
if ($config->use_email_as_username && !$memberId)
{
$this->input->post->set('username', $this->input->post->getString('email'));
}
$canManage = OSMembershipHelper::getManageGroupMemberPermission();
if (($memberId && $canManage >= 1) || ($canManage == 2))
{
/* @var OSMembershipModelGroupmember $model */
$model = $this->getModel('groupmember');
$errors = $model->validate($this->input);
if (count($errors))
{
foreach ($errors as $error)
{
$this->app->enqueueMessage($error, 'error');
}
$this->input->set('view', 'groupmember');
$this->input->set('validate_error', 1);
$this->display();
return;
}
$post = $this->input->post->getData();
if (empty($post['password1']))
{
$post['password'] = $post['password1'] = UserHelper::genRandomPassword();
}
else
{
$post['password'] = $post['password1'];
}
$model->store($post);
$Itemid = OSMembershipHelperRoute::findView('groupmembers', $this->input->getInt('Itemid', 0));
if ($task === 'apply' && !empty($post['id']))
{
$this->setRedirect(
Route::_(
'index.php?option=com_osmembership&view=groupmember&id=' . $post['id'] . '&Itemid=' . $Itemid,
false
),
Text::_('OSM_GROUP_MEMBER_WAS_SUCCESSFULL_CREATED')
);
}
else
{
$this->setRedirect(
Route::_('index.php?option=com_osmembership&view=groupmembers&Itemid=' . $Itemid, false),
Text::_('OSM_GROUP_MEMBER_WAS_SUCCESSFULL_CREATED')
);
}
}
else
{
$this->setRedirect('index.php', Text::_('OSM_NOT_ALLOW_TO_MANAGE_GROUP_MEMBERS'));
}
}
/**
* Cancel add/edit group member, redirect back to group members management page
*
* @return void
*/
public function cancel()
{
$Itemid = OSMembershipHelperRoute::findView('groupmembers', $this->input->getInt('Itemid', 0));
$this->setRedirect(Route::_('index.php?option=com_osmembership&view=groupmembers&Itemid=' . $Itemid, false));
}
/**
* Delete a member from group
*/
public function delete()
{
$this->csrfProtection();
$canManage = OSMembershipHelper::getManageGroupMemberPermission();
if ($canManage < 1)
{
$this->setRedirect('index.php', Text::_('OSM_NOT_ALLOW_TO_MANAGE_GROUP_MEMBERS'));
return;
}
$cid = $this->input->get('cid', [], 'array');
$id = $this->input->getInt('member_id', 0);
// This code is added for backward compatible purpose
if (!count($cid))
{
$cid = [$id];
}
$Itemid = $this->input->getInt('Itemid', 0);
/* @var OSMembershipModelGroupmember $model */
$model = $this->getModel('groupmember');
foreach ($cid as $id)
{
$model->deleteMember($id);
}
$this->setRedirect(
Route::_('index.php?option=com_osmembership&view=groupmembers&Itemid=' . $Itemid, false),
Text::_('OSM_GROUP_MEMBER_WAS_SUCCESSFULL_DELETED')
);
}
/**
* Get profile data of the subscriber, using for json format
*/
public function get_member_data()
{
// Check permission
$canManage = OSMembershipHelper::getManageGroupMemberPermission();
if ($canManage >= 1)
{
$input = $this->input;
$userId = $input->getInt('user_id', 0);
$planId = $input->getInt('plan_id');
$data = [];
if ($userId)
{
$rowFields = OSMembershipHelper::getProfileFields($planId, true);
/* @var DatabaseDriver $db */
$db = Factory::getContainer()->get('db');
$query = $db->getQuery(true);
$query->clear();
$query->select('*')
->from('#__osmembership_subscribers')
->where('user_id=' . $userId);
$db->setQuery($query);
$rowProfile = $db->loadObject();
$data = [];
if ($rowProfile)
{
$data = OSMembershipHelper::getProfileData($rowProfile, $planId, $rowFields);
}
else
{
// Trigger plugin to get data
$mappings = [];
foreach ($rowFields as $rowField)
{
if ($rowField->field_mapping)
{
$mappings[$rowField->name] = $rowField->field_mapping;
}
}
PluginHelper::importPlugin('osmembership');
$event = new GetProfileData(['userId' => $userId, 'mappings' => $mappings]);
$results = $this->app->getDispatcher()->dispatch($event->getName(), $event)->getArgument('result', []);
if (count($results))
{
foreach ($results as $res)
{
if (is_array($res) && count($res))
{
$data = $res;
break;
}
}
}
}
if (!count($data) && PluginHelper::isEnabled('user', 'profile'))
{
$synchronizer = new MPFSynchronizerJoomla();
$mappings = [];
foreach ($rowFields as $rowField)
{
if ($rowField->profile_field_mapping)
{
$mappings[$rowField->name] = $rowField->profile_field_mapping;
}
}
$data = $synchronizer->getData($userId, $mappings);
}
}
if ($userId && !isset($data['first_name']))
{
//Load the name from Joomla default name
$user = Factory::getUser($userId);
$name = $user->name;
if ($name)
{
$pos = strpos($name, ' ');
if ($pos !== false)
{
$data['first_name'] = substr($name, 0, $pos);
$data['last_name'] = substr($name, $pos + 1);
}
else
{
$data['first_name'] = $name;
$data['last_name'] = '';
}
}
}
if ($userId && !isset($data['email']))
{
$user = Factory::getUser($userId);
$data['email'] = $user->email;
}
echo json_encode($data);
$this->app->close();
}
}
/**
* Display form to allow invite users to join group
*
* @return void
*/
public function invite_members()
{
$this->input->set('view', 'invite');
$this->input->set('layout', 'default');
$this->display();
}
/**
* Send invitation to members
*
* @return void
*/
public function send_invite()
{
$this->csrfProtection();
$planId = $this->input->getInt('plan_id', 0);
$emailsInput = $this->input->getString('emails', '');
$subject = $this->input->getString('subject');
$message = $this->input->get('message', '', 'raw');
$emails = explode("\r\n", $emailsInput);
$emails = array_map('trim', $emails);
$emails = array_filter($emails, 'strlen');
$emails = array_filter($emails, 'Joomla\\CMS\\Mail\\MailHelper::isEmailAddress');
$canProcess = true;
if (!$planId)
{
$this->app->enqueueMessage(Text::_('OSM_SELECT_PLAN_TO_INVITE'), 'error');
$canProcess = false;
}
if (count($emails) == 0)
{
$this->app->enqueueMessage(Text::_('OSM_ENTER_VALID_EMAILS_TO_INVITE'), 'error');
$canProcess = false;
}
if (!$message)
{
$this->app->enqueueMessage(Text::_('OSM_ENTER_VALID_EMAIL_MESSAGE'), 'error');
$canProcess = false;
}
if ($canProcess)
{
OSMembershipHelper::callOverridableHelperMethod(
'Mail',
'sendJoinGroupMembershipInvite',
[$planId, $emails, $subject, $message]
);
$this->setRedirect(
Route::_(
'index.php?option=com_osmembership&view=groupmembers&Itemid=' . $this->input->getInt('Itemid', 0),
false
),
Text::_('OSM_INVITE_SENT_TO_USERS_SUCCESSFULLY')
);
}
else
{
// Display the form
$this->display();
}
}
}