Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00%
1 / 1
100.00%
15 / 15
CRAP
100.00%
48 / 48
PageSet
100.00%
1 / 1
100.00%
15 / 15
25
100.00%
48 / 48
 check($id)
100.00%
1 / 1
2
100.00%
5 / 5
 __construct(\Scrivo\Page $page)
100.00%
1 / 1
1
100.00%
4 / 4
 offsetSet($id, $page)
100.00%
1 / 1
1
100.00%
2 / 2
 prepend($page)
100.00%
1 / 1
1
100.00%
3 / 3
 offsetExists($id)
100.00%
1 / 1
2
100.00%
2 / 2
 offsetUnset($id)
100.00%
1 / 1
1
100.00%
1 / 1
 offsetGet($id)
100.00%
1 / 1
2
100.00%
3 / 3
 rewind()
100.00%
1 / 1
1
100.00%
2 / 2
 current()
100.00%
1 / 1
1
100.00%
1 / 1
 key()
100.00%
1 / 1
1
100.00%
1 / 1
 next()
100.00%
1 / 1
1
100.00%
1 / 1
 valid()
100.00%
1 / 1
6
100.00%
11 / 11
 count()
100.00%
1 / 1
3
100.00%
7 / 7
 __sleep()
100.00%
1 / 1
1
100.00%
2 / 2
 __wakeup()
100.00%
1 / 1
1
100.00%
3 / 3
<?php
/* Copyright (c) 2013, Geert Bergman (geert@scrivo.nl)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of "Scrivo" nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* $Id: RoleSet.php 547 2013-03-04 12:06:51Z geert $
*/
/**
* Implementation of the \Scrivo\PageSet class.
*/
namespace Scrivo;
/**
* A Scrivo Page set is a group of Scrivo pages with a common parent id. A
* page set is actually a simple array of (child) pages but it does a
* couple of things extra:
*
* - When serialized only the ids are stored.
* - When iteratering, counting or getting pages from the array only the
* readable pages in the array will be taken into account.
*
* Page sets are a part of a Scrivo page and are used to retrieve and iterate
* through the child pages (or path) of a page.
*/
class PageSet implements \ArrayAccess, \Iterator, \Countable {
/**
* The array containing the pages or page ids.
* @var \Scrivo\Page[id]|int[id]
*/
private $items = array();
/**
* The parent page of the set.
* @var \Scrivo\Page
*/
private $page = null;
/**
* An array containing the keys of the items array, used when serializing.
* @var int[id]
*/
private $ids = null;
/**
* When reading the items array always check of the actual entry is an
* instantiated Scrivo page. If not, get that page and store it in the
* items array.
*
* @param int $id The page id of the entry to check.
*/
private function check($id) {
if (is_int($this->items[$id])) {
$this->items[$id] =
\Scrivo\Page::fetch($this->page->context, $this->items[$id]);
}
return $this->items[$id];
}
/**
* Construct a page set.
*
* @param \Scrivo\Page $page The parent page of the page set.
*/
public function __construct(\Scrivo\Page $page) {
\Scrivo\ArgumentCheck::assertArgs(func_get_args(), array(null));
$this->items = array();
$this->page = $page;
}
/**
* Set a page in the page set.
*
* @param int $id A Scrivo page id.
* @param \Scrivo\Page $page The parent page of the page set.
*/
public function offsetSet($id, $page) {
$this->items[$id] = $page;
}
/**
* Add a page to the beginning of the set.
*
* @param \Scrivo\Page $page The parent page of the page set.
*/
public function prepend($page) {
\Scrivo\ArgumentCheck::assertArgs(func_get_args(), array(null));
array_unshift($this->items, $page);
}
/**
* Test if page is set in the page set.
*
* @param int $id A Scrivo page id to test.
*
* @return boolean True of the page with the given id exists in the set.
*/
public function offsetExists($id) {
return (isset($this->items[$id]) &&
$this->check($id)->roles->canRead($this->page->context->principal));
}
/**
* It is not possible to unset pages in a page set. Calling this method
* will raise a system exception.
*
* @param int $id A Scrivo page id to unset.
*/
public function offsetUnset($id) {
throw new \Scrivo\SystemException("Illegal method");
}
/**
* Get a page with a specific id from the page set.
*
* @param int $id A Scrivo page id to test.
*
* @return \Scrivo\Page The page with the given id.
*/
public function offsetGet($id) {
if (!$this->offsetExists($id)) {
throw new \Scrivo\SystemException("Not set");
}
return $this->items[$id];
}
/**
* Rewind the page set so that iterating will start at the beginning.
*/
function rewind() {
reset($this->items);
}
/**
* Get the current page from the page set when iterating.
*
* @return \Scrivo\Page The current page in the page set.
*/
function current() {
return current($this->items);
}
/**
* Get the key(id) of the current page from the page set when iterating.
*
* @return \Scrivo\Page The key (id) of the current page in the page set.
*/
function key() {
return key($this->items);
}
/**
* Get the current page from the page set and move the internal pointer
* to the next page in the set.
*
* @return \Scrivo\Page The current page in the page set.
*/
function next() {
return next($this->items);
}
/**
* Test if the current page is valid.
*
* @return boolean True if the current page is valid.
*/
function valid() {
$k = key($this->items);
$pr = $this->page->context->principal;
// Get the current page ...
if (isset($this->items[$k]) && $c = $this->check($k)) {
// ... and check if it is readable ...
if ($c->roles->canRead($pr)) {
return true;
}
// ... and if not move to the next until a readable page is found.
while (next($this->items)) {
if ($this->check(key($this->items))->roles->canRead($pr)) {
return true;
}
}
}
return false;
}
/**
* The page count of pages in the set. Note that returned page count
* depends on whether the pages are readable for the user defined in the
* Scrivo context. So the returned count is always equeal or less that the
* actual count of pages in the items array.
*
* @return int The number of pages in the set that are readable for the
* users defined in the Scrivo context.
*/
public function count() {
// Start counting
$count = 0;
foreach($this as $i) {
if ($i->roles->canRead($this->page->context->principal)) {
$count++;
}
}
return $count;
}
/**
* When serializing retrieve the don't store the items array but just the
* keys.
*
* return array An array with the names of the serializable members.
*/
public function __sleep() {
$this->ids = array_keys($this->items);
// Note that page sets always will be serialized as a part of the
// parent page. Therefore the page member will be serialized as a
// reference value.
return array("ids", "page");
}
/**
* When unserializing restore the items array only the id.
*/
public function __wakeup() {
$this->items = array_combine($this->ids, $this->ids);
unset($this->ids);
}
}