shouldInitialize(); if($shouldInitialize === false) return; $this->registerHooks(); self::$initialized = true; } /** * Determine if the integration should be initialized. * * @return bool */ private function shouldInitialize(){ if(self::$initialized === true) return false; if(GlobalsUnlimitedElements::$enableGutenbergSupport === false) return false; if(function_exists('register_block_type') === false) return false; return true; } /** * Register the integration hooks. * * @return void */ private function registerHooks(){ UniteProviderFunctionsUC::addFilter('block_categories_all', array($this, 'registerCategories')); UniteProviderFunctionsUC::addAction('init', array($this, 'registerBlocks')); UniteProviderFunctionsUC::addAction('enqueue_block_editor_assets', array($this, 'enqueueAssets')); } /** * Register the Gutenberg categories. * * @param array $categories * * @return array */ public function registerCategories($categories){ $categories[] = array( 'slug' => GlobalsUnlimitedElements::PLUGIN_NAME, 'title' => __('Elementor Widgets', 'unlimited-elements-for-elementor'), ); return $categories; } /** * Register the Gutenberg blocks. * * @return void */ public function registerBlocks(){ $blocks = $this->getBlocks(); foreach($blocks as $name => $block){ register_block_type($name, $block); } } /** * Render the Gutenberg block on the frontend. * * @param array $attributes * * @return string */ public function renderBlock($attributes){ $data = array( 'id' => $attributes['_id'], 'root_id' => $attributes['_rootId'], 'settings' => json_decode($attributes['data'], true), 'selectors' => true, ); $addonsManager = new UniteCreatorAddons(); $addonData = $addonsManager->getAddonOutputData($data); $conflictingStyles = array('font-awesome'); $conflictingScripts = array(); foreach($addonData['includes'] as $include){ $handle = UniteFunctionsUC::getVal($include, 'handle'); $type = UniteFunctionsUC::getVal($include, 'type'); $url = UniteFunctionsUC::getVal($include, 'url'); if($type === 'css'){ if(in_array($handle, $conflictingStyles) === true) wp_deregister_style($handle); HelperUC::addStyleAbsoluteUrl($url, $handle); }else{ if(in_array($handle, $conflictingScripts) === true) wp_deregister_script($handle); HelperUC::addScriptAbsoluteUrl($url, $handle); } } return $addonData['html']; } /** * Enqueue the Gutenberg assets. * * @return void */ public function enqueueAssets(){ UniteCreatorAdmin::setView('testaddonnew'); UniteCreatorAdmin::onAddScripts(); $handle = 'uc_gutenberg_integrate'; $styleUrl = GlobalsUC::$url_provider . 'assets/gutenberg_integrate.css'; $scriptUrl = GlobalsUC::$url_provider . 'assets/gutenberg_integrate.js'; $scriptDeps = array('jquery', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-element'); HelperUC::addStyleAbsoluteUrl($styleUrl, $handle); HelperUC::addScriptAbsoluteUrl($scriptUrl, $handle, false, $scriptDeps); wp_localize_script($handle, 'g_gutenbergBlocks', $this->getBlocks()); wp_localize_script($handle, 'g_gutenbergParsedBlocks', $this->getParsedBlocks()); wp_add_inline_script($handle, HelperHtmlUC::getGlobalJsOutput(), 'before'); } /** * Get the Gutenberg blocks. * * @return array */ private function getBlocks(){ if(empty(self::$blocks) === true){ $addonsOrder = ''; $addonsParams = array('filter_active' => 'active'); $addonsType = GlobalsUC::ADDON_TYPE_ELEMENTOR; $addonsManager = new UniteCreatorAddons(); $addons = $addonsManager->getArrAddons($addonsOrder, $addonsParams, $addonsType); foreach($addons as $addon){ $name = GlobalsUnlimitedElements::PLUGIN_NAME . '/' . sanitize_title($addon->getTitle()); self::$blocks[$name] = array( 'name' => $name, 'title' => $addon->getTitle(), 'icon' => $addon->getPreviewIconContents(), 'category' => GlobalsUnlimitedElements::PLUGIN_NAME, 'render_callback' => array($this, 'renderBlock'), 'attributes' => array( '_id' => array( 'type' => 'string', 'default' => $addon->getID(), ), '_rootId' => array( 'type' => 'string', 'default' => '', ), '_preview' => array( 'type' => 'string', 'default' => '', ), 'data' => array( 'type' => 'string', 'default' => '', ), ), 'example' => array( 'attributes' => array( '_preview' => $addon->getPreviewImageUrl(), ), ), 'supports' => array( 'customClassName' => false, 'html' => false, 'renaming' => false, 'reusable' => false, ), 'editor_style_handles' => array('uc_gutenberg_integrate'), 'script_handles' => array('jquery'), ); } } return self::$blocks; } /** * Get the parsed Gutenberg blocks. * * @return array */ private function getParsedBlocks(){ $post = get_post(); $existingBlocks = $this->getBlocks(); $parsedBlocks = parse_blocks($post->post_content); $blocks = array(); foreach($parsedBlocks as $block){ $name = $block['blockName']; if(empty($existingBlocks[$name]) === false) $blocks[] = array( 'name' => $name, 'html' => render_block($block), ); } return $blocks; } }