diff --git a/doc/examples/README.md b/doc/examples/README.md new file mode 100644 index 0000000..1570f1f --- /dev/null +++ b/doc/examples/README.md @@ -0,0 +1,20 @@ +The examples in this directory are meant to present different usages for the query field. +They all come with their own query type, as well as a README file that guides you into using the example. + +## List of examples + +### `children` +[documentation](children/README.md) +Children of a content item: images of a gallery, most recent articles of a category... + +### `map_location_distance` +[documentation](map_location_distance/README.md) +Items located within a given distance of an item's geographical location. + +### `reverse_relations` +[documentation](reverse_relations/README.md) +Items related to the current item. + +### `ancestors` +[documentation](children/README.md) +Ancestors of a type. diff --git a/doc/examples/ancestors/AncestorsOfContentQueryType.php b/doc/examples/ancestors/AncestorsOfContentQueryType.php new file mode 100644 index 0000000..44c64c8 --- /dev/null +++ b/doc/examples/ancestors/AncestorsOfContentQueryType.php @@ -0,0 +1,61 @@ +locationService = $locationService; + } + + public function getQuery(array $parameters = []) + { + if ($parameters['content'] instanceof Content) { + $pathStrings = array_map( + function (Location $location) { + return $location->pathString; + }, + $this->locationService->loadLocations($parameters['content']->contentInfo) + ); + } else { + throw new InvalidArgumentException('content', 'should be of type API\Content'); + } + + $filter = new Criterion\LogicalAnd([ + new Criterion\Ancestor($pathStrings), + new Criterion\ContentTypeIdentifier($parameters['type']), + ]); + + return new Query([ + 'filter' => $filter, + ]); + } + + public function getSupportedParameters() + { + return ['content', 'type']; + } + + public static function getName() + { + return 'AncestorsOfContent'; + } +} diff --git a/doc/examples/ancestors/README.md b/doc/examples/ancestors/README.md new file mode 100644 index 0000000..db7b8f6 --- /dev/null +++ b/doc/examples/ancestors/README.md @@ -0,0 +1,18 @@ +# Query field: ancestors example +A field that, given a content item, returns the ancestors of that item's locations that are of a given type. Example use-case: + +## Example +Images are added as children of Gallery items. +The `images.gallery` field returns the galleries any image is part of. + +### Query Type +`AncestorsOfContent` + +### Returned type +Image + +### Parameters +```yaml +content: "@=content" +type: "@=returnedType" +``` diff --git a/doc/examples/children/ChildrenQueryType.php b/doc/examples/children/ChildrenQueryType.php new file mode 100644 index 0000000..ee11f2f --- /dev/null +++ b/doc/examples/children/ChildrenQueryType.php @@ -0,0 +1,53 @@ + +{% for item in items %} + {{ render(controller("ez_content:viewAction", { + "contentId": item.id, + "viewType": itemViewType + })) }} +{% endfor %} + + +{% if isPaginationEnabled %} + {{ pagerfanta( items, 'ez', {'routeName': location, 'pageParameter': pageParameter } ) }} +{% endif %} diff --git a/doc/examples/children/templates/content/view/line/images.html.twig b/doc/examples/children/templates/content/view/line/images.html.twig new file mode 100644 index 0000000..47944ca --- /dev/null +++ b/doc/examples/children/templates/content/view/line/images.html.twig @@ -0,0 +1,11 @@ +
+ {{ ez_render_field( + content, 'image', + { + parameters: { + alias: 'small', + attrs: {class: 'img-fluid img-thumbnail'} + } + } + ) }} +
diff --git a/doc/examples/children/views.yml b/doc/examples/children/views.yml new file mode 100644 index 0000000..574c309 --- /dev/null +++ b/doc/examples/children/views.yml @@ -0,0 +1,17 @@ +ezpublish: + systems: + site: + content_view: + # Customize the layout around all the images + content_query_field: + gallery_images: + match: + Identifier\ContentType: gallery + Identifier\FieldDefinition: images + template: "content/view/content_query_field/gallery_images.html.twig" + # Customize the layout of each image + line: + images: + match: + Identifier\ContentType: image + template: "content/view/line/images.html.twig" diff --git a/doc/examples/nearby_places/README.md b/doc/examples/map_location_distance/README.md similarity index 68% rename from doc/examples/nearby_places/README.md rename to doc/examples/map_location_distance/README.md index db161dc..390a42c 100644 --- a/doc/examples/nearby_places/README.md +++ b/doc/examples/map_location_distance/README.md @@ -1,13 +1,12 @@ ### Nearby places query field - -A field that lists Place items located close to the current item. +A field that returns items based on their distance relative to the current item. #### Content type configuration The following assumes a "place" content item with a "location" map location field definition. ##### Query type -"Nearby places" (see [NearbyPlacesQueryType](NearbyPlacesQueryType.php). +"RelativeDistance" (see [NearbyPlacesQueryType](NearbyPlacesQueryType.php). ##### Parameters ```yaml diff --git a/doc/examples/nearby_places/NearbyPlacesQueryType.php b/doc/examples/map_location_distance/RelativeDistanceQueryType.php similarity index 89% rename from doc/examples/nearby_places/NearbyPlacesQueryType.php rename to doc/examples/map_location_distance/RelativeDistanceQueryType.php index 9a1ccc6..dca8998 100644 --- a/doc/examples/nearby_places/NearbyPlacesQueryType.php +++ b/doc/examples/map_location_distance/RelativeDistanceQueryType.php @@ -4,13 +4,13 @@ * @copyright Copyright (C) eZ Systems AS. All rights reserved. * @license For full copyright and license information view LICENSE file distributed with this source code. */ -namespace App\QueryType; +namespace AppBundle\QueryType; use eZ\Publish\API\Repository\Values\Content\Query; use eZ\Publish\API\Repository\Values\Content\Query\Criterion; use eZ\Publish\Core\QueryType\QueryType; -class NearbyPlacesQueryType implements QueryType +class RelativeDistanceQueryType implements QueryType { public function getQuery(array $parameters = []) { @@ -35,6 +35,6 @@ public function getSupportedParameters() public static function getName() { - return 'NearbyPlaces'; + return 'RelativeDistance'; } } diff --git a/doc/examples/reverse_relations/README.md b/doc/examples/reverse_relations/README.md new file mode 100644 index 0000000..389dcdc --- /dev/null +++ b/doc/examples/reverse_relations/README.md @@ -0,0 +1,43 @@ +### Partners references query field +A field that lists the references developed by a partner. + +#### Content type configuration +The "reference' content type with has a "partners" relation list field. Each partner involved in the reference is added. + +The "partner" content type has a "references" content query field. It lists all references that include that partner. + +##### Query type +AppBundle:RelatedToContent + +##### Returned type +Reference + +##### Parameters +```yaml +from_field: partners +sort_by: Name +content_type: '@=returnedType' +to_content: '@=content' +``` + +#### Layout customization +```yaml +ezpublish: + systems: + site: + languages: [eng-GB] + content_view: + # Customize the layout around all the images + content_query_field: + partner_references: + match: + Identifier\ContentType: partner + Identifier\FieldDefinition: references + template: "content/view/content_query_field/partner_references.html.twig" + # Customize the layout of each image + line: + reference: + match: + Identifier\ContentType: reference + template: "content/view/line/reference.html.twig" +``` diff --git a/doc/examples/reverse_relations/RelatedToContentQueryType.php b/doc/examples/reverse_relations/RelatedToContentQueryType.php new file mode 100644 index 0000000..4c9e4c9 --- /dev/null +++ b/doc/examples/reverse_relations/RelatedToContentQueryType.php @@ -0,0 +1,74 @@ +setDefined(['to_content', 'from_field', 'content_type', 'sort_by']); + $optionsResolver->setRequired(['to_content', 'from_field']); + $optionsResolver->addAllowedTypes('to_content', Content::class); + $optionsResolver->addAllowedTypes('from_field', 'string'); + $optionsResolver->addAllowedTypes('content_type', 'string'); + + } + + /** + * @inheritDoc + */ + protected function doGetQuery(array $parameters) + { + $query = new Query(); + $query->filter = new Query\Criterion\LogicalAnd([ + new Query\Criterion\FieldRelation($parameters['from_field'], Query\Criterion\Operator::CONTAINS, [$parameters['to_content']->id]) + ]); + if (isset($parameters['content_type'])) { + $query->filter->criteria[] = new Query\Criterion\ContentTypeIdentifier($parameters['content_type']); + } + + if (isset($parameters['sort_by'])) { + $sortClauseClass = 'Query\SortClause' . $parameters['sort_by']; + if (class_exists($sortClauseClass)) { + $query->sortClauses[] = new $sortClauseClass(Query::SORT_ASC); + } + } + + if (empty($query->sortClauses)) { + $query->sortClauses[] = new Query\SortClause\ContentName(Query::SORT_ASC); + } + + return $query; + } + + /** + * @inheritDoc + */ + public static function getName() + { + return 'RelatedToContent'; + } +}