File "Controller.php"
Full Path: /home/attunedd/public_html/byp/wp-content/plugins/carousel-slider/modules/HeroCarousel/Controller.php
File size: 24.78 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace CarouselSlider\Modules\HeroCarousel;
use CarouselSlider\REST\ApiController;
use CarouselSlider\Supports\Sanitize;
use WP_Error;
use WP_Post;
use WP_REST_Request;
use WP_REST_Response;
use WP_REST_Server;
/**
* Controller class
*/
class Controller extends ApiController {
/**
* Registers the routes for the objects of the controller.
*/
public function register_routes() {
register_rest_route(
$this->namespace,
'/carousels/hero',
[
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [ $this, 'create_item' ],
'permission_callback' => [ $this, 'create_item_permissions_check' ],
'args' => $this->get_create_item_params(),
],
]
);
register_rest_route(
$this->namespace,
'/carousels/hero/(?P<id>[\d]+)',
[
'args' => [
'id' => [
'description' => __( 'Unique identifier for the carousel.', 'carousel-slider' ),
'type' => 'integer',
],
],
[
'methods' => WP_REST_Server::READABLE,
'callback' => [ $this, 'get_item' ],
'permission_callback' => [ $this, 'get_item_permissions_check' ],
],
[
'methods' => WP_REST_Server::EDITABLE,
'callback' => [ $this, 'update_item' ],
'permission_callback' => [ $this, 'create_item_permissions_check' ],
'args' => $this->get_create_item_params(),
],
]
);
}
/**
* Creates one item from the collection.
*
* @param WP_REST_Request $request Full details about the request.
*
* @return WP_REST_Response Response object.
*/
public function create_item( $request ) {
$title = $request->get_param( 'title' );
$slider_id = \CarouselSlider\Helper::create_slider( $title, 'hero-banner-slider' );
if ( is_wp_error( $slider_id ) ) {
return $this->respond_with_wp_error( $slider_id );
}
$general_settings = $request->get_param( 'general_settings' );
$this->update_general_setting( $slider_id, $general_settings );
$items = $request->get_param( 'slider_items' );
$slider_items = array_map( [ $this, 'prepare_slider_item_for_database' ], $items );
update_post_meta( $slider_id, '_content_slider', $slider_items );
$slider_settings = $request->get_param( 'slider_settings' );
update_post_meta( $slider_id, '_content_slider_settings', $slider_settings );
$settings = new Setting( $slider_id );
$general_settings = $settings->to_array();
if ( isset( $general_settings['slider_settings'] ) ) {
unset( $general_settings['slider_settings'] );
}
return $this->respond_created(
[
'title' => $title,
'slider_type' => $settings->get_slider_type(),
'slider_status' => get_post_status( $slider_id ),
'global_settings' => $settings->get_global_settings(),
'general_settings' => $general_settings,
'slider_settings' => $settings->get_content_settings(),
'slider_items' => $items,
]
);
}
/**
* Retrieves one item from the collection.
*
* @param WP_REST_Request $request Full details about the request.
*
* @return WP_REST_Response Response object.
*/
public function get_item( $request ) {
$id = (int) $request->get_param( 'id' );
$post = get_post( $id );
$settings = new Setting( $id );
$general_settings = $settings->to_array();
$items = $settings->get_slider_items();
$items = array_map( [ $this, 'prepare_slider_item_for_response' ], $items );
if ( isset( $general_settings['slider_settings'] ) ) {
unset( $general_settings['slider_settings'] );
}
return $this->respond_ok(
[
'title' => get_the_title( $post ),
'slider_type' => $settings->get_slider_type(),
'slider_status' => $post->post_status,
'global_settings' => $settings->get_global_settings(),
'general_settings' => $general_settings,
'slider_settings' => $settings->get_content_settings(),
'slider_items' => $items,
]
);
}
/**
* Updates one item from the collection.
*
* @param WP_REST_Request $request Full details about the request.
*
* @return WP_REST_Response Response object.
*/
public function update_item( $request ) {
$slider_id = (int) $request->get_param( 'id' );
$post = get_post( $slider_id );
if ( ! ( $post instanceof WP_Post && CAROUSEL_SLIDER_POST_TYPE === $post->post_type ) ) {
return $this->respond_not_found();
}
$title = $request->get_param( 'title' );
if ( get_the_title( $post ) !== $title ) {
wp_update_post(
[
'ID' => $slider_id,
'title' => $title,
]
);
}
$general_settings = $request->get_param( 'general_settings' );
$this->update_general_setting( $slider_id, $general_settings );
$items = $request->get_param( 'slider_items' );
$slider_items = array_map( [ $this, 'prepare_slider_item_for_database' ], $items );
update_post_meta( $slider_id, '_content_slider', $slider_items );
$slider_settings = $request->get_param( 'slider_settings' );
update_post_meta( $slider_id, '_content_slider_settings', $slider_settings );
$settings = new Setting( $slider_id );
$general_settings = $settings->to_array();
if ( isset( $general_settings['slider_settings'] ) ) {
unset( $general_settings['slider_settings'] );
}
return $this->respond_ok(
[
'title' => $title,
'slider_type' => $settings->get_slider_type(),
'slider_status' => get_post_status( $slider_id ),
'global_settings' => $settings->get_global_settings(),
'general_settings' => $general_settings,
'slider_settings' => $settings->get_content_settings(),
'slider_items' => $items,
]
);
}
/**
* Sanitize general settings.
*
* @param mixed $data Raw data.
*
* @return array
*/
public function sanitize_general_setting( $data ): array {
$sanitized_data = parent::sanitize_general_setting( $data );
$sanitized_data['type_of_slider'] = 'slider';
$sanitized_data['slides_per_view'] = [ 'xs' => 1 ];
return $sanitized_data;
}
/**
* Sanitize hero slider settings
*
* @param mixed $data The raw data.
*
* @return array
*/
public function sanitize_hero_slider_settings( $data ): array {
$default = [
'slide_height' => '400px',
'content_width' => '850px',
'content_animation' => 'zoomIn',
'slide_padding' => [
'top' => '1rem',
'right' => '1rem',
'bottom' => '1rem',
'left' => '1rem',
],
];
if ( ! is_array( $data ) ) {
return $default;
}
return wp_parse_args( $data, $default );
}
/**
* Sanitize hero slider items
*
* @param mixed $data The data to be sanitized.
*
* @return array
*/
public function sanitize_hero_slider_items( $data ): array {
if ( ! is_array( $data ) ) {
return [];
}
$sanitized_data = [];
foreach ( $data as $index => $value ) {
if ( ! is_array( $value ) ) {
continue;
}
$sanitized_data[] = $this->sanitize_hero_slider_item( $value );
}
return $sanitized_data;
}
/**
* Sanitize hero slider item.
*
* @param array $value The value to be sanitized.
*
* @return array
*/
public function sanitize_hero_slider_item( array $value ): array {
$sanitized_data = [
'background_type' => $value['background_type'],
];
if ( 'image' === $value['background_type'] && is_array( $value['bg_image'] ) ) {
$default = [
'img_id' => '',
'img_position' => Item::get_default_value( 'img_bg_position' ),
'img_size' => Item::get_default_value( 'img_bg_size' ),
'overlay_color' => Item::get_default_value( 'bg_overlay' ),
'ken_burns_effect' => Item::get_default_value( 'ken_burns_effect' ),
];
$bg_image = wp_parse_args( $value['bg_image'], $default );
$sanitized_data['bg_image'] = [
'img_id' => Sanitize::int( $bg_image['img_id'] ),
'img_position' => Sanitize::text( $bg_image['img_position'] ),
'img_size' => Sanitize::text( $bg_image['img_size'] ),
'overlay_color' => Sanitize::color( $bg_image['overlay_color'] ),
'ken_burns_effect' => Sanitize::text( $bg_image['ken_burns_effect'] ),
];
}
if ( 'color' === $value['background_type'] ) {
$sanitized_data['bg_color'] = Sanitize::color( $value['bg_color'] );
}
$sanitized_data['content_alignment'] = $value['content_alignment'] ?? Item::get_default_value( 'content_alignment' );
$sanitized_data['content_animation'] = $value['content_animation'] ?? '';
$heading_default = [
'text' => Item::get_default_value( 'slide_heading' ),
'font_size' => Item::get_default_value( 'heading_font_size' ),
'margin_bottom' => Item::get_default_value( 'heading_gutter' ),
'color' => Item::get_default_value( 'heading_color' ),
];
$sanitized_data['heading'] = wp_parse_args( $value['heading'], $heading_default );
if ( ! empty( $value['description']['text'] ) ) {
$description_default = [
'text' => Item::get_default_value( 'slide_description' ),
'font_size' => Item::get_default_value( 'description_font_size' ),
'margin_bottom' => Item::get_default_value( 'description_gutter' ),
'color' => Item::get_default_value( 'description_color' ),
];
$sanitized_data['description'] = wp_parse_args( $value['description'], $description_default );
}
$sanitized_data['link_type'] = $value['link_type'] ?? Item::get_default_value( 'link_type' );
if ( 'full' === $sanitized_data['link_type'] ) {
$sanitized_data['full_link'] = [
'url' => $value['full_link']['url'],
'target' => $value['full_link']['target'] ?? Item::get_default_value( 'link_target' ),
];
}
if ( 'button' === $sanitized_data['link_type'] ) {
if ( ! empty( $value['button_link']['primary']['text'] ) && ! empty( $value['button_link']['primary']['url'] ) ) {
$primary_button_default = [
'text' => Item::get_default_value( 'button_one_text' ),
'url' => Item::get_default_value( 'button_one_url' ),
'target' => Item::get_default_value( 'button_one_target' ),
'type' => Item::get_default_value( 'button_one_type' ),
'size' => Item::get_default_value( 'button_one_size' ),
'border_width' => Item::get_default_value( 'button_one_border_width' ),
'border_radius' => Item::get_default_value( 'button_one_border_radius' ),
'bg_color' => Item::get_default_value( 'button_one_bg_color' ),
'color' => Item::get_default_value( 'button_one_color' ),
];
$primary_button = wp_parse_args( $value['button_link']['primary'], $primary_button_default );
$sanitized_data['button_link']['primary'] = $primary_button;
}
if ( ! empty( $value['button_link']['secondary']['text'] ) && ! empty( $value['button_link']['secondary']['url'] ) ) {
$secondary_button_default = [
'text' => Item::get_default_value( 'button_two_text' ),
'url' => Item::get_default_value( 'button_two_url' ),
'target' => Item::get_default_value( 'button_two_target' ),
'type' => Item::get_default_value( 'button_two_type' ),
'size' => Item::get_default_value( 'button_two_size' ),
'border_width' => Item::get_default_value( 'button_two_border_width' ),
'border_radius' => Item::get_default_value( 'button_two_border_radius' ),
'bg_color' => Item::get_default_value( 'button_two_bg_color' ),
'color' => Item::get_default_value( 'button_two_color' ),
];
$secondary_button = wp_parse_args( $value['button_link']['secondary'], $secondary_button_default );
$sanitized_data['button_link']['secondary'] = $secondary_button;
}
}
return $sanitized_data;
}
/**
* Prepare slider item for response
*
* @param Item $item The Item object.
*
* @return array
*/
public function prepare_slider_item_for_response( Item $item ): array {
$data = [
'background_type' => $item->get_background_type(),
'bg_color' => $item->get_prop( 'bg_color' ),
'bg_image' => [
'img_id' => $item->get_prop( 'img_id' ),
'img_position' => $item->get_prop( 'img_bg_position' ),
'img_size' => $item->get_prop( 'img_bg_size' ),
'overlay_color' => $item->get_prop( 'bg_overlay' ),
'ken_burns_effect' => $item->get_prop( 'ken_burns_effect' ),
],
'content_alignment' => $item->get_prop( 'content_alignment' ),
'content_animation' => $item->get_content_animation(),
'heading' => [
'text' => $item->get_prop( 'slide_heading' ),
'font_size' => $item->get_prop( 'heading_font_size' ),
'margin_bottom' => $item->get_prop( 'heading_gutter' ),
'color' => $item->get_prop( 'heading_color' ),
],
'description' => [
'text' => $item->get_prop( 'slide_description' ),
'font_size' => $item->get_prop( 'description_font_size' ),
'margin_bottom' => $item->get_prop( 'description_gutter' ),
'color' => $item->get_prop( 'description_color' ),
],
'link_type' => $item->get_link_type(),
'full_link' => [
'url' => $item->get_prop( 'slide_link' ),
'target' => $item->get_prop( 'link_target' ),
],
'button_link' => [
'primary' => new \ArrayObject(),
'secondary' => new \ArrayObject(),
],
];
if ( $item->has_button_one() ) {
$data['button_link']['primary'] = [
'text' => $item->get_prop( 'button_one_text' ),
'url' => $item->get_prop( 'button_one_url' ),
'target' => $item->get_prop( 'button_one_target' ),
'type' => $item->get_prop( 'button_one_type' ),
'size' => $item->get_prop( 'button_one_size' ),
'border_width' => $item->get_prop( 'button_one_border_width' ),
'border_radius' => $item->get_prop( 'button_one_border_radius' ),
'bg_color' => $item->get_prop( 'button_one_bg_color' ),
'color' => $item->get_prop( 'button_one_color' ),
];
}
if ( $item->has_button_two() ) {
$data['button_link']['primary'] = [
'text' => $item->get_prop( 'button_two_text' ),
'url' => $item->get_prop( 'button_two_url' ),
'target' => $item->get_prop( 'button_two_target' ),
'type' => $item->get_prop( 'button_two_type' ),
'size' => $item->get_prop( 'button_two_size' ),
'border_width' => $item->get_prop( 'button_two_border_width' ),
'border_radius' => $item->get_prop( 'button_two_border_radius' ),
'bg_color' => $item->get_prop( 'button_two_bg_color' ),
'color' => $item->get_prop( 'button_two_color' ),
];
}
return $data;
}
/**
* Prepare slider item for database
*
* @param array $data Raw data.
*
* @return string[]
*/
public function prepare_slider_item_for_database( array $data ): array {
$default = Item::get_default();
$sanitized_data = [
'background_type' => $data['background_type'],
'content_alignment' => $data['content_alignment'],
'content_animation' => $data['content_animation'],
'link_type' => $data['link_type'],
];
if ( 'color' === $data['background_type'] ) {
$sanitized_data['bg_color'] = $data['bg_color'] ?? '';
}
if ( 'image' === $data['background_type'] && is_array( $data['bg_image'] ) ) {
$sanitized_data['img_id'] = $data['bg_image']['img_id'];
$sanitized_data['img_bg_position'] = $data['bg_image']['img_position'];
$sanitized_data['img_bg_size'] = $data['bg_image']['img_size'];
$sanitized_data['ken_burns_effect'] = $data['bg_image']['ken_burns_effect'];
$sanitized_data['bg_overlay'] = $data['bg_image']['overlay_color'];
}
if ( ! empty( $data['heading']['text'] ) ) {
$sanitized_data['slide_heading'] = $data['heading']['text'];
$sanitized_data['heading_font_size'] = $data['heading']['font_size'];
$sanitized_data['heading_gutter'] = $data['heading']['margin_bottom'];
$sanitized_data['heading_color'] = $data['heading']['color'];
}
if ( ! empty( $data['description']['text'] ) ) {
$sanitized_data['slide_description'] = $data['description']['text'];
$sanitized_data['description_font_size'] = $data['description']['font_size'];
$sanitized_data['description_gutter'] = $data['description']['margin_bottom'];
$sanitized_data['description_color'] = $data['description']['color'];
}
if ( 'full' === $data['link_type'] ) {
$sanitized_data['slide_link'] = $data['full_link']['url'];
$sanitized_data['link_target'] = $data['full_link']['target'];
}
if ( 'button' === $data['link_type'] && isset( $data['button_link'] ) ) {
if ( isset( $data['button_link']['primary'] ) ) {
foreach ( $data['button_link']['primary'] as $key_suffix => $value ) {
$sanitized_data[ 'button_one_' . $key_suffix ] = $value;
}
}
if ( isset( $data['button_link']['secondary'] ) ) {
foreach ( $data['button_link']['secondary'] as $key_suffix => $value ) {
$sanitized_data[ 'button_two_' . $key_suffix ] = $value;
}
}
}
return wp_parse_args( $sanitized_data, $default );
}
/**
* Validate a request argument based on details registered to the route.
*
* @param mixed $value The value.
* @param WP_REST_Request $request The Request object.
* @param string $param Parameter name.
*
* @return true|WP_Error
*/
public function validate_hero_slider_items_args( $value, $request, $param ) {
if ( ! is_array( $value ) ) {
return new WP_Error(
'rest_invalid_type',
/* translators: 1: Parameter, 2: List of types. */
__( 'slider_items is not of type array.', 'carousel-slider' ),
array( 'param' => $param )
);
}
$attributes = $request->get_attributes();
if ( ! isset( $attributes['args'][ $param ] ) || ! is_array( $attributes['args'][ $param ] ) ) {
return true;
}
foreach ( $value as $index => $item ) {
$is_valid = $this->validate_hero_slider_item_args( $item, $index );
if ( is_wp_error( $is_valid ) ) {
return $is_valid;
}
}
return true;
}
/**
* Validate hero slider single item arguments.
*
* @param array $item User submitted data.
* @param int $index Item index.
*
* @return true|WP_Error
*/
public function validate_hero_slider_item_args( array $item, int $index = 0 ) {
$background_type = $item['background_type'] ?? '';
$name = 'slider_items[' . $index . ']';
if ( 'color' === $background_type ) {
if ( empty( $item['bg_color'] ) ) {
return new WP_Error(
'rest_property_required',
/* translators: %s will be replaced with name*/
sprintf( __( 'bg_color is a required property of %s when background_type is set as color', 'carousel-slider' ), $name )
);
}
}
if ( 'image' === $background_type ) {
if ( empty( $item['bg_image'] ) ) {
return new WP_Error(
'rest_property_required',
/* translators: %s will be replaced with name*/
sprintf( __( 'bg_image is a required property of %s when background_type is set as image', 'carousel-slider' ), $name )
);
}
if ( empty( $item['bg_image']['img_id'] ) ) {
return new WP_Error(
'rest_property_required',
/* translators: %s will be replaced with name*/
sprintf( __( 'img_id is a required property of %s[bg_image]', 'carousel-slider' ), $name )
);
}
$src = wp_get_attachment_image_src( $item['bg_image']['img_id'] );
if ( ! is_array( $src ) ) {
return new WP_Error(
'rest_invalid_value',
/* translators: %s will be replaced with name*/
sprintf( __( 'The value of img_id of %s[bg_image] is invalid.', 'carousel-slider' ), $name )
);
}
}
return true;
}
/**
* Create item parameters
*
* @return array[]
*/
public function get_create_item_params(): array {
return [
'title' => [
'description' => __( 'The carousel slider title', 'carousel-slider' ),
'type' => 'string',
'required' => true,
'sanitize_callback' => 'sanitize_text_field',
'validate_callback' => 'rest_validate_request_arg',
],
'general_settings' => [
'description' => __( 'Carousel settings.', 'carousel-slider' ),
'type' => 'object',
'properties' => $this->general_setting_args_properties(),
'default' => $this->general_setting_defaults,
'sanitize_callback' => [ $this, 'sanitize_general_setting' ],
'validate_callback' => 'rest_validate_request_arg',
],
'slider_settings' => [
'description' => __( 'Hero carousel specific settings.', 'carousel-slider' ),
'type' => 'object',
'required' => true,
'properties' => [
'slide_height' => [
'type' => 'string',
'required' => true,
],
'content_animation' => [
'type' => 'string',
'required' => true,
'enum' => array_keys( Helper::animations() ),
],
'content_width' => [ 'type' => 'string' ],
'slide_padding' => [
'type' => 'object',
'properties' => [
'top' => [ 'type' => 'string' ],
'right' => [ 'type' => 'string' ],
'bottom' => [ 'type' => 'string' ],
'left' => [ 'type' => 'string' ],
],
],
],
'sanitize_callback' => [ $this, 'sanitize_hero_slider_settings' ],
],
'slider_items' => [
'description' => __( 'Carousel settings.', 'carousel-slider' ),
'type' => 'array',
'required' => true,
'items' => [
'type' => 'object',
'properties' => $this->hero_carousel_setting_args_properties(),
],
'sanitize_callback' => [ $this, 'sanitize_hero_slider_items' ],
'validate_callback' => [ $this, 'validate_hero_slider_items_args' ],
],
];
}
/**
* Get general setting arguments property
*
* @return array[]
*/
public function hero_carousel_setting_args_properties(): array {
return [
'background_type' => [
'type' => 'string',
'enum' => [ 'color', 'image' ],
'required' => true,
],
'bg_color' => [
'type' => 'string',
'sanitize_callback' => [ Sanitize::class, 'color' ],
],
'bg_image' => [
'type' => 'object',
'properties' => [
'img_id' => [
'type' => 'int',
'sanitize_callback' => [ Sanitize::class, 'int' ],
],
'img_position' => [
'type' => 'string',
'enum' => array_keys( Helper::background_position() ),
],
'img_size' => [
'type' => 'string',
'enum' => array_keys( Helper::background_size() ),
],
'overlay_color' => [
'type' => 'string',
'sanitize_callback' => [ Sanitize::class, 'color' ],
],
'ken_burns_effect' => [
'type' => 'string',
'enum' => array_keys( Helper::ken_burns_effects() ),
],
],
],
'content_alignment' => [
'required' => true,
'type' => 'string',
'enum' => array_keys( Helper::text_alignment() ),
],
'content_animation' => [
'type' => 'string',
'enum' => array_keys( Helper::animations() ),
],
'heading' => [
'required' => true,
'type' => 'object',
'properties' => $this->get_section_text_properties(),
],
'description' => [
'type' => 'object',
'properties' => $this->get_section_text_properties(),
],
'link_type' => [
'required' => true,
'type' => 'string',
'enum' => array_keys( Helper::link_type() ),
],
'full_link' => [
'type' => 'object',
'properties' => [
'url' => [ 'type' => 'string' ],
'target' => [
'type' => 'string',
'enum' => array_keys( Helper::link_target() ),
],
],
],
'button_link' => [
'type' => 'object',
'properties' => [
'primary' => [
'type' => 'object',
'properties' => $this->get_button_properties(),
],
'secondary' => [
'type' => 'object',
'properties' => $this->get_button_properties(),
],
],
],
];
}
/**
* Get section text properties
*
* @return array[]
*/
protected function get_section_text_properties(): array {
return [
'text' => [ 'type' => 'string' ],
'font_size' => [ 'type' => 'string' ],
'margin_bottom' => [ 'type' => 'string' ],
'color' => [ 'type' => 'string' ],
];
}
/**
* Get button properties
*
* @return array
*/
protected function get_button_properties(): array {
return [
'text' => [ 'type' => 'string' ],
'url' => [ 'type' => 'string' ],
'target' => [ 'type' => 'string' ],
'type' => [
'type' => 'string',
'enum' => array_keys( Helper::button_type() ),
],
'size' => [
'type' => 'string',
'enum' => array_keys( Helper::button_size() ),
],
'border_width' => [ 'type' => 'string' ],
'border_radius' => [ 'type' => 'string' ],
'bg_color' => [ 'type' => 'string' ],
'color' => [ 'type' => 'string' ],
];
}
}