Index: branches/unlabeled/unlabeled-1.20.22/kernel/include/portalgroup.php =================================================================== diff -u -r4447 -r6839 --- branches/unlabeled/unlabeled-1.20.22/kernel/include/portalgroup.php (.../portalgroup.php) (revision 4447) +++ branches/unlabeled/unlabeled-1.20.22/kernel/include/portalgroup.php (.../portalgroup.php) (revision 6839) @@ -523,7 +523,8 @@ $rs = $this->adodbConnection->Execute($sql); //echo $sql."
"; - + $this->processPremiumGroups(); + $clear_old = true; $insert_sql = 'INSERT INTO %s (PortalUserId,GroupId,MembershipExpires,PrimaryGroup) VALUES (%s,%s,%s,%s)'; while($rs && !$rs->EOF) @@ -549,6 +550,66 @@ unset($GLOBALS['_CopyFromEditTable']); } + function processPremiumGroups() + { + // get users, that were in temp editing + $sql = 'SELECT PortalUserId + FROM '.$this->Application->GetTempName(TABLE_PREFIX.'PortalUser'); + $user_ids = $this->Conn->GetCol($sql); + + // get temp & live user<->group links to compare them later + $temp_groups = $this->getUserGroups($user_ids, true); + $live_groups = $this->getUserGroups($user_ids, false); + + $new_groups = array_diff($temp_groups, $live_groups); + $deleted_groups = array_diff($live_groups, $temp_groups); + + if (!$new_groups && !$deleted_groups) { + // all groups stays the same + return ; + } + + $products_helper =& $this->Application->recallObject('ProductsHelper'); + /* @var $products_helper ProductsHelper */ + + foreach ($deleted_groups as $group_info) { + list ($user_id, $group_id) = explode('_', $group_info); + $products_helper->iterateUserProducts($user_id, 'OnExpire', $group_id); + } + + foreach ($new_groups as $group_info) { + list ($user_id, $group_id) = explode('_', $group_info); + $products_helper->iterateUserProducts($user_id, 'OnPurchase', $group_id); + } + } + + /** + * Returns groups in what users can be found (optionally from temp table) + * + * @param Array $user_ids + * @param bool $is_temp + * @return Array + */ + function getUserGroups($user_ids, $is_temp = false) + { + $table_name = TABLE_PREFIX.'UserGroup'; + if ($is_temp) { + $table_name = $this->Application->GetTempName($table_name); + } + + $sql = 'SELECT PortalUserId, GroupId + FROM '.$table_name.' + WHERE PortalUserId IN ('.implode(',', $user_ids).')'; + $groups = $this->Conn->Query($sql); + + $ret = Array (); + foreach ($groups as $group_info) { + $ret[] = $group_info['PortalUserId'].'_'.$group_info['GroupId']; + } + + return $ret; + } + function &Edit_UserGroup($group_id, $user_id, $membership_expires) { $ug =& $this->GetItemByField( Array('GroupId','PortalUserId'), Array($group_id,$user_id) );