changeset 290:8ffcb08361bc misc

Various cleanups and improve parameter parsing.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 09 Mar 2015 08:06:03 +0200
parents fb11575b634e
children 8720936884bb
files materials/index.php
diffstat 1 files changed, 118 insertions(+), 71 deletions(-) [+]
line wrap: on
line diff
--- a/materials/index.php	Mon Mar 09 06:17:12 2015 +0200
+++ b/materials/index.php	Mon Mar 09 08:06:03 2015 +0200
@@ -13,80 +13,131 @@
   exit;
 }
 
+function stParseList($values, $pair)
+{
+  $res = array();
+  if ($values === FALSE)
+    return $res;
+
+  // It's an array already
+  if (is_array($values))
+  {
+    if ($pair)
+    {
+      // The data should already be in our desired format .. maybe
+      foreach ($values as $key => $val)
+        $res[trim($key)] = trim($val);
+    }
+    else
+    {
+      // Place values in hash
+      foreach ($values as $key)
+        $res[trim($key)] = 1;
+    }
+    return $res;
+  }
+
+  // Assume string, parse it
+  if (($list = preg_split("/\s*,\s*/", trim($values), -1, PREG_SPLIT_NO_EMPTY)) === FALSE)
+    return $res;
+
+  if ($pair)
+  {
+    // Parse key-value pairs separated by :
+    foreach ($list as $str)
+    {
+      if (($tmp = preg_split("/\s*:\s*/", trim($str), -1, PREG_SPLIT_NO_EMPTY)) !== FALSE)
+        $res[$tmp[0]] = $tmp[1];
+    }
+  }
+  else
+  {
+    // Should be just values, so place them in hash
+    foreach ($list as $str)
+      $res[$str] = 1;
+  }
+  return $res;
+}
+
+
+function stMakeList($name, $url, $array, $pair)
+{
+  if (count($array) == 0)
+    return "";
+
+  $tmp = array();
+  if ($pair)
+  {
+    foreach ($array as $key => $val)
+      $tmp[] = $key.":".$val;
+  }
+  else
+  {
+    foreach ($array as $key => $val)
+      $tmp[] = $key;
+  }
+
+  if ($url)
+    return "&amp;".$name."=".join(",", $tmp);
+  else
+    return stGetFormHiddenInput($name, join(",", $tmp))."\n";
+}
+
+
 // Sorting column
-$sortColumn = intval(stGetRequestItem("s", 0, TRUE));
-$sortDirection = substr(strtolower(stGetRequestItem("d", "", TRUE)), 0, 1) == "d";
+$setSortColumn = intval(stGetRequestItem("s", 0, TRUE));
+$setSortDirection = substr(strtolower(stGetRequestItem("d", "", TRUE)), 0, 1) == "d";
 
 // Material column hiding
-$hideColumns = array();
-if (isset($_GET["h"]) && is_array($_GET["h"]))
-{
-  foreach ($_GET["h"] as $vval)
-    $hideColumns[$vval] = 1;
-}
+$setHideColumns = stParseList(stGetRequestItem("h", FALSE, TRUE), FALSE);
 
 // Column filters
-if (isset($_GET["f"]) && is_array($_GET["f"]))
-  $attrFilters = $_GET["f"];
-else
-  $attrFilters = array();
+$setAttrFilters = stParseList(stGetRequestItem("f", FALSE, TRUE), TRUE);
 
 // Material filters
-if (isset($_GET["m"]) && is_array($_GET["m"]))
-  $matFilters = $_GET["m"];
-else
-  $matFilters = array();
-
-$doMatFilter = intval(stGetRequestItem("mf", 0, TRUE));
+$setMatFilters = stParseList(stGetRequestItem("m", FALSE, TRUE), FALSE);
+$setEnableMatFilters = intval(stGetRequestItem("mf", 0, TRUE));
 
 
 function stGetTC($a, $column)
 {
-  global $sortColumn;
-  return "<".$a.($column == $sortColumn ? " class=\"hilite\"" : "").">";
+  global $setSortColumn;
+  return "<".$a.($column == $setSortColumn ? " class=\"hilite\"" : "").">";
 }
 
 
