oont-contents/plugins/webappick-product-feed-for-woocommerce/V5/API/V1/DropDown.php
2025-03-31 21:42:48 +02:00

323 lines
8.6 KiB
PHP

<?php
namespace CTXFeed\V5\API\V1;
use CTXFeed\V5\API\RestController;
use CTXFeed\V5\Common\Helper;
use CTXFeed\V5\Helper\FeedHelper;
use CTXFeed\V5\Merchant\TemplateConfig;
use CTXFeed\V5\Query\WCQuery;
use WP_REST_Server;
use CTXFeed\V5\Common\DropDownOptions;
use \WP_Error;
/**
* Class AttributesMapping
*
* @package CTXFeed
* @subpackage CTXFeed\V5\API
* @author Azizul Hasan <azizulhasan.cr@gmail.com>
* @link https://azizulhasan.com
* @license https://opensource.org/licenses/gpl-license.php GNU Public License
*/
class DropDown extends RestController {
/**
* @var $dropdown
*/
protected $dropdown;
/**
* The single instance of the class
*
* @var DropDown
*
*/
protected static $_instance = null;
private function __construct() {
parent::__construct();
$this->rest_base = 'drop_down';
$this->dropdown = DropDownOptions::instance();
}
/**
* Main DropDownOptionsApi Instance.
*
* Ensures only one instance of DropDownOptionsApi is loaded or can be loaded.
*
* @return DropDown Main instance
*/
public static function instance() {
if ( is_null( self::$_instance ) ) {
self::$_instance = new self();
}
return self::$_instance;
}
public function register_routes() {
register_rest_route(
$this->namespace,
'/' . $this->rest_base,
[
/**
* @endpoint: wp-json/ctxfeed/v1/drop_down/?type=feed_country
*
* @param $type String will be DropDownOptions class\'s method name
*/
[
'methods' => WP_REST_Server::READABLE,
'callback' => [ $this, 'get_item' ],
'permission_callback' => [ $this, 'get_item_permissions_check' ],
'args' => [
'type' => [
'description' => __( 'Dropdown type name. $type will be DropDownOptions class\'s method name. Example: wp-json/ctxfeed/v1/drop_down/?type=feed_country. Here fee_country is DropDownOptions method name.' ),
'type' => 'string',
'required' => true
],
'search' => [
'description' => __( 'Search with search string in the specific method. If search string exists.' ),
'type' => 'string',
'required' => false,
'default' => ''
],
],
],
'schema' => [ $this, 'get_item_schema' ],
]
);
// single feed rules
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/feed_rules',
[
/**
* @endpoint: wp-json/ctxfeed/v1/drop_down/feed_rules/?template=custom
*
* @param $template String feed template name.
*/
[
'methods' => WP_REST_Server::READABLE,
'callback' => [ $this, 'get_feed_rules' ],
'permission_callback' => [ $this, 'get_item_permissions_check' ],
'args' => [
'template' => [
'description' => __( 'Template name' ),
'type' => 'string',
'required' => true
],
],
],
'schema' => [ $this, 'get_item_schema' ],
]
);
// fetch all initial feed rules
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/initial_feed_rules',
[
/**
* @endpoint: wp-json/ctxfeed/v1/drop_down/initial_feed_rules
*
* @param $template String feed template name.
*/
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [ $this, 'get_initial_feed_rules' ],
'permission_callback' => [ $this, 'get_item_permissions_check' ],
'args' => [],
],
]
);
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/composite_plugins',
[
/**
* @endpoint: wp-json/ctxfeed/v1/drop_down/initial_feed_rules
*
* @param $template String feed template name.
*/
[
'methods' => WP_REST_Server::READABLE,
'callback' => [ $this, 'get_initialed_composite_plugins' ],
'permission_callback' => [ $this, 'get_item_permissions_check' ],
'args' => [],
],
]
);
}
/**
* Get dropdown based on type params. If parameter 'type' is not passed then it will give error.
* $type will be DropDownOptions class's method name.
*
* if method name is @param DropDownOptions@get_categories extra parameter cal be
* "slug" => string|comma separated 'string'
* "search" => string
*
* if method name is @param DropDownOptions@all_product_ids extra parameter cal be
* "include" => product id |comma separated product ids
* "s" => string
*
* @param $request
*
* @return void|\WP_Error|\WP_REST_Response
*/
public function get_item( $request ) {
$method = $request->get_param( 'type' );
$query_args = $this->get_query_args( $request->get_params() );
if ( method_exists( $this->dropdown, $method ) && count( $query_args ) ) {
$this->response['data'] = $this->dropdown::$method( $query_args );
} else if ( method_exists( $this->dropdown, $method ) ) {
$this->response['data'] = $this->dropdown::$method( '', false );
} else {
return $this->error( esc_attr_e( 'Method Does not exist !', 'woo-feed' ) );
}
$response = $this->success( $this->response['data'] );
if ( is_array( $this->response['data'] ) ) {
$response->header( 'X-WP-Total', count( $this->response['data'] ) );
}
return $response;
}
/**
* @param $query_args
*
* @return mixed
*/
public function get_query_args( $query_args ) {
foreach ( $query_args as $key => $value ) {
// if parameter value is empty remove it.
if ( empty( $value ) ) {
unset( $query_args[ $key ] );
}
if ( in_array( $key, [ 'slug', 'include' ] ) ) {
// if value is comma ( , ) separated then make it an array
if ( false !== strpos( $value, ',' ) ) {
$query_args[ $key ] = explode( ',', $value );
} else {
$query_args[ $key ] = [ $value ];
}
}
}
// unset method name
unset( $query_args['type'] );
if ( isset( $query_args['rest_route'] ) ) {
unset( $query_args['rest_route'] );
}
return $query_args;
}
/**
* Get feed configuration based on template name.
*
* @param $request
*
* @return void|\WP_Error|\WP_REST_Response
*/
public function get_feed_rules( $request ) {
$template = $request->get_param( 'template' );
$specialTemplates = FeedHelper::get_special_templates();
if ( in_array( $template, $specialTemplates ) ) {
$merchantData = TemplateConfig::get( $template );
$this->response['data'] = $merchantData['feed_config_custom2'];
$this->response['extra'] = [
'provider' => $template,
];
$response = $this->success( $this->response['data'] );
$response->header( 'X-WP-Total', 1 );
} else {
$this->response['data'] = TemplateConfig::get( $template );
$this->response['extra'] = [
'provider' => $template,
];
$response = $this->success( $this->response['data'] );
$response->header( 'X-WP-Total', count( $this->response['data'] ) );
}
return $response;
}
/**
* Get feed configuration based on template name.
*
* @param $request
*
* @return void|\WP_Error|\WP_REST_Response
*/
public function get_initial_feed_rules( $request ) {
$templates = $request->get_body();
$templates = json_decode( $templates , true);
$this->response['data'] = TemplateConfig::getMultiple( $templates );
$response = $this->success( $this->response['data'] );
$response->header( 'X-WP-Total', count( $this->response['data'] ) );
return $response;
}
public function get_initialed_composite_plugins( $request ) {
$this->response['data'] = Helper::ctx_feed_has_composite_product_plugin();
$response = $this->success( $this->response['data'] );
return $response;
}
/**
* Retrieves the contact schema, conforming to JSON Schema.
*
* @return array
*/
public function get_item_schema() {
if ( $this->schema ) {
return $this->add_additional_fields_schema( $this->schema );
}
$schema = [
'$schema' => 'http://json-schema.org/draft-04/schema#',
'title' => 'dropdown',
'type' => 'array',
'properties' => [
'dropdown' => [
'description' => __( 'Unique identifier for the object.' ),
'type' => 'array',
'context' => [ 'view', 'edit' ],
'readonly' => false,
],
]
];
$this->schema = $schema;
return $this->add_additional_fields_schema( $this->schema );
}
/**
* Retrieves the query params for collections.
*
* @return array
*/
public function get_collection_params() {
$params = parent::get_collection_params();
unset( $params['search'] );
return $params;
}
}