/**
* {@inheritdoc}
*/
public function getContentData(PropertyInterface $property)
{
// check memoize
$hash = spl_object_hash($property);
if (array_key_exists($hash, $this->cache)) {
return $this->cache[$hash];
}
/** @var PropertyParameter[] $params */
$params = array_merge($this->getDefaultParams($property), $property->getParams());
// prepare filters
$filters = $property->getValue();
$filters['excluded'] = [$property->getStructure()->getUuid()];
// default value of tags/category is an empty array
if (!array_key_exists('tags', $filters)) {
$filters['tags'] = [];
}
if (!array_key_exists('categories', $filters)) {
$filters['categories'] = [];
}
// extends selected filter with requested tags
$filters['websiteTags'] = $this->tagRequestHandler->getTags($params['tags_parameter']->getValue());
$filters['websiteTagsOperator'] = $params['website_tags_operator']->getValue();
// extends selected filter with requested categories
$filters['websiteCategories'] = $this->categoryRequestHandler->getCategories($params['categories_parameter']->getValue());
$filters['websiteCategoriesOperator'] = $params['website_categories_operator']->getValue();
// resolve tags to id
if (!empty($filters['tags'])) {
$filters['tags'] = $this->tagManager->resolveTagNames($filters['tags']);
}
// resolve website tags to id
if (!empty($filters['websiteTags'])) {
$filters['websiteTags'] = $this->tagManager->resolveTagNames($filters['websiteTags']);
}
// get provider
$provider = $this->getProvider($property);
$configuration = $provider->getConfiguration();
// prepare pagination, limitation and options
$page = 1;
$limit = array_key_exists('limitResult', $filters) && $configuration->hasLimit() ? $filters['limitResult'] : null;
$options = ['webspaceKey' => $property->getStructure()->getWebspaceKey(), 'locale' => $property->getStructure()->getLanguageCode()];
if (isset($params['max_per_page']) && $configuration->hasPagination()) {
// is paginated
$page = $this->getCurrentPage($params['page_parameter']->getValue());
$pageSize = intval($params['max_per_page']->getValue());
// resolve paginated filters
$data = $provider->resolveResourceItems($filters, $params, $options, !empty($limit) ? intval($limit) : null, $page, $pageSize);
} else {
$data = $provider->resolveResourceItems($filters, $params, $options, !empty($limit) ? intval($limit) : null);
}
// append view data
$filters['page'] = $page;
$filters['hasNextPage'] = $data->getHasNextPage();
$filters['referencedUuids'] = $data->getReferencedUuids();
$filters['paginated'] = $configuration->hasPagination();
$property->setValue($filters);
// save result in cache
return $this->cache[$hash] = $data->getItems();
}