[jan] Use name format preference not only for paging, but for sorting too
authorJan Schneider <jan@horde.org>
Thu, 21 Oct 2010 20:13:30 +0000 (22:13 +0200)
committerJan Schneider <jan@horde.org>
Thu, 21 Oct 2010 20:18:40 +0000 (22:18 +0200)
      (Request #8806).

turba/docs/CHANGES
turba/lib/List.php

index 0062fce..7e82bad 100644 (file)
@@ -15,6 +15,8 @@ v3.0-git
 v2.3.6-cvs
 ----------
 
+[jan] Use name format preference not only for paging, but for sorting too
+      (Request #8806).
 [jan] Fix photo corruption when exporting to vCard 3.0 (Bug #9100).
 
 
index 157877b..39e35bc 100644 (file)
@@ -104,11 +104,16 @@ class Turba_List implements Countable
             );
         }
 
-        $need_lastname = false;
-        $last_first = ($GLOBALS['prefs']->getValue('name_format') == 'last_first');
+        $need_lastname = $need_firstname = false;
+        $name_format = $GLOBALS['prefs']->getValue('name_format');
+        $name_sort = $GLOBALS['prefs']->getValue('name_sort');
         foreach ($order as &$field) {
-            if ($last_first && ($field['field'] == 'name')) {
-                $field['field'] = 'lastname';
+            if ($field['field'] == 'name') {
+                if ($name_sort == 'last_first') {
+                    $field['field'] = 'lastname';
+                } elseif ($name_sort == 'first_last') {
+                    $field['field'] = 'firstname';
+                }
             }
 
             if ($field['field'] == 'lastname') {
@@ -116,20 +121,41 @@ class Turba_List implements Countable
                 $need_lastname = true;
                 break;
             }
+            if ($field['field'] == 'firstname') {
+                $field['field'] = '__firstname';
+                $need_firstname = true;
+                break;
+            }
         }
 
-        if (!$need_lastname) {
-            $sorted_objects = $this->objects;
-        } else {
+        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($object->getValue('name'));
+                    $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;
         }
 
         $this->_usortCriteria = $order;