-function stGetURLStr($cfilters, $col, $dir, $domfilter, $mfilters)
+function stGetURLStr($cfilters, $col, $dir, $domfilters, $mfilters)
 {
-  global $sortDirs, $hideColumns, $doMatFilter;
-
-  $str = "s=".$col."&amp;d=".$sortDirs[$dir]."&amp;mf=".$domfilter;
-
-  foreach ($cfilters as $fkey => $fval)
-    $str .= "&amp;f%5B".$fkey."%5D=".$fval;
-
-  foreach ($hideColumns as $fkey => $fval)
-    $str .= "&amp;h%5B%5D=".$fkey;
-
-  foreach ($mfilters as $fkey => $fval)
-    $str .= "&amp;m%5B".$fkey."%5D=".$fval;
-
+  global $sortDirs, $setHideColumns;
+  $str  = "s=".$col."&amp;d=".$sortDirs[$dir]."&amp;mf=".$domfilters;
+  $str .= stMakeList("f", TRUE, $cfilters, TRUE);
+  $str .= stMakeList("h", TRUE, $setHideColumns, FALSE);
+  $str .= stMakeList("m", TRUE, $mfilters, FALSE);
   return $str;
 }
 
 
 function stSortMatFunc($a, $b)
 {
-  global $sortDirection, $sortColumn;
-  $index = $sortColumn - 1;
+  global $setSortDirection, $setSortColumn;
+  $index = $setSortColumn - 1;
 
   if ($a[$index] == $b[$index])
     return 0;
   
   $res = $a[$index] < $b[$index];
   
-  if ($sortDirection)
+  if ($setSortDirection)
     return $res ? 1 : -1;
   else
     return $res ? -1 : 1;
 }
 
 
-if ($sortColumn <= 0 || $sortColumn >= 18)
+if ($setSortColumn <= 0 || $setSortColumn >= 18)
 {
-  $sortColumn = 0;
-  if ($sortDirection)
+  $setSortColumn = 0;
+  if ($setSortDirection)
     krsort($matTable, SORT_STRING);
   else
     ksort($matTable, SORT_STRING);
@@ -127,15 +178,11 @@
 <form action="<? echo $pageIndex; ?>" method="get">
 <?
 echo
-  stGetFormHiddenInput("s", $sortColumn)."\n".
-  stGetFormHiddenInput("d", $sortDirs[$sortDirection]).
-  stGetFormHiddenInput("mf", $doMatFilter)."\n";
-
-foreach ($attrFilters as $fkey => $fval)
-  echo stGetFormHiddenInput("f[".$fkey."]", $fval)."\n";
-
-foreach ($matFilters as $fkey => $fval)
-  echo stGetFormHiddenInput("m[".$fkey."]", $fval)."\n";
+  stGetFormHiddenInput("s", $setSortColumn)."\n".
+  stGetFormHiddenInput("d", $sortDirs[$setSortDirection])."\n".
+  stGetFormHiddenInput("mf", $setEnableMatFilters)."\n".
+  stMakeList("f", FALSE, $setAttrFilters, TRUE).
+  stMakeList("m", FALSE, $setMatFilters, FALSE);
 ?>
 <table class="optionsTable">
  <tr>
@@ -171,7 +218,7 @@
 while (list($key, $value) = each($transNameTable))
 {
   echo "    <option".
-    (isset($hideColumns[$key]) ? " selected=\"selected\"" : "").
+    (isset($setHideColumns[$key]) ? " selected=\"selected\"" : "").
     " value=\"$key\">".chentities($value)."</option>\n";
 }
 ?>
@@ -180,8 +227,8 @@
   <td>
    <select name="f[14]">
 <?
-$typeFilter = isset($attrFilters[14]) ? $attrFilters[14] : -1;
-if ($typeFilter == -1) unset($attrFilters[14]);
+$typeFilter = isset($setAttrFilters[14]) ? $setAttrFilters[14] : -1;
+if ($typeFilter == -1) unset($setAttrFilters[14]);
 $typeTable = $transTable[14];
 $typeTable[-1] = "EVERYTHING";
 ksort($typeTable);
@@ -201,22 +248,22 @@
 </table>
 </form>
 <?
-if (count($attrFilters) > 0)
+if (count($setAttrFilters) > 0)
 {
   $filters = array();
-  foreach ($attrFilters as $fkey => $fval)
+  foreach ($setAttrFilters as $fkey => $fval)
   if ($fkey >= 0)
     $filters[] = "<b>".strtolower($transNameTable[$fkey + 1])."</b>=".strtolower($transTable[$fkey][$fval]);
 
   echo "<p>Filtering: ".implode(", ", $filters)."</p>\n";
 }
 
-if (count($matFilters) > 0)
+if (count($setMatFilters) > 0)
 {
   echo
-    "<p>Material filter: ".implode(", ", array_keys($matFilters))." ".
-    "<a href=\"?".stGetURLStr($attrFilters, $sortColumn, $sortDirection, !$doMatFilter, $matFilters).
-    "\">[".($doMatFilter ? "Deactivate" : "Activate")."]</a></p>\n";
+    "<p>Material filter: ".implode(", ", array_keys($setMatFilters))." ".
+    "<a href=\"?".stGetURLStr($setAttrFilters, $setSortColumn, $setSortDirection, !$setEnableMatFilters, $setMatFilters).
+    "\">[".($setEnableMatFilters ? "Deactivate" : "Activate")."]</a></p>\n";
 }
 ?>
 <div class="matTable">
@@ -225,16 +272,16 @@
 <?
 foreach ($transNameTable as $key => $value)
 {
-  if ($key == 0 || !isset($hideColumns[$key]))
+  if ($key == 0 || !isset($setHideColumns[$key]))
   {
     echo "  ".stGetTC("th", $key);
     if ($key < 18)
     {
       echo
       "<a href=\"?".
-      stGetURLStr($attrFilters, $key,
-      ($key == $sortColumn) ? !$sortDirection : $sortDirection,
-      $doMatFilter, $matFilters).
+      stGetURLStr($setAttrFilters, $key,
+      ($key == $setSortColumn) ? !$setSortDirection : $setSortDirection,
+      $setEnableMatFilters, $setMatFilters).
       "\">".chentities($value)."</a>";
     }
     else
@@ -248,14 +295,14 @@
 foreach ($matTable as $key => $value)
 {
   $doShow = TRUE;
-  foreach ($attrFilters as $fkey => $fval)
+  foreach ($setAttrFilters as $fkey => $fval)
   if ($fval >= 0 && $value[$fkey] != $fval)
   {
     $doShow = FALSE;
     break;
   }
 
-  if ($doMatFilter && !isset($matFilters[$key]))
+  if ($setEnableMatFilters && !isset($setMatFilters[$key]))
     $doShow = FALSE;
 
   if ($doShow)
@@ -263,7 +310,7 @@
     $col = 0;
 
     // Material filter
-    $tmpFilters = $matFilters;
+    $tmpFilters = $setMatFilters;
     if (isset($tmpFilters[$key]))
       unset($tmpFilters[$key]);
     else
@@ -271,15 +318,15 @@
 
     echo
       " <tr>".stGetTC("td", $col++).
-      "<a class=\"matToggle ".(isset($matFilters[$key]) ? "active" : "inactive").
-      "\" href=\"?".stGetURLStr($attrFilters, $sortColumn, $sortDirection, $doMatFilter, $tmpFilters).
-      "\">".(isset($matFilters[$key]) ? "-" : "+")."</a>".
+      "<a class=\"matToggle ".(isset($setMatFilters[$key]) ? "active" : "inactive").
+      "\" href=\"?".stGetURLStr($setAttrFilters, $setSortColumn, $setSortDirection, $setEnableMatFilters, $tmpFilters).
+      "\">".(isset($setMatFilters[$key]) ? "-" : "+")."</a>".
       "<a href=\"/mat/".urlencode($key)."\">".chentities($key)."</a>".
       "</td>";
     
     foreach ($value as $kkey => $kvalue)
     {
-      if (!isset($hideColumns[$kkey + 1]))
+      if (!isset($setHideColumns[$kkey + 1]))
       {
         echo stGetTC("td", $col);
         if (is_array($kvalue))
@@ -296,14 +343,14 @@
         else
         {
           // A simple entry, just print it out
-          $tmpFilters = $attrFilters;
+          $tmpFilters = $setAttrFilters;
           if (isset($tmpFilters[$kkey]))
             unset($tmpFilters[$kkey]);
           else
             $tmpFilters[$kkey] = $kvalue;
 
           echo "<a href=\"?".
-            stGetURLStr($tmpFilters, $sortColumn, $sortDirection, $doMatFilter, $matFilters).
+            stGetURLStr($tmpFilters, $setSortColumn, $setSortDirection, $setEnableMatFilters, $setMatFilters).
             "\">".chentities($transTable[$kkey][$kvalue])."</a>";
         }
         echo "</td>";