152 lines
3.2 KiB
PHP
152 lines
3.2 KiB
PHP
<?php
|
|
/**
|
|
* Registry utility superclass
|
|
*
|
|
* This class should be extended to create object registries.
|
|
*
|
|
* @package EDD
|
|
* @subpackage Classes/Utilities
|
|
* @copyright Copyright (c) 2018, Easy Digital Downloads, LLC
|
|
* @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
|
|
* @since 3.0
|
|
*/
|
|
namespace EDD\Utils;
|
|
|
|
use EDD\Utils\Exceptions;
|
|
|
|
/**
|
|
* Defines the construct for building an item registry.
|
|
*
|
|
* @since 3.0.0
|
|
* @abstract
|
|
*/
|
|
abstract class Registry extends \ArrayObject {
|
|
|
|
/**
|
|
* Item error label.
|
|
*
|
|
* Used for customizing exception messages to the current registry instance. Default 'item'.
|
|
*
|
|
* @since 3.0
|
|
* @var string
|
|
*/
|
|
public static $item_error_label = 'item';
|
|
|
|
/**
|
|
* Adds an item to the registry.
|
|
*
|
|
* @since 3.0
|
|
*
|
|
* @throws \EDD_Exception If the `$attributes` array is empty.
|
|
*
|
|
* @param string $item_id Item ID.
|
|
* @param array $attributes Array of item attributes. Each extending registry will
|
|
* handle item ID and attribute building in different ways.
|
|
* @return bool True if `$attributes` is not empty, otherwise false.
|
|
*/
|
|
public function add_item( $item_id, $attributes ) {
|
|
$result = false;
|
|
|
|
if ( ! empty( $attributes ) ) {
|
|
|
|
$this->offsetSet( $item_id, $attributes );
|
|
|
|
$result = true;
|
|
|
|
} else {
|
|
|
|
$message = sprintf(
|
|
'The attributes were missing when attempting to add the \'%1$s\' %2$s.',
|
|
$item_id,
|
|
static::$item_error_label
|
|
);
|
|
|
|
throw new Exception( $message );
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Removes an item from the registry by ID.
|
|
*
|
|
* @since 3.0
|
|
*
|
|
* @param string $item_id Item ID.
|
|
*/
|
|
public function remove_item( $item_id ) {
|
|
if ( $this->offsetExists( $item_id ) ) {
|
|
$this->offsetUnset( $item_id );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Retrieves an item and its associated attributes.
|
|
*
|
|
* @since 3.0
|
|
*
|
|
* @throws \EDD_Exception if the item does not exist.
|
|
*
|
|
* @param string $item_id Item ID.
|
|
* @return array Array of attributes for the item if the item is set,
|
|
* otherwise an empty array.
|
|
*/
|
|
public function get_item( $item_id ) {
|
|
|
|
$item = array();
|
|
|
|
if ( $this->offsetExists( $item_id ) ) {
|
|
|
|
$item = $this->offsetGet( $item_id );
|
|
|
|
} else {
|
|
|
|
$message = sprintf(
|
|
'The \'%1$s\' %2$s does not exist.',
|
|
$item_id,
|
|
static::$item_error_label
|
|
);
|
|
|
|
throw new Exception( $message );
|
|
}
|
|
|
|
return $item;
|
|
}
|
|
|
|
/**
|
|
* Retrieves registered items.
|
|
*
|
|
* @since 3.0
|
|
*
|
|
* @return array The list of registered items.
|
|
*/
|
|
public function get_items() {
|
|
return $this->getArrayCopy();
|
|
}
|
|
|
|
/**
|
|
* Retrieves the value of a given attribute for a given item.
|
|
*
|
|
* @since 3.0
|
|
*
|
|
* @throws \EDD_Exception if the item does not exist.
|
|
* @throws \EDD_Exception if the attribute and/or item does not exist.
|
|
*
|
|
* @param string $key Key of the attribute to retrieve.
|
|
* @param string $item_id Collection to retrieve the attribute from.
|
|
* @return mixed|null The attribute value if set, otherwise null.
|
|
*/
|
|
public function get_attribute( $key, $item_id ) {
|
|
$attribute = null;
|
|
$item = $this->get_item( $item_id );
|
|
|
|
if ( ! empty( $item[ $key ] ) ) {
|
|
$attribute = $item[ $key ];
|
|
} else {
|
|
throw Exceptions\Attribute_Not_Found::from_attr( $key, $item_id );
|
|
}
|
|
|
|
return $attribute;
|
|
}
|
|
}
|