setToggleName('user_is_vendor'); $this->addvalidOrderingFieldName(array('ju.username','ju.name','ju.email','sg.virtuemart_shoppergroup_id','shopper_group_name','shopper_group_desc','vmu.virtuemart_user_id') ); $this->setMainTable('vmusers'); $this->removevalidOrderingFieldName('virtuemart_user_id'); array_unshift($this->_validOrderingFieldName,'ju.id'); self::$searchMap = array( 'name:' => array('_name','username'), 'last_name:' => 'last_name', 'surname:' => 'last_name', 'company:' => 'company', 'street:' => 'address_', 'email:' => 'email', 'city:' => 'city', 'zip:' => 'zip' ); } /** * Internal function * * @param unknown_type $id */ public function setUserId($cid = null){ $user = JFactory::getUser(); //anonymous sets to 0 for a new entry if(empty($user->id)){ $id = 0; //vmdebug('Recognized anonymous case'); } else { //not anonymous, but no cid means already registered user edit own data if(empty($cid)){ $id = $user->id; //vmdebug('setId setCurrent $user',$user->get('id')); } else { if($cid != $user->id){ if(vmAccess::manager(array('user','user.edit'))){ $id = $cid; //vmdebug('setId is Manager',$userId); } else { vmError('Blocked attempt setId '.$cid.' '.$user->id); $id = $user->id; } }else { $id = $user->id; //vmdebug('setId setCurrent $user',$user->get('id')); } } } if($this->_id!=$id){ $this->_id = (int)$id; $this->clearCachedData(); } return $this->_id; } function clearCachedData(){ $this->_data = null; $this->customer_number = 0; self::$currentUser = null; } static public $currentUser = null; public function getCurrentUser(){ if(self::$currentUser === null){ //$user = JFactory::getUser(); //vmdebug('getCurrentUser',$user->id); $id = $this->setUserId(); self::$currentUser = $this->getUser($id); } return self::$currentUser; } private $_defaultShopperGroup = 0; /** * Sets the internal user id with given vendor Id * * @author Max Milbers * @param int $vendorId */ function getVendor($vendorId=1,$return=TRUE){ $vendorModel = VmModel::getModel('vendor'); $userId = VirtueMartModelVendor::getUserIdByVendorId($vendorId); if($userId){ $this->setUserId($userId); if($return){ return $this->getUser($userId); } } else { return false; } } static $_users = array(); /** * Retrieve the detail record for the current $id if the data has not already been loaded. * @author Max Milbers */ function &getUser($id = null){ if(isset($id)){ $this->_id = $this->setUserId($id); vmdebug('Get user, using given id '.$this->_id); } else if(empty($this->_id)) { $this->setIdByRequest(); vmdebug('Get user, setIdByRequest '.$this->_id); } vmdebug('Get user id '.$this->_id); if(!empty($this->_id) and isset(self::$_users[$this->_id])){ return self::$_users[$this->_id]; } $this->_data = $this->getTable('vmusers'); $this->_data->load((int)$this->_id); $this->_data->JUser = JUser::getInstance($this->_id); // Add the virtuemart_shoppergroup_ids if(!empty($this->_id)){ $xrefTable = $this->getTable('vmuser_shoppergroups'); $this->_data->shopper_groups = $xrefTable->load($this->_id); } // quorvia - also get shoppergroups for the admin when acting as a user as that can have shoppergroup ids that may impact options if (VmConfig::get('ChangeShopperAlsoUseAdminShoppergroups', 0)){ $adminId = vmAccess::getBgManagerId(); if (!empty($adminId) && $this->_id != $adminId){ $xrefTable = $this->getTable('vmuser_shoppergroups'); $admin_shopper_groups = $xrefTable->load($adminId); if (!empty ($admin_shopper_groups)){ $this->_data->shopper_groups = array_merge($this->_data->shopper_groups, $admin_shopper_groups); } } } //quorvia end if(empty($this->_data->shopper_groups)) $this->_data->shopper_groups = array(); if (VmConfig::isSite()) { $shoppergroupmodel = VmModel::getModel('ShopperGroup'); $shoppergroupmodel->appendShopperGroups($this->_data->shopper_groups,$this->_data->JUser,1); } $db = JFactory::getDBO(); if(!empty($this->_id)) { $q = 'SELECT `virtuemart_userinfo_id` FROM `#__virtuemart_userinfos` WHERE `virtuemart_user_id` = "' . (int)$this->_id.'" ORDER BY `address_type` ASC'; $db->setQuery($q); $userInfo_ids = $db->loadColumn(0); } else { $userInfo_ids = array(); } $this->_data->userInfo = array (); $BTuid = 0; foreach($userInfo_ids as $uid){ $this->_data->userInfo[$uid] = $this->getTable('userinfos'); $this->_data->userInfo[$uid]->load($uid); if ($this->_data->userInfo[$uid]->address_type == 'BT') { $BTuid = $uid; $this->_data->userInfo[$BTuid]->name = $this->_data->JUser->name; $this->_data->userInfo[$BTuid]->email = $this->_data->JUser->email; $this->_data->userInfo[$BTuid]->username = $this->_data->JUser->username; $this->_data->userInfo[$BTuid]->address_type = 'BT'; // vmdebug('$this->_data->vmusers',$this->_data); } } // vmdebug('user_is_vendor ?',$this->_data->user_is_vendor); if($this->_data->user_is_vendor){ $vendorModel = VmModel::getModel('vendor'); if(Vmconfig::get('multix','none')=='none'){ $this->_data->virtuemart_vendor_id = 1; //vmdebug('user model, single vendor',$this->_data->virtuemart_vendor_id); } $vendorModel->setId($this->_data->virtuemart_vendor_id); $this->_data->vendor = $vendorModel->getVendor(); } self::$_users[$this->_id] = $this->_data; return self::$_users[$this->_id]; } /** * Retrieve contact info for a user if any * * @return array of null */ function getContactDetails() { if ($this->_id) { $db = JFactory::getDBO(); $db->setQuery('SELECT * FROM #__contact_details WHERE user_id = ' . $this->_id); $_contacts = $db->loadObjectList(); if (count($_contacts) > 0) { return $_contacts[0]; } } return null; } /** * Method to save the form data. * * @copyright Copyright (C) 2005 - 2019 Open Source Matters, Inc. All rights reserved. And the VirtueMart team * * @license GNU General Public License version 2 or later; see LICENSE.txt * @param array $temp The form data. * * @return mixed The user id on success, false on failure. * * @since 1.6 */ public function register($user, $new) { $params = JComponentHelper::getParams('com_users'); $useractivation = $params->get('useractivation'); $sendpassword = $params->get('sendpassword', 1); VmLanguage::loadJLang('com_users', 1); // Load the users plugin group. JPluginHelper::importPlugin('user'); // Store the data. if (!$user->save()) { vmError(JText::sprintf('COM_USERS_REGISTRATION_SAVE_FAILED', $user->getError())); return false; } elseif (!$new) { return true; } $mailer = null; $mailtemplate = 'com_users.registration.user.registration_mail'; $app = JFactory::getApplication(); $config = JFactory::getConfig(); $db = JFactory::getDbo(); $query = $db->getQuery(true); // Compile the notification mail values. $data = $user->getProperties(); $data['fromname'] = $config->get('fromname'); $data['mailfrom'] = $config->get('mailfrom'); $data['sitename'] = $config->get('sitename'); $data['siteurl'] = JUri::root(); // Handle account activation/confirmation emails. if ($useractivation == 2) { // Set the link to confirm the user email. $linkMode = $config->get('force_ssl', 0) == 2 ? Route::TLS_FORCE : Route::TLS_IGNORE; $data['activate'] = JRoute::link( 'site', 'index.php?option=com_users&task=registration.activate&token=' . $data['activation'], false, $linkMode, true ); $emailSubject = JText::sprintf( 'COM_USERS_EMAIL_ACCOUNT_DETAILS', $data['name'], $data['sitename'] ); $mailtemplate = 'com_users.registration.user.admin_activation'; if ($sendpassword) { $mailtemplate .= '_w_pw'; $emailBody = JText::sprintf( 'COM_USERS_EMAIL_REGISTERED_WITH_ADMIN_ACTIVATION_BODY', $data['name'], $data['sitename'], $data['activate'], $data['siteurl'], $data['username'], $data['password_clear'] ); } else { $emailBody = JText::sprintf( 'COM_USERS_EMAIL_REGISTERED_WITH_ADMIN_ACTIVATION_BODY_NOPW', $data['name'], $data['sitename'], $data['activate'], $data['siteurl'], $data['username'] ); } } elseif ($useractivation == 1) { // Set the link to activate the user account. $linkMode = $config->get('force_ssl', 0) == 2 ? Route::TLS_FORCE : Route::TLS_IGNORE; $data['activate'] = JRoute::link( 'site', 'index.php?option=com_users&task=registration.activate&token=' . $data['activation'], false, $linkMode, true ); $emailSubject = JText::sprintf( 'COM_USERS_EMAIL_ACCOUNT_DETAILS', $data['name'], $data['sitename'] ); $mailtemplate = 'com_users.registration.user.self_activation'; if ($sendpassword) { $mailtemplate .= '_w_pw'; $emailBody = JText::sprintf( 'COM_USERS_EMAIL_REGISTERED_WITH_ACTIVATION_BODY', $data['name'], $data['sitename'], $data['activate'], $data['siteurl'], $data['username'], $data['password_clear'] ); } else { $emailBody = JText::sprintf( 'COM_USERS_EMAIL_REGISTERED_WITH_ACTIVATION_BODY_NOPW', $data['name'], $data['sitename'], $data['activate'], $data['siteurl'], $data['username'] ); } } else { $pw = ''; if ($sendpassword) { $mailtemplate .= '_w_pw'; $pw = $data['password_clear']; } if (JVM_VERSION < 4) { $this->sendRegistrationEmail($user,$pw, $useractivation); return true; } } $debug_email = VmConfig::get('debug_mail', false); // Send the registration email. if (VmConfig::showDebug() and $debug_email == 'debug_email') { $msg = 'Registration Debug mail active, no mail sent. The mail to send subject ' . $emailSubject . ' to "' . $data['email'] . '" from ' . $data['mailfrom'] . ' ' . $data['fromname'] . ' ' . vmText::$language->getTag() . '
' . $emailBody; vmdebug($msg); $return = true; } else { if (JFactory::getApplication()->get('mailonline', 1)) { if (JVM_VERSION >= 4) { $mailer = new \Joomla\CMS\Mail\MailTemplate($mailtemplate, $app->getLanguage()->getTag()); $mailer->addTemplateData($data); $mailer->addRecipient($data['email']); $return = $mailer->send(); } else { $return = JFactory::getMailer()->sendMail($data['mailfrom'], $data['fromname'], $data['email'], $emailSubject, $emailBody); } } } // Send Notification mail to administrators if (($params->get('useractivation') < 2) && ($params->get('mail_to_admin') == 1)) { $emailSubject = JText::sprintf( 'COM_USERS_EMAIL_ACCOUNT_DETAILS', $data['name'], $data['sitename'] ); $emailBodyAdmin = JText::sprintf( 'COM_USERS_EMAIL_REGISTERED_NOTIFICATION_TO_ADMIN_BODY', $data['name'], $data['username'], $data['siteurl'] ); // Get all admin users $query->clear() ->select($db->quoteName(array('name', 'email', 'sendEmail'))) ->from($db->quoteName('#__users')) ->where($db->quoteName('sendEmail') . ' = 1') ->where($db->quoteName('block') . ' = 0'); $db->setQuery($query); try { $rows = $db->loadObjectList(); } catch (RuntimeException $e) { vmError(JText::sprintf('COM_USERS_DATABASE_ERROR', $e->getMessage()), 500); return false; } // Send mail to all superadministrators id foreach ($rows as $row) { if (VmConfig::showDebug() and $debug_email == 'debug_email') { $msg = 'Registration Debug mail to admin active, no mail sent. The mail to send subject ' . $emailSubject . ' to "' . $row->email . '" from ' . $data['mailfrom'] . ' ' . $data['fromname'] . ' ' . vmText::$language->getTag() . '
' . $emailBodyAdmin; vmdebug($msg); $return = true; } else { if (JFactory::getApplication()->get('mailonline', 1)) { if (JVM_VERSION >= 4) { $mailer = new \Joomla\CMS\Mail\MailTemplate('com_users.registration.admin.new_notification', $app->getLanguage()->getTag()); $mailer->addTemplateData($data); $mailer->addRecipient($row->email); $return = $mailer->send(); } else { $return = JFactory::getMailer()->sendMail($data['mailfrom'], $data['fromname'], $row->email, $emailSubject, $emailBodyAdmin); } } } // Check for an error. if ($return !== true) { vmError(JText::_('COM_USERS_REGISTRATION_ACTIVATION_NOTIFY_SEND_MAIL_FAILED')); return false; } } } // Check for an error. if ($return !== true) { vmError(JText::_('COM_USERS_REGISTRATION_SEND_MAIL_FAILED')); // Send a system message to administrators receiving system mails $query->clear() ->select($db->quoteName('id')) ->from($db->quoteName('#__users')) ->where($db->quoteName('block') . ' = ' . (int) 0) ->where($db->quoteName('sendEmail') . ' = ' . (int) 1); $db->setQuery($query); try { $userids = $db->loadColumn(); } catch (RuntimeException $e) { vmError(JText::sprintf('COM_USERS_DATABASE_ERROR', $e->getMessage()), 500); return false; } if (count($userids) > 0) { $jdate = new JDate; // Build the query to add the messages foreach ($userids as $userid) { $values = array( $db->quote($userid), $db->quote($userid), $db->quote($jdate->toSql()), $db->quote(JText::_('COM_USERS_MAIL_SEND_FAILURE_SUBJECT')), $db->quote(JText::sprintf('COM_USERS_MAIL_SEND_FAILURE_BODY', $return, $data['username'])) ); $query->clear() ->insert($db->quoteName('#__messages')) ->columns($db->quoteName(array('user_id_from', 'user_id_to', 'date_time', 'subject', 'message'))) ->values(implode(',', $values)); $db->setQuery($query); try { $db->execute(); } catch (RuntimeException $e) { vmError(JText::sprintf('COM_USERS_DATABASE_ERROR', $e->getMessage()), 500); return false; } } } return false; } if ($useractivation == 1) { return 'useractivate'; } elseif ($useractivation == 2) { return 'adminactivate'; } else { return $user->id; } } /** * Little function that checks if a vendor has already too much customers (For VirtueMart used for salesMan) * @return false */ public function checkVendorMaxCustomer(){ if(VmConfig::get('multix','none')!='none'){ $vendorId = vmAccess::isSuperVendor(); vmdebug('checkVendorMaxCustomer',$vendorId); if($vendorId>1){ $vM = VmModel::getModel('vendor'); $ven = $vM->getVendor($vendorId); if($ven->max_customers>0){ $this->setGetCount (true); parent::exeSortSearchListQuery(2,'virtuemart_user_id',' FROM #__virtuemart_vendor_users as vu LEFT JOIN `#__users` as ju ON vu.virtuemart_user_id = ju.id',' WHERE ( `virtuemart_vendor_user_id` = "'.$vendorId.'" AND ju.`block` = 0) '); $this->setGetCount (false); if($ven->max_customers<($this->_total+1)){ vmWarn('You are not allowed to register more than '.$ven->max_customers.' users'); return false; } } } } return true; } static public function filterAndWhiteListJUserData(&$user, &$data, $new, $usersConfig){ // This construction is necessary, because this function is used to register a new JUser, so we need all the JUser data in $data. // On the other hand this function is also used just for updating JUser data, like the email for the BT address. In this case the // name, username, password and so on is already stored in the JUser and dont need to be entered again. if(empty ($data['email'])){ $email = $user->get('email'); if(!empty($email)){ $data['email'] = $email; } } else { $data['email'] = vRequest::filter($data['email'],FILTER_VALIDATE_EMAIL,FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH); } //$data['email'] = str_replace(array('\'','"',',','%','*','/','\\','?','^','`','{','}','|','~'),array(''),$data['email']); //This is important, when a user changes his email address from the cart, //that means using view user layout edit_address (which is called from the cart) $user->set('email',$data['email']); if(empty ($data['name'])){ $name = $user->get('name'); if(!empty($name)){ $data['name'] = $name; } } else { $data['name'] = vRequest::filter($data['name'],FILTER_SANITIZE_SPECIAL_CHARS,FILTER_FLAG_STRIP_LOW); } $data['name'] = str_replace(array('\'','"',',','%','*','/','\\','?','^','`','{','}','|','~'),array(''),$data['name']); $can_change_username = (int)$usersConfig->get('change_login_name', false); $data['username'] = vRequest::filter($data['username'],FILTER_SANITIZE_SPECIAL_CHARS,FILTER_FLAG_STRIP_LOW); $username = $user->get('username'); if(!empty($username)){ if(!empty($data['username'])){ if(!$can_change_username and !vmAccess::manager('user.edit')){ if($data['username']!=$username){ vmWarn('You are not allowed to change your username'); } $data['username'] = $username; } } else { $data['username'] = $username; } } if(empty ($data['password'])){ $data['password'] = vRequest::getCmd('password', ''); if($data['password']!=vRequest::get('password')){ vmError('Password contained invalid character combination.'); return false; } } if(empty ($data['password2'])){ $data['password2'] = vRequest::getCmd('password2'); if($data['password2']!=vRequest::get('password2')){ vmError('Password2 contained invalid character combination.'); return false; } } if(!$new and empty($data['password2'])){ unset($data['password']); unset($data['password2']); } //if(!vmAccess::manager('core')){ $whiteDataToBind = array(); if(isset($data['name'])) $whiteDataToBind['name'] = $data['name']; if(isset($data['username'])) $whiteDataToBind['username'] = $data['username']; if(isset($data['email'])) $whiteDataToBind['email'] = $data['email']; if(isset($data['language'])) $whiteDataToBind['language'] = $data['language']; if(isset($data['editor'])) $whiteDataToBind['editor'] = $data['editor']; if(isset($data['password'])) $whiteDataToBind['password'] = $data['password']; if(isset($data['password2'])) $whiteDataToBind['password2'] = $data['password2']; if (!VmConfig::isSite()) { if(isset($data['block'])) $whiteDataToBind['block'] = $data['block']; } unset($data['isRoot']); /* } else { $whiteDataToBind = $data; }*/ return $whiteDataToBind; } /** * Bind the post data to the JUser object and the VM tables, then saves it * It is used to register new users * This function can also change already registered users, this is important when a registered user changes his email within the checkout. * * @author Max Milbers * @author Oscar van Eijk * @return boolean True is the save was successful, false otherwise. */ public function store(&$data){ $message = ''; vRequest::vmCheckToken('Invalid Token, while trying to save user'); if(empty($data)){ vmError('Developer notice, no data to store for user'); return false; } //vmdebug('VM Usermodel store $data',$data); //To find out, if we have to register a new user, we take a look on the id of the usermodel object. //The constructor sets automatically the right id. $new = false; if(empty($this->_id) or $this->_id < 1){ $new = true; $user = new JUser(); //thealmega http://forum.virtuemart.net/index.php?topic=99755.msg393758#msg393758 } else { $cUser = JFactory::getUser(); if($cUser->id!=$this->_id and !vmAccess::manager('user.edit') ){ vmWarn('Insufficient permission'); return false; } $user = JFactory::getUser($this->_id); } if(!$this->checkVendorMaxCustomer()){ vmdebug('Model VMuser Max Customers reached '); return false; } $gid = $user->get('gid'); // Save original gid // Preformat and control user datas by plugin vDispatcher::importVMPlugins('vmuserfield'); $valid = true ; vDispatcher::trigger('plgVmOnBeforeUserfieldDataSave',array(&$valid,$this->_id,&$data,$user )); // $valid must be false if plugin detect an error if( !$valid ) { return false; } $usersConfig = JComponentHelper::getParams( 'com_users' ); $whiteDataToBind = self::filterAndWhiteListJUserData($user, $data, $new, $usersConfig); //vmdebug('VM Usermodel store $whiteDataToBind',$whiteDataToBind); // Bind Joomla userdata if (!$user->bind($whiteDataToBind)) { vmdebug('Couldnt bind data to joomla user'); //array('user'=>$user,'password'=>$data['password'],'message'=>$message,'newId'=>$newId,'success'=>false); } if($new){ // If user registration is not allowed, show 403 not authorized. // But it is possible for admins and storeadmins to save $cUser = JFactory::getUser(); if($usersConfig->get('allowUserRegistration') == '0' and !(vmAccess::manager('user')) ) { vmLanguage::loadJLang('com_virtuemart'); $msg = vmText::_ ('COM_VIRTUEMART_ACCESS_FORBIDDEN'). ' allowUserRegistration in joomla disabled'; vmError($msg, $msg); return; } // Initialize new usertype setting $newUsertype = $usersConfig->get( 'new_usertype' ); if (!$newUsertype) { $newUsertype=2; } // Set some initial user values $user->set('usertype', $newUsertype); $user->groups[] = $newUsertype; $date = JFactory::getDate(); $user->set('registerDate', $date->toSQL()); // If user activation is turned on, we need to set the activation information $useractivation = $usersConfig->get( 'useractivation' ); $doUserActivation=false; if ($useractivation == '1' or $useractivation == '2') { $doUserActivation=true; $user->set('activation', vRequest::getHash( JUserHelper::genRandomPassword()) ); $user->set('block', '1'); if ($useractivation == '2') { $user->set('guest', '1'); } } } $option = vRequest::getCmd( 'option'); // If an exising superadmin gets a new group, make sure enough admins are left... if (!$new && $user->get('gid') != $gid && $gid == __SUPER_ADMIN_GID) { if ($this->getSuperAdminCount() <= 1) { vmError(vmText::_('COM_VIRTUEMART_USER_ERR_ONLYSUPERADMIN')); return false; } } if(isset($data['language'])){ $user->setParam('language',$data['language']); } // Load the users plugin group. JPluginHelper::importPlugin('user'); // Save the JUser object if (!$this->register($user, $new)) { $msg = vmText::sprintf('JLIB_APPLICATION_ERROR_SAVE_FAILED',$user->getError()); vmError($msg.VmEcho::varPrintR($user),$msg); return false; } else { $data['name'] = $user->get('name'); $data['username'] = $user->get('username'); $data['email'] = $user->get('email'); $data['language'] = $user->get('language'); $data['editor'] = $user->get('editor'); } unset($data['password']); unset($data['password2']); $newId = $user->get('id'); $data['virtuemart_user_id'] = $newId; //We need this in that case, because data is bound to table later //$this->setUserId($newId); $this->_id = $newId; //Reset of the cached data. $this->clearCachedData(); //Save the VM user stuff $vmUserResult = $this->saveUserData($data); if ( !$vmUserResult || !self::storeAddress($data)){ vmError('COM_VIRTUEMART_NOT_ABLE_TO_SAVE_USER_DATA'); // vmError(vmText::_('COM_VIRTUEMART_NOT_ABLE_TO_SAVE_USERINFO_DATA')); } else { if ($new) { $user->userInfo = $data; $password=''; if ($usersConfig->get('sendpassword', 1)) { $password=$user->password_clear; } //$doVendor = (boolean) $usersConfig->get('mail_to_admin', true); //$this->sendRegistrationEmail($user,$password, $useractivation); if ($useractivation == '1' ) { vmInfo('COM_VIRTUEMART_REG_COMPLETE_ACTIVATE'); } else if ($useractivation == '2' ){ vmInfo('COM_VIRTUEMART_REG_COMPLETE_ACTIVATE_ADMIN'); } else { vmInfo('COM_VIRTUEMART_REG_COMPLETE'); $user->set('activation', '' ); $user->set('block', '0'); $user->set('guest', '0'); } } else { vmInfo('COM_VIRTUEMART_USER_DATA_STORED'); } } //The extra check for isset vendor_currency prevents storing of the vendor if there is no form (edit address cart) if($vmUserResult and (int)$data['user_is_vendor']==1 and isset($data['vendor_currency'])){ vmdebug('vendor recognised '.$data['virtuemart_vendor_id']); if($this ->storeVendorData($data)){ if ($new) { if ($doUserActivation ) { vmInfo('COM_VIRTUEMART_REG_VENDOR_COMPLETE_ACTIVATE'); } else { vmInfo('COM_VIRTUEMART_REG_VENDOR_COMPLETE'); } } else { vmInfo('COM_VIRTUEMART_VENDOR_DATA_STORED'); } } } if(!isset($data['password'])) $data['password'] = ''; return array('user'=>$user,'password'=>$data['password'],'message'=>$message,'newId'=>$newId,'success'=>true); } /** * This function is NOT for anonymous. Anonymous just get the information directly sent by email. * This function saves the vm Userdata for registered JUsers. * TODO, setting of shoppergroup isnt done * * TODO No reason not to use this function for new users, but it requires a Joomla plugin * that gets fired by the onAfterStoreUser. I'll built that (OvE) * * Notice: * As long we do not have the silent registration, an anonymous does not get registered. It is enough to send the virtuemart_order_id * with the email. The order is saved with all information in an extra table, so there is * no need for a silent registration. We may think about if we actually need/want the feature silent registration * The information of anonymous is stored in the order table and has nothing todo with the usermodel! * * @author Max Milbers * @author Oscar van Eijk * return boolean */ public function saveUserData(&$data,$trigger=true){ if(empty($this->_id)){ echo 'This is a notice for developers, you used this function for an anonymous user, but it is only designed for already registered ones'; vmError( 'This is a notice for developers, you used this function for an anonymous user, but it is only designed for already registered ones'); return false; } $noError = true; $usertable = $this->getTable('vmusers'); $alreadyStoredUserData = $usertable->load($this->_id); if(!vmAccess::manager('core')){ unset($data['virtuemart_vendor_id']); unset($data['user_is_vendor']); } else { if(!isset($data['user_is_vendor']) and !empty($alreadyStoredUserData->user_is_vendor)){ $data['user_is_vendor'] = $alreadyStoredUserData->user_is_vendor; } if(!isset($data['virtuemart_vendor_id']) and !empty($alreadyStoredUserData->virtuemart_vendor_id)){ $data['virtuemart_vendor_id'] = $alreadyStoredUserData->virtuemart_vendor_id; } } if(vmAccess::manager('user.edit')){ if(empty($data['customer_number'])){ $data['customer_number'] = strtoupper(substr($data['username'],0,2)).substr(md5($data['username']),0,7); //We set this data so that vmshopper plugin know if they should set the customer number $data['customer_number_bycore'] = 1; } } else { unset($data['customer_number']); if(empty($alreadyStoredUserData->customer_number)){ $data['customer_number'] = strtoupper(substr($data['username'],0,2)).substr(md5($data['username']),0,7); //We set this data so that vmshopper plugin know if they should set the customer number $data['customer_number_bycore'] = 1; } else { $data['customer_number'] = $alreadyStoredUserData->customer_number; } } if($trigger){ JPluginHelper::importPlugin('vmshopper'); $plg_datas = vDispatcher::trigger('plgVmOnUserStore',array(&$data)); foreach($plg_datas as $plg_data){ // $data = array_merge($plg_data,$data); } } $res = $usertable -> bindChecknStore($data); if(!$res){ vmError('storing user data'); $noError = false; } $data['virtuemart_vendor_id'] = $usertable->virtuemart_vendor_id; $data['user_is_vendor'] = $usertable->user_is_vendor; if(vmAccess::manager('user.edit') and !empty($data['virtuemart_shoppergroup_set'])){ $shoppergroupmodel = VmModel::getModel('ShopperGroup'); if(empty($this->_defaultShopperGroup)){ $this->_defaultShopperGroup = $shoppergroupmodel->getDefault(0); } $user_shoppergroups_table = $this->getTable('vmuser_shoppergroups'); if(empty($data['virtuemart_shoppergroup_id']) or $data['virtuemart_shoppergroup_id']==$this->_defaultShopperGroup->virtuemart_shoppergroup_id){ $data['virtuemart_shoppergroup_id'] = array(); } //We can't do that here, because we could else not set "no shoppergroup" /*if(!isset($data['virtuemart_shoppergroup_id'])){ $data['virtuemart_shoppergroup_id'] = array(); }*/ $shoppergroupData = array('virtuemart_user_id'=>$this->_id,'virtuemart_shoppergroup_id'=>$data['virtuemart_shoppergroup_id']); $res = $user_shoppergroups_table -> bindChecknStore($shoppergroupData); } if($trigger){ $plg_datas = vDispatcher::trigger('plgVmAfterUserStore',array($data)); foreach($plg_datas as $plg_data){ if(is_array($plg_data)){ $data = array_merge($data,$plg_data); } } } if(!empty($data['virtuemart_vendor_user_id']) and (is_array($data['virtuemart_vendor_user_id']) or $data['virtuemart_vendor_user_id']>1) and ( (empty($data['virtuemart_vendor_id']) and empty($data['user_is_vendor'])) or (!empty($data['virtuemart_vendor_id']) and $data['virtuemart_vendor_id']!=$data['virtuemart_vendor_user_id']) ) ){ //$vUserD = array('virtuemart_user_id' => $data['virtuemart_user_id'],'virtuemart_vendor_id' => $data['virtuemart_vendor_user_id']); $vUser = $this->getTable('vendor_users'); $vUser->load((int)$data['virtuemart_user_id']); $toStore = array('virtuemart_user_id'=>$data['virtuemart_user_id']); if(!$vUser->virtuemart_vendor_user_id){ $arr = (array) $data['virtuemart_vendor_user_id']; } else { if(!is_array($data['virtuemart_vendor_user_id'])){ $arr = array_unique(array_merge($vUser->virtuemart_vendor_user_id,(array)$data['virtuemart_vendor_user_id'])); } else { $arr = $data['virtuemart_vendor_user_id']; } } $toStore['virtuemart_vendor_user_id'] = $arr; vmdebug('vendor_users bind',$arr); $vUser->bind($toStore); $vUser->store(); } return $noError; } public function storeVendorData($data){ if(empty($data['user_is_vendor'])) return true; if(vmAccess::manager(array('user.editshop','user.editvendor')) ){ $vendorModel = VmModel::getModel('vendor'); //TODO Attention this is set now to virtuemart_vendor_id=1 in single vendor mode, because using a vendor with different id then 1 is not completly supported and can lead to bugs //So we disable the possibility to store vendors not with virtuemart_vendor_id = 1 if(Vmconfig::get('multix','none')=='none' ){ $data['virtuemart_vendor_id'] = 1; vmdebug('no multivendor, set virtuemart_vendor_id = 1'); } if($data['virtuemart_vendor_id']==1 and !vmAccess::manager('user.editshop')){ $msg = 'You do not have the permission to change the shop data'; vmWarn($msg,$msg); return false; } $vendorModel->setId($data['virtuemart_vendor_id']); if (!$vendorModel->store($data)) { vmdebug('Error storing vendor',$vendorModel); return false; } else { if(!empty($data['virtuemart_country_id'])) { $countryTable = VmModel::getTable('countries'); $countryTable->load( $data['virtuemart_country_id'] ); $countryTable->toggle('published','1'); } return true; } } else { vmInfo('Missing rights to store the vendor data'); } return true; } /** * Take a data array and save any address info found in the array. * * @author unknown, oscar, max milbers * @param array $data (Posted) user data * @param sting $_table Table name to write to, null (default) not to write to the database * @param boolean $_cart Attention, this was deleted, the address to cart is now done in the controller (True to write to the session (cart)) * @return boolean True if the save was successful, false otherwise. */ function storeAddress(&$data){ $user =JFactory::getUser(); $userinfo = $this->getTable('userinfos'); $manager = vmAccess::manager(); if($data['address_type'] == 'BT'){ if(isset($data['virtuemart_userinfo_id']) and $data['virtuemart_userinfo_id']!=0){ if(!$manager ){ $userinfo->load($data['virtuemart_userinfo_id']); if($userinfo->virtuemart_user_id!=$user->id){ vmError('Hacking attempt storeAddress','Hacking attempt storeAddress'); return false; } } } else { if($manager and isset($data['virtuemart_user_id'])){ $userId = (int)$data['virtuemart_user_id']; } else { $userId = $user->id; } $q = 'SELECT `virtuemart_userinfo_id` FROM `#__virtuemart_userinfos` WHERE `virtuemart_user_id` = '.$userId.' AND `address_type` = "BT"'; $db = JFactory::getDbo(); $db->setQuery($q); $total = $db->loadColumn(); if (count($total) > 0) { $data['virtuemart_userinfo_id'] = (int)$total[0]; } else { $data['virtuemart_userinfo_id'] = 0;//md5(uniqid($this->virtuemart_user_id)); } $userinfo->load($data['virtuemart_userinfo_id']); //unset($data['virtuemart_userinfo_id']); } $data = (array)$data; $this->validateUserData($data,'BT'); //if(!$this->validateUserData($data,'BT')){ //return false; We dont need to stop the storing process here //} $dataST['address_type'] = 'BT'; $userInfoData = self::_prepareUserFields($data, 'BT',$userinfo); //vmdebug('model user storeAddress',$data); $userinfo->bindChecknStore($userInfoData); } // Check for fields with the the 'shipto_' prefix; that means a (new) shipto address. if($data['address_type'] == 'ST' or isset($data['shipto_address_type_name'])){ $dataST = array(); //$_pattern = '/^shipto_/'; foreach ($data as $_k => $_v) { //if (preg_match($_pattern, $_k)) { if (strpos($_k,'shipto_')===0) { //$_new = preg_replace($_pattern, '', $_k); $_new = substr($_k,7); $dataST[$_new] = $_v; } } $userinfo = $this->getTable('userinfos'); if(isset($dataST['virtuemart_userinfo_id']) and $dataST['virtuemart_userinfo_id']!=0){ $dataST['virtuemart_userinfo_id'] = (int)$dataST['virtuemart_userinfo_id']; if(!$manager){ $userinfo->load($dataST['virtuemart_userinfo_id']); $user = JFactory::getUser(); if($userinfo->virtuemart_user_id!=$user->id){ vmError('Hacking attempt as admin?','Hacking attempt store address'); return false; } } } if(empty($userinfo->virtuemart_user_id)){ if(!$manager){ $dataST['virtuemart_user_id'] = $user->id; } else { if(isset($data['virtuemart_user_id'])){ $dataST['virtuemart_user_id'] = (int)$data['virtuemart_user_id']; } else { //Disadvantage is that admins should not change the ST address in the FE (what should never happen anyway.) $dataST['virtuemart_user_id'] = $user->id; } } } if(!is_array($dataST)) $dataST = (array)$dataST; $this->validateUserData($dataST,'ST'); //if(!$this->validateUserData($dataST,'ST')){ //return false; We dont need to stop the storing process here //} $dataST['address_type'] = 'ST'; $userfielddata = self::_prepareUserFields($dataST, 'ST',$userinfo); //We dont need the prefix, because we use a cleared array $userinfo->bindChecknStore($userfielddata); if(VmConfig::isSite()){ $cart = VirtuemartCart::getCart(); if($cart){ $cart->selected_shipto = $userinfo->virtuemart_userinfo_id; } } } return $userinfo->virtuemart_userinfo_id; } /** * Test userdata if valid * * @author Max Milbers * @param String if BT or ST * @param Object If given, an object with data address data that must be formatted to an array * @return redirectMsg, if there is a redirectMsg, the redirect should be executed after */ public function validateUserData(&$data,$type='BT',$showInfo = false) { $userFieldsModel = VmModel::getModel('userfields'); if ($type == 'BT') { $fieldtype = 'account'; } else if($type == 'cartfields'){ $fieldtype = 'cart'; } else { $fieldtype = 'shipment'; } $neededFields = $userFieldsModel->getUserFields( $fieldtype , array('required' => true, 'delimiters' => true, 'captcha' => true, 'system' => false) , array('delimiter_userinfo', 'name','username', 'password', 'password2', 'address_type_name', 'address_type', 'user_is_vendor', 'agreed')); $i = 0; $return = true; $untested = true; $required = 0; $filledNotByDefault = 0; $staterequired = true; $missingFields = array(); $lang = vmLanguage::getLanguage(); foreach ($neededFields as $field) { //This is a special test for the virtuemart_state_id. There is the speciality that the virtuemart_state_id could be 0 but is valid. if ($field->name == 'virtuemart_state_id' or $field->name == 'virtuemart_country_id' ) { if($untested){ $untested = false; $stateId = 0; if(isset($data['virtuemart_state_id'])){ $stateId = $data['virtuemart_state_id']; } if(isset($data['virtuemart_country_id'])){ $msg = VirtueMartModelState::testStateCountry($data['virtuemart_country_id'], $stateId, $staterequired); } if(isset($data['virtuemart_state_id'])){ $data['virtuemart_state_id'] = $stateId; } } if ($field->name == 'virtuemart_state_id' and $field->required){ $field->required = $staterequired; } } if($field->required ){ $required++; if(empty($data[$field->name])){ if($lang->hasKey('COM_VIRTUEMART_MISSING_'.$field->name)){ $missingFields[] = vmText::_('COM_VIRTUEMART_MISSING_'.$field->name); } else { $missingFields[] = vmText::sprintf('COM_VIRTUEMART_MISSING_VALUE_FOR_FIELD',$field->title ); } $i++; $return = false; } else if($data[$field->name] == $field->default){ $i++; } else { //vmdebug('Not filled by default '.$field->name,$field->default,$data[$field->name]); $filledNotByDefault++; } } } if(empty($required)){ vmdebug('Nothing to require'); $return = true; } else if($i==$required){ $return = -1; } //vmdebug('my i '.$i.' my data size $showInfo: '.(int)$showInfo.' required: '.(int)$required,$return); //if( ($required>2 and ($i+1)<$required) or ($required<=2 and !$return) or $showInfo){ //if($showInfo or ($required>2 and $i<($required-1)) or ($required<3 and !$return) ){ if($showInfo or $filledNotByDefault>1 ){ foreach($missingFields as $fieldname){ vmInfo($fieldname); } } return $return; } function _prepareUserFields(&$data, $type, $userinfo = 0, $prefix = '') { $userFieldsModel = VmModel::getModel('userfields'); if ($type == 'ST') { $prepareUserFields = $userFieldsModel->getUserFields( 'shipment' , array('delimiter','delimiter_userinfo', 'delimiter_billto') // Default toggles ); } else { // BT // The user is not logged in (anonymous), so we need tome extra fields $prepareUserFields = $userFieldsModel->getUserFields( 'account' , array() // Default toggles , array('delimiter','delimiter_userinfo', 'delimiter_billto', 'name', 'username', 'password', 'password2', 'user_is_vendor') // Skips ); } $user = JFactory::getUser(); $manager = vmAccess::manager(); // Format the data foreach ($prepareUserFields as $fld) { if(empty($data[$fld->name])) $data[$fld->name] = ''; $fldName = $fld->name; /*if(!$manager and $fld->readonly) { unset($data[$fldName]); }*/ if($userinfo!==0){ if(property_exists($userinfo,$fldName)){ if(!$manager and $fld->readonly) { $data[$fldName] = $userinfo->{$fldName}; } //$data[$fldName] = $userinfo->{$fldName}; } else if($fldName!='email'){ //No error here, email is part of the fields, but stored in joomla table //vmError('Your tables seem to be broken, you have fields in your form which have no corresponding field in the db '.$fldName); vmdebug('Your tables may be broken, you have fields in your form which have no corresponding field in the db ', $prepareUserFields); } } else { if(!$manager and $fld->readonly) { unset($data[$fldName]); } } $data[$fld->name] = $userFieldsModel->prepareFieldDataSave($fld, $data, $prefix); } $data['address_type'] = $type; return $data; } function getBTuserinfo_id($id = 0){ $db = JFactory::getDBO(); if($id == 0){ $id = $this->_id; vmdebug('getBTuserinfo_id is '.$this->_id); } static $c = array(); if(isset($c[$id])){ return $c[$id]; } else { $q = 'SELECT `virtuemart_userinfo_id` FROM `#__virtuemart_userinfos` WHERE `virtuemart_user_id` = "' .(int)$id .'" AND `address_type`="BT" '; $db->setQuery($q); $c[$id] = $db->loadResult(); return $c[$id]; } } /** * * @author Max Milbers */ function getUserInfoInUserFields($layoutName, $type, $uid, $cart=true, $isVendor=false, $virtuemart_user_id = null ){ $userFieldsModel = VmModel::getModel('userfields'); $prepareUserFields = $userFieldsModel->getUserFieldsFor( $layoutName, $type ); if($type=='ST'){ $preFix = 'shipto_'; } else { $preFix = ''; } /* if(!empty($this->_data->JUser) and $this->_data->JUser->id==$this->_id){ $JUser = $this->_data->JUser; } else { if(empty($this->_data)){ $JUser = JUser::getInstance($this->_id); /* } else { $JUser = $this->_data->JUser = JUser::getInstance($this->_id); } }*/ $data = null; $userFields = array(); if(!empty($uid)){ $dataT = $this->getTable('userinfos'); $data = $dataT->load($uid); $JUser = JUser::getInstance($data->virtuemart_user_id); if($data->virtuemart_user_id!==0 and !$isVendor){ if(!vmAccess::manager('user')){ $cUser = JFactory::getUser(); if($data->virtuemart_user_id!=$cUser->id){ vmError('Blocked attempt loading userinfo, you got logged'); echo 'Hacking attempt loading userinfo, you got logged'; return false; } } } if ($data->address_type != 'ST' ) { $BTuid = $uid; $data->name = $JUser->name; $data->email = $JUser->email; $data->username = $JUser->username; $data->address_type = 'BT'; } } else { /* Fallback if $virtuemart_user_id is not given */ if($virtuemart_user_id === null){ $virtuemart_user_id = vRequest::getInt('virtuemart_user_id',0); if(is_array($virtuemart_user_id)) $virtuemart_user_id = reset($virtuemart_user_id); if(empty($virtuemart_user_id) and !empty($this->_data->JUser)){ $virtuemart_user_id = $this->_data->JUser->id; } } vmdebug('getUserInfoInUserFields case empty $uid but $virtuemart_user_id ',$virtuemart_user_id); $JUser = JFactory::getUser($virtuemart_user_id); //New Address is filled here with the data of the cart (we are in the userview) if($cart){ $cart = VirtueMartCart::getCart(); $adType = $type.'address'; if(empty($cart->{$adType})){ $data = $cart->{$type}; if(empty($data)) $data = array(); if($JUser){ if(empty($data['name'])){ $data['name'] = $JUser->name; } if(empty($data['email'])){ $data['email'] = $JUser->email; } if(empty($data['username'])){ $data['username'] = $JUser->username; } if(empty($data['virtuemart_user_id'])){ $data['virtuemart_user_id'] = $JUser->id; } } $data = (object)$data; } } else { if($JUser){ if(empty($data['name'])){ $data['name'] = $JUser->name; } if(empty($data['email'])){ $data['email'] = $JUser->email; } if(empty($data['username'])){ $data['username'] = $JUser->username; } if(empty($data['virtuemart_user_id'])){ $data['virtuemart_user_id'] = $JUser->id; } $data = (object)$data; } } } if(empty($data) ) { vmdebug('getUserInfoInUserFields $data empty',$uid,$data); $cart = VirtueMartCart::getCart(); $data = $cart->BT; } $userFields[$uid] = $userFieldsModel->getUserFieldsFilled( $prepareUserFields ,$data ,$preFix ); return $userFields; } /** * This stores the userdata given in userfields * @deprecated seems unused * @author Max Milbers */ function storeUserDataByFields($data,$type, $toggles, $skips){ $userFieldsModel = VmModel::getModel('userfields'); $prepareUserFields = $userFieldsModel->getUserFields( $type, $toggles, $skips ); // Format the data foreach ($prepareUserFields as $_fld) { if(empty($data[$_fld->name])) $data[$_fld->name] = ''; $data[$_fld->name] = $userFieldsModel->prepareFieldDataSave($_fld,$data); } $this->store($data); return true; } /** * This uses the shopFunctionsF::renderAndSendVmMail function, which uses a controller and task to render the content * and sents it then. * * * @author Oscar van Eijk * @author Max Milbers * @author Christopher Roussel * @author ValĂ©rie Isaksen */ private function sendRegistrationEmail($user, $password, $useractivation){ $vars = array('user' => $user); // Send registration confirmation mail $password = preg_replace('/[\x00-\x1F\x7F]/', '', $password); //Disallow control chars in the email $vars['password'] = $password; if ($useractivation == '1' or $useractivation == '2') { jimport('joomla.user.helper'); $vars['activationLink'] = 'index.php?option=com_users&task=registration.activate&token='.$user->get('activation'); } $usersConfig = JComponentHelper::getParams( 'com_users' ); $adminMail = $usersConfig->get('mail_to_admin',false); if(empty($adminMail)){ unset($vars['doVendor']); //The construction is due the nasty construction in renderMail } else { $vars['doVendor'] = 1; } shopFunctionsF::renderMail('user', $user->get('email'), $vars); } /** * Delete all record ids selected * * @return boolean True is the remove was successful, false otherwise. */ function remove($userIds, $deleteJUser = true) { return self::removeS($userIds, $deleteJUser); } static $startTime = null; static $maxScriptTime = null; static function removeS($userIds, $deleteJUser = true, $ignoreIds = null) { if(empty($userIds)){ return false; } else if(!is_array($userIds)) { vmdebug('user removeS $userIds not an array',$userIds); $userIds = array($userIds); //return false; } if(vmAccess::manager('user.delete')){ $_status = true; static $userInfo = null; static $vm_shoppergroup_xref = null; static $vm_vendor = null; static $vmusers = null; if(!isset($userInfo)){ $userInfo = VmTable::getInstance('Userinfos'); $vm_shoppergroup_xref = VmTable::getInstance('Vmuser_shoppergroups'); $vmusers = VmTable::getInstance('Vmusers'); $vm_vendor = VmTable::getInstance('Vendor_users'); } vmInfo('Deleting '.count($userIds).' Users with ids '.vmEcho::varPrintR(array($userIds))); logInfo('Deleting '.count($userIds).' Users with ids '.vmEcho::varPrintR(array($userIds))); foreach($userIds as $userId) { if( isset(self::$startTime) and (microtime(true)-self::$startTime) >= (self::$maxScriptTime)){ vmInfo('Clear up shoppers. Times up. Please execute the job again'); return; } if(isset($ignoreIds)){ if(in_array($userId,$ignoreIds)){ vmdebug('Did not delete this user, because on ignore list'); continue; } } $_JUser = JUser::getInstance($userId); if (self::getSuperAdminCountS() <= 1) { // Prevent deletion of the only Super Admin if (in_array(8,$_JUser->groups)) { vmError('COM_VIRTUEMART_USER_ERR_LASTSUPERADMIN'); $_status = false; continue; } } if (!$userInfo->delete($userId)) { return false; } if (!$vm_shoppergroup_xref->delete($userId)) { $_status = false; continue; } if (!$vm_vendor->delete($userId)) { vmError('remove user did not work for '.$userId); } if (!$vmusers->delete($userId)) { $_status = false; continue; } if ($deleteJUser and !$_JUser->delete()) { vmError($_JUser->getError()); $_status = false; continue; } } } return $_status; } function removeAddress($virtuemart_userinfo_id, $id){ $db = JFactory::getDBO(); if ( isset($virtuemart_userinfo_id) and $id != 0 ) { //$userModel -> deleteAddressST(); $q = 'DELETE FROM #__virtuemart_userinfos WHERE virtuemart_user_id="'. $id .'" AND virtuemart_userinfo_id="'. (int)$virtuemart_userinfo_id .'"'; $db->setQuery($q); if($db->execute()){ vmInfo('COM_VIRTUEMART_ADDRESS_DELETED'); return true; } } return false; } var $searchTable = 'juser'; /** * Retrieve a list of users from the database. * * @author Max Milbers * @return object List of user objects */ function getUserList() { //$select = ' * '; //$joinedTables = ' FROM #__users AS ju LEFT JOIN #__virtuemart_vmusers AS vmu ON ju.id = vmu.virtuemart_user_id'; $search = vRequest::getString('search', false); $app = JFactory::getApplication (); $this->searchTable = $app->getUserStateFromRequest ('com_virtuemart.user.searchTable', 'searchTable', 'juser', 'string'); //$tableToUse = vRequest::getString('searchTable','juser'); $where = array(); if ($search) { $where = ' WHERE '; $db = JFactory::getDbo(); $searchArray = array('ju.name','ju.username','ju.email','shopper_group_name'); // removed ,'usertype' should be handled by extra dropdown $userFieldsValid = array(); if($this->searchTable!='juser'){ $userfieldTable = new TableUserinfos($db); $userfieldFields = $userfieldTable->getProperties(); $userFieldSearchArray = array('company','first_name','last_name','address_1','zip','city','phone_1'); //We must validate if the userfields actually exists, they could be removed foreach($userFieldSearchArray as $ufield){ if(array_key_exists($ufield,$userfieldFields)){ $userFieldsValid[] = $ufield; } } $searchArray = array_merge($userFieldsValid,$searchArray); } $search = str_replace(' ','%',$db->escape( $search, true )); foreach($searchArray as $field){ $whereOr[] = ' '.$field.' LIKE "%'.$search.'%" '; } //$where = substr($where,0,-3); } $select = ' ju.id AS id , ju.name AS name , ju.username AS username , ju.email AS email , IFNULL(vmu.user_is_vendor,"0") AS user_is_vendor , IFNULL(sg.shopper_group_name, "") AS shopper_group_name '; if ($search) { /*if($this->searchTable!='juser'){ $select .= ' , ui.name as uiname '; }*/ foreach($userFieldsValid as $ufield){ $select .= ' , '.$ufield; } } $joinedTables = ' FROM #__users AS ju LEFT JOIN #__virtuemart_vmusers AS vmu ON ju.id = vmu.virtuemart_user_id LEFT JOIN #__virtuemart_vmuser_shoppergroups AS vx ON ju.id = vx.virtuemart_user_id LEFT JOIN #__virtuemart_shoppergroups AS sg ON vx.virtuemart_shoppergroup_id = sg.virtuemart_shoppergroup_id '; if ($search and $this->searchTable!='juser') { $joinedTables .= ' LEFT JOIN #__virtuemart_userinfos AS ui ON ui.virtuemart_user_id = vmu.virtuemart_user_id'; } if(vmAccess::manager('managevendors')){ $vendorId = vRequest::getInt('virtuemart_vendor_id', vmAccess::isSuperVendor()); } else { $vendorId = vmAccess::isSuperVendor(); } $whereAnd = array(); if(VmConfig::get('multixcart',0)!='none' and $vendorId>1){ $joinedTables .= ' LEFT JOIN #__virtuemart_vendor_users AS vu ON ju.id = vu.virtuemart_user_id'; $whereAnd[] = ' vu.virtuemart_vendor_user_id = '.$vendorId.' '; } if(VmConfig::get('multixcart',0)!='none' and vmAccess::manager('managevendors')){ if ($this->searchTable=='vendors') { $whereAnd[] = ' vmu.virtuemart_vendor_id > 1 or (vmu.user_is_vendor>0 and vmu.virtuemart_vendor_id != "1") '; } else if ($this->searchTable=='shoppers') { $whereAnd[] = ' vmu.user_is_vendor = 0 '; } } $where = ''; $whereStr = ' WHERE '; if(!empty($whereOr)){ $where = $whereStr.implode(' OR ',$whereOr); $whereStr = 'AND'; } if(!empty($whereAnd)){ $where .= $whereStr.' ('.implode(' OR ',$whereAnd).')'; } //$this->setDebugSql(1); return $this->_data = $this->exeSortSearchListQuery(0,$select,$joinedTables,$where,' GROUP BY ju.id',$this->_getOrdering()); } public function getSwitchUserList($superVendor=null,$adminID=false) { if(!isset($superVendor)) $superVendor = vmAccess::isSuperVendor(); $result = false; if($superVendor){ $db = JFactory::getDbo(); $search = vRequest::getUword('usersearch',''); if(!empty($search)){ $search = ' WHERE (`name` LIKE "%'.$search.'%" OR `username` LIKE "%'.$search.'%" OR `customer_number` LIKE "%'.$search.'%")'; } else if($superVendor!=1) { $search = ' WHERE vu.virtuemart_vendor_user_id = '.$superVendor.' '; } $q = 'SELECT ju.`id`,`name`,`username` FROM `#__users` as ju'; if($superVendor!=1 or !empty($search)) { $q .= ' LEFT JOIN #__virtuemart_vmusers AS vmu ON vmu.virtuemart_user_id = ju.id'; if($superVendor!=1){ $q .= ' LEFT JOIN #__virtuemart_vendor_users AS vu ON vu.virtuemart_user_id = ju.id'; $search .= ' AND ( vmu.user_is_vendor = 0 OR (vmu.virtuemart_vendor_id) IS NULL)'; } } $current = JFactory::getUser(); $hiddenUserID = $adminID ? $adminID : $current->id; if(!empty($search)){ $search .= ' AND ju.id!= "'.$hiddenUserID.'" '; } else { $q .= ' WHERE ju.id!= "'.$hiddenUserID.'" '; } $q .= ' AND ju.`block` = 0'; $q .= $search.' ORDER BY `name` LIMIT 0,10000'; $db->setQuery($q); $result = $db->loadObjectList(); if($result){ foreach($result as $k => $user) { $result[$k]->displayedName = $user->name .'  ( '. $user->username .' )'; } } else { $result = array(); } if($adminID){ $user = JFactory::getUser($adminID); if($current->id!=$user->id){ $toAdd = new stdClass(); $toAdd->id = $user->id; $toAdd->name = $user->name; $toAdd->username = $user->username; $toAdd->displayedName = vmText::sprintf('COM_VIRTUEMART_RETURN_TO',$user->name,$user->username); array_unshift($result,$toAdd); } } $toAdd = new stdClass(); $toAdd->id = 0; $toAdd->name = ''; $toAdd->username = ''; $toAdd->displayedName = '-'.vmText::_('COM_VIRTUEMART_REGISTER').'-'; array_unshift($result,$toAdd); } return $result; } /** * If a filter was set, get the SQL WHERE clase * * @return string text to add to the SQL statement */ function _getFilter() { if ($search = vRequest::getString('search', false)) { $db = JFactory::getDBO(); $search = '"%' . $db->escape( $search, true ) . '%"' ; //$search = $db->Quote($search, false); $searchArray = array('name','username','email','usertype','shopper_group_name'); $where = ' WHERE '; foreach($searchArray as $field){ $where.= ' `'.$field.'` LIKE '.$search.' OR '; } $where = substr($where,0,-3); return ($where); } return (''); } /** * Retrieve a single address for a user * * @param $_uid int User ID * @param $_virtuemart_userinfo_id string Optional User Info ID * @param $_type string, addess- type, ST (ShipTo, default) or BT (BillTo). Empty string to ignore */ function getUserAddressList($_uid = 0, $_type = 'ST',$_virtuemart_userinfo_id = -1){ //Todo, add perms, allow admin to see 0 entries. if($_uid==0 and $this->_id==0){ return array(); } $_q = 'SELECT * FROM #__virtuemart_userinfos WHERE virtuemart_user_id="' . (($_uid==0)?$this->_id:(int)$_uid) .'"'; if ($_virtuemart_userinfo_id !== -1) { $_q .= ' AND virtuemart_userinfo_id="'.(int)$_virtuemart_userinfo_id.'"'; } else { if ($_type !== '') { $_q .= ' AND address_type="'.$_type.'"'; } } //vmdebug('getUserAddressList execute '.$_q); return ($this->_getList($_q)); } /** * Retrieves the Customer Number of the user specified by ID * * @param int $_id User ID * @return string Customer Number */ private $customer_number = 0; public function getCustomerNumberById() { if($this->customer_number===0){ $_q = "SELECT `customer_number` FROM `#__virtuemart_vmusers` " ."WHERE `virtuemart_user_id`='" . $this->_id . "' "; $_r = $this->_getList($_q); if(!empty($_r[0])){ $this->customer_number = $_r[0]->customer_number; }else { $this->customer_number = false; } } return $this->customer_number; } /** * Get the number of active Super Admins * * @return integer */ function getSuperAdminCount(){ return self::getSuperAdminCountS(); } static function getSuperAdminCountS(){ $db = JFactory::getDBO(); $q = ' SELECT COUNT(us.id) FROM #__users as us '. ' INNER JOIN #__user_usergroup_map as um ON us.id = um.user_id ' . ' INNER JOIN #__usergroups as ug ON um.group_id = ug.id ' . ' WHERE ug.id = "8" AND block = "0" '; $db->setQuery($q); return ($db->loadResult()); } /** * Return a list of Joomla ACL groups. * * The returned object list includes a group anme and a group name with spaces * prepended to the name for displaying an indented tree. * * @author RickG * @return ObjectList List of acl group objects. */ function getAclGroupIndentedTree(){ //TODO check this out $name = 'title'; $as = '`'; $table = '#__usergroups'; $and = ''; //Ugly thing, produces Select_full_join $query = 'SELECT `node`.`' . $name . $as . ', CONCAT(REPEAT("   ", (COUNT(`parent`.`' . $name . '`) - 1)), `node`.`' . $name . '`) AS `text` '; $query .= 'FROM `' . $table . '` AS node, `' . $table . '` AS parent '; $query .= 'WHERE `node`.`lft` BETWEEN `parent`.`lft` AND `parent`.`rgt` '; $query .= $and; $query .= 'GROUP BY `node`.`' . $name . '` '; $query .= ' ORDER BY `node`.`lft`'; $db = JFactory::getDBO(); $db->setQuery($query); //$app = JFactory::getApplication(); //$app -> enqueueMessage($db->getQuery()); $objlist = $db->loadObjectList(); // vmdebug('getAclGroupIndentedTree',$objlist); return $objlist; } } //No Closing tag