$initial_data Initial data. */ public function __construct( $initial_data = null ) { $initial_data = $this->normalize_cloud_api( $initial_data ); parent::__construct( [ 'snippets' => [], 'total_snippets' => 0, 'total_pages' => 0, 'page' => 0, 'cloud_id_rev' => [], ], $initial_data, [ 'items' => 'snippets', 'total_items' => 'total_snippets', 'page' => 'page', 'cloud_id_rev' => 'cloud_id_rev', ] ); } /** * Prepare a value before it is stored. * * @param mixed $value Value to prepare. * @param string $field Field name. * * @return mixed Value in the correct format. */ protected function prepare_field( $value, string $field ) { switch ( $field ) { case 'page': case 'total_pages': case 'total_snippets': return absint( $value ); default: return $value; } } /** * Prepare the `snippets` field by ensuring it is a list of Cloud_Snippets objects. * * @param mixed $snippets The field as provided. * * @return Cloud_Snippets[] The field in the correct format. */ protected function prepare_snippets( $snippets ): array { $result = []; $snippets = is_array( $snippets ) ? $snippets : [ $snippets ]; foreach ( $snippets as $snippet ) { $result[] = $snippet instanceof Cloud_Snippet ? $snippet : new Cloud_Snippet( $snippet ); } return $result; } /** * Normalize payloads returned by the cloud API into the shape expected by this class. * * @param mixed $initial_data Raw data passed into the constructor. * * @return mixed Normalized data array or original value when no normalization is required. */ private function normalize_cloud_api( $initial_data ) { // pagination metadata is nested under a 'meta' key. if ( is_array( $initial_data ) && isset( $initial_data['meta'] ) ) { $meta = $initial_data['meta']; $normalized = []; $normalized['snippets'] = $initial_data['snippets'] ?? $initial_data['data'] ?? []; $normalized['total_snippets'] = isset( $meta['total'] ) ? (int) $meta['total'] : 0; $normalized['total_pages'] = isset( $meta['total_pages'] ) ? (int) $meta['total_pages'] : 0; $normalized['page'] = isset( $meta['page'] ) ? max( 0, (int) $meta['page'] - 1 ) : 0; $normalized['cloud_id_rev'] = $initial_data['cloud_id_rev'] ?? []; $initial_data = $normalized; } return $initial_data; } }