1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
21: defined('XOOPS_ROOT_PATH') || exit('Restricted access');
22:
23: 24: 25: 26: 27: 28: 29:
30: class CriteriaElement
31: {
32: 33: 34: 35: 36:
37: public $order = 'ASC';
38:
39: 40: 41: 42:
43: public $sort = '';
44:
45: 46: 47: 48: 49:
50: public $limit = 0;
51:
52: 53: 54: 55: 56:
57: public $start = 0;
58:
59: 60: 61: 62:
63: public $groupby = '';
64:
65: 66: 67:
68: public function __construct()
69: {
70: }
71:
72: 73: 74: 75:
76: public function render()
77: {
78: }
79:
80: 81: 82: 83:
84: public function setSort($sort)
85: {
86: $this->sort = $sort;
87: }
88:
89: 90: 91: 92:
93: public function getSort()
94: {
95: return $this->sort;
96: }
97:
98: 99: 100: 101:
102: public function setOrder($order)
103: {
104: if ('DESC' === strtoupper($order)) {
105: $this->order = 'DESC';
106: }
107: }
108:
109: 110: 111: 112:
113: public function getOrder()
114: {
115: return $this->order;
116: }
117:
118: 119: 120: 121:
122: public function setLimit($limit = 0)
123: {
124: $this->limit = (int)$limit;
125: }
126:
127: 128: 129: 130:
131: public function getLimit()
132: {
133: return $this->limit;
134: }
135:
136: 137: 138: 139:
140: public function setStart($start = 0)
141: {
142: $this->start = (int)$start;
143: }
144:
145: 146: 147: 148:
149: public function getStart()
150: {
151: return $this->start;
152: }
153:
154: 155: 156: 157:
158: public function setGroupBy($group)
159: {
160: $this->groupby = $group;
161: }
162:
163: 164: 165: 166:
167: public function getGroupby()
168: {
169: return $this->groupby ? " GROUP BY {$this->groupby}" : '';
170: }
171: 172: 173:
174: }
175:
176: 177: 178: 179:
180: class CriteriaCompo extends CriteriaElement
181: {
182: 183: 184: 185: 186:
187: public $criteriaElements = array();
188:
189: 190: 191: 192: 193:
194: public $conditions = array();
195:
196: 197: 198: 199: 200: 201:
202: public function __construct(CriteriaElement $ele = null, $condition = 'AND')
203: {
204: if (isset($ele)) {
205: $this->add($ele, $condition);
206: }
207: }
208:
209: 210: 211: 212: 213: 214: 215:
216: public function &add(CriteriaElement $criteriaElement, $condition = 'AND')
217: {
218: if (is_object($criteriaElement)) {
219: $this->criteriaElements[] =& $criteriaElement;
220: $this->conditions[] = $condition;
221: }
222:
223: return $this;
224: }
225:
226: 227: 228: 229: 230:
231: public function render()
232: {
233: $ret = '';
234: $count = count($this->criteriaElements);
235: if ($count > 0) {
236: $render_string = $this->criteriaElements[0]->render();
237: for ($i = 1; $i < $count; ++$i) {
238: if (!$render = $this->criteriaElements[$i]->render()) {
239: continue;
240: }
241: $render_string .= (empty($render_string) ? '' : ' ' . $this->conditions[$i] . ' ') . $render;
242: }
243: $ret = empty($render_string) ? '' : "({$render_string})";
244: }
245:
246: return $ret;
247: }
248:
249: 250: 251: 252: 253:
254: public function renderWhere()
255: {
256: $ret = $this->render();
257: $ret = ($ret != '') ? 'WHERE ' . $ret : $ret;
258:
259: return $ret;
260: }
261:
262: 263: 264: 265: 266: 267:
268: public function renderLdap()
269: {
270: $retval = '';
271: $count = count($this->criteriaElements);
272: if ($count > 0) {
273: $retval = $this->criteriaElements[0]->renderLdap();
274: for ($i = 1; $i < $count; ++$i) {
275: $cond = strtoupper($this->conditions[$i]);
276: $op = ($cond === 'OR') ? '|' : '&';
277: $retval = "({$op}{$retval}" . $this->criteriaElements[$i]->renderLdap() . ')';
278: }
279: }
280:
281: return $retval;
282: }
283: }
284:
285: 286: 287: 288:
289: class Criteria extends CriteriaElement
290: {
291: 292: 293: 294:
295: public $prefix;
296: public $function;
297: public $column;
298: public $operator;
299: public $value;
300:
301: 302: 303: 304: 305: 306: 307: 308: 309:
310: public function __construct($column, $value = '', $operator = '=', $prefix = '', $function = '')
311: {
312: $this->prefix = $prefix;
313: $this->function = $function;
314: $this->column = $column;
315: $this->value = $value;
316: $this->operator = $operator;
317: }
318:
319: 320: 321: 322: 323:
324: public function render()
325: {
326: $clause = (!empty($this->prefix) ? "{$this->prefix}." : '') . $this->column;
327: if (!empty($this->function)) {
328: $clause = sprintf($this->function, $clause);
329: }
330: if (in_array(strtoupper($this->operator), array('IS NULL', 'IS NOT NULL'))) {
331: $clause .= ' ' . $this->operator;
332: } else {
333: if ('' === ($value = trim($this->value))) {
334: return '';
335: }
336: if (!in_array(strtoupper($this->operator), array('IN', 'NOT IN'))) {
337: if ((substr($value, 0, 1) !== '`') && (substr($value, -1) !== '`')) {
338: $value = "'{$value}'";
339: } elseif (!preg_match('/^[a-zA-Z0-9_\.\-`]*$/', $value)) {
340: $value = '``';
341: }
342: }
343: $clause .= " {$this->operator} {$value}";
344: }
345:
346: return $clause;
347: }
348:
349: 350: 351: 352: 353: 354:
355: public function renderLdap()
356: {
357: if ($this->operator === '>') {
358: $this->operator = '>=';
359: }
360: if ($this->operator === '<') {
361: $this->operator = '<=';
362: }
363:
364: if ($this->operator === '!=' || $this->operator === '<>') {
365: $operator = '=';
366: $clause = '(!(' . $this->column . $operator . $this->value . '))';
367: } else {
368: if ($this->operator === 'IN') {
369: $newvalue = str_replace(array('(', ')'), '', $this->value);
370: $tab = explode(',', $newvalue);
371: foreach ($tab as $uid) {
372: $clause .= "({$this->column}={$uid})";
373: }
374: $clause = '(|' . $clause . ')';
375: } else {
376: $clause = '(' . $this->column . $this->operator . $this->value . ')';
377: }
378: }
379:
380: return $clause;
381: }
382:
383: 384: 385: 386: 387:
388: public function renderWhere()
389: {
390: $cond = $this->render();
391:
392: return empty($cond) ? '' : "WHERE {$cond}";
393: }
394: }
395: