Your IP : 216.73.216.172


Current Path : /var/www/html/administrator/components/com_kunena/src/Controller/
Upload File :
Current File : /var/www/html/administrator/components/com_kunena/src/Controller/UsersController.php

<?php

/**
 * Kunena Component
 *
 * @package         Kunena.Administrator
 * @subpackage      Controllers
 *
 * @copyright       Copyright (C) 2008 - 2026 Kunena Team. All rights reserved.
 * @license         https://www.gnu.org/copyleft/gpl.html GNU/GPL
 * @link            https://www.kunena.org
 **/

namespace Kunena\Forum\Administrator\Controller;

\defined('_JEXEC') or die();

use Exception;
use Joomla\CMS\Date\Date;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Session\Session;
use Joomla\CMS\User\UserFactoryInterface;
use Joomla\Utilities\ArrayHelper;
use Kunena\Forum\Libraries\Access\KunenaAccess;
use Kunena\Forum\Libraries\Controller\KunenaController;
use Kunena\Forum\Libraries\Forum\Category\KunenaCategory;
use Kunena\Forum\Libraries\Forum\Category\KunenaCategoryHelper;
use Kunena\Forum\Libraries\Forum\KunenaForum;
use Kunena\Forum\Libraries\Forum\Message\KunenaMessageHelper;
use Kunena\Forum\Libraries\Route\KunenaRoute;
use Kunena\Forum\Libraries\User\KunenaBan;
use Kunena\Forum\Libraries\User\KunenaUser;
use Kunena\Forum\Libraries\User\KunenaUserHelper;

/**
 * Kunena Users Controller
 *
 * @since   Kunena 2.0
 */
class UsersController extends KunenaController
{
    /**
     * @var    string  The prefix to use with controller messages.
     * @since  1.6
     */
    protected $textPrefix = 'COM_KUNENA_USERS';

    /**
     * @var     null|string
     * @since   Kunena 6.0
     */
    protected $baseurl = null;

    /**
     * Constructor.
     *
     * @param   array  $config  An optional associative array of configuration settings.
     *
     * @throws Exception
     * @since   Kunena 2.0
     *
     * @see     KunenaController
     */

    public function __construct($config = array())
    {
        parent::__construct($config);
        $this->baseurl = 'administrator/index.php?option=com_kunena&view=users';
    }

    /**
     * Proxy for getModel.
     *
     * @param   string  $name    The model name. Optional.
     * @param   string  $prefix  The class prefix. Optional.
     * @param   array   $config  Configuration array for model. Optional.
     *
     * @return  object  The model.
     *
     * @since   1.6
     */
    public function getModel($name = 'User', $prefix = 'Administrator', $config = ['ignore_request' => true]): object
    {
        return parent::getModel($name, $prefix, $config);
    }

