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: $this->setOptions($options);
91: $this->loadArticles();
92: }
93:
94: 95: 96: 97: 98: 99:
100: public function setOptions($options) {
101: if (isset($options['idcat']) && !isset($options['categories'])) {
102: $options['categories'] = array(
103: $options['idcat']
104: );
105: }
106:
107: if (isset($options['categories']) === false) {
108: $options['categories'] = array();
109: }
110:
111: if (isset($options['lang']) === false) {
112: $options['lang'] = cRegistry::getLanguageId();
113: }
114:
115: if (isset($options['client']) === false) {
116: $options['client'] = cRegistry::getClientId();
117: }
118:
119: if (isset($options['start']) === false) {
120: $options['start'] = false;
121: }
122:
123: if (isset($options['startonly']) === false) {
124: $options['startonly'] = false;
125: }
126:
127: if (isset($options['offline']) === false) {
128: $options['offline'] = false;
129: }
130:
131: if (isset($options['offlineonly']) === false) {
132: $options['offlineonly'] = false;
133: }
134:
135: switch ($options['order']) {
136: case 'sortsequence':
137: $options['order'] = 'artsort';
138: break;
139:
140: case 'title':
141: $options['order'] = 'title';
142: break;
143:
144: case 'modificationdate':
145: $options['order'] = 'lastmodified';
146: break;
147:
148: case 'publisheddate':
149: $options['order'] = 'published';
150: break;
151:
152: case 'creationdate':
153: default:
154: $options['order'] = 'created';
155: break;
156: }
157:
158: if (isset($options['artspecs']) === false) {
159: $options['artspecs'] = array();
160: }
161:
162: if (isset($options['direction']) === false) {
163: $options['direction'] = 'DESC';
164: }
165:
166: if (isset($options['limit']) === false) {
167: $options['limit'] = 0;
168: }
169:
170: $this->_options = $options;
171: }
172:
173: 174: 175: 176: 177:
178: public function loadArticles() {
179: $this->_articles = array();
180:
181: $cfg = cRegistry::getConfig();
182:
183: $sqlCat = (count($this->_options['categories']) > 0) ? " idcat IN ('" . implode("','", $this->_options['categories']) . "') AND " : '';
184:
185: $db = cRegistry::getDb();
186: $sql = "SELECT startidartlang, idcat FROM " . $cfg['tab']['cat_lang'] . " WHERE " . $sqlCat . " idlang=" . $this->_options['lang'];
187: $db->query($sql);
188:
189: while ($db->nextRecord()) {
190: $startId = $db->f('startidartlang');
191: if ($startId > 0) {
192: $this->_startArticles[$db->f('idcat')] = $startId;
193: }
194: }
195:
196: $sqlCat = (count($this->_options['categories']) > 0) ? " c.idcat IN ('" . implode("','", $this->_options['categories']) . "') AND b.idart = c.idart AND " : '';
197: $sqlArtSpecs = (count($this->_options['artspecs']) > 0) ? " a.artspec IN ('" . implode("','", $this->_options['artspecs']) . "') AND " : '';
198:
199: if (count($this->_startArticles) > 0) {
200: if ($this->_options['start'] == false) {
201: $sqlStartArticles = "a.idartlang NOT IN ('" . implode("','", $this->_startArticles) . "') AND ";
202: }
203:
204: if ($this->_options['startonly'] == true) {
205: $sqlStartArticles = "a.idartlang IN ('" . implode("','", $this->_startArticles) . "') AND ";
206: }
207: }
208:
209: if ($this->_options['startonly'] == true && count($this->_startArticles) == 0) {
210: return;
211: }
212:
213: $sql = "SELECT DISTINCT a.idartlang FROM " . $cfg['tab']['art_lang'] . " AS a, ";
214: $sql .= $cfg['tab']['art'] . " AS b, " . $cfg['tab']['cat_art'] . " AS c " . " WHERE ";
215: $sql .= $sqlCat . $sqlStartArticles . $sqlArtSpecs . "b.idclient = '" . $this->_options['client'] . "' AND ";
216: $sql .= "a.idlang = '" . $this->_options['lang'] . "' AND " . "a.idart = b.idart";
217:
218: if ($this->_options['offlineonly'] == true) {
219: $sql .= " AND a.online = 0";
220: } elseif ($this->_options['offline'] == false) {
221: $sql .= " AND a.online = 1";
222: }
223:
224: $sql .= " ORDER BY a." . $this->_options['order'] . " " . $this->_options['direction'];
225:
226: if ((int) $this->_options['limit'] > 0) {
227: $sql .= " LIMIT " . $this->_options['limit'];
228: }
229:
230: $db->query($sql);
231:
232: while ($db->nextRecord()) {
233: $artLangId = $db->f('idartlang');
234: $this->_articles[] = new cApiArticleLanguage($artLangId);
235: }
236:
237:
238: cApiCecHook::execute('Contenido.ArticleCollector.Articles', array(
239: 'idart' => cRegistry::getArticleId(),
240: 'articles' => $this->_articles
241: ));
242: }
243:
244: 245: 246: 247: 248: 249: 250:
251: public function startArticle() {
252: if (count($this->_startArticles) != 1) {
253: throw new cBadMethodCallException("Can not load start article due to multiple loaded start articles.");
254: }
255:
256: return new cApiArticleLanguage(current($this->_startArticles));
257: }
258:
259: 260: 261: 262: 263: 264:
265: public function nextArticle() {
266: $next = $this->current();
267: $this->next();
268:
269: if ($next instanceof cApiArticleLanguage) {
270: return $next;
271: }
272:
273: return false;
274: }
275:
276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288:
289: public function setResultPerPage($resPerPage) {
290: if ($resPerPage > 0) {
291: if (is_array($this->_articles)) {
292: $this->_pages = array_chunk($this->_articles, $resPerPage);
293: } else {
294: $this->_pages = array();
295: }
296: }
297: }
298:
299: 300: 301: 302: 303: 304: 305: 306: 307:
308: public function setPage($page) {
309: if (is_array($this->_pages[$page])) {
310: $this->_articles = $this->_pages[$page];
311: }
312: }
313:
314: 315: 316: 317: 318: 319:
320: public function seek($position) {
321: $this->_currentPosition = $position;
322:
323: if ($this->valid() === false) {
324: throw new cOutOfBoundsException("Invalid seek position: " . $position);
325: }
326: }
327:
328: 329: 330:
331: public function rewind() {
332: $this->_currentPosition = 0;
333: }
334:
335: 336: 337: 338: 339:
340: public function current() {
341: return $this->_articles[$this->_currentPosition];
342: }
343:
344: 345: 346: 347: 348:
349: public function key() {
350: return $this->_currentPosition;
351: }
352:
353: 354: 355:
356: public function next() {
357: ++$this->_currentPosition;
358: }
359:
360: 361: 362: 363: 364:
365: public function valid() {
366: return isset($this->_articles[$this->_currentPosition]);
367: }
368:
369: 370: 371: 372: 373: 374:
375: public function count() {
376: return count($this->_articles);
377: }
378:
379: }