From 5cec9ccd94231dd007a4cc89c68fe6d4bf4b9e00 Mon Sep 17 00:00:00 2001 From: eduardohumberto Date: Wed, 29 Aug 2018 21:36:05 -0300 Subject: [PATCH] allow pagination in facets endpoint (ref. #94) --- .../class-tainacan-rest-facets-controller.php | 78 ++++++++++++++++++- .../filter-types/filter-types-mixin.js | 6 +- 2 files changed, 77 insertions(+), 7 deletions(-) diff --git a/src/api/endpoints/class-tainacan-rest-facets-controller.php b/src/api/endpoints/class-tainacan-rest-facets-controller.php index 5328d32e0..35eae8fd8 100644 --- a/src/api/endpoints/class-tainacan-rest-facets-controller.php +++ b/src/api/endpoints/class-tainacan-rest-facets-controller.php @@ -13,6 +13,8 @@ class REST_Facets_Controller extends REST_Controller { */ public function __construct() { $this->rest_base = 'facets'; + $this->total_pages = 0; + $this->total_items = 0; parent::__construct(); add_action('init', array(&$this, 'init_objects'), 11); } @@ -56,15 +58,16 @@ class REST_Facets_Controller extends REST_Controller { * @return \WP_Error|\WP_REST_Response */ public function get_item( $request ) { - - $metadatum_id = $request['metadatum_id']; + + $metadatum_id = $request['metadatum_id']; $metadatum = $this->metadatum_repository->fetch($metadatum_id); $response = $this->prepare_item_for_response($metadatum, $request ); $rest_response = new \WP_REST_Response($response, 200); - $rest_response->header('X-WP-Total', (int) count($response)); + $rest_response->header('X-WP-Total', $this->total_items); + $rest_response->header('X-WP-TotalPages', $this->total_pages); return $rest_response; } @@ -95,6 +98,10 @@ class REST_Facets_Controller extends REST_Controller { $restItemsClass = new REST_Items_Controller(); + if(isset($request['number'])){ + $args['posts_per_page'] = $request['number']; + } + $items = $this->items_repository->fetch($args, $options['collection_id'], 'WP_Query'); if ($items->have_posts()) { while ( $items->have_posts() ) { @@ -109,6 +116,9 @@ class REST_Facets_Controller extends REST_Controller { wp_reset_postdata(); } + $this->total_items = $items->found_posts; + $this->total_pages = ceil($this->total_items / (int) $items->query_vars['posts_per_page']); + } else if ( $metadatum_type === 'Tainacan\Metadata_Types\Taxonomy' ){ if( isset($request['term_id']) ){ @@ -127,6 +137,8 @@ class REST_Facets_Controller extends REST_Controller { array_push($response, $restTermClass->prepare_item_for_response( $term, $request )); } + $this->set_pagination_properties_term_type( $args, $response ); + } else { $metadatum_id = $metadatum->get_id(); $offset = ''; @@ -153,6 +165,7 @@ class REST_Facets_Controller extends REST_Controller { } } + $this->set_pagination_properties_text_type( $collection_id, $metadatum_id, ($request['search']) ? $request['search'] : '' , $offset, $number ); } } @@ -181,7 +194,7 @@ class REST_Facets_Controller extends REST_Controller { foreach ( $response as $key => $item ) { if( $type === 'Tainacan\Metadata_Types\Taxonomy' ){ - + $row = [ 'label' => $item['name'], 'value' => $item['id'], @@ -223,6 +236,63 @@ class REST_Facets_Controller extends REST_Controller { return $result; } + + /** + * set attributes for text metadata + */ + private function set_pagination_properties_text_type( $collection_id, $metadatum_id, $search , $offset, $number ){ + $response = $this->metadatum_repository->fetch_all_metadatum_values( $collection_id, $metadatum_id, $search); + + if( $response && is_array( $response ) ){ + + if ( $offset !== '' && $number) { + $per_page = (int) $number; + $page = ceil( ( ( (int) $offset ) / $per_page ) + 1 ); + + $this->total_items = count( $response ); + + $max_pages = ceil( $this->total_items / $per_page ); + + $this->total_pages = (int) $max_pages ; + } else { + $this->total_items = count( $response ); + $this->total_pages = 1; + } + } else { + $this->total_items = 0; + $this->total_pages = 0; + } + } + + /** + * set attributes for term metadata + */ + private function set_pagination_properties_term_type( $args, $response ){ + + if(isset($args['number'], $args['offset'])){ + $number = $args['number']; + $offset = $args['offset']; + + unset( $args['number'], $args['offset'] ); + $total_terms = wp_count_terms( $this->taxonomy->get_db_identifier(), $args ); + + if ( ! $total_terms ) { + $total_terms = 0; + } + + $per_page = (int) $number; + $page = ceil( ( ( (int) $offset ) / $per_page ) + 1 ); + + $this->total_items = (int) $total_terms ; + + $max_pages = ceil( $total_terms / $per_page ); + + $this->total_pages = (int) $max_pages ; + } else{ + $this->total_items = count($response) ; + $this->total_pages = 1 ; + } + } } ?> \ No newline at end of file diff --git a/src/classes/filter-types/filter-types-mixin.js b/src/classes/filter-types/filter-types-mixin.js index 5c0099907..b38105ba0 100644 --- a/src/classes/filter-types/filter-types-mixin.js +++ b/src/classes/filter-types/filter-types-mixin.js @@ -24,7 +24,7 @@ export const filter_type_mixin = { let url = `/collection/${this.collection}/facets/${metadatumId}?`; if(offset != undefined && number != undefined){ - url += `offset=${offset}&number=${number}`; + url += `offset=${offset}&number=${number}&`; } if(isRepositoryLevel){ @@ -32,7 +32,7 @@ export const filter_type_mixin = { } if(search && offset != undefined && number != undefined){ - url += `&search=${search}&` + qs.stringify(query_items); + url += `search=${search}&` + qs.stringify(query_items); } else if(search){ url += `search=${search}&` + qs.stringify(query_items); } else { @@ -107,7 +107,7 @@ export const filter_type_mixin = { let url = '/collection/' + this.filter.collection_id + '/facets/' + this.filter.metadatum.metadatum_id + '?'; if(offset != undefined && number != undefined){ - url += `offset=${offset}&perpage=${number}`; + url += `offset=${offset}&number=${number}`; } else { url += `nopaging=1` }