Page 1 of 1

udt does not sort numbers correctly

Posted: Wed Oct 26, 2011 11:01 pm
by ie8
using cmsms 1.9.4.3
this cmsms content management system made simple
udt user defined term

has one column that sorts numbers
it sorts incorrectly by the first number and not the entire number
90
8000707
6
567


Code: Select all

global $gCms;
$feusers =& $gCms->modules['FrontEndUsers']['object'];
$comp_dir =& $gCms->modules['CompanyDirectory']['object'];
$download = true;
$db =& $gCms->GetDb();
debug_display($_POST);

$from = time();
switch($_POST['expiration'])
{
	case 'custom':
		$to = strtotime($_POST['custom_expiration']);
		if ( $date < time() ){ $from = $to;$to = time();}
		break;
	default:
		$to = strtotime('+ '.$_POST['expiration'].' days');
		break;
}
echo strftime('%D',$from).'---'.strftime('%D',$to);

if ( empty($_POST['status']) || $_POST['status'] == 'approved' || $_POST['status'] == 'tapproved')
{
	$query = "SELECT * FROM ".cms_db_prefix()."module_compdir_companies";
	$fquery = 'SELECT A.id,A.name,B.value FROM '.cms_db_prefix().'module_compdir_fielddefs A LEFT JOIN '.cms_db_prefix().'module_compdir_fieldvals B ON A.id = B.fielddef_id WHERE B.company_id = ?';

	$dbresult = $db->Execute($query);
	$csv_output = '';
	$delim = '|';
	$csv_lines = array();
	$option_type = array();
	$option_size = array();
	$i = 0;
	while($dbresult && $row=$dbresult->FetchRow())
	{	
		if ($_POST['master'] == 'true')
		{
			$members = array(array( 'userid' => $feusers->GetUserID($row['contact_email'] ) ));
		}
		else
		{
			$members = $feusers->GetUsersByProperties('company_id',$row['id']);
		}
		$categories = $db->GetArray("SELECT category_id FROM ".cms_db_prefix()."module_compdir_company_categories WHERE company_id = ?",array($row['id']));
		$cat_names = array();
		foreach($categories as $onecat)
		{
			switch ($onecat['category_id'])
			{
				case ('1'):	$cat_names[] = "Agency"; 		break;
				case ('2'):	$cat_names[] = "Consultant";		break;
				case ('3'):	$cat_names[] = "Service Provider";	break;
				case ('4'):	$cat_names[] = "TrainingClients"; 	break;
				case ('5'):	$cat_names[] = "Conference"; 	break;
			}
		}
		$company_type = implode(', ', $cat_names);
		if (!empty($company_type) ) $option_type[str_replace(array(',',' '),'', $company_type)] = $company_type;
		if(!empty($_POST['type']) && str_replace(array(',',' '),'', $company_type) != $_POST['type'] )  continue;
		$tmp1 = $db->GetArray($fquery,array($row['id']));
		$company_fields = $comp_dir->array_to_hash( $tmp1, 'name' );
		
		if (!empty($company_fields['Size office']['value']) ) $option_size[str_replace(array(',',' ','-'),'', $company_fields['Size office']['value'])] = $company_fields['Size office']['value'];
		if(!empty($_POST['size']) && str_replace(array(',',' ','-'),'', $company_fields['Size office']['value']) != $_POST['size'] )  continue;

		if ($_POST['payment'] == 'check'  ) continue;
		if ($_POST['payment'] == 'cc' && $company_fields['Amount Charged']['value'] == 'manually' ) continue;


		foreach($members as $onemember)
		{
			if ($_POST['status'] == 'approved' && $feusers->MemberOfGroup($onemember['userid'], '27') ) continue;
			if ($_POST['status'] == 'tapproved' && !$feusers->MemberOfGroup($onemember['userid'], '27')  ) continue;

			$user = $feusers->GetUserInfo($onemember['userid']);
			if( !empty($_POST['expiration']) )
			{
				if( strtotime($user[1]['expires']) < $from  || strtotime($user[1]['expires']) > $to ) continue;
			}
			if ($_POST['master'] == 'false' && strtoupper(trim($row['contact_email'])) == strtoupper(trim($user[1]['username']))) continue;

				//if ( $feusers->IsAccountExpired($onemember['userid']) ) continue;
			if ( isset($csv_lines[$onemember['userid']]) ) $csv_lines[$onemember['userid']] = array();

			$properties = $feusers->GetUserProperties($onemember['userid']);
			$props = $comp_dir->array_to_hash($properties, 'title');
			
			if(!empty($_POST['companyname']) && stripos($row['company_name'], $_POST['companyname']) === false )  continue;
			if(!empty($_POST['firstname']) && stripos($props['first_name']['data'], $_POST['firstname']) === false )  continue;
			if(!empty($_POST['lastname']) && stripos($props['last_name']['data'], $_POST['lastname']) === false )  continue;
			if(!empty($_POST['city']) && stripos($props['city']['data'], $_POST['city']) === false )  continue;

			switch ($company_fields['Payment Method']['value'])
			{
				case 'monthly':
					$new_renewal = mktime(date("H",$company_fields['RenewalDate']['value']),date("i",$company_fields['RenewalDate']['value']),date("s",$company_fields['RenewalDate']['value']),date("n",$company_fields['RenewalDate']['value'])+1,date("j",$company_fields['RenewalDate']['value']),date("Y",$company_fields['RenewalDate']['value']) );
					break;
				case 'quarterly':
					$new_renewal = mktime(date("H",$company_fields['RenewalDate']['value']),date("i",$company_fields['RenewalDate']['value']),date("s",$company_fields['RenewalDate']['value']),date("n",$company_fields['RenewalDate']['value'])+3,date("j",$company_fields['RenewalDate']['value']),date("Y",$company_fields['RenewalDate']['value']) );
					break;
				case 'annually':
				case 'check':
					$new_renewal = mktime(date("H",$company_fields['RenewalDate']['value']),date("i",$company_fields['RenewalDate']['value']),date("s",$company_fields['RenewalDate']['value']),date("n",$company_fields['RenewalDate']['value']),date("j",$company_fields['RenewalDate']['value']),date("Y",$company_fields['RenewalDate']['value'])+1 );
					break;
			}

			$csv_lines[$onemember['userid']][] = $onemember['userid'];
			$csv_lines[$onemember['userid']][] = $user[1]['username'];
			$csv_lines[$onemember['userid']][] = $row['company_name'];
			$csv_lines[$onemember['userid']][] =  $props['phone']['data'];
			$csv_lines[$onemember['userid']][] =  $props['last_name']['data'];
			$csv_lines[$onemember['userid']][] = $props['first_name']['data'];
			//$csv_lines[$onemember['userid']][] = $row['address'];
			$csv_lines[$onemember['userid']][] = $company_fields['Company City']['value'];
			$csv_lines[$onemember['userid']][] = $company_fields['Company State']['value'];
			//$csv_lines[$onemember['userid']][] = $company_fields['Country']['value'];
			//$csv_lines[$onemember['userid']][] = $company_fields['Zip']['value'];
			(strtoupper(trim($row['contact_email'])) == strtoupper(trim($user[1]['username'])))?$csv_lines[$onemember['userid']][] ='Master':$csv_lines[$onemember['userid']][] = '';
			($feusers->MemberOfGroup($onemember['userid'], '27') )?$csv_lines[$onemember['userid']][] ='T Approved':$csv_lines[$onemember['userid']][] = 'A Approved';
			//$csv_lines[$onemember['userid']][] = $props['title_input']['data'];
			//$csv_lines[$onemember['userid']][] = $props['phone']['data'];
			$csv_lines[$onemember['userid']][] = strftime('%F',strtotime($user[1]['expires']));
			$csv_lines[$onemember['userid']][] = $company_fields['Payment Method']['value'];
			$csv_lines[$onemember['userid']][] = $company_fields['Amount Charged']['value'];
			$csv_lines[$onemember['userid']][] = '';	//$company_fields['ExpireNotify']['value'];
			//$csv_lines[$onemember['userid']][] = $company_fields['Sub_Card']['value'];
			$csv_lines[$onemember['userid']][] = (empty($new_renewal))?'':strftime('%F',$new_renewal );
			$csv_lines[$onemember['userid']][] = strftime('%F',strtotime($user[1]['createdate']));
			$csv_lines[$onemember['userid']][] = $company_fields['Size office']['value'];
			$csv_lines[$onemember['userid']][] = $company_type;

		}
		
	}
}
if ( (empty($_POST['status']) || !($_POST['status'] == 'approved' || $_POST['status'] == 'tapproved') )  && (empty($_POST['type']) || $_POST['type'] == 'Agency') )
{
	$pending_users = $feusers->GetFullUsersInGroup('6');
	foreach($pending_users as $userid => $one_user)
	{
		if ($_POST['payment'] == 'check'  ) continue;
		if ( ($_POST['status'] == 'started' ||  $_POST['status'] == 'tstarted') && !$feusers->MemberOfGroup($userid, '15') ) continue;
		if ( ($_POST['status'] == 'billing' ||  $_POST['status'] == 'tbilling') && $feusers->MemberOfGroup($userid, '15') ) continue;
		if ( ($_POST['status'] == 'billing' ||  $_POST['status'] == 'started') &&  $feusers->MemberOfGroup($userid, '27') ) continue;
		if ( ($_POST['status'] == 'tbilling' ||  $_POST['status'] == 'tstarted')&&  !$feusers->MemberOfGroup($userid, '27') ) continue;

		if ($_POST['master'] == 'false' && ($feusers->MemberOfGroup($userid, '3') ||  $feusers->MemberOfGroup($userid, '27')) ) continue;
		if ($_POST['master'] == 'true' && !($feusers->MemberOfGroup($userid, '3') ||  $feusers->MemberOfGroup($userid, '27')) ) continue;
		if( !empty($_POST['expiration']) )
		{
			if( strtotime($one_user['expires']) < $from  || strtotime($one_user['expires']) > $to ) continue;  
			
		}
		$props = $comp_dir->array_to_hash($one_user['props'], 'title');
		if(!empty($_POST['companyname']) && stripos($props['Company_Name']['data'], $_POST['companyname']) === false )  continue;
		if(!empty($_POST['firstname']) && stripos($props['first_name']['data'], $_POST['firstname']) === false )  continue;
		if(!empty($_POST['lastname']) && stripos($props['last_name']['data'], $_POST['lastname']) === false )  continue;
		if(!empty($_POST['city']) && stripos($props['city']['data'], $_POST['city']) === false )  continue;

		if(!empty($_POST['size']) && str_replace(array(',',' ','-'),'', $props['Agency_Size_Office']['data']) != $_POST['size'] )  continue;

		if ( isset($csv_lines[$userid]) ) $csv_lines[$userid] = array();
		
		$csv_lines[$userid][] = $userid;
		$csv_lines[$userid][] = $one_user['username'];
		$csv_lines[$userid][] = $props['Company_Name']['data'];
		$csv_lines[$userid][] =  $props['phone']['data'];
		$csv_lines[$userid][] =  $props['last_name']['data'];
		$csv_lines[$userid][]= $props['first_name']['data'];
		$csv_lines[$userid][] = $props['city']['data'];
		$csv_lines[$userid][] = $props['state']['data'];
		($feusers->MemberOfGroup($userid, '3') ||  $feusers->MemberOfGroup($userid, '27'))?$csv_lines[$userid][]='Master':$csv_lines[$userid][] = '';
		($feusers->MemberOfGroup($userid, '27') )?$type ='T ':$type = 'A ';
		($feusers->MemberOfGroup($userid, '15') )?$csv_lines[$userid][]=$type.'Started':$csv_lines[$userid][]=$type.'Billing';
		$csv_lines[$userid][] = strftime('%F',strtotime($one_user['expires']));
		$csv_lines[$userid][] = $props['payment_term']['data'];
		$csv_lines[$userid][] = $props['amount_charged']['data'];
		$csv_lines[$userid][]= '';	
		$csv_lines[$userid][] = '';
		$csv_lines[$userid][] = strftime('%F',strtotime($one_user['createdate']));
		$csv_lines[$userid][] = $props['Agency_Size_Office']['data'];
		$csv_lines[$userid][] = 'Agency';
	}
}
	
