255 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			255 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Gutenberg block.
 | |
|  *
 | |
|  * @package visual-portfolio
 | |
|  */
 | |
| 
 | |
| if ( ! defined( 'ABSPATH' ) ) {
 | |
| 	exit;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Class Visual_Portfolio_Gutenberg_Block
 | |
|  */
 | |
| class Visual_Portfolio_Gutenberg_Block {
 | |
| 	/**
 | |
| 	 * Cached block attributes, we will use it when register block in PHP and in JS.
 | |
| 	 *
 | |
| 	 * @var array
 | |
| 	 */
 | |
| 	public $cached_attributes = array();
 | |
| 
 | |
| 	/**
 | |
| 	 * Registered controls, that will be used in Gutenberg block.
 | |
| 	 *
 | |
| 	 * @var array
 | |
| 	 */
 | |
| 	public $registered_controls = array();
 | |
| 
 | |
| 	/**
 | |
| 	 * Visual_Portfolio_Gutenberg_Block constructor.
 | |
| 	 */
 | |
| 	public function __construct() {
 | |
| 		add_action( 'init', array( $this, 'register_block' ), 11 );
 | |
| 		add_action( 'enqueue_block_assets', array( $this, 'enqueue_block_editor_assets' ) );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get block attributes.
 | |
| 	 *
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public function get_block_attributes() {
 | |
| 		if ( ! empty( $this->cached_attributes ) ) {
 | |
| 			return $this->cached_attributes;
 | |
| 		}
 | |
| 
 | |
| 		// Default attributes.
 | |
| 		$attributes = array(
 | |
| 			'block_id' => array(
 | |
| 				'type' => 'string',
 | |
| 			),
 | |
| 			'align' => array(
 | |
| 				'type' => 'string',
 | |
| 			),
 | |
| 			'className' => array(
 | |
| 				'type' => 'string',
 | |
| 			),
 | |
| 			'anchor' => array(
 | |
| 				'type' => 'string',
 | |
| 			),
 | |
| 		);
 | |
| 
 | |
| 		// Add dynamic attributes from registered controls.
 | |
| 		$controls = Visual_Portfolio_Controls::get_registered_array();
 | |
| 
 | |
| 		foreach ( $controls as $control ) {
 | |
| 			if ( isset( $attributes[ $control['name'] ] ) ) {
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			if (
 | |
| 				'html' === $control['type'] ||
 | |
| 				'notice' === $control['type'] ||
 | |
| 				'pro_note' === $control['type'] ||
 | |
| 				'category_tabs' === $control['type'] ||
 | |
| 				'category_toggle_group' === $control['type'] ||
 | |
| 				'category_collapse' === $control['type'] ||
 | |
| 				'category_navigator' === $control['type']
 | |
| 			) {
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			$attribute_data = apply_filters(
 | |
| 				'vpf_register_block_attribute_data',
 | |
| 				array(
 | |
| 					'type' => 'string',
 | |
| 				),
 | |
| 				$control
 | |
| 			);
 | |
| 
 | |
| 			if ( ! $attribute_data ) {
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			$attributes[ $control['name'] ] = $attribute_data;
 | |
| 
 | |
| 			switch ( $control['type'] ) {
 | |
| 				case 'checkbox':
 | |
| 				case 'toggle':
 | |
| 					$attributes[ $control['name'] ]['type'] = 'boolean';
 | |
| 					break;
 | |
| 				case 'number':
 | |
| 				case 'range':
 | |
| 					$attributes[ $control['name'] ]['type'] = 'number';
 | |
| 					break;
 | |
| 				case 'select':
 | |
| 				case 'select2':
 | |
| 					if ( $control['multiple'] ) {
 | |
| 						$attributes[ $control['name'] ]['type']  = 'array';
 | |
| 						$attributes[ $control['name'] ]['items'] = array(
 | |
| 							'type' => 'string',
 | |
| 						);
 | |
| 					}
 | |
| 					break;
 | |
| 				case 'sortable':
 | |
| 					$attributes[ $control['name'] ]['type']  = 'array';
 | |
| 					$attributes[ $control['name'] ]['items'] = array(
 | |
| 						'type' => 'string',
 | |
| 					);
 | |
| 					break;
 | |
| 				case 'gallery':
 | |
| 					$attributes[ $control['name'] ]['type']  = 'array';
 | |
| 					$attributes[ $control['name'] ]['items'] = array(
 | |
| 						'type' => 'object',
 | |
| 					);
 | |
| 					break;
 | |
| 				case 'elements_selector':
 | |
| 					$attributes[ $control['name'] ]['type']  = 'object';
 | |
| 					$attributes[ $control['name'] ]['items'] = array(
 | |
| 						'type' => 'object',
 | |
| 					);
 | |
| 					break;
 | |
| 			}
 | |
| 
 | |
| 			if ( isset( $control['default'] ) ) {
 | |
| 				$attributes[ $control['name'] ]['default'] = $control['default'];
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$attributes = apply_filters(
 | |
| 			'vpf_register_block_attributes',
 | |
| 			$attributes,
 | |
| 			$controls
 | |
| 		);
 | |
| 
 | |
| 		$this->cached_attributes = $attributes;
 | |
| 
 | |
| 		return $this->cached_attributes;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Register Block.
 | |
| 	 */
 | |
| 	public function register_block() {
 | |
| 		if ( ! function_exists( 'register_block_type_from_metadata' ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$attributes = $this->get_block_attributes();
 | |
| 
 | |
| 		register_block_type_from_metadata(
 | |
| 			visual_portfolio()->plugin_path . 'gutenberg/block',
 | |
| 			array(
 | |
| 				'render_callback' => array( $this, 'block_render' ),
 | |
| 				'attributes'      => $attributes,
 | |
| 			)
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Block output
 | |
| 	 *
 | |
| 	 * @param array $attributes - block attributes.
 | |
| 	 *
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function block_render( $attributes ) {
 | |
| 		$attributes = array_merge(
 | |
| 			array(
 | |
| 				'align'     => '',
 | |
| 				'className' => '',
 | |
| 			),
 | |
| 			$attributes
 | |
| 		);
 | |
| 
 | |
| 		$class_name = 'wp-block-visual-portfolio';
 | |
| 
 | |
| 		$wrapper_attributes = get_block_wrapper_attributes(
 | |
| 			array(
 | |
| 				'class' => $class_name,
 | |
| 			)
 | |
| 		);
 | |
| 
 | |
| 		return sprintf( '<div %1$s>%2$s</div>', $wrapper_attributes, Visual_Portfolio_Get::get( $attributes ) );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Enqueue script for Gutenberg editor
 | |
| 	 */
 | |
| 	public function enqueue_block_editor_assets() {
 | |
| 		if ( ! is_admin() ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$attributes = $this->get_block_attributes();
 | |
| 
 | |
| 		// Block.
 | |
| 		Visual_Portfolio_Assets::enqueue_script(
 | |
| 			'visual-portfolio-gutenberg',
 | |
| 			'build/gutenberg/index',
 | |
| 			array( 'masonry' )
 | |
| 		);
 | |
| 		Visual_Portfolio_Assets::enqueue_style(
 | |
| 			'visual-portfolio-gutenberg',
 | |
| 			'build/gutenberg/index'
 | |
| 		);
 | |
| 		wp_style_add_data( 'visual-portfolio-gutenberg', 'rtl', 'replace' );
 | |
| 		wp_style_add_data( 'visual-portfolio-gutenberg', 'suffix', '.min' );
 | |
| 
 | |
| 		wp_localize_script(
 | |
| 			'visual-portfolio-gutenberg',
 | |
| 			'VPGutenbergVariables',
 | |
| 			array(
 | |
| 				'nonce'                    => wp_create_nonce( 'vp-ajax-nonce' ),
 | |
| 				'plugin_version'           => VISUAL_PORTFOLIO_VERSION,
 | |
| 				'plugin_name'              => visual_portfolio()->plugin_name,
 | |
| 				'plugin_url'               => visual_portfolio()->plugin_url,
 | |
| 				'admin_url'                => get_admin_url(),
 | |
| 				'attributes'               => $attributes,
 | |
| 				'controls'                 => Visual_Portfolio_Controls::get_registered_array(),
 | |
| 				'controls_categories'      => Visual_Portfolio_Controls::get_registered_categories(),
 | |
| 				'items_count_notice'       => get_option( 'visual_portfolio_items_count_notice_state', 'show' ),
 | |
| 				'items_count_notice_limit' => 40,
 | |
| 			)
 | |
| 		);
 | |
| 
 | |
| 		// Meta.
 | |
| 		Visual_Portfolio_Assets::enqueue_script(
 | |
| 			'visual-portfolio-gutenberg-custom-post-meta',
 | |
| 			'build/gutenberg/custom-post-meta'
 | |
| 		);
 | |
| 
 | |
| 		wp_localize_script(
 | |
| 			'visual-portfolio-gutenberg-custom-post-meta',
 | |
| 			'VPGutenbergMetaVariables',
 | |
| 			array(
 | |
| 				'nonce'       => wp_create_nonce( 'vp-ajax-nonce' ),
 | |
| 				'plugin_name' => visual_portfolio()->plugin_name,
 | |
| 			)
 | |
| 		);
 | |
| 	}
 | |
| }
 | |
| new Visual_Portfolio_Gutenberg_Block();
 |