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: }