$csv_header = array("UserID","Email Address","Company","Work Phone","Last Name","First Name","City","State","Master","Status","Member Expiration","Payment Method","Billing Amount","CC Expiry","Check Due","Member Since","Office Size","Company Type");
	

if ($_GET['showtemplate'] != 'false')
{
	echo $feusers->ProcessTemplateFromData('{JQueryTools action=incjs exclude="fancybox,form,lightbox"}');
	echo '<__script__ type="text/javascript">jQuery(document).ready(function($) { jQuery(".cms_sortable").tablesorter({widthFixed: true, widgets: ["zebra"]}); });</__script>';

	if ($download)
	{
//		echo '<center><a href="'.$_SERVER['SCRIPT_URI'].'?showtemplate=false" style="text-decoration:none;"><button type="button">Download File</button></a></center>';
	}
	echo '<form method="post">';
	echo '<label for="master">Master/Non-Master: </label><select name="master"><option value="">Select One</option><option value="true" '.(($_POST['master'] == 'true')?'selected':'').'>Master</option><option value="false" '.(($_POST['master'] == 'false')?'selected':'').'>Non-Master</option></select><br />';
	echo '<label for="status">Status: </label><select name="status"><option value="">Select One</option><option value="approved" '.(($_POST['status'] == 'approved')?'selected':'').'>Approved</option><option value="billing" '.(($_POST['status'] == 'billing')?'selected':'').'>Billing</option><option value="started" '.(($_POST['status'] == 'started')?'selected':'').'>Started</option><option value="tapproved" '.(($_POST['status'] == 'tapproved')?'selected':'').'>T Approved</option><option value="tbilling" '.(($_POST['status'] == 'tbilling')?'selected':'').'>T Billing</option><option value="tstarted" '.(($_POST['status'] == 'tstarted')?'selected':'').'>T Started</option></select><br />';
	echo '<label for="payment">Payment Method: </label><select name="payment"><option value="">Select One</option><option value="cc" '.(($_POST['payment'] == 'cc')?'selected':'').'>Credit Card</option><option value="check" '.(($_POST['payment'] == 'check')?'selected':'').'>Check</option></select><br />';
	echo '<label for="expiration">Member Expiration: </label><select name="expiration"><option value="">Select One</option><option value="60" '.(($_POST['expiration'] == '62')?'selected':'').'>Next two months</option><option value="31" '.(($_POST['expiration'] == '30')?'selected':'').'>Next month</option><option value="7" '.(($_POST['expiration'] == '7')?'selected':'').'>Next week</option><option value="custom" '.(($_POST['expiration'] == 'custom')?'selected':'').'>Custom date range</option></select><br /><label for="custom_expiration">Expiration Date: </label><input name="custom_expiration" value="'.$_POST['custom_date'].'"/><br />';
	echo '<label for="type">Company Type: </label><select name="type"><option value="">Select One</option>';
	foreach( $option_type as $typename => $onetype )
	{
		echo '<option value="'.$typename.'" '.(($_POST['type'] == $typename)?'selected':'').'>'.$onetype.'</option>';
	}
	echo '</select><br />';
	echo '<label for="size">Company Size: </label><select name="size"><option value="">Select One</option>';
	foreach( $option_size as $sizename => $onesize )
	{
		echo '<option value="'.$sizename.'" '.(($_POST['type'] == $sizename)?'selected':'').'>'.$onesize.'</option>';
	}
	echo '</select><br />';
	echo '<label for="companyname">Company Name: </label><input name="companyname" value="'.$_POST['companyname'].'"/><br />';
	echo '<label for="firstname">First Name: </label><input name="firstname" value="'.$_POST['firstname'].'"/><br />';
	echo '<label for="lastname">Last Name: </label><input name="lastname" value="'.$_POST['lastname'].'"/><br />';
	echo '<label for="city">City: </label><input name="city" value="'.$_POST['city'].'"/><br />';

	echo '<input type="submit" value="Filter" name="filter" /><a href="http://www.mirren.org/members-list/"><button>Clear</button></a></form>';
	echo '<table class="cms_sortable tablesorter" BORDER=1 CELLPADDING=3><thead><tr><th style="color:#ffffff;">'.implode('</th><th style="color:#ffffff;">', $csv_header).'</th></tr></thead><tbody>';
	foreach($csv_lines as  $one_row)
	{
			$i++;

		echo '<tr><td NOWRAP>'.implode('</td><td NOWRAP>', $one_row).'</td></tr>';
	}
	echo '</tbody></table>';
}
else
{

	//Then force the output normally and exit so we don't get a footer
	header("Content-disposition: attachment; filename=members_list." . date("Y-m-d") . ".csv");
	header("Content-type: text/csv");
	print '"'.implode('"'.$delim.'"', $csv_header)."\"\n";
	foreach($csv_lines as $one_row)
	{
		print '"'.implode('"'.$delim.'"', $one_row)."\"\n";
	}
	exit;
}
echo $i;

Re: udt does not sort numbers correctly

Posted: Fri Oct 28, 2011 12:21 am
by spcherub
That's a lot of code with very little background - so it hard for someone to offer help.

It looks like a UDT that gets data from two separate modules and joins them together in some way meaningful to you. It is possible that the sorting of the data is being done using the default sort criteria which ignores the numeric values. You need to locate the part of the code that sorts the output array and make sure to change it to sort numerically. Also looking closer I see the sorting is happening in Javascript, so make sure you are setting the sort criteria for the required column to numeric instead of plain ASCII.

Hope that helps.
-S