Browse Source

Added "List all" button to javascript address book.
List all addresses in the personal address book when window is opened.

pallo 25 years ago
parent
commit
f5bb0f1f04
3 changed files with 209 additions and 119 deletions
  1. 6 4
      doc/addressbook.txt
  2. 36 19
      functions/addressbook.php
  3. 167 96
      src/addrbook_search.php

+ 6 - 4
doc/addressbook.txt

@@ -59,20 +59,19 @@ methods are provided:
    moment), or false if it failed.
    moment), or false if it failed.
 
 
 
 
-  search(QUERY, [BTYPE])
+  search(QUERY, [BNUM])
 
 
      QUERY - Something to search for. At the moment, only 
      QUERY - Something to search for. At the moment, only 
      a string is allowed here, but advanced expressions
      a string is allowed here, but advanced expressions
      will be supported through an array of parameters.
      will be supported through an array of parameters.
 
 
-     BTYPE - Optional backend type to search. Either "local"
-     or "remote".
+     BNUM  - Optional backend number to search.
 
 
    This method will return an array of result arrays (see below), an
    This method will return an array of result arrays (see below), an
    empty array if nothing was found, or false if the search failed.
    empty array if nothing was found, or false if the search failed.
 
 
 
 
-  s_search(QUERY, [BTYPE])
+  s_search(QUERY, [BNUM])
 
 
    The same as search(), but the result array is sorted by backend and
    The same as search(), but the result array is sorted by backend and
    fullname before it is returned.
    fullname before it is returned.
@@ -163,3 +162,6 @@ In addition, the following keys may exist for some backends:
 ----------------------
 ----------------------
 
 
 ... more later ...
 ... more later ...
+
+Ask pallo@squirrelmail.org if you have any questions on how to build
+new address book backends.

+ 36 - 19
functions/addressbook.php

@@ -116,36 +116,49 @@
 
 
       // Return a list of addresses matching expression in
       // Return a list of addresses matching expression in
       // all backends of a given type.
       // all backends of a given type.
-      function search($expression, $btype = "") {
+      function search($expression, $bnum = -1) {
 	 $ret = array();
 	 $ret = array();
 	 $this->error = "";
 	 $this->error = "";
 
 
-	 $sel = $this->get_backend_list($btype);
-	 $failed = 0;
-	 for($i = 0 ; $i < sizeof($sel) ; $i++) {
-	    $backend = &$sel[$i];
-	    $backend->error = "";
-	    $res = $backend->search($expression);
-	    if(is_array($res)) {
-	       $ret = array_merge($ret, $res);
-	    } else {
-	       $this->error = $this->error . "<br>\n". $backend->error;
-	       $failed++;
+	 // Search all backends
+	 if($bnum == -1) {
+	    $sel = $this->get_backend_list("");
+	    $failed = 0;
+	    for($i = 0 ; $i < sizeof($sel) ; $i++) {
+	       $backend = &$sel[$i];
+	       $backend->error = "";
+	       $res = $backend->search($expression);
+	       if(is_array($res)) {
+		  $ret = array_merge($ret, $res);
+	       } else {
+		  $this->error = $this->error . "<br>\n". $backend->error;
+		  $failed++;
+	       }
 	    }
 	    }
+
+	    // Only fail if all backends failed
+	    if($failed >= sizeof($sel))
+	       return false;
+
 	 }
 	 }
 
 
-	 // Only fail if all backends failed
-	 if($failed >= sizeof($sel))
-	    return false;
+	 // Search only one backend
+	 else {
+	    $ret = $this->backends[$bnum]->search($expression);
+	    if(!is_array($ret)) {
+	       $this->error = $this->error . "<br>\n". $this->backends[$bnum]->error;
+	       return false;
+	    }
+	 }
 
 
 	 return $ret;
 	 return $ret;
       }
       }
 
 
 
 
       // Return a sorted search
       // Return a sorted search
-      function s_search($expression, $btype = "") {
+      function s_search($expression, $bnum = -1) {
 
 
-	 $ret = $this->search($expression, $btype);
+	 $ret = $this->search($expression, $bnum);
 	 if(!is_array($ret))
 	 if(!is_array($ret))
 	    return $ret;
 	    return $ret;
 
 
@@ -198,10 +211,14 @@
 
 
 
 
       // Return all addresses
       // Return all addresses
-      function list_addr() {
+      function list_addr($bnum = -1) {
 	 $ret = array();
 	 $ret = array();
 
 
-	 $sel = $this->get_backend_list("local");
+	 if($bnum == -1) 
+	    $sel = $this->get_backend_list("local");
+	 else
+	    $sel = array(0 => &$this->backends[$bnum]);
+
 	 for($i = 0 ; $i < sizeof($sel) ; $i++) {
 	 for($i = 0 ; $i < sizeof($sel) ; $i++) {
 	    $backend = &$sel[$i];
 	    $backend = &$sel[$i];
 	    $backend->error = "";
 	    $backend->error = "";

+ 167 - 96
src/addrbook_search.php

@@ -6,76 +6,8 @@
     **
     **
     **/
     **/
 
 
-   session_start();
-
-   if(!isset($logged_in)) {
-      echo _("You must login first.");
-      exit;
-   }
-   if(!isset($username) || !isset($key)) {
-      echo _("You need a valid user and password to access this page!");
-      exit;
-   }
-
-   if (!isset($config_php))
-      include("../config/config.php");
-   if (!isset($array_php))
-      include("../functions/array.php");
-   if (!isset($strings_php))
-      include("../functions/strings.php");
-   if (!isset($imap_php))
-      include("../functions/imap.php");
-   if (!isset($page_header_php))
-      include("../functions/page_header.php");
-   if (!isset($addressbook_php))
-      include("../functions/addressbook.php");
-
-   // Authenticate user and load prefs
-   $imapConnection = sqimap_login($username, $key, 
-				  $imapServerAddress, $imapPort, 10);
-   include("../src/load_prefs.php");
-   sqimap_logout ($imapConnection);
-
-   displayHtmlHeader();
-
-   // Choose correct colors for top and bottom frame
-   if($show == "form") {
-      echo "<BODY BGCOLOR=\"$color[3]\" TEXT=\"$color[6]\" ";
-      echo "LINK=\"$color[6]\" VLINK=\"$color[6]\" ALINK=\"$color[6]\" ";
-      echo "OnLoad=\"document.sform.query.focus();\">";  
-   } else {
-      echo "<BODY TEXT=\"$color[8]\" BGCOLOR=\"$color[4]\" ";
-      echo "LINK=\"$color[7]\" VLINK=\"$color[7]\" ALINK=\"$color[7]\">\n";
-   }
-
-   // Just make a blank page and exit
-   if(($show == "blank") || (empty($query) && empty($show)))  {
-      printf("<P ALIGN=center><BR>%s</P>\n</BODY></HTML>\n",
-	     _("Search results will display here"));
-      exit;
-   }
-
-   // Create search form 
-   if($show == "form") {
-      printf("<FORM NAME=sform TARGET=abookres ACTION=\"%s\" METHOD=\"POST\">\n",
-	     $PHP_SELF);
-      printf("<TABLE BORDER=0 WIDTH=\"100%%\" HEIGHT=\"100%%\">");
-      printf("<TR><TD NOWRAP VALIGN=middle>\n");
-      printf("  <STRONG>%s:</STRONG>\n</TD><TD VALIGN=middle>\n",
-	     _("Search for"));
-      printf("  <INPUT TYPE=text NAME=query VALUE=\"%s\" SIZE=30>\n",
-	     htmlspecialchars($query));
-      printf("</TD><TD VALIGN=middle>\n");
-      printf("  <INPUT TYPE=submit VALUE=\"%s\">",
-	     _("Search"));
-      printf("</TD><TD WIDTH=\"50%%\" VALIGN=middle ALIGN=right>\n");
-      printf("<INPUT TYPE=button VALUE=\"%s\" onclick=\"parent.close();\">\n",
-             _("Close window"));
-      printf("</TD></TR></TABLE></FORM>\n");
-   }
-
-   // Include JavaScript code if this is search results
-   if(!empty($query)) {
+   // Function to include JavaScript code
+   function insert_javascript() {
 ?>
 ?>
 <SCRIPT LANGUAGE="Javascript"><!--
 <SCRIPT LANGUAGE="Javascript"><!--
 
 
@@ -139,12 +71,172 @@ function bcc_address($addr) {
 // --></SCRIPT>
 // --></SCRIPT>
 
 
 <?php 
 <?php 
-   } // End of included JavaScript code
+   } // End of included JavaScript
+
+
+   // List search results
+   function display_result($res, $includesource = true) {
+      global $color;
+
+      if(sizeof($res) <= 0) return;
+
+      insert_javascript();
+
+      $line = 0;
+      print "<TABLE BORDER=0 WIDTH=\"98%\" ALIGN=center>";
+      printf("<TR BGCOLOR=\"$color[9]\"><TH ALIGN=left>&nbsp;".
+	     "<TH ALIGN=left>&nbsp;%s<TH ALIGN=left>&nbsp;%s".
+	     "<TH ALIGN=left>&nbsp;%s",
+	     _("Name"), _("E-mail"), _("Info"));
+
+      if($includesource)
+	 printf("<TH ALIGN=left WIDTH=\"10%%\">&nbsp;%s", _("Source"));
+
+      print "</TR>\n";
+      
+      while(list($key, $row) = each($res)) {
+	 printf("<tr%s nowrap><td nowrap align=center width=\"5%%\">".
+		"<small><a href=\"javascript:to_address('%s');\">To</A> | ".
+		"<a href=\"javascript:cc_address('%s');\">Cc</A> | ".
+		"<a href=\"javascript:bcc_address('%s');\">Bcc</A></small>".
+		"<td nowrap>&nbsp;%s&nbsp;<td nowrap>&nbsp;".
+		"<a href=\"javascript:to_and_close('%s');\">%s</A>&nbsp;".
+		"<td nowrap>&nbsp;%s&nbsp;", 
+		($line % 2) ? " bgcolor=\"$color[0]\"" : "", 
+		$row["email"], $row["email"], $row["email"], 
+		$row["name"],  $row["email"], $row["email"],
+		$row["label"]);
+
+	 if($includesource)
+	    printf("<td nowrap>&nbsp;%s", $row["source"]);
+
+	 print "</TR>\n";
+	 $line++;
+      }
+      print "</TABLE>";
+   }
+
+   /* ================= End of functions ================= */
+
+   session_start();
+
+   if(!isset($logged_in)) {
+      echo _("You must login first.");
+      exit;
+   }
+   if(!isset($username) || !isset($key)) {
+      echo _("You need a valid user and password to access this page!");
+      exit;
+   }
+
+   if (!isset($config_php))
+      include("../config/config.php");
+   if (!isset($array_php))
+      include("../functions/array.php");
+   if (!isset($strings_php))
+      include("../functions/strings.php");
+   if (!isset($imap_php))
+      include("../functions/imap.php");
+   if (!isset($page_header_php))
+      include("../functions/page_header.php");
+   if (!isset($addressbook_php))
+      include("../functions/addressbook.php");
+
+   // Authenticate user and load prefs
+   $imapConnection = sqimap_login($username, $key, 
+				  $imapServerAddress, $imapPort, 10);
+   include("../src/load_prefs.php");
+   sqimap_logout ($imapConnection);
+
+   displayHtmlHeader();
+
+   // Choose correct colors for top and bottom frame
+   if($show == "form") {
+      echo "<BODY BGCOLOR=\"$color[3]\" TEXT=\"$color[6]\" ";
+      echo "LINK=\"$color[6]\" VLINK=\"$color[6]\" ALINK=\"$color[6]\" ";
+      echo "OnLoad=\"document.sform.query.focus();\">";  
+   } else {
+      echo "<BODY TEXT=\"$color[8]\" BGCOLOR=\"$color[4]\" ";
+      echo "LINK=\"$color[7]\" VLINK=\"$color[7]\" ALINK=\"$color[7]\">\n";
+   }
+
+   // Empty search
+   if(empty($query) && empty($show) && empty($listall))  {
+      printf("<P ALIGN=center><BR>%s</P>\n</BODY></HTML>\n",
+	     _("No persons matching your search was found"));
+      exit;
+   }
+
+   // Initialize addressbook
+   $abook = addressbook_init();
+
+   // Create search form 
+   if($show == "form") {
+      printf("<FORM NAME=sform TARGET=abookres ACTION=\"%s\" METHOD=\"POST\">\n",
+	     $PHP_SELF);
+      printf("<TABLE BORDER=0 WIDTH=\"100%%\" HEIGHT=\"100%%\">");
+      printf("<TR><TD NOWRAP VALIGN=middle NOWRAP>\n");
+      printf("  <STRONG>%s</STRONG>\n", _("Search for"));
+      printf("  <INPUT TYPE=text NAME=query VALUE=\"%s\" SIZE=26>\n",
+	     htmlspecialchars($query));
+
+      // List all backends to allow the user to choose where to search
+      if($abook->numbackends > 1) {
+	 printf("<STRONG>%s</STRONG>&nbsp;<SELECT NAME=backend>\n", 
+		_("in"));
+	 printf("<OPTION VALUE=-1 SELECTED>%s\n", 
+		_("All address books"));
+	 $ret = $abook->get_backend_list();
+	 while(list($k,$v) = each($ret)) 
+	    printf("<OPTION VALUE=%d SELECTED>%s\n", $v->bnum, $v->sname);
+	 printf("</SELECT>\n");
+      } else {
+	 printf("<INPUT TYPE=hidden NAME=backend VALUE=-1>\n");
+      }
+
+      printf("<INPUT TYPE=submit VALUE=\"%s\">",
+	     _("Search"));
+      printf("&nbsp;|&nbsp;<INPUT TYPE=submit VALUE=\"%s\" NAME=listall>\n",
+             _("List all"));
+      printf("</TD><TD ALIGN=right>\n");
+      printf("<INPUT TYPE=button VALUE=\"%s\" onclick=\"parent.close();\">\n",
+             _("Close window"));
+      printf("</TD></TR></TABLE></FORM>\n");
+   } else
+
+   // Show personal addressbook
+   if($show == "blank" || !empty($listall)) {
+
+      if($backend != -1 || $show == "blank") {
+	 if($show == "blank") 
+	    $backend = $abook->localbackend;
+
+	 //printf("<H3 ALIGN=center>%s</H3>\n", $abook->backends[$backend]->sname);
+
+	 $res = $abook->list_addr($backend);
+
+	 if(is_array($res)) {
+	    display_result($res, false);
+	 } else {
+	    printf("<P ALIGN=center><STRONG>"._("Unable to list addresses from %s").
+		   "</STRONG></P>\n", $abook->backends[$backend]->sname);
+	 }
+
+      } else {
+	 $res = $abook->list_addr();
+	 display_result($res, true);
+      }
+
+   } else
 
 
    // Do the search
    // Do the search
-   if(!empty($query)) {
-      $abook = addressbook_init();
-      $res = $abook->s_search($query);
+   if(!empty($query) && empty($listall)) {
+
+      if($backend == -1) {
+	 $res = $abook->s_search($query);
+      } else {
+	 $res = $abook->s_search($query, $backend);
+      }
 
 
       if(!is_array($res)) {
       if(!is_array($res)) {
 	 printf("<P ALIGN=center><BR>%s:<br>%s</P>\n</BODY></HTML>\n",
 	 printf("<P ALIGN=center><BR>%s:<br>%s</P>\n</BODY></HTML>\n",
@@ -159,28 +251,7 @@ function bcc_address($addr) {
 	 exit;
 	 exit;
       }
       }
 
 
-      // List search results
-      $line = 0;
-      print "<table border=0 width=\"98%\" align=center>";
-      printf("<tr bgcolor=\"$color[9]\"><TH align=left>&nbsp;".
-             "<TH align=left>&nbsp;%s<TH align=left>&nbsp;%s".
-	     "<TH align=left>&nbsp;%s<TH align=left width=\"10%%\">".
-	     "&nbsp;%s</tr>\n",
-             _("Name"), _("E-mail"), _("Info"), _("Source"));
-
-      while(list($key, $row) = each($res)) {
-	 printf("<tr%s nowrap><td nowrap align=center width=\"5%%\">".
-		"<a href=\"javascript:to_address('%s');\">To</A> | ".
-		"<a href=\"javascript:cc_address('%s');\">Cc</A>".
-		"<td nowrap>&nbsp;%s&nbsp;<td nowrap>&nbsp;".
-                "<a href=\"javascript:to_and_close('%s');\">%s</A>&nbsp;".
-		"<td nowrap>&nbsp;%s&nbsp;<td nowrap>&nbsp;%s</tr>\n", 
-		($line % 2) ? " bgcolor=\"$color[0]\"" : "", $row["email"],
-		$row["email"], $row["name"], $row["email"], $row["email"],
-                $row["label"], $row["source"]);
-	 $line++;
-      }
-      print "</TABLE>";
+      display_result($res);
    }
    }
 ?>
 ?>