Fix accent sensitivity in autocompletion
[platal.git] / classes / plset.php
index d2267d0..2338706 100644 (file)
@@ -86,6 +86,27 @@ class PlSet
         return $it;
     }
 
+    public function args()
+    {
+        $get = $_GET;
+        unset($get['n']);
+        return $get;
+    }
+
+    protected function encodeArgs(array $args, $encode = false)
+    {
+        $qs = '?';
+        $sep = '&';
+        foreach ($args as $k=>$v) {
+            if (!$encode) {
+                $k = urlencode($k);
+                $v = urlencode($v);
+            }
+            $qs .= "$k=$v$sep";
+        }
+        return $encode ? urlencode($qs) : $qs;
+    }
+
     public function &get($fields, $joins, $where, $groupby, $order, $limitcount = null, $limitfrom = null)
     {
         if (!is_null($limitcount)) {
@@ -95,7 +116,6 @@ class PlSet
             $limitcount = "LIMIT $limitcount";
         }
         $joins  = $this->joins . ' ' . $joins;
-        $where  = $where;
         if (trim($this->where)) {
             if (trim($where)) {
                 $where .= ' AND ';
@@ -117,7 +137,8 @@ class PlSet
     {
         $view = strtolower($view);
         if (!$view || !class_exists($view . 'View') || !isset($this->mods[$view])) {
-            $view = $this->default ? $this->default : $this->mods[0];
+            reset($this->mods);
+            $view = $this->default ? $this->default : key($this->mods);
         }
         $this->mod = $view;
         $class = $view . 'View';
@@ -138,10 +159,16 @@ class PlSet
         if (is_null($view)) {
             return false;
         }
+        $args = $view->args();
+        if (!isset($args['rechercher'])) {
+            $args['rechercher'] = 'Chercher';
+        }
         $page->changeTpl('core/plset.tpl');
         $page->assign('plset_base', $baseurl);
         $page->assign('plset_mods', $this->mods);
         $page->assign('plset_mod', $this->mod);
+        $page->assign('plset_search', $this->encodeArgs($args));
+        $page->assign('plset_search_enc', $this->encodeArgs($args, true));
         foreach ($this->modParams[$this->mod] as $param=>$value) {
             $page->assign($this->mod . '_' . $param, $value);
         }
@@ -155,6 +182,7 @@ interface PlView
 {
     public function __construct(PlSet &$set, $data, array $params);
     public function apply(PlatalPage &$page);
+    public function args();
 }
 
 abstract class MultipageView implements PlView
@@ -165,10 +193,12 @@ abstract class MultipageView implements PlView
     public $page   = 1;
     public $offset = 0;
 
-    protected $order  = array();
     protected $entriesPerPage = 20;
     protected $params = array();
 
+    protected $sortkeys = array();
+    protected $defaultkey = null;
+
     public function __construct(PlSet &$set, $data, array $params)
     {
         $this->set   =& $set;
@@ -192,20 +222,41 @@ abstract class MultipageView implements PlView
         return null;
     }
 
+    protected function addSortKey($name, array $keys, $desc, $default = false)
+    {
+        $this->sortkeys[$name] = array('keys' => $keys, 'desc' => $desc);
+        if (!$this->defaultkey || $default) {
+            $this->defaultkey = $name;
+        }
+    }
+
     public function order()
     {
-        foreach ($this->order as &$item) {
-            if ($item{0} == '-') {
-                $item = substr($item, 1) . ' DESC';
+        $order = Env::v('order', $this->defaultkey);
+        $invert = ($order{0} == '-');
+        if ($invert) {
+            $order = substr($order, 1);
+        }
+        $list = array();
+        foreach ($this->sortkeys[$order]['keys'] as $item) {
+            $desc = ($item{0} == '-');
+            if ($desc) {
+                $item = substr($item, 1);
             }
+            if ($desc xor $invert) {
+                $item .= ' DESC';
+            }
+            $list[] = $item;
         }
-        return implode(', ', $this->order);
+        return implode(', ', $list);
     }
 
     abstract public function templateName();
 
     public function apply(PlatalPage &$page)
     {
+        $page->assign('order', Env::v('order', $this->defaultkey));
+        $page->assign('orders', $this->sortkeys);
         $page->assign_by_ref('plview', $this);
         $page->assign_by_ref('set',
                              $this->set->get($this->fields(),
@@ -217,9 +268,16 @@ abstract class MultipageView implements PlView
                                              $this->offset));
         $count = $this->set->count();
         $this->pages = intval(ceil($count / $this->entriesPerPage));
-
         return 'include/plview.multipage.tpl';
     }
+
+    public function args()
+    {
+        $list = $this->set->args();
+        unset($list['page']);
+        unset($list['order']);
+        return $list;
+    }
 }
 
 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: