chiark / gitweb /
Added grid view when listing apps in browse repository.
authorHans-Emil Skogh <hansemil@gmail.com>
Sun, 11 Dec 2011 14:34:21 +0000 (15:34 +0100)
committerCiaran Gultnieks <ciaran@ciarang.com>
Tue, 20 Dec 2011 14:45:59 +0000 (14:45 +0000)
Also, the WP plugin will now pass on all of the relevant query arguments via generated links by default.

wp-fdroid/wp-fdroid.php

index 8a79ad6da121ceb14437e8f33228a2650cb9baea..2cd8b98a0c60cdd578b59261c50ac89556822b15 100644 (file)
@@ -16,9 +16,10 @@ class FDroid
 {\r
 \r
     // Our text domain, for internationalisation\r
-    var $textdom='wp-fdroid';\r
+    private $textdom='wp-fdroid';\r
 \r
-    var $site_path = "/home/fdroid/public_html";\r
+    // TODO: Fix site path...\r
+       private $site_path = "/home/hansemil/MyDocuments/f-droid";\r
 \r
     // Constructor\r
     function FDroid() {\r
@@ -34,6 +35,7 @@ class FDroid
         $qvars[]='fdfilter';\r
         $qvars[]='fdid';\r
         $qvars[]='fdpage';\r
+        $qvars[]='fdstyle';\r
         return $qvars;\r
     }\r
 \r
@@ -55,19 +57,6 @@ class FDroid
         return $wp_query->query_vars[$name];\r
     }\r
 \r
-    // Make a link to this page, with the given query parameter string added\r
-    function makelink($params) {\r
-        $link=get_permalink();\r
-        if(strlen($params)==0)\r
-            return $link;\r
-        if(strpos($link,'?')===false)\r
-            $link.='?';\r
-        else\r
-            $link.='&';\r
-        $link.=$params;\r
-        return $link;\r
-    }\r
-\r
     // Handler for the 'fdroidrepo' shortcode.\r
     //  $attribs - shortcode attributes\r
     //  $content - optional content enclosed between the starting and\r
@@ -77,32 +66,37 @@ class FDroid
         global $wp_query,$wp_rewrite;\r
         $this->lazyinit();\r
 \r
-        $page=1;\r
-        if(isset($wp_query->query_vars['fdpage'])) {\r
-            $page=(int)$wp_query->query_vars['fdpage'];\r
-            if($page==0)\r
-                $page=1;\r
-        }\r
-\r
-        $filter=$wp_query->query_vars['fdfilter'];\r
-        $fdid=$wp_query->query_vars['fdid'];\r
-\r
-        if($fdid!==null)\r
-            $out=$this->get_app($fdid);\r
+               \r
+               // Init local query vars\r
+               foreach($this->queryvars(array()) as $qv) {\r
+                       if(array_key_exists($qv,$wp_query->query_vars)) {\r
+                               $query_vars[$qv] = $wp_query->query_vars[$qv];\r
+                       } else {\r
+                               $query_vars[$qv] = null;\r
+                       }\r
+               }\r
+       \r
+               // Santiy check query vars\r
+               if(!isset($query_vars['fdpage']) || !is_numeric($query_vars['fdpage']) || $query_vars['fdpage'] <= 0) {\r
+                       $query_vars['fdpage'] = 1;\r
+               }\r
+\r
+        if($query_vars['fdid']!==null)\r
+            $out=$this->get_app($query_vars);\r
         else\r
-            $out=$this->get_apps($page,$filter);\r
+            $out=$this->get_apps($query_vars);\r
         return $out;\r
 \r
     }\r
 \r
 \r
