Your IP : 216.73.216.95


Current Path : /var/www/ooareogundevinitiative/wp-content/plugins/brizy/admin/popups/
Upload File :
Current File : /var/www/ooareogundevinitiative/wp-content/plugins/brizy/admin/popups/main.php

<?php
/**
 * Created by PhpStorm.
 * User: alex
 * Date: 1/11/19
 * Time: 10:59 AM
 */


class Brizy_Admin_Popups_Main {

	const CP_POPUP = 'brizy-popup';

	/**
	 * @return Brizy_Admin_Popups_Main
	 */
	public static function _init() {
		static $instance;

		if ( ! $instance ) {
			$instance = new self();
			$instance->initialize();
		}

		return $instance;
	}

	public function initialize() {

		add_filter( 'brizy_content', array( $this, 'insertPopupsHtml' ), - 999999, 4 );
		add_action( 'brizy_after_enabled_for_post', array( $this, 'afterBrizyEnabledForPopup' ) );

		if ( is_admin() ) {
			add_action( 'admin_menu', array( $this, 'removePageAttributes' ) );
		}
	}

	public function removePageAttributes() {
		remove_meta_box( 'pageparentdiv', self::CP_POPUP, 'side' );
	}

	static public function registerCustomPosts() {

		$labels = array(
			'name'               => _x( 'Popups', 'post type general name' ),
			'singular_name'      => _x( 'Popup', 'post type singular name' ),
			'menu_name'          => _x( 'Popups', 'admin menu' ),
			'name_admin_bar'     => _x( 'Popup', 'add new on admin bar' ),
			'add_new'            => _x( 'Add New', self::CP_POPUP ),
			'add_new_item'       => __( 'Add New Popup' ),
			'new_item'           => __( 'New Popup' ),
			'edit_item'          => __( 'Edit Popup' ),
			'view_item'          => __( 'View Popup' ),
			'all_items'          => __( 'Popups' ),
			'search_items'       => __( 'Search Popups' ),
			'parent_item_colon'  => __( 'Parent Popups:' ),
			'not_found'          => __( 'No Popups found.' ),
			'not_found_in_trash' => __( 'No Popups found in Trash.' ),
			'attributes'         => __( 'Popup attributes:' )
		);

		register_post_type( self::CP_POPUP,
			array(
				'labels'              => $labels,
				'public'              => false,
				'has_archive'         => false,
				'description'         => __( 'Popups', 'brizy' ),
				'publicly_queryable'  => Brizy_Editor_User::is_user_allowed(),
				'show_ui'             => defined( 'BRIZY_PRO_VERSION' ),
				'show_in_menu'        => Brizy_Admin_Settings::menu_slug(),
				'query_var'           => false,
				'rewrite'             => array( 'slug' => 'brizy-popup' ),
				'capability_type'     => 'page',
				'hierarchical'        => false,
				'show_in_rest'        => false,
				'exclude_from_search' => true,
				'can_export'          => true,
				'supports'            => array( 'title', 'post_content', 'revisions' )
			)
		);

		remove_post_type_support( self::CP_POPUP, 'page-attributes' );


		add_filter( 'brizy_supported_post_types', function ( $posts ) {
			$posts[] = self::CP_POPUP;
			return $posts;
		} );
	}

	/**
	 * @param $post
	 *
	 * @throws Exception
	 */
	public function afterBrizyEnabledForPopup( $post ) {
		if ( $post->post_type === Brizy_Admin_Popups_Main::CP_POPUP ) {
			$manager = new Brizy_Admin_Rules_Manager();
			if ( count( $manager->getRules( $post->ID ) ) == 0 ) {
				$manager->saveRules( $post->ID, array(
					new Brizy_Admin_Rule( null, Brizy_Admin_Rule::TYPE_INCLUDE, '', '', array() )
				) );
			}
		}
	}

	/**
	 * @param $content
	 * @param $project
	 * @param $wpPost
	 * @param string $context
	 *
	 * @return string|string[]|null
	 * @throws Brizy_Editor_Exceptions_NotFound
	 * @throws Brizy_Editor_Exceptions_ServiceUnavailable
	 */
	public function insertPopupsHtml( $content, $project, $wpPost, $context = 'document' ) {
		$popups = $this->getMatchingBrizyPopups();

		foreach ( $popups as $brizyPopup ) {
			/**
			 * @var Brizy_Editor_Post $brizyPopup ;
			 */

			if ( $brizyPopup->get_needs_compile() ) {
				$brizyPopup->compile_page();
				$brizyPopup->saveStorage();
				$brizyPopup->savePost();
			}

			$compiledPage = $brizyPopup->get_compiled_page();

			if ( $context == 'document' ) {
				$content = $this->insertInDocumentHead( $content, $compiledPage->get_head() );
				$content = $this->insertInDocumentBody( $content, $compiledPage->get_body() );
			}

			if ( $context == 'head' ) {
				$content = $this->insertHead( $content, $compiledPage->get_head() );
			}

			if ( $context == 'body' ) {
				$content = $this->insertBody( $content, $compiledPage->get_body() );
			}
		}

		return $content;
	}

	private function insertHead( $target, $headContent ) {

		return $target . "\n\n<!-- POPUP INSERT START-->\n{$headContent}\n<!-- POPUP INSERT END-->\n\n";
	}

	private function insertBody( $target, $bodyContent ) {

		return $target . "\n\n<!-- POPUP INSERT START-->\n{$bodyContent}\n<!-- POPUP INSERT END-->\n\n";
	}

	private function insertInDocumentHead( $target, $headContent ) {

		$target = preg_replace( "/(<head[^>]*>)/ium", "$1" . "\n\n<!-- POPUP INSERT START-->\n{$headContent}\n<!-- POPUP INSERT END-->\n\n", $target );

		return $target;
	}

	private function insertInDocumentBody( $target, $bodyContent ) {

		$target = preg_replace( "/(<body[^>]*>)/ium", "$1" . "\n\n<!-- POPUP INSERT START-->\n{$bodyContent}\n<!-- POPUP INSERT END-->\n\n", $target );

		return $target;
	}

	/**
	 * @return array
	 * @throws Brizy_Editor_Exceptions_NotFound
	 */
	public function getMatchingBrizyPopups() {
		list( $applyFor, $entityType, $entityValues ) = Brizy_Admin_Rules_Manager::getCurrentPageGroupAndTypeForPopoup();

		return $this->findMatchingPopups( $applyFor, $entityType, $entityValues );
	}

	/**
	 * @param $applyFor
	 * @param $entityType
	 * @param $entityValues
	 *
	 * @return array
	 * @throws Brizy_Editor_Exceptions_NotFound
	 */
	private function findMatchingPopups( $applyFor, $entityType, $entityValues ) {

		$resultPopups = array();
		$allPopups    = get_posts( array(
			'post_type'   => self::CP_POPUP,
			'numberposts' => - 1,
			'post_status' => 'publish'
		) );

		$allPopups = Brizy_Admin_Rules_Manager::sortEntitiesByRuleWeight( $allPopups, [
			'type'         => $applyFor,
			'entityType'   => $entityType,
			'entityValues' => $entityValues
		] );

		$ruleManager = new Brizy_Admin_Rules_Manager();
		foreach ( $allPopups as $aPopup ) {
			$ruleSet = $ruleManager->getRuleSet( $aPopup->ID );
			if ( $ruleSet->isMatching( $applyFor, $entityType, $entityValues ) ) {
				$resultPopups[] = Brizy_Editor_Post::get( $aPopup );
			}
		}

		return $resultPopups;
	}
}