| @@ -1,87 +1,168 @@ | ||
| 1 | 1 | <?php |
| 2 | +// phpcs:disable WordPress.DB.SlowDBQuery.slow_db_query_meta_query,WordPress.DB.SlowDBQuery.slow_db_query_meta_key,WordPress.DB.SlowDBQuery.slow_db_query_tax_query -- core block query; meta/tax filtering required. | |
| 3 | +namespace WPDeveloper\BetterDocs\Editors\BlockEditor\Blocks; | |
| 2 | 4 | |
| 3 | -namespace WPDeveloper\BetterDocs\Editors\BlockEditor\Blocks; | |
| 5 | +if ( ! defined( 'ABSPATH' ) ) { | |
| 6 | + exit; | |
| 7 | +} | |
| 4 | 8 | |
| 9 | + | |
| 5 | 10 | use WPDeveloper\BetterDocs\Editors\BlockEditor\Block; |
| 6 | 11 | |
| 7 | 12 | class Sidebar extends Block { |
| 8 | 13 | |
| 9 | - protected $editor_styles = [ | |
| 10 | - 'betterdocs-sidebar' | |
| 11 | - ]; | |
| 14 | + public $view_wrapper = 'betterdocs-toc-block'; | |
| 12 | 15 | |
| 13 | - protected $frontend_styles = [ | |
| 14 | - 'betterdocs-sidebar' | |
| 15 | - ]; | |
| 16 | + protected $editor_styles = [ | |
| 17 | + 'betterdocs-sidebar', | |
| 18 | + 'betterdocs-search-modal', | |
| 19 | + 'betterdocs-extend-search-modal' | |
| 20 | + ]; | |
| 16 | 21 | |
| 17 | - public function get_name() { | |
| 18 | - return 'sidebar'; | |
| 19 | - } | |
| 22 | + protected $frontend_styles = [ | |
| 23 | + 'betterdocs-sidebar', | |
| 24 | + 'betterdocs-fontawesome' | |
| 25 | + ]; | |
| 20 | 26 | |
| 27 | + protected $frontend_scripts = [ | |
| 28 | + 'betterdocs', | |
| 29 | + 'betterdocs-category-grid', | |
| 30 | + 'betterdocs-search-modal' | |
| 31 | + ]; | |
| 32 | + | |
| 33 | + public function get_name() { | |
| 34 | + return 'sidebar'; | |
| 35 | + } | |
| 36 | + | |
| 37 | + public function register_scripts() { | |
| 38 | + if( is_admin() ){ // load for wordpress admin panel only | |
| 39 | + if ( function_exists( 'betterdocs_pro' ) && betterdocs_pro()->assets != null ) { // get the sidebar modal on gutenberg edit mode | |
| 40 | + betterdocs_pro()->assets->enqueue( 'betterdocs-extend-search-modal', 'public/js/extend-search-modal.js', [] ); | |
| 41 | + } | |
| 42 | + $this->assets_manager->enqueue( | |
| 43 | + 'betterdocs-search-modal', | |
| 44 | + 'shortcodes/js/search-modal.js', | |
| 45 | + [ 'jquery' ] | |
| 46 | + ); | |
| 47 | + } | |
| 48 | + } | |
| 49 | + | |
| 21 | 50 | public function get_default_attributes() { |
| 22 | 51 | return [ |
| 23 | - 'blockId' => '', | |
| 24 | - 'sidebar_layout' => 'layout-1', | |
| 25 | - 'includeCategories' => '', | |
| 26 | - 'excludeCategories' => '', | |
| 27 | - 'terms_per_page' => -1, | |
| 28 | - 'terms_order' => 'asc', | |
| 29 | - 'terms_orderby' => 'doc_category_order', | |
| 30 | - 'docs_per_page' => -1, | |
| 31 | - 'docs_orderby' => 'title', | |
| 32 | - 'docs_order' => 'asc', | |
| 33 | - 'enableNestedSubcategory' => false, | |
| 34 | - 'docs_per_subcategory' => 10, | |
| 35 | - 'titleTag' => 'h1', | |
| 36 | - 'enableStickyTOC' => false | |
| 52 | + 'blockId' => '', | |
| 53 | + 'sidebar_layout' => 'layout-1', | |
| 54 | + 'selectKB' => '', | |
| 55 | + 'includeCategories' => '', | |
| 56 | + 'excludeCategories' => '', | |
| 57 | + 'terms_per_page' => -1, | |
| 58 | + 'terms_order' => 'asc', | |
| 59 | + 'terms_orderby' => 'doc_category_order', | |
| 60 | + 'docs_per_page' => -1, | |
| 61 | + 'postsOrderBy' => 'title', | |
| 62 | + 'postsOrder' => 'asc', | |
| 63 | + 'enableNestedSubcategory' => false, | |
| 64 | + // Default follows the global "Lazy Load Sidebar Docs & Subcategories" | |
| 65 | + // setting, mirroring the Elementor sidebar widget's control default, so | |
| 66 | + // enabling the setting lazy-loads the block too unless overridden. | |
| 67 | + 'enableLazyLoad' => (bool) betterdocs()->settings->get( 'archive_lazy_load_descendants' ), | |
| 68 | + 'docs_per_subcategory' => 10, | |
| 69 | + 'titleTag' => 'h1', | |
| 70 | + 'show_count' => false, | |
| 71 | + 'enableStickyTOC' => false, | |
| 72 | + 'listIcon' => '', | |
| 73 | + 'listIconImageUrl' => '', | |
| 74 | + 'initialDocsQueryNumber' => 5, | |
| 75 | + 'initialFAQQueryNumber' => 5, | |
| 76 | + 'searchModalQueryTermIds' => '', //for search modal | |
| 77 | + 'searchModalQueryDocIds' => '', //for search modal | |
| 78 | + 'searchModalQueriesFaqGroupIds' => '' | |
| 37 | 79 | ]; |
| 38 | 80 | } |
| 39 | 81 | |
| 40 | - public function render( $attributes, $content ) { | |
| 41 | - $layout = isset( $this->attributes['sidebar_layout'] ) ? $this->attributes['sidebar_layout'] : 'layout-1'; | |
| 42 | - $layout = str_replace( 'layout-', '', $layout ); | |
| 82 | + public function render( $attributes, $content ) { | |
| 83 | + $layout = isset( $this->attributes['sidebar_layout'] ) ? $this->attributes['sidebar_layout'] : 'layout-1'; | |
| 84 | + $layout = str_replace( 'layout-', '', $layout ); | |
| 85 | + $layout_mapper = [ | |
| 86 | + 1 => 1, | |
| 87 | + 2 => 4, | |
| 88 | + 3 => 5, | |
| 89 | + 4 => 2, | |
| 90 | + 5 => 3, | |
| 91 | + 6 => 6, | |
| 92 | + 7 => 7, | |
| 93 | + 8 => 8, | |
| 94 | + ]; | |
| 95 | + $sidebar_layout = isset( $layout_mapper[ $layout ] ) ? $layout_mapper[ $layout ] : 1; | |
| 43 | 96 | |
| 44 | - $sidebar_layout = $layout; | |
| 97 | + if ( ! betterdocs()->is_pro_active() ) { | |
| 98 | + $sidebar_layout = 1; | |
| 99 | + } | |
| 45 | 100 | |
| 46 | - if ( ! betterdocs()->is_pro_active() && ( $sidebar_layout == 2 || $sidebar_layout == 3 ) ) { | |
| 47 | - $sidebar_layout = 1; | |
| 48 | - } | |
| 101 | + add_filter( 'betterdocs_base_terms_args', [ $this, 'filter_base_args' ], 10, 1 ); | |
| 102 | + $this->views( 'templates/sidebars/sidebar-' . $sidebar_layout ); | |
| 103 | + if ( $this->attributes['enableStickyTOC'] && $sidebar_layout == 1 ) { | |
| 104 | + $this->views( 'widgets/sticky-toc-block' ); | |
| 105 | + } | |
| 106 | + remove_filter( 'betterdocs_base_terms_args', [ $this, 'filter_base_args' ], 10 ); | |
| 107 | + } | |
| 49 | 108 | |
| 50 | - add_filter( 'betterdocs_base_terms_args', [$this, 'filter_base_args'], 10, 1 ); | |
| 51 | - $this->views( 'templates/sidebars/sidebar-' . $sidebar_layout ); | |
| 52 | - if ( $this->attributes['enableStickyTOC'] && $sidebar_layout == 1 ) { | |
| 53 | - $this->views( 'widgets/sticky-toc-block' ); | |
| 54 | - } | |
| 55 | - remove_filter( 'betterdocs_base_terms_args', [$this, 'filter_base_args'], 10 ); | |
| 56 | - } | |
| 109 | + public function filter_base_args( $term_args ) { | |
| 110 | + if ( $term_args['orderby'] == 'doc_category_order' ) { | |
| 111 | + $term_args['meta_key'] = 'doc_category_order'; | |
| 112 | + $term_args['orderby'] = 'meta_value_num'; | |
| 113 | + } | |
| 114 | + return $term_args; | |
| 115 | + } | |
| 57 | 116 | |
| 58 | - public function filter_base_args( $term_args ) { | |
| 59 | - if ( $term_args['orderby'] == 'doc_category_order' ) { | |
| 60 | - $term_args['meta_key'] = 'doc_category_order'; | |
| 61 | - $term_args['orderby'] = 'meta_value_num'; | |
| 62 | - } | |
| 63 | - return $term_args; | |
| 64 | - } | |
| 117 | + public function view_params() { | |
| 118 | + $settings = &$this->attributes; | |
| 65 | 119 | |
| 66 | - public function view_params() { | |
| 67 | - $settings = &$this->attributes; | |
| 120 | + $default_multiple_kb = betterdocs()->settings->get( 'multiple_kb' ); | |
| 121 | + $kb_slug = ! empty( $settings['selectKB'] ) && isset( $settings['selectKB'] ) ? json_decode( $settings['selectKB'] )->value : ''; | |
| 122 | + $layout_seven_params = []; | |
| 68 | 123 | |
| 69 | - $default_multiple_kb = betterdocs()->settings->get( 'multiple_kb' ); | |
| 70 | - $kb_slug = isset( $settings['selected_knowledge_base'] ) ? $settings['selected_knowledge_base'] : ''; | |
| 71 | - return [ | |
| 124 | + if ( $settings['sidebar_layout'] == 'layout-1' || $settings['sidebar_layout'] == 'layout-6' || $settings['sidebar_layout'] == 'layout-7' ) { | |
| 125 | + $settings['show_count'] = true; | |
| 126 | + } | |
| 127 | + | |
| 128 | + $default_view_params = [ | |
| 72 | 129 | 'shortcode_attr' => [ |
| 73 | 130 | 'terms_order' => $settings['terms_order'], |
| 74 | - 'terms_orderby' => $settings['terms_orderby'], | |
| 131 | + 'terms_orderby' => $settings['terms_orderby'] == 'doc_category_order' ? 'betterdocs_order' : $settings['terms_orderby'], | |
| 75 | 132 | 'terms_include' => array_diff( $this->string_to_array( $settings['includeCategories'] ), $this->string_to_array( $settings['excludeCategories'] ) ), |
| 76 | 133 | 'terms_exclude' => isset( $settings['excludeCategories'] ) ? $this->string_to_array( $settings['excludeCategories'] ) : '', |
| 77 | 134 | 'nested_subcategory' => $settings['enableNestedSubcategory'], |
| 78 | - 'multiple_knowledge_base' => $default_multiple_kb, | |
| 79 | - 'kb_slug' => $kb_slug, | |
| 135 | + 'lazy_load' => ! empty( $settings['enableLazyLoad'] ), | |
| 80 | 136 | 'sidebar_list' => true, |
| 137 | + 'list_icon_url' => '', | |
| 138 | + 'list_icon_name' => $settings['sidebar_layout'] == 'layout-4' ? '' : ( ! empty( $this->attributes['listIconImageUrl'] ) ? $this->attributes['listIconImageUrl'] : ( ! empty( $this->attributes['listIcon'] ) ? $this->attributes['listIcon'] : ( ! empty( betterdocs()->settings->get( 'docs_list_icon' ) ) ? betterdocs()->settings->get( 'docs_list_icon' )['url'] : 'list' ) ) ), | |
| 139 | + 'layout_type' => 'block', | |
| 81 | 140 | 'disable_customizer_style' => true, |
| 82 | 141 | 'posts_per_page' => -1, |
| 83 | - 'title_tag' => $settings['titleTag'] | |
| 142 | + 'title_tag' => $settings['titleTag'], | |
| 143 | + 'show_count' => $settings['show_count'], | |
| 144 | + 'orderby' => $settings['postsOrderBy'], | |
| 145 | + 'order' => $settings['postsOrder'] | |
| 84 | 146 | ] |
| 85 | 147 | ]; |
| 86 | - } | |
| 148 | + | |
| 149 | + if ( $settings['sidebar_layout'] == 'layout-7' ) { | |
| 150 | + $default_view_params['number_of_docs'] = $settings['initialDocsQueryNumber']; | |
| 151 | + $default_view_params['number_of_faqs'] = $settings['initialFAQQueryNumber']; | |
| 152 | + $default_view_params['faq_term_ids'] = $settings['searchModalQueriesFaqGroupIds']; | |
| 153 | + $default_view_params['doc_ids'] = $settings['searchModalQueryDocIds']; | |
| 154 | + $default_view_params['doc_term_ids'] = $settings['searchModalQueryTermIds']; | |
| 155 | + } | |
| 156 | + | |
| 157 | + // Pass a KB scope only when one is explicitly selected on the block. When none is | |
| 158 | + // set, omit kb_slug so the betterdocs_sidebar_template_shortcode_params filter | |
| 159 | + // (Pro/MKB) can inject the current knowledge_base context on KB templates — the | |
| 160 | + // same path the default sidebar uses. (Passing kb_slug='' would block injection.) | |
| 161 | + if ( ! empty( $kb_slug ) ) { | |
| 162 | + $default_view_params['shortcode_attr']['kb_slug'] = $kb_slug; | |
| 163 | + $default_view_params['shortcode_attr']['multiple_knowledge_base'] = (bool) $default_multiple_kb; | |
| 164 | + } | |
| 165 | + | |
| 166 | + return $default_view_params; | |
| 167 | + } | |
| 87 | 168 | } |