PluginProbe ʕ •ᴥ•ʔ
Superb Addons: Blocks, Patterns, Pre-built Pages, Sliders, Popups, Free Forms, Animations & More / 3.5.0
Superb Addons: Blocks, Patterns, Pre-built Pages, Sliders, Popups, Free Forms, Animations & More v3.5.0
4.0.6 4.0.5 4.0.4 4.0.3 4.0.2 4.0.1 4.0.0 trunk 1.0.0 2.0.0 2.0.1 2.0.2 2.0.3 3.0 3.0.1 3.0.2 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.2 3.1.3 3.2.0 3.2.1 3.2.2 3.2.4 3.2.5 3.2.7 3.2.8 3.2.9 3.3.0 3.3.1 3.3.2 3.4.0 3.4.1 3.4.2 3.4.5 3.4.6 3.5.0 3.5.1 3.5.2 3.5.3 3.5.4 3.5.6 3.5.7 3.5.8 3.5.9 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1
superb-blocks / src / gutenberg / class-gutenberg-controller.php
superb-blocks / src / gutenberg Last commit date
block-api 1 year ago templates 1 year ago class-gutenberg-block-styles.php 1 year ago class-gutenberg-controller.php 1 year ago class-gutenberg-enhancements-controller.php 1 year ago
class-gutenberg-controller.php
364 lines
1 <?php
2
3 namespace SuperbAddons\Gutenberg\Controllers;
4
5 defined('ABSPATH') || exit();
6
7 use SuperbAddons\Admin\Controllers\SettingsController;
8 use SuperbAddons\Admin\Controllers\Wizard\WizardController;
9 use SuperbAddons\Admin\Controllers\Wizard\WizardRestorationPointController;
10 use SuperbAddons\Admin\Utils\AdminLinkUtil;
11 use SuperbAddons\Data\Controllers\CompatibilitySettingsOptionKey;
12 use SuperbAddons\Data\Controllers\RestController;
13 use SuperbAddons\Data\Utils\AllowedTemplateHTMLUtil;
14 use SuperbAddons\Data\Utils\ScriptTranslations;
15 use SuperbAddons\Gutenberg\BlocksAPI\Controllers\DynamicBlockAssets;
16 use SuperbAddons\Gutenberg\BlocksAPI\Controllers\RecentPostsController;
17 use SuperbAddons\Library\Controllers\LibraryController;
18 use SuperbAddons\Library\Controllers\LibraryRequestController;
19
20 class GutenbergController
21 {
22 const MINIMUM_WORDPRESS_VERSION = '5.8';
23 const MINIMUM_PHP_VERSION = '5.6';
24
25 const PATTERN_BLOCK_ARG = 'is_pattern_block';
26 const BLOCKS = array(
27 ['path' => "animated-heading", "args" => ['render_callback' => array(DynamicBlockAssets::class, 'EnqueueAnimatedHeader')]],
28 ['path' => "author-box", "args" => []],
29 ['path' => "ratings", "args" => []],
30 ['path' => "table-of-contents", "args" => []],
31 ['path' => "recent-posts", "args" => ['render_callback' => array(RecentPostsController::class, 'DynamicRender')]],
32 ['path' => "cover-image", "args" => []],
33 ['path' => "google-maps", "args" => []],
34 ['path' => "reveal-buttons", "args" => []],
35 ['path' => "reveal-button", "args" => ['render_callback' => array(DynamicBlockAssets::class, 'EnqueueRevealButton')]]
36 );
37
38 public function __construct()
39 {
40 WizardRestorationPointController::Initialize();
41
42 if (!self::is_compatible()) {
43 return;
44 }
45
46 add_action('block_categories_all', array($this, 'RegisterBlockCategory'), defined('PHP_INT_MAX') ? PHP_INT_MAX : 999, 2);
47 add_action('init', array($this, 'RegisterBlocks'), 0);
48 add_action('enqueue_block_editor_assets', array($this, 'EnqueueBlockEditorAssets'));
49
50 add_action("enqueue_block_assets", array($this, 'EnqueueEditorIframeAssets'));
51 add_action("wp_enqueue_scripts", array($this, 'EnqueuePatternAssets'));
52
53 add_action('enqueue_block_editor_assets', array($this, 'EnqueueVariableFallbacks'), PHP_INT_MIN);
54 add_action("wp_enqueue_scripts", array($this, 'EnqueueVariableFallbacks'), PHP_INT_MIN);
55
56 GutenbergEnhancementsController::Initialize();
57 WizardController::Initialize();
58 }
59
60 public static function is_compatible()
61 {
62 // Check for required WP version
63 if (version_compare(get_bloginfo('version'), self::MINIMUM_WORDPRESS_VERSION, '<')) {
64 return false;
65 }
66
67 // Check for required PHP version
68 if (version_compare(PHP_VERSION, self::MINIMUM_PHP_VERSION, '<')) {
69 return false;
70 }
71
72 return true;
73 }
74
75 public static function is_block_theme()
76 {
77 if (!function_exists('wp_is_block_theme')) {
78 return false;
79 }
80
81 if (!wp_is_block_theme()) {
82 return false;
83 }
84
85 return true;
86 }
87
88 public static function GetGutenbergLibraryMenuItems()
89 {
90 return array(
91 array(
92 "id" => "patterns",
93 "title" => esc_html__('Patterns', "superb-blocks"),
94 "routes" => array(
95 "list" => LibraryRequestController::GUTENBERG_LIST_ROUTE . LibraryRequestController::GUTENBERG_ROUTE_TYPE_PATTERNS,
96 "insert" => LibraryRequestController::GUTENBERG_INSERT_ROUTE . LibraryRequestController::GUTENBERG_ROUTE_TYPE_PATTERNS
97 ),
98 "hidden" => false
99 ),
100 array(
101 "id" => "pages",
102 "title" => esc_html__('Pages', "superb-blocks"),
103 "routes" => array(
104 "list" => LibraryRequestController::GUTENBERG_LIST_ROUTE . LibraryRequestController::GUTENBERG_ROUTE_TYPE_PAGES,
105 "insert" => LibraryRequestController::GUTENBERG_INSERT_ROUTE . LibraryRequestController::GUTENBERG_ROUTE_TYPE_PAGES
106 ),
107 "hidden" => false
108 )
109 );
110 }
111
112 public function EnqueuePatternAssets()
113 {
114 wp_register_style(
115 'superb-addons-patterns',
116 SUPERBADDONS_ASSETS_PATH . '/css/patterns.min.css',
117 array(),
118 SUPERBADDONS_VERSION
119 );
120 wp_enqueue_style(
121 'superb-addons-patterns'
122 );
123 }
124
125 public function EnqueueVariableFallbacks()
126 {
127 $fallbacks = ":root{--wp--preset--color--primary:#1f7cec;--wp--preset--color--primary-hover:#3993ff;--wp--preset--color--base:#fff;--wp--preset--color--featured:#0a284b;--wp--preset--color--contrast-light:#fff;--wp--preset--color--contrast-dark:#000;--wp--preset--color--mono-1:#0d3c74;--wp--preset--color--mono-2:#64748b;--wp--preset--color--mono-3:#e2e8f0;--wp--preset--color--mono-4:#f8fafc;--wp--preset--spacing--superbspacing-xxsmall:clamp(5px,1vw,10px);--wp--preset--spacing--superbspacing-xsmall:clamp(10px,2vw,20px);--wp--preset--spacing--superbspacing-small:clamp(20px,4vw,40px);--wp--preset--spacing--superbspacing-medium:clamp(30px,6vw,60px);--wp--preset--spacing--superbspacing-large:clamp(40px,8vw,80px);--wp--preset--spacing--superbspacing-xlarge:clamp(50px,10vw,100px);--wp--preset--spacing--superbspacing-xxlarge:clamp(60px,12vw,120px);--wp--preset--font-size--superbfont-tiny:clamp(10px,0.625rem + ((1vw - 3.2px) * 0.227),12px);--wp--preset--font-size--superbfont-xxsmall:clamp(12px,0.75rem + ((1vw - 3.2px) * 0.227),14px);--wp--preset--font-size--superbfont-xsmall:clamp(16px,1rem + ((1vw - 3.2px) * 1),16px);--wp--preset--font-size--superbfont-small:clamp(16px,1rem + ((1vw - 3.2px) * 0.227),18px);--wp--preset--font-size--superbfont-medium:clamp(18px,1.125rem + ((1vw - 3.2px) * 0.227),20px);--wp--preset--font-size--superbfont-large:clamp(24px,1.5rem + ((1vw - 3.2px) * 0.909),32px);--wp--preset--font-size--superbfont-xlarge:clamp(32px,2rem + ((1vw - 3.2px) * 1.818),48px);--wp--preset--font-size--superbfont-xxlarge:clamp(40px,2.5rem + ((1vw - 3.2px) * 2.727),64px)}.has-primary-color{color:var(--wp--preset--color--primary)!important}.has-primary-hover-color{color:var(--wp--preset--color--primary-hover)!important}.has-base-color{color:var(--wp--preset--color--base)!important}.has-featured-color{color:var(--wp--preset--color--featured)!important}.has-contrast-light-color{color:var(--wp--preset--color--contrast-light)!important}.has-contrast-dark-color{color:var(--wp--preset--color--contrast-dark)!important}.has-mono-1-color{color:var(--wp--preset--color--mono-1)!important}.has-mono-2-color{color:var(--wp--preset--color--mono-2)!important}.has-mono-3-color{color:var(--wp--preset--color--mono-3)!important}.has-mono-4-color{color:var(--wp--preset--color--mono-4)!important}.has-primary-background-color{background-color:var(--wp--preset--color--primary)!important}.has-primary-hover-background-color{background-color:var(--wp--preset--color--primary-hover)!important}.has-base-background-color{background-color:var(--wp--preset--color--base)!important}.has-featured-background-color{background-color:var(--wp--preset--color--featured)!important}.has-contrast-light-background-color{background-color:var(--wp--preset--color--contrast-light)!important}.has-contrast-dark-background-color{background-color:var(--wp--preset--color--contrast-dark)!important}.has-mono-1-background-color{background-color:var(--wp--preset--color--mono-1)!important}.has-mono-2-background-color{background-color:var(--wp--preset--color--mono-2)!important}.has-mono-3-background-color{background-color:var(--wp--preset--color--mono-3)!important}.has-mono-4-background-color{background-color:var(--wp--preset--color--mono-4)!important}.has-superbfont-tiny-font-size{font-size:var(--wp--preset--font-size--superbfont-tiny)!important}.has-superbfont-xxsmall-font-size{font-size:var(--wp--preset--font-size--superbfont-xxsmall)!important}.has-superbfont-xsmall-font-size{font-size:var(--wp--preset--font-size--superbfont-xsmall)!important}.has-superbfont-small-font-size{font-size:var(--wp--preset--font-size--superbfont-small)!important}.has-superbfont-medium-font-size{font-size:var(--wp--preset--font-size--superbfont-medium)!important}.has-superbfont-large-font-size{font-size:var(--wp--preset--font-size--superbfont-large)!important}.has-superbfont-xlarge-font-size{font-size:var(--wp--preset--font-size--superbfont-xlarge)!important}.has-superbfont-xxlarge-font-size{font-size:var(--wp--preset--font-size--superbfont-xxlarge)!important}";
128 wp_register_style('superb-addons-variable-fallbacks', false, array(), SUPERBADDONS_VERSION);
129 wp_enqueue_style('superb-addons-variable-fallbacks');
130 wp_add_inline_style('superb-addons-variable-fallbacks', $fallbacks);
131 }
132
133 public function EnqueueEditorIframeAssets()
134 {
135 global $pagenow;
136 // Enqueues as block assets - check the current page to make sure we only enqueue on the site editor page and not on the frontend
137 if ('site-editor.php' === $pagenow) {
138 wp_enqueue_style(
139 'superb-gutenberg-layout-library',
140 SUPERBADDONS_ASSETS_PATH . '/css/layout-library-preview.min.css',
141 array(),
142 SUPERBADDONS_VERSION
143 );
144 // Enhancements
145 wp_enqueue_style(
146 'superb-addons-editor-enhancements',
147 SUPERBADDONS_ASSETS_PATH . '/css/editor-enhancements.min.css',
148 array(),
149 SUPERBADDONS_VERSION
150 );
151 // Patterns
152 $this->EnqueuePatternAssets();
153 $this->EnqueueVariableFallbacks();
154 }
155 }
156
157 public function EnqueueBlockEditorAssets()
158 {
159 self::AddonsLibrary();
160 self::EditorEnhancements();
161 $this->EnqueuePatternAssets();
162 wp_enqueue_script(
163 'superb-addons-gutenberg-library',
164 SUPERBADDONS_ASSETS_PATH . '/js/gutenberg/pattern-library.js',
165 array("jquery", "wp-plugins", "wp-hooks", "wp-data", "wp-element", "wp-i18n", "wp-components", "wp-compose", "wp-blocks", "wp-editor"),
166 SUPERBADDONS_VERSION,
167 true
168 );
169 ScriptTranslations::Set('superb-addons-gutenberg-library');
170 wp_localize_script('superb-addons-gutenberg-library', 'superblayoutlibrary_g', array(
171 "style_placeholder" => esc_html__('All themes', "superb-blocks"),
172 "category_placeholder" => esc_html__('All categories', "superb-blocks"),
173 "snacks" => array(
174 "settings_save_message" => esc_html__("Settings saved successfully.", "superb-blocks"),
175 "settings_save_error" => esc_html__("Something went wrong while attempting to save your settings. Please try again or contact support if the problem persists.", "superb-blocks"),
176 "insert_error" => esc_html__('Something went wrong while attempting to insert this element. Please try again or contact support if the problem persists.', "superb-blocks"),
177 "list_error" => esc_html__('Something went wrong while attempting to list elements. Please try again or contact support if the problem persists.', "superb-blocks")
178 ),
179 "menu_items" => self::GetGutenbergLibraryMenuItems(),
180 "rest" => array(
181 "base" => \get_rest_url(),
182 "namespace" => RestController::NAMESPACE,
183 "nonce" => wp_create_nonce("wp_rest")
184 ),
185 "addons_link_id" => AdminLinkUtil::GetLinkID()
186 ));
187 wp_enqueue_style(
188 'superb-addons-elements',
189 SUPERBADDONS_ASSETS_PATH . '/css/framework.min.css',
190 array(),
191 SUPERBADDONS_VERSION
192 );
193 wp_enqueue_style(
194 'superb-addons-font-manrope',
195 SUPERBADDONS_ASSETS_PATH . '/fonts/manrope/manrope.css',
196 array(),
197 SUPERBADDONS_VERSION
198 );
199 wp_enqueue_style(
200 'superb-gutenberg-editor-layout-library',
201 SUPERBADDONS_ASSETS_PATH . '/css/layout-library-editor.min.css',
202 array(),
203 SUPERBADDONS_VERSION
204 );
205 wp_enqueue_style(
206 'superb-gutenberg-layout-library',
207 SUPERBADDONS_ASSETS_PATH . '/css/layout-library-preview.min.css',
208 array(),
209 SUPERBADDONS_VERSION
210 );
211 wp_enqueue_style(
212 'superbaddons-js-snackbar',
213 SUPERBADDONS_ASSETS_PATH . '/lib/js-snackbar.min.css',
214 array(),
215 SUPERBADDONS_VERSION
216 );
217 wp_enqueue_script('superb-addons-select2', SUPERBADDONS_ASSETS_PATH . '/lib/select2.min.js', array('jquery'), SUPERBADDONS_VERSION, true);
218 wp_enqueue_style(
219 'superbaddons-select2',
220 SUPERBADDONS_ASSETS_PATH . '/lib/select2.min.css',
221 array(),
222 SUPERBADDONS_VERSION
223 );
224
225 wp_enqueue_script(
226 'superbaddons-animated-heading',
227 SUPERBADDONS_ASSETS_PATH . '/js/dynamic-blocks/animated-heading.js',
228 [],
229 SUPERBADDONS_VERSION,
230 true
231 );
232
233 // Enhancements
234 wp_enqueue_style(
235 'superb-addons-editor-enhancements',
236 SUPERBADDONS_ASSETS_PATH . '/css/editor-enhancements.min.css',
237 array(),
238 SUPERBADDONS_VERSION
239 );
240
241 /// Compatibility
242
243 if (SettingsController::IsCompatibilitySettingRelevantAndEnabled(CompatibilitySettingsOptionKey::SPECTRA_BLOCK_SPACING)) {
244 wp_enqueue_script(
245 'superb-addons-block-spacing-compatibility-fix',
246 SUPERBADDONS_ASSETS_PATH . '/js/compatibility/block-spacing.js',
247 array('jquery'),
248 SUPERBADDONS_VERSION,
249 true
250 );
251 }
252 }
253
254 public function RegisterBlockCategory($block_categories, $block_editor_context)
255 {
256 return array_merge(
257 array(
258 array(
259 'slug' => 'superb-addons-blocks',
260 'title' => __('Superb Addons', "superb-blocks"),
261 ),
262 ),
263 $block_categories
264 );
265 }
266
267 public function RegisterBlocks()
268 {
269 foreach (self::BLOCKS as $block) {
270 if (isset($block['args'][self::PATTERN_BLOCK_ARG])) {
271 $block['args']['category'] = 'superb-addons-blocks-patterns';
272 unset($block['args'][self::PATTERN_BLOCK_ARG]);
273 }
274 register_block_type(SUPERBADDONS_PLUGIN_DIR . 'blocks/' . $block['path'], $block['args']);
275 }
276 }
277
278 private static function EditorEnhancements()
279 {
280 add_action('admin_footer', function () {
281 AllowedTemplateHTMLUtil::enable_safe_styles();
282 ob_start();
283 include(SUPERBADDONS_PLUGIN_DIR . 'src/gutenberg/templates/block-quick-options.php');
284 $template = ob_get_clean();
285 echo '<script type="text/template" id="tmpl-gutenberg-superb-block-quick-options">' . wp_kses($template, "post") . '</script>';
286 AllowedTemplateHTMLUtil::disable_safe_styles();
287 });
288 }
289
290 public static function AddonsLibrary()
291 {
292 add_action('admin_footer', function () {
293 AllowedTemplateHTMLUtil::enable_safe_styles();
294 ///// Buttons
295 ob_start();
296 include(SUPERBADDONS_PLUGIN_DIR . 'src/gutenberg/templates/library-button.php');
297 $template = ob_get_clean();
298 echo '<script type="text/template" id="tmpl-gutenberg-superb-library-button">' . wp_kses($template, "post") . '</script>';
299 //
300 ob_start();
301 include(SUPERBADDONS_PLUGIN_DIR . 'src/gutenberg/templates/pattern-tab-library-button.php');
302 $template = ob_get_clean();
303 echo '<script type="text/template" id="tmpl-gutenberg-superb-library-button-patternstab">' . wp_kses($template, "post") . '</script>';
304 //
305 ob_start();
306 include(SUPERBADDONS_PLUGIN_DIR . 'src/gutenberg/templates/appender-button.php');
307 $template = ob_get_clean();
308 echo '<script type="text/template" id="tmpl-gutenberg-superb-library-appender-button">' . wp_kses($template, "post") . '</script>';
309 AllowedTemplateHTMLUtil::disable_safe_styles();
310 ////// Library
311 LibraryController::InsertTemplatesWithWrapper();
312 });
313 }
314
315 public static function GutenbergDataImportAction($data)
316 {
317 if (!isset($data['content'])) {
318 return $data;
319 }
320
321 $content = $data['content'];
322 $content = preg_replace_callback("/(http)?s?:?(\/\/[^\"']*\.(?:png|jpg|jpeg|gif|png|webp))/", function ($matches) {
323 // Get the URL
324 $url = $matches[0];
325 $basename = pathinfo($url, PATHINFO_BASENAME);
326 $title = sanitize_title($basename);
327
328 // Check if attachment exists based on the file slug
329 $posts = get_posts(
330 array(
331 'post_type' => 'attachment',
332 'title' => $title,
333 'numberposts' => 1,
334 )
335 );
336 if (!empty($posts)) {
337 // Return existing attachment URL
338 $attachment = $posts[0];
339 return wp_get_attachment_image_url($attachment->ID, 'full');
340 }
341
342 if (!function_exists('media_sideload_image')) {
343 require_once(ABSPATH . 'wp-admin/includes/image.php');
344 require_once(ABSPATH . 'wp-admin/includes/file.php');
345 require_once(ABSPATH . 'wp-admin/includes/media.php');
346 }
347
348 // Create new attachment
349 $attachment_id = \media_sideload_image($url, 0, $title, 'id');
350 if (is_wp_error($attachment_id) || !is_numeric($attachment_id)) {
351 // Return original URL if any error occurred
352 return $url;
353 }
354
355 // Return new attachment URL
356 return wp_get_attachment_image_url($attachment_id, 'full');
357 }, $content);
358
359 $data['content'] = $content;
360
361 return $data;
362 }
363 }
364