1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
15:
16: defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.');
17:
18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
45: class cArticleCollector implements SeekableIterator, Countable {
46:
47: 48: 49: 50: 51:
52: protected $_options = array();
53:
54: 55: 56: 57: 58:
59: protected $_articles = array();
60:
61: 62: 63: 64: 65:
66: protected $_pages = array();
67:
68: 69: 70: 71: 72:
73: protected $_startArticles = array();
74:
75: 76: 77: 78: 79:
80: protected $_currentPosition = 0;
81:
82: 83: 84: 85: 86: 87: 88:
89: public function __construct($options = array()) {
90: if (count($options) > 0) {
91: $this->setOptions($options);
92: $this->loadArticles();
93: }
94: }
95:
96: 97: 98: 99: 100: 101:
102: public function setOptions($options) {
103: if (isset($options['idcat']) && !isset($options['categories'])) {
104: $options['categories'] = array(
105: $options['idcat']
106: );
107: }
108:
109: if (isset($options['categories']) === false) {
110: $options['categories'] = array();
111: }
112:
113: if (isset($options['lang']) === false) {
114: $options['lang'] = cRegistry::getLanguageId();
115: }
116:
117: if (isset($options['client']) === false) {
118: $options['client'] = cRegistry::getClientId();
119: }
120:
121: if (isset($options['start']) === false) {
122: $options['start'] = false;
123: }
124:
125: if (isset($options['startonly']) === false) {
126: $options['startonly'] = false;
127: }
128:
129: if (isset($options['offline']) === false) {
130: $options['offline'] = false;
131: }
132:
133: if (isset($options['offlineonly']) === false) {
134: $options['offlineonly'] = false;
135: }
136:
137: switch ($options['order']) {
138: case 'sortsequence':
139: $options['order'] = 'artsort';
140: break;
141:
142: case 'modificationdate':
143: $options['order'] = 'lastmodified';
144: break;
145:
146: case 'publisheddate':
147: $options['order'] = 'published';
148: break;
149:
150: case 'creationdate':
151: default:
152: $options['order'] = 'created';
153: break;
154: }
155:
156: if (isset($options['artspecs']) === false) {
157: $options['artspecs'] = array();
158: }
159:
160: if (isset($options['direction']) === false) {
161: $options['direction'] = 'DESC';
162: }
163:
164: if (isset($options['limit']) === false) {
165: $options['limit'] = 0;
166: }
167:
168: $this->_options = $options;
169: }
170:
171: 172: 173: 174: 175:
176: public function loadArticles() {
177: $this->_articles = array();
178:
179: $cfg = cRegistry::getConfig();
180:
181: $sqlCat = (count($this->_options['categories']) > 0) ? " idcat IN ('" . implode("','", $this->_options['categories']) . "') AND " : '';
182:
183: $db = cRegistry::getDb();
184: $sql = "SELECT startidartlang, idcat FROM " . $cfg['tab']['cat_lang'] . " WHERE " . $sqlCat . " idlang=" . $this->_options['lang'];
185: $db->query($sql);
186:
187: while ($db->nextRecord()) {
188: $startId = $db->f('startidartlang');
189: if ($startId > 0) {
190: $this->_startArticles[$db->f('idcat')] = $startId;
191: if ($this->_options['startonly'] == true) {
192: $this->_articles[] = new cApiArticleLanguage($startId);
193: }
194: }
195: }
196:
197: if (count($this->_articles) > 0) {
198: return;
199: }
200:
201: $sqlCat = (count($this->_options['categories']) > 0) ? " c.idcat IN ('" . implode("','", $this->_options['categories']) . "') AND b.idart = c.idart AND " : '';
202: $sqlArtSpecs = (count($this->_options['artspecs']) > 0) ? " a.artspec IN ('" . implode("','", $this->_options['artspecs']) . "') AND " : '';
203:
204: if ($this->_options['start'] == false && count($this->_startArticles) > 0) {
205: $sqlStartArticles = "a.idartlang NOT IN ('" . implode("','", $this->_startArticles) . "') AND ";
206: }
207:
208: $sql = "SELECT DISTINCT a.idartlang FROM " . $cfg['tab']['art_lang'] . " AS a, " . $cfg['tab']['art'] . " AS b, " . $cfg['tab']['cat_art'] . " AS c " . " WHERE " . $sqlCat . $sqlStartArticles . $sqlArtSpecs . "b.idclient = '" . $this->_options['client'] . "' AND " . "a.idlang = '" . $this->_options['lang'] . "' AND " . "a.idart = b.idart";
209:
210: if ($this->_options['offlineonly'] == true) {
211: $sql .= " AND a.online = 0";
212: } elseif ($this->_options['offline'] == false) {
213: $sql .= " AND a.online = 1";
214: }
215:
216: $sql .= " ORDER BY a." . $this->_options['order'] . " " . $this->_options['direction'];
217:
218: if ((int) $this->_options['limit'] > 0) {
219: $sql .= " LIMIT " . $this->_options['limit'];
220: }
221:
222: $db->query($sql);
223:
224: while ($db->nextRecord()) {
225: $artLangId = $db->f('idartlang');
226: $this->_articles[] = new cApiArticleLanguage($artLangId);
227: }
228: }
229:
230: 231: 232: 233: 234: 235: 236:
237: public function startArticle() {
238: if (count($this->_startArticles) != 1) {
239: throw new cBadMethodCallException("Can not load start article due to multiple loaded start articles.");
240: }
241:
242: return new cApiArticleLanguage(current($this->_startArticles));
243: }
244:
245: 246: 247: 248: 249: 250:
251: public function nextArticle() {
252: $next = $this->current();
253: $this->next();
254:
255: if ($next instanceof cApiArticleLanguage) {
256: return $next;
257: }
258:
259: return false;
260: }
261:
262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274:
275: public function setResultPerPage($resPerPage) {
276: if ($resPerPage > 0) {
277: if (is_array($this->_articles)) {
278: $this->_pages = array_chunk($this->_articles, $resPerPage);
279: } else {
280: $this->_pages = array();
281: }
282: }
283: }
284:
285: 286: 287: 288: 289: 290: 291: 292: 293:
294: public function setPage($page) {
295: if (is_array($this->_pages[$page])) {
296: $this->_articles = $this->_pages[$page];
297: }
298: }
299:
300: 301: 302: 303: 304: 305:
306: public function seek($position) {
307: $this->_currentPosition = $position;
308:
309: if ($this->valid() === false) {
310: throw new cOutOfBoundsException("Invalid seek position: " . $position);
311: }
312: }
313:
314: 315: 316:
317: public function rewind() {
318: $this->_currentPosition = 0;
319: }
320:
321: 322: 323: 324: 325:
326: public function current() {
327: return $this->_articles[$this->_currentPosition];
328: }
329:
330: 331: 332: 333: 334:
335: public function key() {
336: return $this->_currentPosition;
337: }
338:
339: 340: 341:
342: public function next() {
343: ++$this->_currentPosition;
344: }
345:
346: 347: 348: 349: 350:
351: public function valid() {
352: return isset($this->_articles[$this->_currentPosition]);
353: }
354:
355: 356: 357: 358: 359: 360:
361: public function count() {
362: return count($this->_articles);
363: }
364:
365: }