Add basic filtering support
authorAndreas Boehler <andreas@aboehler.at>
Wed, 22 Jun 2016 18:11:51 +0200
changeset 15 efa26dde82f2
parent 14 57ee0afbea6d
child 16 9f92b1b42241
Add basic filtering support
syntax/book.php
--- a/syntax/book.php	Wed Jun 22 09:36:22 2016 +0200
+++ b/syntax/book.php	Wed Jun 22 18:11:51 2016 +0200
@@ -60,6 +60,7 @@
         $data = array('name' => $ID,
                       'description' => $this->getLang('created_by_davcard'),
                       'id' => array(),
+                      'filter' => array(),
                       );
         foreach($options as $option)
         {
@@ -68,6 +69,10 @@
             $val = trim($val);
             switch($key)
             {
+                case 'filter':
+                    list($k, $v) = explode(':', strtolower($val), 2);
+                    $data['filter'][$k] = $v;
+                break;
                 case 'id':
                     if(!in_array($val, $data['id']))
                         $data['id'][] = $val;
@@ -121,9 +126,10 @@
         global $ID;
         if($format !== 'xhtml')
             return false;
-                
-        $R->doc .= '<div class="davcardAddressbookAddNew"><a href="#" class="davcardAddressbookAddNew">'.$this->getLang('add_new').'</a></div>';
-        
+        if(in_array($ID, $data['id']))
+        {        
+            $R->doc .= '<div class="davcardAddressbookAddNew"><a href="#" class="davcardAddressbookAddNew">'.$this->getLang('add_new').'</a></div>';
+        }        
         // FIXME: Add new is not yet permission checked and does not support
         // included address books!
         
@@ -178,6 +184,8 @@
             foreach($entries as $entry)
             {
                 $contactdata = $this->hlp->parseVcard($entry['contactdata'], $entry['uri']);
+                if(!$this->contactFilterMatch($data['filter'], $contactdata))
+                    continue;
                 $R->doc .= '<tr><td><a href="#" class="plugin_davcard_edit_vcard" data-davcardid="'.$id.'" data-davcarduri="'.$entry['uri'].'" data-write="'.($write ? 'true' : 'false').'">'.$entry['formattedname'].'</a></td><td>';
                 if(count($contactdata['addr']) > 0)
                 {
@@ -240,7 +248,57 @@
         
     }
 
-
+    private function contactFilterMatch($filter, $contactdata)
+    {
+        if(empty($filter))
+            return true;
+        
+        foreach($filter as $type => $params)
+        {
+            $params = '/'.$params.'/i';
+            switch($type)
+            {
+                case 'name':
+                    if(preg_match($params, $contactdata['formattedname']) !== 1)
+                        return false;
+                break;
+                case 'mail':
+                    $found = false;
+                    foreach($contactdata['mail'] as $dat)
+                    {
+                        if(preg_match($params, $dat['mail']) === 1)
+                            $found = true;
+                    }
+                    if(!$found)
+                        return false;
+                break;
+                case 'address':
+                    $found = false;
+                    foreach($contactdata['addr'] as $dat)
+                    {
+                        foreach($dat['address'] as $da)
+                        {
+                            if(preg_match($params, $da) === 1)
+                                $found = true;
+                        }
+                    }
+                    if(!$found)
+                        return false;
+                break;
+                case 'tel':
+                    $found = false;
+                    foreach($contactdata['tel'] as $dat)
+                    {
+                        if(preg_match($params, $dat['number']) === 1)
+                            $found = true;
+                    }
+                    if(!$found)
+                        return false;
+                break;
+            }
+        }
+        return true;
+    }
    
 }