diff --git a/lib/Phile/Repository/Page.php b/lib/Phile/Repository/Page.php index 62ed4e18..f8124859 100644 --- a/lib/Phile/Repository/Page.php +++ b/lib/Phile/Repository/Page.php @@ -84,63 +84,65 @@ public function findByPath($pageId, $folder = CONTENT_DIR) { * @param array $options * @param string $folder * - * @return array of \Phile\Model\Page objects + * @return PageCollection of \Phile\Model\Page objects */ public function findAll(array $options = array(), $folder = CONTENT_DIR) { - $options += $this->settings; - // ignore files with a leading '.' in its filename - $files = Utility::getFiles($folder, '\Phile\FilterIterator\ContentFileFilterIterator'); - $pages = array(); - foreach ($files as $file) { - if (str_replace($folder, '', $file) == '404' . CONTENT_EXT) { - // jump to next page if file is the 404 page - continue; + return new PageCollection(function() use ($options, $folder){ + $options += $this->settings; + // ignore files with a leading '.' in its filename + $files = Utility::getFiles($folder, '\Phile\FilterIterator\ContentFileFilterIterator'); + $pages = array(); + foreach ($files as $file) { + if (str_replace($folder, '', $file) == '404' . CONTENT_EXT) { + // jump to next page if file is the 404 page + continue; + } + $pages[] = $this->getPage($file, $folder); } - $pages[] = $this->getPage($file, $folder); - } - - if (empty($options['pages_order'])) { - return $pages; - } - // parse search criteria - $terms = preg_split('/\s+/', $options['pages_order'], -1, PREG_SPLIT_NO_EMPTY); - foreach ($terms as $term) { - $term = explode('.', $term); - if (count($term) > 1) { - $type = array_shift($term); - } else { - $type = null; + if (empty($options['pages_order'])) { + return $pages; } - $term = explode(':', $term[0]); - $sorting[] = array('type' => $type, 'key' => $term[0], 'order' => $term[1]); - } - // prepare search criteria for array_multisort - foreach ($sorting as $sort) { - $key = $sort['key']; - $column = array(); - foreach ($pages as $page) { - /** @var \Phile\Model\Page $page */ - $meta = $page->getMeta(); - if ($sort['type'] === 'page') { - $method = 'get' . ucfirst($key); - $value = $page->$method(); - } elseif ($sort['type'] === 'meta') { - $value = $meta->get($key); + // parse search criteria + $terms = preg_split('/\s+/', $options['pages_order'], -1, PREG_SPLIT_NO_EMPTY); + foreach ($terms as $term) { + $term = explode('.', $term); + if (count($term) > 1) { + $type = array_shift($term); } else { - continue 2; // ignore unhandled search term + $type = null; } - $column[] = $value; + $term = explode(':', $term[0]); + $sorting[] = array('type' => $type, 'key' => $term[0], 'order' => $term[1]); } - $sortHelper[] = $column; - $sortHelper[] = constant('SORT_' . strtoupper($sort['order'])); - } - $sortHelper[] = &$pages; - call_user_func_array('array_multisort', $sortHelper); + // prepare search criteria for array_multisort + foreach ($sorting as $sort) { + $key = $sort['key']; + $column = array(); + foreach ($pages as $page) { + /** @var \Phile\Model\Page $page */ + $meta = $page->getMeta(); + if ($sort['type'] === 'page') { + $method = 'get' . ucfirst($key); + $value = $page->$method(); + } elseif ($sort['type'] === 'meta') { + $value = $meta->get($key); + } else { + continue 2; // ignore unhandled search term + } + $column[] = $value; + } + $sortHelper[] = $column; + $sortHelper[] = constant('SORT_' . strtoupper($sort['order'])); + } + $sortHelper[] = &$pages; + + call_user_func_array('array_multisort', $sortHelper); - return $pages; + return $pages; + }); } /** diff --git a/lib/Phile/Repository/PageCollection.php b/lib/Phile/Repository/PageCollection.php new file mode 100644 index 00000000..e6a3c76f --- /dev/null +++ b/lib/Phile/Repository/PageCollection.php @@ -0,0 +1,64 @@ +loader = $loader; + } + + private function load(){ + if ($this->pages === null){ + $this->pages = call_user_func($this->loader); + } + } + + public function getIterator(){ + $this->load(); + return new \ArrayIterator($this->pages); + } + + public function offsetExists ($offset){ + $this->load(); + return isset($this->pages[$offset]); + } + + public function offsetGet($offset){ + $this->load(); + return $this->pages[$offset]; + } + + public function offsetSet($offset, $value){ + $this->load(); + $this->pages[$offset] = $value; + } + + public function offsetUnset($offset){ + $this->load(); + unset($this->pages[$offset]); + } + + public function count(){ + $this->load(); + return count($this->pages); + } +}