# shopbuilder/1.1.3/app/Controllers/BuilderController.php

ShopBuilder – WooCommerce Builder For Elementor, version 1.1.3. 298 lines.

- Page: https://pluginprobe.com/plugins/shopbuilder/1.1.3/code/app/Controllers/BuilderController.php
- Raw: https://pluginprobe.com/plugins/shopbuilder/1.1.3/raw/app/Controllers/BuilderController.php
- Modified: 2023-07-06T10:18:00+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/shopbuilder/1.1.3/code/app/Controllers/BuilderController.php#L10-L20`.

```php
<?php
/**
 * Main BuilderController class.
 *
 * @package RadiusTheme\SB
 */

namespace RadiusTheme\SB\Controllers;

use Elementor\Plugin;
use RadiusTheme\SB\Helpers\Fns;
use RadiusTheme\SB\Helpers\BuilderFns;
use RadiusTheme\SB\Traits\SingletonTrait;
use RadiusTheme\SB\Controllers\Builder\BuilderCpt;
use RadiusTheme\SB\Controllers\Hooks\BuilderHooks;
use RadiusTheme\SB\Elementor\Controls\ImageSelectorControl;
use RadiusTheme\SB\Models\ElementList;

// Do not allow directly accessing this file.
if ( ! defined( 'ABSPATH' ) ) {
	exit( 'This script cannot be accessed directly.' );
}

/**
 * Builder Controller
 */
class BuilderController {
	/**
	 * Builder page id.
	 *
	 * @var integer
	 */
	private $builder_page_id = 0;

	/**
	 * Page Edit By.
	 *
	 * @var string
	 */
	private $page_edit_with = '';

	/**
	 * Singleton Trait
	 */
	use SingletonTrait;

	/**
	 * Construct function
	 */
	private function __construct() {
		$this->builder_page_id = BuilderFns::builder_page_id_by_page();
		$this->page_edit_with  = Fns::page_edit_with( $this->builder_page_id );

		if ( ! is_admin() ) {
			BuilderHooks::instance();
		}

		BuilderCpt::instance();

		add_action( 'elementor/init', [ $this, 'elementor_init' ] );
		add_action( 'elementor/editor/before_enqueue_scripts', [ $this, 'editor_scripts' ] );
		add_action( 'template_redirect', [ $this, 'both_builder_frontend' ], 99 );
	}

	/**
	 * Apply for frontend.
	 *
	 * @return void
	 */
	public function both_builder_frontend() {
		add_action( 'rtsb/builder/template/before/content', [ $this, 'builder_template_before_content' ] );
		add_action( 'rtsb/builder/template/after/content', [ $this, 'builder_template_after_content' ] );
	}

	/**
	 * Register Category
	 *
	 * @return void
	 */
	public function elementor_init() {
		add_action( 'elementor/elements/categories_registered', [ $this, 'add_elementor_widget_categories' ] );
		add_action( 'elementor/widgets/register', [ $this, 'init_widgets' ] );
		add_action( 'elementor/controls/register', [ $this, 'init_controls' ] );
	}

	/**
	 * Register Category
	 *
	 * @param object $elements_manager Category hooks.
	 *
	 * @return void
	 */
	public function add_elementor_widget_categories( $elements_manager ) {
		$type                                   = BuilderFns::builder_type( get_the_ID() );
		$builder_type                           = ! empty( BuilderFns::builder_page_types()[ $type ] ) ? BuilderFns::builder_page_types()[ $type ] : null;
		$categories['rtsb-shopbuilder']         = [
			'title' => esc_html__( 'ShopBuilder', 'shopbuilder' ) . ' - ' . ucfirst( $builder_type ),
			'icon'  => 'fa fa-plug',
		];
		$categories['rtsb-shopbuilder-general'] = [
			'title' => esc_html__( 'Shopbuilder - General', 'shopbuilder' ),
			'icon'  => 'fa fa-plug',
		];

		$categories       = apply_filters( 'rtsb_elementor_widgets_category_lists', $categories );
		$other_categories = $elements_manager->get_categories();
		$categories       = array_merge(
			array_slice( $other_categories, 0, 1 ),
			$categories,
			array_slice( $other_categories, 1 )
		);

		$set_categories = function ( $categories ) {
			$this->categories = $categories;
		};

		$set_categories->call( $elements_manager, $categories );
	}

	/**
	 * Init Controls
	 *
	 * Include controls files and register them
	 *
	 * @param object $controls_manager Controls Manager.
	 *
	 * @since  1.0.0
	 */
	public function init_controls( $controls_manager ) {
		$controls_manager->register( new ImageSelectorControl() );
	}

	/**
	 * Init Widgets
	 *
	 * Include widgets files and register them
	 *
	 * @since  1.0.0
	 */
	public function init_widgets( $widgets_manager ) {
		foreach ( ElementList::instance()->get_list( true, 'active' ) as $element ) {
			if ( isset( $element['active'] ) && $element['active'] !== 'on' ) {
				continue;
			}

			if ( ! empty( $element['package'] ) && $element['package'] === 'pro-disabled' ) {
				continue;
			}

			if ( isset( $element['base_class'] ) && ! class_exists( $element['base_class'] ) ) {
				continue;
			}

			if ( ! empty( $element['category'] ) ) {
				$widget = false;
				switch ( $element['category'] ) {
					case 'product':
						if ( BuilderFns::is_product() ) {
							$widget = new $element['base_class']();
						}
						break;
					case 'shop':
						if ( BuilderFns::is_archive() || BuilderFns::is_shop() ) {
							$widget = new $element['base_class']();
						}
						break;
					case 'archive':
						if ( BuilderFns::is_archive() ) {
							$widget = new $element['base_class']();
						}
						break;
					case 'cart':
						if ( BuilderFns::is_cart() ) {
							$widget = new $element['base_class']();
						}
						break;
					case 'checkout':
						if ( BuilderFns::is_checkout() ) {
							$widget = new $element['base_class']();
						}
						break;
					case 'general':
						$widget = new $element['base_class']();
						break;
					default:
				}
				$widget = apply_filters( 'rtsb/element/list/init/widgets', $widget, $element );

				if ( $widget && is_object( $widget ) ) {
					$widgets_manager->register( $widget );
				}
			}
		}
	}

	/**
	 * Editor JS.
	 *
	 * @return void
	 */
	public function editor_scripts() {
		$version = ( defined( 'WP_DEBUG' ) && WP_DEBUG ) ? time() : RTSB_VERSION;

		wp_enqueue_script(
			'rtsb-editor-script',
			rtsb()->get_assets_uri( 'js/backend/editor.js' ),
			[
				'jquery',
				'elementor-editor',
			],
			$version,
			true
		);
		$params = [
			'isEditorForBuilder' => false,
		];
		if ( BuilderFns::is_builder_preview() ) {
			$params['isEditorForBuilder'] = true;
		}
		wp_localize_script( 'rtsb-editor-script', 'rtsbTemplateBuilderEditorScript', $params );
		wp_enqueue_style( 'rtsb-el-editor-style', rtsb()->get_assets_uri( 'css/backend/elementor-editor.css' ), [], $version );
	}

	/**
	 * Before Content for Elementor.
	 *
	 * @return void
	 */
	public function builder_template_before_content() {
		/**
		 * Before Header-Footer page template content.
		 *
		 * Fires before the content of Elementor Header-Footer page template.
		 *
		 * @since 2.0.0
		 */
		if ( did_action( 'elementor/loaded' ) && 'elementor' === $this->page_edit_with ) {
			do_action( 'elementor/page_templates/header-footer/before_content' );
		}

		$parent_class = apply_filters( 'rtsb/builder/content/parent_class', [] );

		if ( BuilderFns::is_product() ) {
			$product_id   = Fns::get_prepared_product_id();
			$parent_class = wc_get_product_class( $parent_class, $product_id );
		}

		if ( BuilderFns::is_shop() ) {
			$parent_class[] = 'shop';
		}

		if ( BuilderFns::is_archive() ) {
			$parent_class[] = 'archive';
		}

		if ( BuilderFns::is_checkout() ) {
			$parent_class[] = 'checkout-page ';
		}

		?>
		<!-- Before Content start -->
		<div class="<?php echo esc_attr( implode( ' ', $parent_class ) ); ?>">
		<?php if ( BuilderFns::is_checkout() ) { ?>
			<form name="checkout" method="post" class="rtsb-woocommerce-checkout checkout" action="<?php echo esc_url( wc_get_checkout_url() ); ?>" enctype="multipart/form-data">
			<?php
		}

	}

	/**
	 * After Content for Elementor.
	 *
	 * @return void
	 */
	public function builder_template_after_content() {
		/**
		 * After Header-Footer page template content.
		 *
		 * Fires after the content of Elementor Header-Footer page template.
		 *
		 * @since 2.0.0
		 */
		if ( did_action( 'elementor/loaded' ) && 'elementor' === $this->page_edit_with ) {
			do_action( 'elementor/page_templates/header-footer/after_content' );
		}

		if ( BuilderFns::is_checkout() ) {
			?>
			</form>
			<?php
		}
		?>
		</div>
		<!-- After Content end -->
		<?php
	}
}

```
