abstract class RestfulDataProviderCToolsPlugins in RESTful 7
@file Contains \RestfulDataProviderCToolsPlugins
Hierarchy
- class \RestfulPluginBase implements RestfulPluginInterface
- class \RestfulBase implements RestfulInterface
- class \RestfulDataProviderCToolsPlugins implements RestfulDataProviderCToolsPluginsInterface
- class \RestfulBase implements RestfulInterface
Expanded class hierarchy of RestfulDataProviderCToolsPlugins
File
- plugins/
restful/ RestfulDataProviderCToolsPlugins.php, line 8 - Contains \RestfulDataProviderCToolsPlugins
View source
abstract class RestfulDataProviderCToolsPlugins extends \RestfulBase implements \RestfulDataProviderCToolsPluginsInterface {
/**
* The module name.
*
* @var string
*/
protected $module;
/**
* The type of the plugin.
*
* @var string
*/
protected $type;
/**
* The loaded plugins.
*
* @var array
*/
protected $plugins = array();
/**
* Get the module name.
*
* @return string
*/
public function getModule() {
return $this->module;
}
/**
* Get the plugin type.
*
* @return string
*/
public function getType() {
return $this->type;
}
/**
* Return the plugins.
*
* @return array
*/
public function getPlugins() {
if ($this->plugins) {
return $this->plugins;
}
$this->plugins = ctools_get_plugins($this
->getModule(), $this
->getType());
return $this->plugins;
}
/**
* Gets the plugins filtered and sorted by the request.
*
* @return array
* Array of plugins.
*/
public function getPluginsSortedAndFiltered() {
$plugins = $this
->getPlugins();
$public_fields = $this
->getPublicFields();
foreach ($this
->parseRequestForListFilter() as $filter) {
foreach ($plugins as $plugin_name => $plugin) {
// Initialize to TRUE for AND and FALSE for OR (neutral value).
$match = $filter['conjunction'] == 'AND';
for ($index = 0; $index < count($filter['value']); $index++) {
$property = $public_fields[$filter['public_field']]['property'];
if (empty($plugin[$property])) {
// Property doesn't exist on the plugin, so filter it out.
unset($plugins[$plugin_name]);
}
if ($filter['conjunction'] == 'OR') {
$match = $match || $this
->evaluateExpression($plugin[$property], $filter['value'][$index], $filter['operator'][$index]);
if ($match) {
break;
}
}
else {
$match = $match && $this
->evaluateExpression($plugin[$property], $filter['value'][$index], $filter['operator'][$index]);
if (!$match) {
break;
}
}
}
if (!$match) {
// Property doesn't match the filter.
unset($plugins[$plugin_name]);
}
}
}
if ($this
->parseRequestForListSort()) {
uasort($plugins, array(
$this,
'sortMultiCompare',
));
}
return $plugins;
}
/**
* Overrides \RestfulBase::isValidConjuctionForFilter().
*/
protected static function isValidConjunctionForFilter($conjunction) {
$allowed_conjunctions = array(
'AND',
'OR',
);
if (!in_array(strtoupper($conjunction), $allowed_conjunctions)) {
throw new \RestfulBadRequestException(format_string('Conjunction "@conjunction" is not allowed for filtering on this resource. Allowed conjunctions are: !allowed', array(
'@conjunction' => $conjunction,
'!allowed' => implode(', ', $allowed_conjunctions),
)));
}
}
/**
* Evaluate a simple expression.
*
* @param $value1
* The first value.
* @param $value2
* The second value.
* @param $operator
* The operator.
*
* @return bool
* TRUE or FALSE based on the evaluated expression.
*
* @throws RestfulBadRequestException
*/
protected function evaluateExpression($value1, $value2, $operator) {
switch ($operator) {
case '=':
return $value1 == $value2;
case '<':
return $value1 < $value2;
case '>':
return $value1 > $value2;
case '>=':
return $value1 >= $value2;
case '<=':
return $value1 <= $value2;
case '<>':
case '!=':
return $value1 != $value2;
case 'IN':
return in_array($value1, $value2);
case 'BETWEEN':
return $value1 >= $value2[0] && $value1 >= $value2[1];
}
}
/**
* Sort plugins by multiple criteria.
*
* @param $value1
* The first value.
* @param $value2
* The second value.
*
* @return int
* The values expected by uasort() function.
*
* @link http://stackoverflow.com/a/13673568/750039
*/
protected function sortMultiCompare($value1, $value2) {
$sorts = $this
->parseRequestForListSort();
foreach ($sorts as $key => $order) {
if ($value1[$key] == $value2[$key]) {
continue;
}
return ($order == 'DESC' ? -1 : 1) * strcmp($value1[$key], $value2[$key]);
}
return 0;
}
/**
* Constructs a RestfulDataProviderCToolsPlugins object.
*
* @param array $plugin
* Plugin definition.
* @param RestfulAuthenticationManager $auth_manager
* (optional) Injected authentication manager.
* @param DrupalCacheInterface $cache_controller
* (optional) Injected cache backend.
* @param string $language
* (optional) The language to return items in.
*/
public function __construct(array $plugin, \RestfulAuthenticationManager $auth_manager = NULL, \DrupalCacheInterface $cache_controller = NULL, $language = NULL) {
parent::__construct($plugin, $auth_manager, $cache_controller, $language);
// Validate keys exist in the plugin's "data provider options".
$required_keys = array(
'module',
'type',
);
$options = $this
->processDataProviderOptions($required_keys);
$this->module = $options['module'];
$this->type = $options['type'];
ctools_include('plugins');
}
/**
* {@inheritdoc}
*/
public function getTotalCount() {
return count($this
->getPluginsSortedAndFiltered());
}
public function index() {
$return = array();
foreach (array_keys($this
->getPluginsSortedAndFiltered()) as $plugin_name) {
$return[] = $this
->view($plugin_name);
}
return $return;
}
/**
* {@inheritdoc}
*
* @todo: We should generalize this, as it's repeated often.
*/
public function view($id) {
$cache_id = array(
'md' => $this
->getModule(),
'tp' => $this
->getType(),
'id' => $id,
);
$cached_data = $this
->getRenderedCache($cache_id);
if (!empty($cached_data->data)) {
return $cached_data->data;
}
if (!($plugin = ctools_get_plugins($this
->getModule(), $this
->getType(), $id))) {
// Since the discovery resource sits under 'api/' it will pick up all
// invalid paths like 'api/invalid'. If it is not a valid plugin then
// return a 404.
throw new \RestfulNotFoundException('Invalid URL path.');
}
// Loop over all the defined public fields.
foreach ($this
->getPublicFields() as $public_field_name => $info) {
$value = NULL;
if ($info['create_or_update_passthrough']) {
// The public field is a dummy one, meant only for passing data upon
// create or update.
continue;
}
// If there is a callback defined execute it instead of a direct mapping.
if ($info['callback']) {
$value = static::executeCallback($info['callback'], array(
$plugin,
));
}
elseif ($info['property']) {
$value = $plugin[$info['property']];
}
// Execute the process callbacks.
if ($value && $info['process_callbacks']) {
foreach ($info['process_callbacks'] as $process_callback) {
$value = static::executeCallback($process_callback, array(
$value,
));
}
}
$output[$public_field_name] = $value;
}
$this
->setRenderedCache($output, $cache_id);
return $output;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
RestfulBase:: |
protected | property | Authentication manager. | |
RestfulBase:: |
protected | property | Cache controller object. | |
RestfulBase:: |
protected | property | Nested array that provides information about what method to call for each route pattern. | |
RestfulBase:: |
protected | property | Array keyed by the header property, and the value. | |
RestfulBase:: |
protected | property | Determines the language of the items that should be returned. | |
RestfulBase:: |
protected | property | The HTTP method used for the request. | |
RestfulBase:: |
protected | property | The path of the request. | |
RestfulBase:: |
protected | property | The public fields that are exposed to the API. | 1 |
RestfulBase:: |
protected | property | Determines the number of items that should be returned when viewing lists. | |
RestfulBase:: |
protected | property | Rate limit manager. | |
RestfulBase:: |
protected | property | The request array. | |
RestfulBase:: |
public | property | Static cache controller. | |
RestfulBase:: |
protected | property | Holds additional information about the generated values. This information is available to the formatters. | |
RestfulBase:: |
public | function |
Determine if user can access the handler. Overrides RestfulInterface:: |
4 |
RestfulBase:: |
protected | function | Checks access based on the referer header and the allow_origin setting. | |
RestfulBase:: |
protected static | function | Get the cache id parameters based on the keys. | |
RestfulBase:: |
protected | function | Add default values to the public fields array. | 2 |
RestfulBase:: |
protected | function | Adds query tags and metadata to the EntityFieldQuery. | 2 |
RestfulBase:: |
public | function |
Add the a value to a multi-value HTTP header. Overrides RestfulInterface:: |
|
RestfulBase:: |
public | function | Invalidates cache for a certain entity. | |
RestfulBase:: |
public static | function | Helper function to remove the application generated request data. | |
RestfulBase:: |
protected | function | Clear an entry from the rendered cache. | |
RestfulBase:: |
public | function | Clear all caches corresponding to the current resource. | |
RestfulBase:: |
public static | function | Returns the default controllers for the entity. | 1 |
RestfulBase:: |
public | function | 3 | |
RestfulBase:: |
public | function | Call resource using the DELETE http method. | |
RestfulBase:: |
public static | function | Execute a user callback. | |
RestfulBase:: |
public | function | Call the output format on the given data. | |
RestfulBase:: |
protected | function | Get the formatter handler for the current restful formatter. | |
RestfulBase:: |
public | function | Returns the names of the available formatter plugins. | |
RestfulBase:: |
protected | function | Generate a cache identifier for the request and the current context. | |
RestfulBase:: |
public | function | Call resource using the GET http method. | |
RestfulBase:: |
public | function | Proxy method to get the account from the authenticationManager. | |
RestfulBase:: |
public | function | Getter for $authenticationManager. | |
RestfulBase:: |
public | function | Getter for $cacheController. | |
RestfulBase:: |
public | function | Return the controller from a given path. | |
RestfulBase:: |
public | function | Get the defined controllers | |
RestfulBase:: |
public | function |
Return array keyed by the header property, and the value. Overrides RestfulInterface:: |
|
RestfulBase:: |
public | function | Get the language code. | |
RestfulBase:: |
public static | function | Get the non translated menu item. | |
RestfulBase:: |
public | function | Get the HTTP method used for the request. | |
RestfulBase:: |
public static | function | Get the resource name and version from the page arguments in the router. | |
RestfulBase:: |
public | function | Return the path of the request. | |
RestfulBase:: |
public | function |
Return the properties that should be public after processing. Overrides RestfulInterface:: |
|
RestfulBase:: |
public | function | Get the pager range. | |
RestfulBase:: |
public | function | Getter for rateLimitManager. | |
RestfulBase:: |
protected | function | Get an entry from the rendered cache. | |
RestfulBase:: |
public | function | Get the request array. | |
RestfulBase:: |
protected | function | Gets a request array with the data that should be piped to sub requests. | |
RestfulBase:: |
public static | function | Return the last version for a given resource. | |
RestfulBase:: |
public | function | Return the resource name. | |
RestfulBase:: |
public | function | Helper method; Get the URL of the resource and query strings. | |
RestfulBase:: |
public | function | Get value metadata. | |
RestfulBase:: |
public | function | Return array keyed with the major and minor version of the resource. | |
RestfulBase:: |
public static | function | Gets the major and minor version for the current request. | |
RestfulBase:: |
public | function | Call resource using the GET http method. | |
RestfulBase:: |
final public static | function | Helper method to determine if an array is numeric. | |
RestfulBase:: |
public | function | Helper method to know if the current request is for a list. | |
RestfulBase:: |
public static | function | Determines if the HTTP method represents a read operation. | |
RestfulBase:: |
public static | function | Determines if the HTTP method is one of the known methods. | |
RestfulBase:: |
protected static | function | Check if an operator is valid for filtering. | 1 |
RestfulBase:: |
public static | function | Determines if the HTTP method represents a write operation. | |
RestfulBase:: |
protected | function | Get the default cache object based on the plugin configuration. | |
RestfulBase:: |
protected static | function | Helper method with the code to run for non implemented CRUD operations. | |
RestfulBase:: |
public | function | Call resource using the OPTIONS http method. | |
RestfulBase:: |
protected | function | Overrides the range parameter with the URL value if any. | |
RestfulBase:: |
protected | function | Filter the query for list. | |
RestfulBase:: |
protected | function | Parses the request object to get the pagination options. | |
RestfulBase:: |
protected | function | Parses the request to get the sorting options. | |
RestfulBase:: |
public static | function | Parses the version string. | |
RestfulBase:: |
public | function | Call resource using the PATCH http method. | |
RestfulBase:: |
public | function | Call resource using the POST http method. | |
RestfulBase:: |
public | function |
Entry point to process a request. Overrides RestfulInterface:: |
|
RestfulBase:: |
protected | function | Process plugin options by validation keys exists, and set default values. | |
RestfulBase:: |
public | function | Call resource using the PUT http method. | |
RestfulBase:: |
public | function | 3 | |
RestfulBase:: |
public | function | Proxy method to set the account from the authenticationManager. | |
RestfulBase:: |
public | function | Setter for $authenticationManager. | |
RestfulBase:: |
public | function |
Set the HTTP headers. Overrides RestfulInterface:: |
|
RestfulBase:: |
public | function | Sets the language code. | |
RestfulBase:: |
public | function | Set the HTTP method used for the request. | |
RestfulBase:: |
public | function | Set the path of the request. | |
RestfulBase:: |
public | function | Set the public fields. | |
RestfulBase:: |
public | function | Set the pager range. | |
RestfulBase:: |
public | function | Setter for rateLimitManager. | |
RestfulBase:: |
protected | function | Store an entry in the rendered cache. | |
RestfulBase:: |
public | function | Set the request array. | |
RestfulBase:: |
public | function | 3 | |
RestfulBase:: |
public | function | Gets a resource URL based on the current version. | |
RestfulBase:: |
public | function | 2 | |
RestfulDataProviderCToolsPlugins:: |
protected | property | The module name. | |
RestfulDataProviderCToolsPlugins:: |
protected | property | The loaded plugins. | |
RestfulDataProviderCToolsPlugins:: |
protected | property | The type of the plugin. | |
RestfulDataProviderCToolsPlugins:: |
protected | function | Evaluate a simple expression. | |
RestfulDataProviderCToolsPlugins:: |
public | function | Get the module name. | |
RestfulDataProviderCToolsPlugins:: |
public | function | Return the plugins. | 1 |
RestfulDataProviderCToolsPlugins:: |
public | function | Gets the plugins filtered and sorted by the request. | |
RestfulDataProviderCToolsPlugins:: |
public | function |
Get the total count of entities that match certain request. Overrides RestfulDataProviderCToolsPluginsInterface:: |
|
RestfulDataProviderCToolsPlugins:: |
public | function | Get the plugin type. | |
RestfulDataProviderCToolsPlugins:: |
public | function |
Get a list of entities. Overrides RestfulBase:: |
|
RestfulDataProviderCToolsPlugins:: |
protected static | function |
Overrides \RestfulBase::isValidConjuctionForFilter(). Overrides RestfulBase:: |
|
RestfulDataProviderCToolsPlugins:: |
protected | function | Sort plugins by multiple criteria. | |
RestfulDataProviderCToolsPlugins:: |
public | function |
@todo: We should generalize this, as it's repeated often. Overrides RestfulBase:: |
|
RestfulDataProviderCToolsPlugins:: |
public | function |
Constructs a RestfulDataProviderCToolsPlugins object. Overrides RestfulBase:: |
|
RestfulInterface:: |
constant | Return this value from public field access callbacks to allow access. | ||
RestfulInterface:: |
constant | Return this value from public field access callbacks to deny access. | ||
RestfulInterface:: |
constant | Return this value from public field access callbacks to not affect access. | ||
RestfulInterface:: |
constant | |||
RestfulInterface:: |
constant | |||
RestfulInterface:: |
constant | HTTP methods. | ||
RestfulInterface:: |
constant | |||
RestfulInterface:: |
constant | |||
RestfulInterface:: |
constant | |||
RestfulInterface:: |
constant | |||
RestfulInterface:: |
public | function | Return the properties that should be public. | 7 |
RestfulInterface:: |
constant | |||
RestfulInterface:: |
constant | Token value for token generation functions. | ||
RestfulInterface:: |
constant | |||
RestfulPluginBase:: |
protected | property | The plugin definition array. | |
RestfulPluginBase:: |
public | function |
Gets information about the restful plugin. Overrides RestfulPluginInterface:: |
|
RestfulPluginBase:: |
public | function |
Gets information about the restful plugin key. Overrides RestfulPluginInterface:: |
|
RestfulPluginBase:: |
public | function |
Sets information about the restful plugin. Overrides RestfulPluginInterface:: |
|
RestfulPluginBase:: |
public | function |
Gets information about the restful plugin key. Overrides RestfulPluginInterface:: |