    /**
     * Edit the user
     *
     * @return  boolean|void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function edit()
    {
        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return false;
        }

        $cid    = $this->input->get('cid', [], 'array');
        $cid    = ArrayHelper::toInteger($cid, []);
        $userid = array_shift($cid);

        if ($userid <= 0) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return false;
        }

        $this->app->setUserState('kunena.user.userid', $userid);

        $this->setRedirect(Route::_("index.php?option=com_kunena&view=user&layout=edit&userid={$userid}", false));
    }

    /**
     * Trash menu
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function trashusermessages(): void
    {
        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $cid = $this->input->get('cid', [], 'array');
        $cid = ArrayHelper::toInteger($cid, []);

        if ($cid) {
            foreach ($cid as $id) {
                list($total, $messages) = KunenaMessageHelper::getLatestMessages(false, 0, 0, ['starttime' => '-1', 'user' => $id]);

                foreach ($messages as $mes) {
                    $mes->publish(KunenaForum::DELETED);
                }
            }
        } else {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $this->app->enqueueMessage(Text::_('COM_KUNENA_A_USERMES_TRASHED_DONE'), 'success');
        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }

    /**
     * Move
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function move(): void
    {
        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $cid = $this->input->get('cid', [], 'array');
        $cid = ArrayHelper::toInteger($cid, []);

        if (empty($cid)) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $this->app->setUserState('kunena.usermove.userids', $cid);

        $this->setRedirect(Route::_("index.php?option=com_kunena&view=user&layout=move", false));
    }

    /**
     * Logout the user
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function logout(): void
    {
        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $cid = $this->input->get('cid', [], 'array');
        $cid = ArrayHelper::toInteger($cid, []);
        $id  = array_shift($cid);

        if ($id <= 0) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $options = ['clientid' => 0];
        $this->app->logout((int) $id, $options);

        $this->app->enqueueMessage(Text::_('COM_KUNENA_A_USER_LOGOUT_DONE'), 'success');
        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }

    /**
     * Remove the user
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function remove(): void
    {
        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $cid = $this->input->get('cid', [], 'array');
        $cid = ArrayHelper::toInteger($cid, []);

        if (empty($cid)) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $users = KunenaUserHelper::loadUsers($cid);

        $my        = $this->app->getIdentity();
        $usernames = [];

        foreach ($users as $user) {
            if ($my->id == $user->userid) {
                $this->app->enqueueMessage(Text::_('COM_KUNENA_USER_ERROR_CANNOT_DELETE_YOURSELF'), 'error');
                continue;
            }

            $instance = Factory::getContainer(UserFactoryInterface::class)->get(UserFactoryInterface::class)->loadUserById($user->userid);

            if ($instance->authorise('core.admin')) {
                $this->app->enqueueMessage(Text::_('COM_KUNENA_USER_ERROR_CANNOT_DELETE_ADMINS'), 'error');
                continue;
            }

            $result = $user->delete();

            if (!$result) {
                $this->app->enqueueMessage(Text::sprintf('COM_KUNENA_USER_DELETE_KUNENA_USER_TABLE_FAILED', $user->userid), 'error');
                continue;
            }

            // Delete the user too from Joomla!
            $jresult = $instance->delete();

            if (!$jresult) {
                $this->app->enqueueMessage(Text::sprintf('COM_KUNENA_USER_DELETE_JOOMLA_USER_TABLE_FAILED', $user->userid), 'error');
                continue;
            }

            $usernames[] = $user->username;
        }

        if (!empty($usernames)) {
            $this->app->enqueueMessage(Text::sprintf('COM_KUNENA_USER_DELETE_DONE_SUCCESSFULLY', implode(', ', $usernames)), 'success');
        }

        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }

    /**
     * Ban
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function ban(): void
    {
        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $cid    = $this->input->get('cid', [], 'array');
        $cid    = ArrayHelper::toInteger($cid, []);
        $userid = array_shift($cid);

        if ($userid <= 0) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $ban = KunenaBan::getInstanceByUserid($userid, true);

        if (!$ban->id) {
            $ban->ban($userid);
        } else {
            $now = new Date();
            $ban->setExpiration($now);
        }

        $message = Text::_('COM_KUNENA_USER_BANNED_DONE');

        try {
            $ban->save();
        } catch (Exception $e) {
            $this->app->enqueueMessage($e->getMessage(), 'error');
        }

        $this->app->enqueueMessage($message, 'success');

        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }

    /**
     * Unban
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function unban(): void
    {
        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $cid    = $this->input->get('cid', [], 'array');
        $cid    = ArrayHelper::toInteger($cid, []);
        $userid = array_shift($cid);

        if ($userid <= 0) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $ban = KunenaBan::getInstanceByUserid($userid, true);

        if (!$ban->id) {
            $ban->ban($userid);
        } else {
            $now = new Date();
            $ban->setExpiration($now);
        }

        $message = Text::_('COM_KUNENA_USER_UNBAN_DONE');

        try {
            $ban->save();
        } catch (Exception $e) {
            $this->app->enqueueMessage($e->getMessage(), 'error');
        }

        $this->app->enqueueMessage($message, 'success');

        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }

    /**
     * Set an user as global moderator, works only if you are an admin
     *
     * @return  void
     *
     * @throws  null
     * @since   Kunena 5.1
     */
    public function moderate(): void
    {
        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $modCatids = $this->input->get('catid', [], 'array');
        $modCatids = ArrayHelper::toInteger($modCatids);

        $cid    = $this->input->get('cid', [], 'array');
        $cid    = ArrayHelper::toInteger($cid);
        $userid = array_shift($cid);

        if ($userid <= 0) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        if ($userid <= 0) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $user = KunenaUserHelper::get($userid);

        $this->setModerate($user, $modCatids);

        $this->app->enqueueMessage(Text::_('COM_KUNENA_USER_MODERATE_DONE'), 'success');

        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }

    /**
     * Set moderator rights on the user given
     *
     * @param   KunenaUser  $user       user
     * @param   array       $modCatids  modCatids
     *
     * @return  boolean
     *
     * @throws Exception
     * @since   Kunena 5.1
     */
    protected function setModerate(KunenaUser $user, array $modCatids): bool
    {
        // Update moderator rights
        $categories = KunenaCategoryHelper::getCategories(false, false, 'admin');

        foreach ($categories as $category) {
            $category->setModerator($user, \in_array($category->id, $modCatids, true));
        }

        // Global moderator is a special case
        if (KunenaUserHelper::getMyself()->isAdmin()) {
            KunenaAccess::getInstance()->setModerator((object) [], $user, \in_array(0, $modCatids, true));
        }

        return true;
    }

    /**
     * Unmoderate
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 5.1
     */
    public function unmoderate(): void
    {
        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $cid    = $this->input->get('cid', [], 'array');
        $cid    = ArrayHelper::toInteger($cid);
        $userid = array_shift($cid);

        if ($userid <= 0) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $user     = KunenaUserHelper::get($userid);
        $category = null;

        if ($category instanceof KunenaCategory) {
            $category = $category->id;
        }

        $category = \intval($category);

        $userCategory = KunenaUserHelper::get($category, $user);

        if ($userCategory->role == 1) {
            $userCategory->role = false;

            if (!$userCategory->params) {
                $userCategory->params = '';
            }

            $success = $userCategory->save();

            // Clear role cache
            KunenaAccess::getInstance()->clearCache();

            // Change user moderator status
            $moderator = KunenaAccess::getInstance()->getModeratorStatus($user);

            if ($user->moderator != !empty($moderator)) {
                $user->moderator = \intval(!empty($moderator));

                try {
                    $success = $user->save();
                } catch (Exception $e) {
                    $this->app->enqueueMessage($e->getMessage(), 'error');
                }
            }
        }

        $message = Text::_('COM_KUNENA_USER_UNMODERATE_DONE');

        if ($success) {
            $this->app->enqueueMessage($message, 'success');
        }

        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }

    /**
     * Block
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function block()
    {
        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $cid    = $this->input->get('cid', [], 'array');
        $cid    = ArrayHelper::toInteger($cid, []);
        $userid = array_shift($cid);

        if ($userid <= 0) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $ban = KunenaBan::getInstanceByUserid($userid, true);

        if (!$ban->id) {
            $ban->ban($userid, null, 1);
        } else {
            $now = new Date();
            $ban->setExpiration($now);
        }

        $message = Text::_('COM_KUNENA_USER_BLOCKED_DONE');

        try {
            $ban->save();
        } catch (Exception $e) {
            $this->app->enqueueMessage($e->getMessage(), 'error');
        }

        $this->app->enqueueMessage($message, 'success');

        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }

    /**
     * Unblock
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function unblock(): void
    {
        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $cid    = $this->input->get('cid', [], 'array');
        $cid    = ArrayHelper::toInteger($cid, []);
        $userid = array_shift($cid);

        if ($userid <= 0) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $ban = KunenaBan::getInstanceByUserid($userid, true);

        if (!$ban->id) {
            $ban->ban($userid, null, 1);
        } else {
            $now = new Date();
            $ban->setExpiration($now);
        }

        $message = Text::_('COM_KUNENA_USER_UNBLOCK_DONE');

        try {
            $ban->save();
        } catch (Exception $e) {
            $this->app->enqueueMessage($e->getMessage(), 'error');
        }

        $this->app->enqueueMessage($message, 'success');

        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }

    /**
     * Batch Moderators
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function batchmoderators(): void
    {
        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $cid    = $this->input->get('cid', [], 'array');
        $cid    = ArrayHelper::toInteger($cid, []);
        $catids = $this->input->get('catid', [], 'array');
        $catids = ArrayHelper::toInteger($catids, []);

        if (empty($cid)) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_USERS_BATCH_NO_USERS_SELECTED'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        if (empty($catids)) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_USERS_BATCH_NO_CATEGORIES_SELECTED'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        // Update moderator rights
        $categories = KunenaCategoryHelper::getCategories(false, false, 'admin');
        $users      = KunenaUserHelper::loadUsers($cid);

        foreach ($users as $user) {
            foreach ($categories as $category) {
                if (\in_array($category->id, $catids)) {
                    $category->setModerator($user, true);
                }
            }

            // Global moderator is a special case
            if ($this->me->isAdmin() && \in_array(0, $catids)) {
                KunenaAccess::getInstance()->setModerator(0, $user, true);
            }
        }

        $this->app->enqueueMessage(Text::_('COM_KUNENA_USERS_SET_MODERATORS_DONE'), 'success');
        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }

    /**
     * Method to just redirect to main manager in case of use of cancel button
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 4.0
     */
    public function cancel(): void
    {
        $this->app->redirect(KunenaRoute::_($this->baseurl, false));
    }

