aa5bfa68b46761347058974391becca578989de5
2 /***************************************************************************
3 * Copyright (C) 2003-2007 Polytechnique.org *
4 * http://opensource.polytechnique.org/ *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the Free Software *
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
20 ***************************************************************************/
22 /** UserSet is a light-weight Model/View tool for displaying a set of items
27 private $groupby = null
;
28 private $joins = null
;
29 private $where = null
;
31 private $count = null
;
33 private $mods = array();
34 private $modParams = array();
36 private $default = null
;
38 public function __construct($from, $joins = '', $where = '', $groupby = '')
41 $this->joins
= $joins;
42 $this->where
= $where;
43 $this->groupby
= $groupby;
46 public function addMod($name, $description, $default = false
, array $params = array())
48 $name = strtolower($name);
49 $this->mods
[$name] = $description;
50 $this->modParams
[$name] = $params;
52 $this->default = $name;
56 public function rmMod($name)
58 $name = strtolower($name);
59 unset($this->mods
[$name]);
62 private function &query($fields, $from, $joins, $where, $groupby, $order, $limit)
65 $order = "ORDER BY $order";
68 $where = "WHERE $where";
71 $groupby = "GROUP BY $groupby";
73 $query = "SELECT SQL_CALC_FOUND_ROWS
83 $it = XDB
::iterator($query);
84 $count = XDB
::query('SELECT FOUND_ROWS()');
85 $this->count
= intval($count->fetchOneCell());
89 public function args()
96 protected function encodeArgs(array $args, $encode = false
)
99 $sep = $encode ?
'&' : '&';
100 foreach ($args as $k=>$v) {
107 return $encode ?
urlencode($qs) : $qs;
110 public function &get($fields, $joins, $where, $groupby, $order, $limitcount = null
, $limitfrom = null
)
112 if (!is_null($limitcount)) {
113 if (!is_null($limitfrom)) {
114 $limitcount = "$limitfrom,$limitcount";
116 $limitcount = "LIMIT $limitcount";
118 $joins = $this->joins
. ' ' . $joins;
120 if (trim($this->where
)) {
124 $where .= $this->where
;
127 $groupby = $this->groupby
;
129 return $this->query($fields, $this->from
, $joins, $where, $groupby, $order, $limitcount);
132 public function count()
137 private function &buildView($view, $data)
139 $view = strtolower($view);
140 if (!$view ||
!class_exists($view . 'View') ||
!isset($this->mods
[$view])) {
141 $view = $this->default ?
$this->default : $this->mods
[0];
144 $class = $view . 'View';
145 if (!class_exists($class)) {
148 $view = new $class($this, $data, $this->modParams
[$this->mod
]);
149 if (!$view instanceof PlView
) {
156 public function apply($baseurl, PlatalPage
&$page, $view = null
, $data = null
)
158 $view =& $this->buildView($view, $data);
159 if (is_null($view)) {
162 $args = $view->args();
163 $page->changeTpl('core/plset.tpl');
164 $page->assign('plset_base', $baseurl);
165 $page->assign('plset_mods', $this->mods
);
166 $page->assign('plset_mod', $this->mod
);
167 $page->assign('plset_search', $this->encodeArgs($args));
168 $page->assign('plset_search_enc', $this->encodeArgs($args, true
));
169 foreach ($this->modParams
[$this->mod
] as $param=>$value) {
170 $page->assign($this->mod
. '_' . $param, $value);
172 $page->assign('plset_content', $view->apply($page));
173 $page->assign('plset_count', $this->count
);
180 public function __construct(PlSet
&$set, $data, array $params);
181 public function apply(PlatalPage
&$page);
182 public function args();
185 abstract class MultipageView
implements PlView
193 protected $entriesPerPage = 20;
194 protected $params = array();
196 protected $sortkeys = array();
197 protected $defaultkey = null
;
199 public function __construct(PlSet
&$set, $data, array $params)
202 $this->page
= Env
::i('page', 1);
203 $this->offset
= $this->entriesPerPage
* ($this->page
- 1);
204 $this->params
= $params;
207 public function joins()
212 public function where()
217 public function groupBy()
222 protected function addSortKey($name, array $keys, $desc, $default = false
)
224 $this->sortkeys
[$name] = array('keys' => $keys, 'desc' => $desc);
225 if (!$this->defaultkey ||
$default) {
226 $this->defaultkey
= $name;
230 public function order()
232 $order = Env
::v('order', $this->defaultkey
);
233 $invert = ($order{0} == '-');
235 $order = substr($order, 1);
238 foreach ($this->sortkeys
[$order]['keys'] as $item) {
239 $desc = ($item{0} == '-');
241 $item = substr($item, 1);
243 if ($desc xor $invert) {
248 return implode(', ', $list);
251 abstract public function templateName();
253 public function apply(PlatalPage
&$page)
255 $page->assign('order', Env
::v('order', $this->defaultkey
));
256 $page->assign('orders', $this->sortkeys
);
257 $page->assign_by_ref('plview', $this);
258 $page->assign_by_ref('set',
259 $this->set
->get($this->fields(),
264 $this->entriesPerPage
,
266 $count = $this->set
->count();
267 $this->pages
= intval(ceil($count / $this->entriesPerPage
));
268 return 'include/plview.multipage.tpl';
271 public function args()
273 $list = $this->set
->args();
274 unset($list['page']);
275 unset($list['order']);
280 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: