/** * @param null|int $id * @param UserTable $user */ private function saveInviteEdit( $id, $user ) { global $_CB_framework, $_CB_database, $_PLUGINS; $inviteLimit = (int) $this->params->get( 'invite_limit', null ); $cbModerator = Application::User( (int) $user->get( 'id' ) )->isGlobalModerator(); $row = new cbinvitesInviteTable(); $row->load( (int) $id ); $canAccess = false; $inviteCount = 0; if ( ! $row->get( 'id' ) ) { if ( $cbModerator ) { $canAccess = true; } elseif ( $user->get( 'id' ) && Application::MyUser()->canViewAccessLevel( $this->params->get( 'invite_create_access', 2 ) ) ) { if ( $inviteLimit ) { $query = 'SELECT COUNT(*)' . "\n FROM " . $_CB_database->NameQuote( '#__comprofiler_plugin_invites' ) . "\n WHERE " . $_CB_database->NameQuote( 'user_id' ) . " = " . (int) $user->get( 'id' ) . "\n AND ( " . $_CB_database->NameQuote( 'user' ) . " IS NULL OR " . $_CB_database->NameQuote( 'user' ) . " = " . $_CB_database->Quote( '' ) . " )"; $_CB_database->setQuery( $query ); $inviteCount = (int) $_CB_database->loadResult(); if ( $inviteCount < $inviteLimit ) { $canAccess = true; } } else { $canAccess = true; } } } elseif ( $cbModerator || ( $row->get( 'user_id' ) == $user->get( 'id' ) ) ) { $canAccess = true; } $profileUrl = $_CB_framework->userProfileUrl( $row->get( 'user_id', $user->get( 'id' ) ), false, 'cbinvitesTab' ); if ( $canAccess && ( ! $row->isAccepted() ) ) { $toArray = explode( ',', $this->input( 'post/to', null, GetterInterface::STRING ) ); if ( ( ! $this->params->get( 'invite_multiple', 1 ) ) && ( ! $cbModerator ) && ( count( $toArray ) > 1 ) ) { $this->showInviteEdit( $row->get( 'id' ), $user, CBTxt::T( 'Comma seperated lists are not supported! Please use a single To address.' ) ); return; } $sent = false; if ( ! empty( $toArray ) ) { foreach ( $toArray as $k => $to ) { if ( $k != 0 ) { $row->set( 'id', null ); $row->set( 'code', null ); } $orgTo = $row->get( 'to' ); $row->set( 'to', $to ); $row->set( 'subject', $this->input( 'post/subject', $row->get( 'subject' ), GetterInterface::STRING ) ); if ( $this->params->get( 'invite_editor', 2 ) >= 2 ) { $row->set( 'body', $this->input( 'post/body', $row->get( 'body' ), GetterInterface::HTML ) ); } else { $row->set( 'body', $this->input( 'post/body', $row->get( 'body' ), GetterInterface::STRING ) ); } $row->set( 'user_id', (int) $this->input( 'post/user_id', $row->get( 'user_id', $user->get( 'id' ) ), GetterInterface::INT ) ); if ( $cbModerator ) { $row->set( 'user', (int) $this->input( 'post/user', $row->get( 'user' ), GetterInterface::INT ) ); } if ( ! $row->get( 'code' ) ) { $row->set( 'code', md5( uniqid() ) ); } $new = ( $row->get( 'id' ) ? false : true ); if ( $new && $inviteLimit ) { $inviteCount++; if ( $inviteCount > $inviteLimit ) { cbRedirect( $profileUrl, CBTxt::T( 'Invite limit reached!' ), 'error' ); } } if ( ! $row->get( 'user' ) ) { $toUser = new UserTable(); $toUser->loadByEmail( $row->get( 'to' ) ); } else { $toUser = CBuser::getUserDataInstance( (int) $row->get( 'user' ) ); } if ( ! $row->get( 'to' ) ) { $row->setError( CBTxt::T( 'To address not specified.' ) ); } elseif ( ! cbIsValidEmail( $row->get( 'to' ) ) ) { $row->setError( CBTxt::T( 'INVITE_TO_ADDRESS_INVALID', 'To address not valid: [to_address]', array( '[to_address]' => $row->get( 'to' ) ) ) ); } elseif ( $toUser->id == $row->get( 'user_id' ) ) { $row->setError( CBTxt::T( 'You can not invite your self.' ) ); } elseif ( $toUser->id && ( $row->get( 'to' ) != $orgTo ) ) { $row->setError( CBTxt::T( 'To address is already a user.' ) ); } elseif ( ( ! $this->params->get( 'invite_duplicate', 0 ) ) && ( ! $cbModerator ) && $row->isDuplicate() ) { $row->setError( CBTxt::T( 'To address is already invited.' ) ); } elseif ( $this->params->get( 'invite_captcha', 0 ) && ( ! $row->get( 'id' ) ) && ( $k == 0 ) && ( ! $cbModerator ) ) { $_PLUGINS->loadPluginGroup( 'user' ); $_PLUGINS->trigger( 'onCheckCaptchaHtmlElements', array() ); if ( $_PLUGINS->is_errors() ) { $row->setError( CBTxt::T( $_PLUGINS->getErrorMSG() ) ); } } $_PLUGINS->trigger( 'invites_onBeforeInvite', array( &$row, $user ) ); if ( $row->getError() || ( ! $row->store() ) ) { $this->showInviteEdit( $row->get( 'id' ), $user, CBTxt::T( 'INVITE_FAILED_SAVE_ERROR', 'Invite failed to save! Error: [error]', array( '[error]' => $row->getError() ) ) ); return; } if ( ( $new || ( ! $row->isSent() ) ) && ( ! $toUser->id ) ) { if ( ! $row->send() ) { $this->showInviteEdit( $row->get( 'id' ), $user, CBTxt::T( 'INVITE_FAILED_SEND_ERROR', 'Invite failed to send! Error: [error]', array( '[error]' => $row->getError() ) ) ); return; } else { $sent = true; } } $_PLUGINS->trigger( 'invites_onAfterInvite', array( $row, $sent, $user ) ); } cbRedirect( $profileUrl, ( $sent ? CBTxt::T( 'Invite sent successfully!' ) : CBTxt::T( 'Invite saved successfully!' ) ) ); } else { $this->showInviteEdit( $row->get( 'id' ), $user, CBTxt::T( 'To address not specified.' ) ); return; } } else { cbRedirect( $profileUrl, CBTxt::T( 'Not authorized.' ), 'error' ); } }
/** * @param cbautoactionsActionTable $trigger * @param UserTable $user */ public function execute( $trigger, $user ) { global $_CB_database; if ( ! $this->installed() ) { if ( $trigger->getParams()->get( 'debug', false, GetterInterface::BOOLEAN ) ) { var_dump( CBTxt::T( 'AUTO_ACTION_INVITE_NOT_INSTALLED', ':: Action [action] :: CB Invites is not installed', array( '[action]' => (int) $trigger->get( 'id' ) ) ) ); } return; } foreach ( $trigger->getParams()->subTree( 'invite' ) as $row ) { /** @var ParamsInterface $row */ $owner = $row->get( 'owner', null, GetterInterface::STRING ); if ( ! $owner ) { $owner = (int) $user->get( 'id' ); } else { $owner = (int) $trigger->getSubstituteString( $owner ); } if ( ! $owner ) { if ( $trigger->getParams()->get( 'debug', false, GetterInterface::BOOLEAN ) ) { var_dump( CBTxt::T( 'AUTO_ACTION_INVITE_NO_OWNER', ':: Action [action] :: CB Invites skipped due to missing owner', array( '[action]' => (int) $trigger->get( 'id' ) ) ) ); } continue; } if ( $user->get( 'id' ) != $owner ) { $user = CBuser::getUserDataInstance( $owner ); } switch ( (int) cbGetParam( $params, 'invite_mode', 1 ) ) { case 1: $invite = new cbinvitesInviteTable(); $toArray = explode( ',', $trigger->getSubstituteString( $row->get( 'to', null, GetterInterface::STRING ) ) ); foreach ( $toArray as $to ) { $invite->set( 'id', null ); $invite->set( 'to', $to ); $invite->set( 'subject', $trigger->getSubstituteString( $row->get( 'subject', null, GetterInterface::STRING ) ) ); $invite->set( 'body', $trigger->getSubstituteString( $row->get( 'body', null, GetterInterface::RAW ) ) ); $invite->set( 'user_id', $owner ); $invite->set( 'code', md5( uniqid() ) ); if ( ! $invite->store() ) { if ( $trigger->getParams()->get( 'debug', false, GetterInterface::BOOLEAN ) ) { var_dump( CBTxt::T( 'AUTO_ACTION_INVITE_FAILED', ':: Action [action] :: CB Invites failed to save. Error: [error]', array( '[action]' => (int) $trigger->get( 'id' ), '[error]' => $invite->getError() ) ) ); } continue; } if ( ! $invite->send() ) { if ( $trigger->getParams()->get( 'debug', false, GetterInterface::BOOLEAN ) ) { var_dump( CBTxt::T( 'AUTO_ACTION_INVITE_SEND_FAILED', ':: Action [action] :: CB Invites failed to send. Error: [error]', array( '[action]' => (int) $trigger->get( 'id' ), '[error]' => $invite->getError() ) ) ); } continue; } } break; case 2: $query = 'SELECT *' . "\n FROM " . $_CB_database->NameQuote( '#__comprofiler_plugin_invites' ) . "\n WHERE " . $_CB_database->NameQuote( 'to' ) . " = " . $_CB_database->Quote( $user->get( 'email' ) ); $_CB_database->setQuery( $query ); $invites = $_CB_database->loadObjectList( null, 'cbinvitesInviteTable', array( $_CB_database ) ); /** @var cbinvitesInviteTable[] $invites */ foreach ( $invites as $invite ) { $invite->accept( $user ); } break; case 3: $query = 'SELECT *' . "\n FROM " . $_CB_database->NameQuote( '#__comprofiler_plugin_invites' ) . "\n WHERE ( " . $_CB_database->NameQuote( 'user_id' ) . " = " . (int) $user->get( 'id' ) . ' OR ' . $_CB_database->NameQuote( 'user' ) . ' = ' . (int) $user->get( 'id' ) . ' )'; $_CB_database->setQuery( $query ); $invites = $_CB_database->loadObjectList( null, 'cbinvitesInviteTable', array( $_CB_database ) ); /** @var cbinvitesInviteTable[] $invites */ foreach ( $invites as $invite ) { $invite->delete(); } break; } } }