    /**
     * Remove categories subscriptions for the users selected
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 6.0
     */
    public function removecatsubscriptions(): void
    {
        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $cid = $this->input->get('cid', [], 'array');
        $cid = ArrayHelper::toInteger($cid, []);

        if (!empty($cid)) {
            foreach ($cid as $userid) {
                $query = $this->db->createQuery();
                $query->update($this->db->quoteName('#__kunena_user_categories'))
                    ->set($this->db->quoteName('subscribed') . ' = 0')
                    ->where($this->db->quoteName('user_id') . ' = ' . $userid);
                $this->db->setQuery($query);

                try {
                    $this->db->execute();
                } catch (Exception $e) {
                    $this->app->enqueueMessage($e->getMessage(), 'error');

                    return;
                }
            }
        }

        $this->app->enqueueMessage(Text::_('COM_KUNENA_USERS_REMOVE_CAT_SUBSCRIPTIONS_DONE'), 'success');
        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }

    /**
     * Remove topics subscriptions for the users selected
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 6.0
     */
    public function removetopicsubscriptions(): void
    {
        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $cid = $this->input->get('cid', [], 'array');
        $cid = ArrayHelper::toInteger($cid, []);

        if (!empty($cid)) {
            foreach ($cid as $userid) {
                $query = $this->db->createQuery();
                $query->update($this->db->quoteName('#__kunena_user_topics'))
                    ->set($this->db->quoteName('subscribed') . ' = 0')
                    ->where($this->db->quoteName('user_id') . ' = ' . $userid);
                $this->db->setQuery($query);

                try {
                    $this->db->execute();
                } catch (Exception $e) {
                    $this->app->enqueueMessage($e->getMessage(), 'error');

                    return;
                }
            }
        }

        $this->app->enqueueMessage(Text::_('COM_KUNENA_USERS_REMOVE_TOPIC_SUBSCRIPTIONS_DONE'), 'success');
        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }

    /**
     * Subscribe users to categories selected
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 6.0
     */
    public function subscribeuserstocategories(): void
    {
        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $userids = $this->input->get('cid', [], 'array');
        $userids = ArrayHelper::toInteger($userids);
        $catids  = $this->input->get('catid', [], 'array');
        $catids  = ArrayHelper::toInteger($catids);

        if (empty($userids)) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_USERS_BATCH_NO_USERS_SELECTED'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        if (empty($catids)) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_USERS_BATCH_NO_CATEGORIES_SELECTED'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $categories = KunenaCategoryHelper::getCategories($catids);

        foreach ($userids as $userid) {
            foreach ($categories as $category) {
                $category->subscribe(true, $userid);
            }
        }

        $this->app->enqueueMessage(Text::_('COM_KUNENA_USERS_ADD_CATEGORIES_SUBSCRIPTIONS_DONE'), 'success');
        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }
}