-    function get_app($id) {\r
+    function get_app($query_vars) {\r
 \r
         $xml = simplexml_load_file($this->site_path."/repo/index.xml");\r
         foreach($xml->children() as $app) {\r
 \r
             $attrs=$app->attributes();\r
-            if($attrs['id']==$id) {\r
+            if($attrs['id']==$query_vars['fdid']) {\r
                 $apks=array();;\r
                 foreach($app->children() as $el) {\r
                     switch($el->getName()) {\r
@@ -199,7 +193,7 @@ class FDroid
                     $out.="</p>";\r
                 }\r
 \r
-                $out.='<hr><p><a href="'.$this->makelink("").'">Index</a></p>';\r
+                $out.='<hr><p><a href="'.makelink($query_vars,array('fdid'=>null)).'">Index</a></p>';\r
 \r
                 return $out;\r
             }\r
@@ -208,98 +202,217 @@ class FDroid
     }\r
 \r
 \r
-    function get_apps($page,$filter=null) {\r
+    function get_apps($query_vars) {\r
+\r
+               $out='';\r
 \r
-        if($filter===null)\r
-            $out="<p>All applications";\r
+               $out.='<div style="float:left;">';\r
+        if($query_vars['fdfilter']===null)\r
+            $out.="All applications";\r
         else\r
-            $out="<p>Applications matching ".$filter;\r
-        $out.="</p>";\r
+            $out.="Applications matching ".$query_vars['fdfilter'];\r
+        $out.="</div>";\r
+\r
+               $out.='<div style="float:right;">';\r
+            $out.='<a href="'.makelink($query_vars, array('fdstyle'=>'list','fdpage'=>'1')).'">List</a> | ';\r
+            $out.='<a href="'.makelink($query_vars, array('fdstyle'=>'grid','fdpage'=>'1')).'">Grid</a>';\r
+        $out.='</div>';\r
+\r
+        $out.='<br break="all"/>';\r
+\r
+        $xml = simplexml_load_file($this->site_path."/repo/index.xml");\r
+               $out.=$this->show_apps($xml,$query_vars,$numpages);\r
+\r
+        $out.='<hr><p>';\r
+        if($query_vars['fdpage']==1) {\r
+            $out.="&lt;&lt;first ";\r
+            $out.="&lt;prev ";\r
+        } else {\r
+            $out.='<a href="'.makelink($query_vars, array('fdpage'=>1)).'">&lt;&lt;first</a> ';\r
+            $out.='<a href="'.makelink($query_vars, array('fdpage'=>($query_vars['fdpage']-1))).'">&lt;&lt;prev</a> ';\r
+        }\r
+        $out.=' Page '.$query_vars['fdpage'].' of '.$numpages.' ';\r
+        if($query_vars['fdpage']==$numpages) {\r
+            $out.="next&gt; ";\r
+            $out.="last&gt;&gt; ";\r
+        } else {\r
+            $out.='<a href="'.makelink($query_vars, array('fdpage'=>($query_vars['fdpage']+1))).'">next&gt;</a> ';\r
+            $out.='<a href="'.makelink($query_vars, array('fdpage'=>$numpages)).'">last&gt;&gt;</a> ';\r
+        }\r
+        $out.='</p>';\r
+\r
+        return $out;\r
+    }\r
 \r
-        $perpage=30;\r
+\r
+    function show_apps($xml,$query_vars,&$numpages) {\r
+       \r
         $skipped=0;\r
         $got=0;\r
         $total=0;\r
 \r
-        $xml = simplexml_load_file($this->site_path."/repo/index.xml");\r
+               if($query_vars['fdstyle']=='grid') {\r
+                       $outputter = new FDOutGrid();\r
+               } else {\r
+                       $outputter = new FDOutList();\r
+               }\r
+               \r
+               $out = "";\r
+               \r
+               $out.=$outputter->outputStart();\r
+               \r
         foreach($xml->children() as $app) {\r
 \r
             if($app->getName() == 'repo') continue;\r
-            $attrs=$app->attributes();\r
-            $id=$attrs['id'];\r
+            $appinfo['attrs']=$app->attributes();\r
+            $appinfo['id']=$appinfo['attrs']['id'];\r
             foreach($app->children() as $el) {\r
                 switch($el->getName()) {\r
                     case "name":\r
-                        $name=$el;\r
+                        $appinfo['name']=$el;\r
                         break;\r
                     case "icon":\r
-                        $icon=$el;\r
+                        $appinfo['icon']=$el;\r
                         break;\r
                     case "summary":\r
-                        $summary=$el;\r
+                        $appinfo['summary']=$el;\r
                         break;\r
                     case "license":\r
-                        $license=$el;\r
+                        $appinfo['license']=$el;\r
                         break;\r
                 }\r
             }\r
 \r
-            if($filter===null || stristr($name,$filter)) {\r
-                if($skipped<($page-1)*$perpage) {\r
+            if($query_vars['fdfilter']===null || stristr($appinfo['name'],$query_vars['fdfilter'])) {\r
+                if($skipped<($query_vars['fdpage']-1)*$outputter->perpage) {\r
                     $skipped++;\r
-                } else if($got<$perpage) {\r
-\r
-                    $out.="<hr>\n";\r
-                    $out.='<div id="appheader">';\r
-\r
-                    $out.='<div style="float:left;padding-right:10px;"><img src="http://f-droid.org/repo/icons/'.$icon.'" style="width:48px;"></div>';\r
-\r
-                    $out.='<div style="float:right;">';\r
-                    $out.='<p><a href="';\r
-                    $out.=$this->makelink("fdid=".$id);\r
-                    $out.='">Details...</a>';\r
-                    $out.="</p>";\r
-                    $out.="</div>\n";\r
-\r
-                    $out.='<p><span style="font-size:20px">'.$name."</span>";\r
-                    $out.="<br>".$summary."</p>\n";\r
-\r
-                    $out.="</div>\n";\r
+                } else if($got<$outputter->perpage) {\r
 \r
+                                       $out.=$outputter->outputEntry($query_vars, $appinfo);\r
                     $got++;\r
                 }\r
                 $total++;\r
             }\r
 \r
         }\r
+               \r
+               $out.=$outputter->outputEnd();\r
+               \r
+               $numpages = ceil((float)$total/$outputter->perpage);\r
+               \r
+               return $out;\r
+       }\r
+}\r
 \r
-        $numpages=ceil((float)$total/$perpage);\r
-\r
-        $out.='<hr><p>';\r
-        if($page==1) {\r
-            $out.="&lt;&lt;first ";\r
-            $out.="&lt;prev ";\r
-        } else {\r
-            $out.='<a href="'.$this->makelink("fdpage=1").'">&lt;&lt;first</a> ';\r
-            $out.='<a href="'.$this->makelink("fdpage=".($page-1)).'">&lt;&lt;prev</a> ';\r
-        }\r
-        $out.=" Page $page of $numpages ";\r
-        if($page==$numpages) {\r
-            $out.="next&gt; ";\r
-            $out.="last&gt;&gt; ";\r
-        } else {\r
-            $out.='<a href="'.$this->makelink("fdpage=".($page+1)).'">next&gt;</a> ';\r
-            $out.='<a href="'.$this->makelink("fdpage=".$numpages).'">last&gt;&gt;</a> ';\r
-        }\r
-        $out.='</p>';\r
-\r
-        return $out;\r
-    }\r
+// Class to output app entries in a detailed list format\r
+class FDOutList\r
+{\r
+       var $perpage=30;\r
+\r
+       function FDOutList() {\r
+       }\r
+\r
+       function outputStart() {\r
+               return '';\r
+       }\r
+       \r
+       function outputEntry($query_vars, $appinfo) {\r
+               $out="";\r
+               $out.="<hr>\n";\r
+               $out.='<div id="appheader">';\r
+\r
+               $out.='<div style="float:left;padding-right:10px;"><img src="http://f-droid.org/repo/icons/'.$appinfo['icon'].'" style="width:48px;"></div>';\r
+\r
+               $out.='<div style="float:right;">';\r
+               $out.='<p><a href="';\r
+               $out.=makelink($query_vars, array('fdid'=>$appinfo['id']));\r
+               $out.='">Details...</a>';\r
+               $out.="</p>";\r
+               $out.="</div>\n";\r
+\r
+               $out.='<p><span style="font-size:20px">'.$appinfo['name']."</span>";\r
+               $out.="<br>".$appinfo['summary']."</p>\n";\r
+\r
+               $out.="</div>\n";\r
+               \r
+               return $out;\r
+       }\r
+\r
+       function outputEnd() {\r
+               return '';\r
+       }\r
+}\r
 \r
+// Class to output app entries in a compact grid format\r
+class FDOutGrid\r
+{\r
+       var $perpage=80;\r
+\r
+       var $itemCount = 0;\r
+\r
+       function FDOutGrid() {\r
+       }\r
+\r
+       function outputStart() {\r
+               return "\n".'<table border="0" width="100%"><tr>'."\n";\r
+       }\r
+       \r
+       function outputEntry($query_vars, $appinfo) {\r
+               $link=makelink($query_vars, array('fdid'=>$appinfo['id']));\r
+\r
+               $out='';\r
+\r
+               if($this->itemCount%4 == 0 && $this->itemCount > 0)\r
+               {\r
+                       $out.='</tr><tr>'."\n";\r
+               }\r
+\r
+               $out.='<td align="center" valign="top" style="background-color:#F8F8F8;">';\r
+               $out.='<p>';\r
+               $out.='<div id="appheader" style="text-align:center;width:110px;">';\r
+\r
+               $out.='<a href="'.$link.'" style="border-bottom-style:none;">';\r
+               $out.='<img src="http://f-droid.org/repo/icons/'.$appinfo['icon'].'" style="width:48px;border-width:0;padding-top:5px;padding-bottom:5px;"><br/>';\r
+               $out.=$appinfo['name'].'<br/>';\r
+               $out.='</a>';\r
+\r
+               $out.="</div>";\r
+               $out.='</p>';\r
+               $out.="</td>\n";\r
+               \r
+               $this->itemCount++;\r
+               return $out;\r
+       }\r
+\r
+       function outputEnd() {\r
+               return '</tr></table>'."\n";\r
+       }\r
+}\r
 \r
+// Make a link to this page, with the current query vars attached and desired params added/modified\r
+function makelink($query_vars, $params=array()) {\r
+       $link=get_permalink();\r
+       $vars=linkify(array_merge($query_vars, $params));\r
+       if(strlen($vars)==0)\r
+               return $link;\r
+       if(strpos($link,'?')===false)\r
+               $link.='?';\r
+       else\r
+               $link.='&';\r
+       return $link.$vars;\r
+}\r
 \r
+// Return the key value pairs in http-get-parameter format as a string\r
+function linkify($vars) {\r
+       $retvar = '';\r
+       foreach($vars as $k => $v) {\r
+               if($k!==null && $v!==null && $v!='')\r
+                       $retvar .= $k.'='.$v.'&';\r
+       }\r
+       return substr($retvar,0,-1);\r
 }\r
 \r
+\r
 $wp_fdroid = new FDroid();\r
 \r
 \r