PluginProbe
FluentCommunity – Ultra-Fast High-Performance Social Network, Community, LMS & Online Courses / 2.10.0
FluentCommunity – Ultra-Fast High-Performance Social Network, Community, LMS & Online Courses v2.10.0
2.11.0 2.10.0 2.10.01 2.9.1 2.9.0 2.8.1 2.8.0 2.7.7 2.7.5 2.7.0 2.6.01 2.6.0 2.5.0 2.4.01 trunk 1.0.90 1.0.91 1.0.92 1.0.93 1.0.94 1.0.95 1.0.96 1.0.97 1.0.98 1.0.99 All 78 releases
← All changes | app/Hooks/Handlers/FluentBlockEditorHandler.php +85 -22 2.7.7 → 2.10.0 View file →
@@ -9,25 +9,40 @@
9 9 use FluentCommunity\Modules\Course\Model\CourseLesson;
10 10
11 11 class FluentBlockEditorHandler
12 12 {
13 + /**
14 + * Extra fcomEditorVars entries contributed by whoever answered the
15 + * fluent_community/block_editor_context filter. Stashed in renderCustomEditor()
16 + * and merged in gutenberg_editor_scripts_and_styles(), which runs later in the
17 + * same request off the wp_enqueue_scripts callback registered below.
18 + *
19 + * @var array
20 + */
21 + private $contextEditorVars = [];
22 +
13 23 public function register()
14 24 {
15 25 add_action('init', function () {
16 26
17 - register_post_type('fcom-dummy', [
18 - 'label' => 'Lesson',
19 - 'public' => false,
20 - 'show_in_rest' => true,
21 - 'supports' => ['title', 'editor', 'thumbnail'],
27 + $editorPostTypes = apply_filters('fluent_community/block_editor_post_types', [
28 + 'fcom-dummy' => [
29 + 'label' => 'Lesson',
30 + 'public' => false,
31 + 'show_in_rest' => true,
32 + 'supports' => ['title', 'editor', 'thumbnail'],
33 + ],
34 + 'fcom-lockscreen' => [
35 + 'label' => 'Lockscreen',
36 + 'public' => false,
37 + 'show_in_rest' => true,
38 + 'supports' => ['editor'],
39 + ],
22 40 ]);
23 41
24 - register_post_type('fcom-lockscreen', [
25 - 'label' => 'Lockscreen',
26 - 'public' => false,
27 - 'show_in_rest' => true,
28 - 'supports' => ['editor'],
29 - ]);
42 + foreach ($editorPostTypes as $editorPostType => $editorPostTypeArgs) {
43 + register_post_type($editorPostType, $editorPostTypeArgs);
44 + }
30 45
31 46 if (!isset($_REQUEST['fluent_community_block_editor'])) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
32 47 return;
33 48 }
@@ -50,8 +65,10 @@
50 65 media="screen"/>
51 66 <?php // phpcs:enable WordPress.WP.EnqueuedResources.NonEnqueuedStylesheet ?>
52 67
53 68 <style>
69 + /* No admin bar here; WP 7.1 offsets the editor by this var, leaving a gap. */
70 + html { --wp-admin--admin-bar--height: 0; }
54 71 <?php echo wp_strip_all_tags($this->getColorSchemaCss()); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- generated CSS, no user input ?>
55 72 </style>
56 73
57 74 <?php
@@ -99,8 +116,30 @@
99 116 $hasAccess = $space && $space->isAdmin(get_current_user_id(), true);
100 117 }
101 118 }
102 119
120 + /*
121 + * Extension point for editor contexts registered outside this plugin (the pro
122 + * Space Pages module uses it). Handlers matching $context return their own
123 + * access decision, post type and the content to seed the simulated post with.
124 + */
125 + $contextConfig = apply_filters('fluent_community/block_editor_context', [
126 + 'has_access' => $hasAccess,
127 + 'post_type' => $postType,
128 + 'has_content' => false,
129 + 'title' => '',
130 + 'content' => '',
131 + ], $context, $data);
132 +
133 + $hasAccess = !empty($contextConfig['has_access']);
134 +
135 + $this->contextEditorVars = (array)Arr::get($contextConfig, 'editor_vars', []);
136 +
137 + $contextPostType = Arr::get($contextConfig, 'post_type');
138 + if ($contextPostType) {
139 + $postType = $contextPostType;
140 + }
141 +
103 142 if (!$hasAccess) {
104 143 echo '<h3 style="padding: 100px; text-align: center;">' . esc_html__('Sorry, you do not have access to this page.', 'fluent-community') . '</h3>';
105 144 exit(200);
106 145 }
@@ -131,8 +170,12 @@
131 170
132 171 if ($lesson) {
133 172 $post->post_title = $lesson->title;
134 173 $post->post_content = $lesson->message ?: '<!-- wp:paragraph --><p> </p><!-- /wp:paragraph -->';
174 + } elseif (!empty($contextConfig['has_content'])) {
175 + $contextContent = Arr::get($contextConfig, 'content');
176 + $post->post_title = Arr::get($contextConfig, 'title', '');
177 + $post->post_content = $contextContent ? $contextContent : '<!-- wp:paragraph --><p> </p><!-- /wp:paragraph -->';
135 178 }
136 179
137 180 // renderPage() exits during admin_init and manually fires wp_enqueue_scripts in
138 181 // both the admin and frontend branches. admin_enqueue_scripts never runs here, so
@@ -297,12 +340,12 @@
297 340 do_action('fluent_enqueue_block_editor_assets');
298 341
299 342 wp_enqueue_script('fcom_editor_custom', FLUENT_COMMUNITY_PLUGIN_URL . 'Modules/Gutenberg/editor/index.js', ['react', 'wp-components', 'wp-compose', 'wp-data', 'wp-edit-post', 'wp-i18n', 'wp-plugins'], FLUENT_COMMUNITY_PLUGIN_VERSION . time(), true);
300 343 wp_localize_script('fcom_editor_custom', 'fcomEditorI18n', $this->getEditorI18nStrings());
301 - wp_localize_script('fcom_editor_custom', 'fcomEditorVars', [
344 + wp_localize_script('fcom_editor_custom', 'fcomEditorVars', array_merge([
302 345 'video_gate_default_threshold' => \FluentCommunity\Modules\Course\Services\LessonVideoGateService::getDefaultThreshold(),
303 346 'can_unfiltered_html' => current_user_can('unfiltered_html') ? 'yes' : 'no',
304 - ]);
347 + ], $this->contextEditorVars));
305 348 }
306 349
307 350 private function getEditorI18nStrings()
308 351 {
@@ -352,8 +395,32 @@
352 395 "User's Name" => __("User's Name", 'fluent-community'),
353 396 "User's Email" => __("User's Email", 'fluent-community'),
354 397 "User's photo HTML" => __("User's photo HTML", 'fluent-community'),
355 398 'Profile Link' => __('Profile Link', 'fluent-community'),
399 + // Space page settings panel
400 + 'Who can view this page' => __('Who can view this page', 'fluent-community'),
401 + 'Everyone who can view the space' => __('Everyone who can view the space', 'fluent-community'),
402 + 'Space members only' => __('Space members only', 'fluent-community'),
403 + 'URL Slug' => __('URL Slug', 'fluent-community'),
404 + 'Changing the slug will break existing links to this page.' => __('Changing the slug will break existing links to this page.', 'fluent-community'),
405 + 'Show in space menu' => __('Show in space menu', 'fluent-community'),
406 + 'Menu Label' => __('Menu Label', 'fluent-community'),
407 + 'Leave empty to use the page title.' => __('Leave empty to use the page title.', 'fluent-community'),
408 + 'SEO' => __('SEO', 'fluent-community'),
409 + 'SEO Description' => __('SEO Description', 'fluent-community'),
410 + 'Used for search engines and link previews' => __('Used for search engines and link previews', 'fluent-community'),
411 + // Space page layout picker. The template labels and descriptions are
412 + // localized by whoever registers them (SpacePageHelper::getLayoutTemplates
413 + // in pro); only the fallback names used when pro is absent live here.
414 + 'Page Layout' => __('Page Layout', 'fluent-community'),
415 + 'Show the page title' => __('Show the page title', 'fluent-community'),
416 + 'Show the featured image' => __('Show the featured image', 'fluent-community'),
417 + 'The title stays editable here and still names the page in the menu.' => __('The title stays editable here and still names the page in the menu.', 'fluent-community'),
418 + 'The image still appears in search results and link previews.' => __('The image still appears in search results and link previews.', 'fluent-community'),
419 + 'Standard' => __('Standard', 'fluent-community'),
420 + 'Classic' => __('Classic', 'fluent-community'),
421 + 'Full Width' => __('Full Width', 'fluent-community'),
422 + 'Unified' => __('Unified', 'fluent-community'),
356 423 ];
357 424
358 425 return apply_filters('fluent_community/editor_i18n_strings', $strings);
359 426 }
@@ -463,24 +530,19 @@
463 530 }
464 531
465 532 private function unloadOtherScripts()
466 533 {
534 + // skips scripts and styles both; fluent_community/skip_no_conflict is styles only
467 535 $isSkip = apply_filters('fluent_com_editor/skip_no_conflict', false);
468 536 if ($isSkip) {
469 537 return;
470 538 }
471 539
472 - /**
473 - * Define the list of approved slugs for FluentCRM assets.
474 - *
475 - * This filter allows modification of the list of slugs that are approved for FluentCRM assets.
476 - *
477 - * @param array $approvedSlugs An array of approved slugs for FluentCRM assets.
478 - */
540 + // scripts only; styles use fluent_community/asset_listed_slugs
479 541 $approvedSlugs = apply_filters('fluent_com_editor/asset_listed_slugs', [
480 542 '\/gutenberg\/'
481 543 ]);
482 - $approvedSlugs[] = 'fluent-community';
544 + $approvedSlugs[] = '\/fluent-community(-pro)?\/';
483 545 $approvedSlugs = array_unique($approvedSlugs);
484 546 $approvedSlugs = implode('|', $approvedSlugs);
485 547
486 548 $pluginUrl = str_replace(['http:', 'https:'], '', plugins_url());
@@ -528,13 +590,14 @@
528 590 if (!$wp_styles) {
529 591 return;
530 592 }
531 593
594 + // styles only; scripts use fluent_com_editor/asset_listed_slugs
532 595 $approvedSlugs = apply_filters('fluent_community/asset_listed_slugs', [
533 596 '\/gutenberg\/',
534 597 ]);
535 598
536 - $approvedSlugs[] = '\/fluent-community\/';
599 + $approvedSlugs[] = '\/fluent-community(-pro)?\/';
537 600
538 601 $approvedSlugs = array_unique($approvedSlugs);
539 602 $approvedSlugs = implode('|', $approvedSlugs);
540 603