geno/wp-content/plugins/cartflows/modules/gutenberg/classes/class-cartflows-init-blocks.php
2024-02-01 11:54:18 +00:00

586 lines
20 KiB
PHP

<?php
/**
* Cartflows Blocks Initializer
*
* Enqueue CSS/JS of all the blocks.
*
* @since 1.6.15
* @package Cartflows
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
/**
* Cartflows_Init_Blocks.
*
* @package Cartflows
*/
class Cartflows_Init_Blocks {
/**
* Member Variable
*
* @var instance
*/
private static $instance;
/**
* Store Json variable
*
* @since 1.8.1
* @var instance
*/
public static $icon_json;
/**
* Initiator
*/
public static function get_instance() {
if ( ! isset( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Constructor
*/
public function __construct() {
// Hook: Frontend assets.
add_action( 'enqueue_block_assets', array( $this, 'block_assets' ) );
// Hook: Editor assets.
add_action( 'enqueue_block_editor_assets', array( $this, 'editor_assets' ) );
if ( version_compare( get_bloginfo( 'version' ), '5.8', '>=' ) ) {
add_filter( 'block_categories_all', array( $this, 'register_block_category' ), 10, 2 );
} else {
add_filter( 'block_categories', array( $this, 'register_block_category' ), 10, 2 );
}
add_action( 'wp_ajax_wpcf_order_detail_form_shortcode', array( $this, 'order_detail_form_shortcode' ) );
add_action( 'wp_ajax_wpcf_order_checkout_form_shortcode', array( $this, 'order_checkout_form_shortcode' ) );
add_action( 'wp_ajax_wpcf_optin_form_shortcode', array( $this, 'optin_form_shortcode' ) );
add_filter(
'cartflows_show_demo_order_details',
function() {
return true;
}
);
add_action( 'enqueue_block_editor_assets', array( $this, 'add_gcp_vars_to_block_editor' ), 12 );
// Load the action only if the theme.json file is present in the file.
if ( wp_theme_has_theme_json() ) {
add_filter( 'wp_theme_json_data_theme', array( $this, 'update_theme_json_file_config' ) );
}
}
/**
* Add CartFlows GCP css vars to the theme's theme.json file if it is present.
*
* Use-case: Some themes adds the theme.json file in the theme's root directory. Due to this change, it overrides the default color pallet.
* and the filter which are using to add the CSS vars in the Gutenberg does not works and hence, we have to re-add and append it to the theme.json file.
*
* Note: If theme.json is not present then this filter will not be executed.
*
* @param WP_Theme_JSON_Data $theme_json_data The Data from the theme.json file.
* @return WP_Theme_JSON_Data $theme_json_data Modified data of theme.json file.
*
* @since x.x.x
*/
public function update_theme_json_file_config( $theme_json_data ) {
$theme_json_data_two = $theme_json_data->get_data();
$post_id = isset( $_GET['post'] ) ? intval( $_GET['post'] ) : 0; //phpcs:ignore WordPress.Security.NonceVerification.Recommended
$flow_id = wcf()->utils->get_flow_id_from_step_id( $post_id );
if (
! empty( $flow_id ) &&
Cartflows_Helper::is_gcp_styling_enabled( (int) $flow_id ) &&
isset( $theme_json_data_two['settings'] ) &&
isset( $theme_json_data_two['settings']['color'] )
) {
$new_color_palette = Cartflows_Helper::generate_css_var_array( $flow_id );
if ( ! empty( $new_color_palette ) ) {
$theme_json_data_two['settings']['color']['palette']['theme'] = array_merge( $theme_json_data_two['settings']['color']['palette']['theme'], $new_color_palette );
}
}
return $theme_json_data->update_with( $theme_json_data_two );
}
/**
* Enqueue the Global Color Pallet CSS vars to the page to use in the page builder settings.
* This CSS vars needs to be re-added so as to enqueue in the block editor to display the colors in the editor window.
*
* Note: Currently the GCP support is added for Elementor and Block Builder.
*
* @since x.x.x
* @return void
*/
public function add_gcp_vars_to_block_editor() {
// Call the same function which generates the inline styles i:e the CSS VARs with the selected values.
wcf()->flow->enqueue_gcp_color_vars( 'CF_block-cartflows-frontend-style' );
}
/**
* Renders the Order Detail Form shortcode.
*
* @since 1.6.15
*/
public function order_detail_form_shortcode() {
check_ajax_referer( 'wpcf_ajax_nonce', 'nonce' );
if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
wp_send_json_error( array( 'message' => __( 'Permission denied.', 'cartflows' ) ) );
}
add_filter(
'cartflows_show_demo_order_details',
function() {
return true;
}
);
if ( ! empty( $_POST['thanyouText'] ) ) {
add_filter(
'cartflows_thankyou_meta_wcf-tq-text',
function( $text ) {
check_ajax_referer( 'wpcf_ajax_nonce', 'nonce' );
$text = isset( $_POST['thanyouText'] ) ? sanitize_text_field( wp_unslash( $_POST['thanyouText'] ) ) : '';
return $text;
},
10,
1
);
}
$thankyou_id = isset( $_POST['id'] ) ? intval( wp_unslash( $_POST['id'] ) ) : 0;
$data['html'] = do_shortcode( '[cartflows_order_details]' );
$data['thankyouText'] = wcf()->options->get_thankyou_meta_value( $thankyou_id, 'wcf-tq-text' );
wp_send_json_success( $data );
}
/**
* Renders the Order Checkout Form shortcode.
*
* @since 1.6.15
*/
public function order_checkout_form_shortcode() {
check_ajax_referer( 'wpcf_ajax_nonce', 'nonce' );
if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
wp_send_json_error( array( 'message' => __( 'Permission denied.', 'cartflows' ) ) );
}
add_filter(
'cartflows_show_demo_checkout',
function() {
return true;
}
);
if ( isset( $_POST['id'] ) ) {
$checkout_id = intval( $_POST['id'] );
}
$store_checkout = intval( \Cartflows_Helper::get_global_setting( '_cartflows_store_checkout' ) );
$flow_id = wcf()->utils->get_flow_id_from_step_id( $checkout_id );
if ( ! wcf()->flow->is_flow_testmode( $flow_id ) && ( $store_checkout !== $flow_id ) ) {
$products = wcf()->utils->get_selected_checkout_products( $checkout_id );
if ( ! is_array( $products ) || empty( $products[0]['product'] ) ) {
wc_clear_notices();
wc_add_notice( __( 'No product is selected. Please select products from the checkout meta settings to continue.', 'cartflows' ), 'error' );
}
}
remove_action( 'woocommerce_before_checkout_form', 'woocommerce_checkout_coupon_form' );
add_action( 'woocommerce_checkout_order_review', array( Cartflows_Checkout_Markup::get_instance(), 'display_custom_coupon_field' ) );
$attributes['layout'] = isset( $_POST['layout'] ) ? sanitize_title( wp_unslash( $_POST['layout'] ) ) : '';
$attributes['orderBumpSkin'] = isset( $_POST['orderBumpSkin'] ) ? sanitize_title( wp_unslash( $_POST['orderBumpSkin'] ) ) : '';
$attributes['orderBumpCheckboxArrow'] = isset( $_POST['orderBumpCheckboxArrow'] ) ? sanitize_title( wp_unslash( $_POST['orderBumpCheckboxArrow'] ) ) : '';
$attributes['orderBumpCheckboxArrowAnimation'] = isset( $_POST['orderBumpCheckboxArrowAnimation'] ) ? sanitize_title( wp_unslash( $_POST['orderBumpCheckboxArrowAnimation'] ) ) : '';
$attributes['sectionposition'] = isset( $_POST['sectionposition'] ) ? sanitize_title( wp_unslash( $_POST['sectionposition'] ) ) : '';
$attributes['productOptionsSkin'] = isset( $_POST['productOptionsSkin'] ) ? sanitize_title( wp_unslash( $_POST['productOptionsSkin'] ) ) : '';
$attributes['productOptionsImages'] = isset( $_POST['productOptionsImages'] ) ? sanitize_title( wp_unslash( $_POST['productOptionsImages'] ) ) : '';
$attributes['productOptionsSectionTitleText'] = isset( $_POST['productOptionsSectionTitleText'] ) ? sanitize_text_field( wp_unslash( $_POST['productOptionsSectionTitleText'] ) ) : '';
$attributes['PreSkipText'] = isset( $_POST['PreSkipText'] ) ? sanitize_title( wp_unslash( $_POST['PreSkipText'] ) ) : '';
$attributes['PreOrderText'] = isset( $_POST['PreOrderText'] ) ? sanitize_title( wp_unslash( $_POST['PreOrderText'] ) ) : '';
$attributes['PreProductTitleText'] = isset( $_POST['PreProductTitleText'] ) ? sanitize_title( wp_unslash( $_POST['PreProductTitleText'] ) ) : '';
$attributes['preSubTitleText'] = isset( $_POST['preSubTitleText'] ) ? sanitize_title( wp_unslash( $_POST['preSubTitleText'] ) ) : '';
$attributes['preTitleText'] = isset( $_POST['preTitleText'] ) ? sanitize_title( wp_unslash( $_POST['preTitleText'] ) ) : '';
$attributes['PreProductDescText'] = isset( $_POST['PreProductDescText'] ) ? sanitize_title( wp_unslash( $_POST['PreProductDescText'] ) ) : '';
$attributes['inputSkins'] = isset( $_POST['inputSkins'] ) ? sanitize_title( wp_unslash( $_POST['inputSkins'] ) ) : '';
$attributes['enableNote'] = isset( $_POST['enableNote'] ) ? sanitize_title( wp_unslash( $_POST['enableNote'] ) ) : '';
$attributes['noteText'] = isset( $_POST['noteText'] ) ? sanitize_text_field( wp_unslash( $_POST['noteText'] ) ) : '';
$attributes['stepOneTitleText'] = isset( $_POST['stepOneTitleText'] ) ? sanitize_text_field( wp_unslash( $_POST['stepOneTitleText'] ) ) : '';
$attributes['stepOneSubTitleText'] = isset( $_POST['stepOneSubTitleText'] ) ? sanitize_text_field( wp_unslash( $_POST['stepOneSubTitleText'] ) ) : '';
$attributes['stepTwoTitleText'] = isset( $_POST['stepTwoTitleText'] ) ? sanitize_text_field( wp_unslash( $_POST['stepTwoTitleText'] ) ) : '';
$attributes['stepTwoSubTitleText'] = isset( $_POST['stepTwoSubTitleText'] ) ? sanitize_text_field( wp_unslash( $_POST['stepTwoSubTitleText'] ) ) : '';
$attributes['offerButtonTitleText'] = isset( $_POST['offerButtonTitleText'] ) ? sanitize_text_field( wp_unslash( $_POST['offerButtonTitleText'] ) ) : '';
$attributes['offerButtonSubTitleText'] = isset( $_POST['offerButtonSubTitleText'] ) ? sanitize_text_field( wp_unslash( $_POST['offerButtonSubTitleText'] ) ) : '';
$checkout_fields = array(
// Input Fields.
array(
'filter_slug' => 'wcf-fields-skins',
'setting_name' => 'inputSkins',
),
array(
'filter_slug' => 'wcf-checkout-layout',
'setting_name' => 'layout',
),
);
if ( isset( $checkout_fields ) && is_array( $checkout_fields ) ) {
foreach ( $checkout_fields as $key => $field ) {
$setting_name = $field['setting_name'];
if ( '' !== $attributes[ $setting_name ] ) {
add_filter(
'cartflows_checkout_meta_' . $field['filter_slug'],
function ( $value ) use ( $setting_name, $attributes ) {
$value = $attributes[ $setting_name ];
return $value;
},
10,
1
);
}
}
}
do_action( 'cartflows_gutenberg_before_checkout_shortcode', $checkout_id );
do_action( 'cartflows_gutenberg_checkout_options_filters', $attributes );
do_action( 'cartflows_gutenberg_before_checkout_shortcode' );
$data['html'] = do_shortcode( '[cartflows_checkout]' );
wp_send_json_success( $data );
}
/**
* Renders the Optin Form shortcode.
*
* @since 1.6.15
*/
public function optin_form_shortcode() {
check_ajax_referer( 'wpcf_ajax_nonce', 'nonce' );
if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
wp_send_json_error( array( 'message' => __( 'Permission denied.', 'cartflows' ) ) );
}
add_filter(
'cartflows_show_demo_optin_form',
function() {
return true;
}
);
if ( isset( $_POST['id'] ) ) {
$optin_id = intval( $_POST['id'] );
}
$products = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-optin-product' );
if ( is_array( $products ) && count( $products ) < 1 ) {
wc_clear_notices();
wc_add_notice( __( 'No product is selected. Please select a Simple, Virtual and Free product from the meta settings.', 'cartflows' ), 'error' );
}
$attributes['input_skins'] = isset( $_POST['input_skins'] ) ? sanitize_title( wp_unslash( $_POST['input_skins'] ) ) : '';
$optin_fields = array(
// Input Fields.
array(
'filter_slug' => 'wcf-input-fields-skins',
'setting_name' => 'input_skins',
),
);
if ( isset( $optin_fields ) && is_array( $optin_fields ) ) {
foreach ( $optin_fields as $key => $field ) {
$setting_name = $field['setting_name'];
add_filter(
'cartflows_optin_meta_' . $field['filter_slug'],
function ( $value ) use ( $setting_name, $attributes ) {
$value = $attributes[ $setting_name ];
return $value;
},
10,
1
);
}
}
do_action( 'cartflows_gutenberg_optin_options_filters', $attributes );
add_filter( 'woocommerce_cart_needs_payment', '__return_false' );
add_filter( 'woocommerce_enable_order_notes_field', '__return_false' );
add_filter( 'woocommerce_cart_needs_shipping_address', '__return_false' );
$data['html'] = do_shortcode( '[cartflows_optin]' );
$data['buttonText'] = wcf()->options->get_optin_meta_value( $optin_id, 'wcf-submit-button-text' );
wp_send_json_success( $data );
}
/**
* Enqueue Gutenberg block assets for both frontend + backend.
*
* @since 1.6.15
*/
public function block_assets() {
global $post;
if ( $post && CARTFLOWS_STEP_POST_TYPE === $post->post_type ) {
// Register block styles for both frontend + backend.
wp_enqueue_style(
'CF_block-cartflows-style-css', // Handle.
CARTFLOWS_URL . 'modules/gutenberg/build/style-blocks.css',
is_admin() ? array( 'wp-editor' ) : null, // Dependency to include the CSS after it.
CARTFLOWS_VER // filemtime( plugin_dir_path( __DIR__ ) . 'build/style-blocks.css' ) // Version: File modification time.
);
$flow_id = wcf()->utils->get_flow_id_from_step_id( $post->ID );
// Return if no flow ID is found.
if ( empty( $flow_id ) ) {
return;
}
if ( Cartflows_Helper::is_gcp_styling_enabled( (int) $flow_id ) ) {
$gcp_vars = Cartflows_Helper::generate_gcp_css_style( (int) $flow_id );
// Include the CSS/JS only if the CSS vars are set.
if ( ! empty( $gcp_vars ) ) {
// Add editor helper css & JS files.
wp_enqueue_style( 'wcf-editor-helper-style', CARTFLOWS_URL . 'modules/gutenberg/assets/css/editor-assets.css', array( 'wp-edit-blocks', 'wp-editor' ), CARTFLOWS_VER );
wp_enqueue_script( 'wcf-editor-helper-script', CARTFLOWS_URL . 'modules/gutenberg/assets/js/editor-assets.js', array( 'wp-editor', 'jquery' ), CARTFLOWS_VER, true );
}
}
}
}
/**
* Enqueue assets for both backend.
*
* @since 1.6.15
*/
public function editor_assets() {
$post_id = isset( $_GET['post'] ) ? intval( $_GET['post'] ) : 0; //phpcs:ignore WordPress.Security.NonceVerification.Recommended
$post_type = get_post_type( $post_id );
if ( CARTFLOWS_STEP_POST_TYPE === $post_type ) {
$wpcf_ajax_nonce = wp_create_nonce( 'wpcf_ajax_nonce' );
$step_type = wcf()->utils->get_step_type( $post_id );
$show_checkout_pro_opt = apply_filters( 'cartflows_show_checkout_pro_opt', false );
if ( 'optin' === $step_type && wcf()->is_woo_active ) {
wp_enqueue_style( 'wcf-optin-template', wcf()->utils->get_css_url( 'optin-template' ), array( 'wp-edit-blocks' ), CARTFLOWS_VER );
}
if ( 'checkout' === $step_type && wcf()->is_woo_active ) {
wp_enqueue_style( 'wcf-checkout-template', wcf()->utils->get_css_url( 'checkout-template' ), array( 'wp-edit-blocks' ), CARTFLOWS_VER );
Cartflows_Checkout_Markup::get_instance()->shortcode_scripts();
}
$script_dep_path = CARTFLOWS_DIR . 'modules/gutenberg/build/blocks.asset.php';
$script_info = file_exists( $script_dep_path )
? include $script_dep_path
: array(
'dependencies' => array(),
'version' => CARTFLOWS_VER,
);
$script_dep = array_merge( $script_info['dependencies'], array( 'wp-blocks', 'wp-i18n', 'wp-element', 'wp-editor' ) );
$script_ver = $script_info['version'];
// Register block editor script for backend.
wp_register_script(
'CF_block-cartflows-block-js', // Handle.
CARTFLOWS_URL . 'modules/gutenberg/build/blocks.js',
$script_dep, // Dependencies, defined above.
$script_ver, // Version: filemtime — Gets file modification time.
true // Enqueue the script in the footer.
);
wp_set_script_translations( 'CF_block-cartflows-block-js', 'cartflows' );
// Register block editor styles for backend.
wp_register_style(
'CF_block-cartflows-block-editor-css', // Handle.
CARTFLOWS_URL . 'modules/gutenberg/build/blocks.style.css',
array( 'wp-edit-blocks' ), // Dependency to include the CSS after it.
CARTFLOWS_VER // Version: File modification time.
);
// Common Editor style.
wp_enqueue_style(
'CF_block-common-editor-css', // Handle.
CARTFLOWS_URL . 'modules/gutenberg/dist/editor.css',
array( 'wp-edit-blocks' ), // Dependency to include the CSS after it.
CARTFLOWS_VER // Version: File modification time.
);
// Enqueue frontend CSS in editor.
wp_enqueue_style( 'CF_block-cartflows-frontend-style', CARTFLOWS_URL . 'assets/css/frontend.css', array( 'wp-edit-blocks' ), CARTFLOWS_VER );
// WP Localized globals. Use dynamic PHP stuff in JavaScript via `cartflowsGlobal` object.
wp_localize_script(
'CF_block-cartflows-block-js',
'cf_blocks_info', // Array containing dynamic data for a JS Global.
array(
'pluginDirPath' => plugin_dir_path( __DIR__ ),
'pluginDirUrl' => plugin_dir_url( __DIR__ ),
'category' => 'cartflows',
'ajax_url' => admin_url( 'admin-ajax.php' ),
'wpcf_ajax_nonce' => $wpcf_ajax_nonce,
'blocks' => Cartflows_Block_Config::get_block_attributes(),
'tablet_breakpoint' => CF_TABLET_BREAKPOINT,
'mobile_breakpoint' => CF_MOBILE_BREAKPOINT,
'show_checkout_pro_opt' => $show_checkout_pro_opt,
'ID' => $post_id,
'step_type' => $step_type,
'is_cartflows_pro_install' => _is_cartflows_pro(),
'is_woo_active' => wcf()->is_woo_active,
'wcf_svg_icons' => $this->backend_load_font_awesome_icons(),
'show_product_options' => $this->maybe_show_product_options_for_store_checkout( $post_id ),
// Add more data here that you want to access from `cartflowsGlobal` object.
)
);
/**
* Register Gutenberg block on server-side.
*
* Register the block on server-side to ensure that the block
* scripts and styles for both frontend and backend are
* enqueued when the editor loads.
*
* @link https://wordpress.org/gutenberg/handbook/blocks/writing-your-first-block-type#enqueuing-block-scripts
* @since 1.6.15
*/
register_block_type(
'wcfb/next-step-button',
array(
// Enqueue blocks.js in the editor only.
'editor_script' => 'CF_block-cartflows-block-js',
// Enqueue blocks.css in the editor only.
'style' => 'CF_block-cartflows-block-editor-css',
// Enqueue blocks.commoneditorstyle.build.css in the editor only.
'editor_style' => 'CF_block-common-editor-css',
)
);
}
}
/**
* Maybe show product options.
*
* @param int $step_id step id.
* @return bool
*/
public function maybe_show_product_options_for_store_checkout( $step_id ) {
$flow_id = (int) wcf()->utils->get_flow_id_from_step_id( $step_id );
$store_checkout = intval( get_option( '_cartflows_store_checkout', false ) );
if ( $flow_id !== $store_checkout ) {
return true;
}
if ( $flow_id === $store_checkout && apply_filters( 'cartflows_show_store_checkout_product_tab', false ) ) {
return true;
}
return false;
}
/**
* Get Json Data.
*
* @since 1.8.1
* @return Array
*/
public function backend_load_font_awesome_icons() {
$json_file = CARTFLOWS_DIR . 'modules/gutenberg/src/controls/spectra-icons-v6.php';
if ( ! file_exists( $json_file ) ) {
return array();
}
// Function has already run.
if ( null !== self::$icon_json ) {
return self::$icon_json;
}
self::$icon_json = include $json_file;
return self::$icon_json;
}
/**
* Gutenberg block category for WCFB.
*
* @param array $categories Block categories.
* @param object $post Post object.
* @since 1.6.15
*/
public function register_block_category( $categories, $post ) {
return array_merge(
$categories,
array(
array(
'slug' => 'cartflows',
'title' => __( 'Cartflows', 'cartflows' ),
),
)
);
}
}
/**
* Prepare if class 'Cartflows_Init_Blocks' exist.
* Kicking this off by calling 'get_instance()' method
*/
Cartflows_Init_Blocks::get_instance();