public function sort($order = null)
{
global $attributes, $prefs;
if (!$order) {
$order = array(array('ascending' => true, 'field' => 'lastname'));
}
$need_lastname = $need_firstname = false;
$name_format = $prefs->getValue('name_format');
$name_sort = $prefs->getValue('name_sort');
foreach ($order as &$field) {
if ($field['field'] == 'name') {
if ($name_sort == 'last_first') {
$field['field'] = 'lastname';
} elseif ($name_sort == 'first_last') {
$field['field'] = 'firstname';
}
}
if ($field['field'] == 'lastname') {
$field['field'] = '__lastname';
$need_lastname = true;
break;
}
if ($field['field'] == 'firstname') {
$field['field'] = '__firstname';
$need_firstname = true;
break;
}
}
if ($need_firstname || $need_lastname) {
$sorted_objects = array();
foreach ($this->objects as $key => $object) {
$name = $object->getValue('name');
$firstname = $object->getValue('firstname');
$lastname = $object->getValue('lastname');
if (!$lastname) {
$lastname = Turba::guessLastname($name);
}
if (!$firstname) {
switch ($name_format) {
case 'last_first':
$firstname = preg_replace('/' . preg_quote($lastname, '/') . ',\\s*/', '', $name);
break;
case 'first_last':
$firstname = preg_replace('/\\s+' . preg_quote($lastname, '/') . '/', '', $name);
break;
default:
$firstname = preg_replace('/\\s*' . preg_quote($lastname, '/') . '(,\\s*)?/', '', $name);
break;
}
}
$object->setValue('__lastname', $lastname);
$object->setValue('__firstname', $firstname);
$sorted_objects[$key] = $object;
}
} else {
$sorted_objects = $this->objects;
}
// Set the comparison type based on the type of attribute we're
// sorting by.
foreach ($order as &$val) {
$sm = 'text';
if (isset($attributes[$val['field']])) {
$f = $attributes[$val['field']];
if (!empty($f['cmptype'])) {
$sm = $f['cmptype'];
} elseif (in_array($f['type'], array('int', 'intlist', 'number'))) {
$sm = 'int';
}
}
$val['sortmethod'] = $sm;
}
$this->_usortCriteria = $order;
/* Exceptions thrown inside a sort incorrectly cause an error. See
* Bug #9202. */
@usort($sorted_objects, array($this, '_cmp'));
$this->objects = $sorted_objects;
}