← All changes
|
inc/ExternalPlugin/Elementor/Widgets/Course/Skins/SkinCoursesBase.php
+237
-237
4.3.9
→
4.4.9
View file →
| @@ -1,237 +1,237 @@ | ||
| 1 | -<?php | |
| 2 | -/** | |
| 3 | - * Class SkinCoursesBase | |
| 4 | - * | |
| 5 | - * For render course in list course | |
| 6 | - * | |
| 7 | - * @since 4.2.5.7 | |
| 8 | - * @version 1.0.1 | |
| 9 | - */ | |
| 10 | - | |
| 11 | -namespace LearnPress\ExternalPlugin\Elementor\Widgets\Course\Skins; | |
| 12 | - | |
| 13 | -use Elementor\Plugin; | |
| 14 | -use Elementor\Widget_Base; | |
| 15 | -use LearnPress\ExternalPlugin\Elementor\LPSkinBase; | |
| 16 | -use LearnPress\Helpers\Template; | |
| 17 | -use LearnPress\Models\Courses; | |
| 18 | -use LearnPress\TemplateHooks\Course\ListCoursesTemplate; | |
| 19 | -use LearnPress\TemplateHooks\Course\SingleCourseTemplate; | |
| 20 | -use LearnPress\TemplateHooks\TemplateAJAX; | |
| 21 | -use LP_Course; | |
| 22 | -use LP_Course_Filter; | |
| 23 | -use LP_Database; | |
| 24 | -use LP_Helper; | |
| 25 | -use stdClass; | |
| 26 | -use Throwable; | |
| 27 | - | |
| 28 | -class SkinCoursesBase extends LPSkinBase { | |
| 29 | - protected function _register_controls_actions() { | |
| 30 | - add_action( | |
| 31 | - 'elementor/element/learnpress_list_courses_by_page/section_skin/before_section_end', | |
| 32 | - [ $this, 'controls_on_section_skin' ], | |
| 33 | - 10, | |
| 34 | - 2 | |
| 35 | - ); | |
| 36 | - } | |
| 37 | - | |
| 38 | - public function controls_on_section_skin( Widget_Base $widget, $args ) { | |
| 39 | - // Only add controls here | |
| 40 | - } | |
| 41 | - | |
| 42 | - /** | |
| 43 | - * Render content list courses. (Grid/List) | |
| 44 | - * @override elementor | |
| 45 | - * | |
| 46 | - * @return void | |
| 47 | - */ | |
| 48 | - public function render() { | |
| 49 | - try { | |
| 50 | - $settings = $this->parent->get_settings_for_display(); | |
| 51 | - $is_load_restapi = $settings['courses_rest'] ?? 0; | |
| 52 | - $courses_rest_no_load_page = $settings['courses_rest_no_load_page'] ?? 0; | |
| 53 | - $settings['url_current'] = LP_Helper::getUrlCurrent(); | |
| 54 | - | |
| 55 | - // Merge params filter form url | |
| 56 | - $settings = array_merge( | |
| 57 | - $settings, | |
| 58 | - lp_archive_skeleton_get_args() | |
| 59 | - ); | |
| 60 | - | |
| 61 | - $html_wrapper_widget = [ | |
| 62 | - '<div class="list-courses-elm-wrapper">' => '</div>', | |
| 63 | - ]; | |
| 64 | - | |
| 65 | - // No load AJAX | |
| 66 | - if ( 'yes' !== $is_load_restapi || Plugin::$instance->editor->is_edit_mode() ) { | |
| 67 | - $templateObj = self::render_courses( $settings ); | |
| 68 | - $content = $templateObj->content; | |
| 69 | - } elseif ( 'yes' === $courses_rest_no_load_page ) { | |
| 70 | - $callback = [ | |
| 71 | - 'class' => get_class( $this ), | |
| 72 | - 'method' => 'render_courses', | |
| 73 | - ]; | |
| 74 | - $content_obj = static::render_courses( $settings ); | |
| 75 | - $settings['html_no_load_ajax_first'] = $content_obj->content; | |
| 76 | - $content = TemplateAJAX::load_content_via_ajax( $settings, $callback ); | |
| 77 | - } else { // Load AJAX | |
| 78 | - $callback = [ | |
| 79 | - 'class' => get_class( $this ), | |
| 80 | - 'method' => 'render_courses', | |
| 81 | - ]; | |
| 82 | - $content = TemplateAJAX::load_content_via_ajax( $settings, $callback ); | |
| 83 | - } | |
| 84 | - | |
| 85 | - echo Template::instance()->nest_elements( $html_wrapper_widget, $content ); | |
| 86 | - } catch ( Throwable $e ) { | |
| 87 | - echo $e->getMessage(); | |
| 88 | - } | |
| 89 | - } | |
| 90 | - | |
| 91 | - /** | |
| 92 | - * Render template list courses with settings param. | |
| 93 | - * | |
| 94 | - * @param array $settings | |
| 95 | - * | |
| 96 | - * @return stdClass { content: string_html } | |
| 97 | - * @since 4.2.5.7 | |
| 98 | - * @version 1.0.1 | |
| 99 | - */ | |
| 100 | - public static function render_courses( array $settings = [] ): stdClass { | |
| 101 | - $listCoursesTemplate = ListCoursesTemplate::instance(); | |
| 102 | - $skin = $settings['skin'] ?? 'grid'; | |
| 103 | - $courses_limit = $settings['courses_limit'] ?? 0; | |
| 104 | - $courses_per_page = $settings['courses_per_page'] ?? 8; | |
| 105 | - $courses_order_by = $settings['order_by'] ?? $settings['courses_order_by_default'] ?? 'post_date'; | |
| 106 | - $total_pages = 0; | |
| 107 | - $paged = $settings['paged'] ?? 1; | |
| 108 | - $show_el_sorting = ( $settings['el_sorting'] ?? 'yes' ) === 'yes'; | |
| 109 | - $show_el_result_count = ( $settings['el_result_count'] ?? 'yes' ) === 'yes'; | |
| 110 | - $pagination_type = $settings['pagination_type'] ?? 'number'; | |
| 111 | - $courses_category_ids = $settings['courses_category_ids'] ?? []; | |
| 112 | - | |
| 113 | - if ( $courses_limit > 0 ) { | |
| 114 | - if ( $courses_per_page > $courses_limit ) { | |
| 115 | - $courses_per_page = $courses_limit; | |
| 116 | - } elseif ( $courses_per_page === 0 ) { | |
| 117 | - $courses_per_page = $courses_limit; | |
| 118 | - } | |
| 119 | - | |
| 120 | - $total_pages = LP_Database::get_total_pages( $courses_per_page, $courses_limit ); | |
| 121 | - } | |
| 122 | - | |
| 123 | - if ( $courses_per_page === 0 ) { | |
| 124 | - $courses_per_page = - 1; | |
| 125 | - } | |
| 126 | - | |
| 127 | - $filter = new LP_Course_Filter(); | |
| 128 | - $settings['order_by'] = $courses_order_by; | |
| 129 | - Courses::handle_params_for_query_courses( $filter, $settings ); | |
| 130 | - // Term | |
| 131 | - $filter->term_ids = array_merge( $filter->term_ids, $courses_category_ids ); | |
| 132 | - // End term | |
| 133 | - $total_rows = 0; | |
| 134 | - $filter->limit = $courses_per_page; | |
| 135 | - $courses = Courses::get_courses( $filter, $total_rows ); | |
| 136 | - $total_pages_result = LP_Database::get_total_pages( $courses_per_page, $total_rows ); | |
| 137 | - if ( $total_pages > 0 ) { | |
| 138 | - if ( $total_pages_result > $total_pages ) { | |
| 139 | - if ( $paged === $total_pages && $total_pages > 1 ) { | |
| 140 | - $number_courses_residual = $courses_limit - $courses_per_page * ( $paged - 1 ); | |
| 141 | - $courses = array_slice( $courses, 0, $number_courses_residual ); | |
| 142 | - } | |
| 143 | - | |
| 144 | - $total_rows = $courses_limit; | |
| 145 | - } else { | |
| 146 | - $total_pages = $total_pages_result; | |
| 147 | - } | |
| 148 | - } else { | |
| 149 | - $total_pages = $total_pages_result; | |
| 150 | - } | |
| 151 | - | |
| 152 | - // Handle layout | |
| 153 | - ob_start(); | |
| 154 | - $data_rs = [ | |
| 155 | - 'total_rows' => $total_rows, | |
| 156 | - 'paged' => $paged, | |
| 157 | - 'courses_per_page' => $courses_per_page, | |
| 158 | - ]; | |
| 159 | - | |
| 160 | - $section_top = [ | |
| 161 | - 'wrapper' => '<div class="learn-press-elms-courses-top">', | |
| 162 | - 'el_result_count' => $show_el_result_count ? $listCoursesTemplate->html_courses_page_result( $data_rs ) : '', | |
| 163 | - 'el_sorting' => $show_el_sorting ? $listCoursesTemplate->html_order_by( $courses_order_by ) : '', | |
| 164 | - 'close_wrapper' => '</div>', | |
| 165 | - ]; | |
| 166 | - echo Template::combine_components( $section_top ); | |
| 167 | - | |
| 168 | - $html_lis = ''; | |
| 169 | - foreach ( $courses as $courseObj ) { | |
| 170 | - $course = learn_press_get_course( $courseObj->ID ); | |
| 171 | - $html_lis .= static::render_course( $course, $settings ); | |
| 172 | - } | |
| 173 | - $section_list = [ | |
| 174 | - 'wrapper' => sprintf( '<ul class="learn-press-courses lp-list-courses-no-css %s">', esc_attr( $skin ) ), | |
| 175 | - 'list' => $html_lis, | |
| 176 | - 'wrapper_end' => '</ul>', | |
| 177 | - ]; | |
| 178 | - echo Template::combine_components( $section_list ); | |
| 179 | - | |
| 180 | - $data_pagination = [ | |
| 181 | - 'total_pages' => $total_pages, | |
| 182 | - 'type' => $pagination_type, | |
| 183 | - 'base' => add_query_arg( 'paged', '%#%', $settings['url_current'] ?? '' ), | |
| 184 | - 'paged' => (int) ( $settings['paged'] ?? 1 ), | |
| 185 | - ]; | |
| 186 | - echo $listCoursesTemplate->html_pagination( $data_pagination ); | |
| 187 | - | |
| 188 | - $content = new stdClass(); | |
| 189 | - $content->content = ob_get_clean(); | |
| 190 | - | |
| 191 | - return $content; | |
| 192 | - } | |
| 193 | - | |
| 194 | - /** | |
| 195 | - * Render single item course | |
| 196 | - * | |
| 197 | - * @param LP_Course $course | |
| 198 | - * @param array $settings | |
| 199 | - * | |
| 200 | - * @return string | |
| 201 | - */ | |
| 202 | - public static function render_course( LP_Course $course, array $settings = [] ): string { | |
| 203 | - $html_item = ''; | |
| 204 | - $singleCourseTemplate = SingleCourseTemplate::instance(); | |
| 205 | - | |
| 206 | - try { | |
| 207 | - $html_wrapper = [ | |
| 208 | - '<li class="course-item">' => '</li>', | |
| 209 | - ]; | |
| 210 | - | |
| 211 | - $title = sprintf( '<a href="%s">%s</a>', $course->get_permalink(), $course->get_title() ); | |
| 212 | - | |
| 213 | - $section = [ | |
| 214 | - 'image' => [ 'text_html' => $singleCourseTemplate->html_image( $course ) ], | |
| 215 | - 'author' => [ 'text_html' => sprintf( '<div>%s</div>', $course->get_instructor_html() ) ], | |
| 216 | - 'title' => [ 'text_html' => $title ], | |
| 217 | - 'price' => [ 'text_html' => sprintf( '<div>%s</div>', $singleCourseTemplate->html_price( $course ) ) ], | |
| 218 | - 'button' => [ | |
| 219 | - 'text_html' => sprintf( | |
| 220 | - '<div><a href="%s">%s</a></div>', | |
| 221 | - $course->get_permalink(), | |
| 222 | - __( 'View More', 'learnpress' ) | |
| 223 | - ), | |
| 224 | - ], | |
| 225 | - ]; | |
| 226 | - | |
| 227 | - ob_start(); | |
| 228 | - Template::instance()->print_sections( $section ); | |
| 229 | - $html_item = ob_get_clean(); | |
| 230 | - $html_item = Template::instance()->nest_elements( $html_wrapper, $html_item ); | |
| 231 | - } catch ( Throwable $e ) { | |
| 232 | - $html_item = $e->getMessage(); | |
| 233 | - } | |
| 234 | - | |
| 235 | - return $html_item; | |
| 236 | - } | |
| 237 | -} | |
| 1 | +<?php | |
| 2 | +/** | |
| 3 | + * Class SkinCoursesBase | |
| 4 | + * | |
| 5 | + * For render course in list course | |
| 6 | + * | |
| 7 | + * @since 4.2.5.7 | |
| 8 | + * @version 1.0.1 | |
| 9 | + */ | |
| 10 | + | |
| 11 | +namespace LearnPress\ExternalPlugin\Elementor\Widgets\Course\Skins; | |
| 12 | + | |
| 13 | +use Elementor\Plugin; | |
| 14 | +use Elementor\Widget_Base; | |
| 15 | +use LearnPress\ExternalPlugin\Elementor\LPSkinBase; | |
| 16 | +use LearnPress\Helpers\Template; | |
| 17 | +use LearnPress\Models\Courses; | |
| 18 | +use LearnPress\TemplateHooks\Course\ListCoursesTemplate; | |
| 19 | +use LearnPress\TemplateHooks\Course\SingleCourseTemplate; | |
| 20 | +use LearnPress\TemplateHooks\TemplateAJAX; | |
| 21 | +use LP_Course; | |
| 22 | +use LP_Course_Filter; | |
| 23 | +use LP_Database; | |
| 24 | +use LP_Helper; | |
| 25 | +use stdClass; | |
| 26 | +use Throwable; | |
| 27 | + | |
| 28 | +class SkinCoursesBase extends LPSkinBase { | |
| 29 | + protected function _register_controls_actions() { | |
| 30 | + add_action( | |
| 31 | + 'elementor/element/learnpress_list_courses_by_page/section_skin/before_section_end', | |
| 32 | + [ $this, 'controls_on_section_skin' ], | |
| 33 | + 10, | |
| 34 | + 2 | |
| 35 | + ); | |
| 36 | + } | |
| 37 | + | |
| 38 | + public function controls_on_section_skin( Widget_Base $widget, $args ) { | |
| 39 | + // Only add controls here | |
| 40 | + } | |
| 41 | + | |
| 42 | + /** | |
| 43 | + * Render content list courses. (Grid/List) | |
| 44 | + * @override elementor | |
| 45 | + * | |
| 46 | + * @return void | |
| 47 | + */ | |
| 48 | + public function render() { | |
| 49 | + try { | |
| 50 | + $settings = $this->parent->get_settings_for_display(); | |
| 51 | + $is_load_restapi = $settings['courses_rest'] ?? 0; | |
| 52 | + $courses_rest_no_load_page = $settings['courses_rest_no_load_page'] ?? 0; | |
| 53 | + $settings['url_current'] = LP_Helper::getUrlCurrent(); | |
| 54 | + | |
| 55 | + // Merge params filter form url | |
| 56 | + $settings = array_merge( | |
| 57 | + $settings, | |
| 58 | + lp_archive_skeleton_get_args() | |
| 59 | + ); | |
| 60 | + | |
| 61 | + $html_wrapper_widget = [ | |
| 62 | + '<div class="list-courses-elm-wrapper">' => '</div>', | |
| 63 | + ]; | |
| 64 | + | |
| 65 | + // No load AJAX | |
| 66 | + if ( 'yes' !== $is_load_restapi || Plugin::$instance->editor->is_edit_mode() ) { | |
| 67 | + $templateObj = self::render_courses( $settings ); | |
| 68 | + $content = $templateObj->content; | |
| 69 | + } elseif ( 'yes' === $courses_rest_no_load_page ) { | |
| 70 | + $callback = [ | |
| 71 | + 'class' => get_class( $this ), | |
| 72 | + 'method' => 'render_courses', | |
| 73 | + ]; | |
| 74 | + $content_obj = static::render_courses( $settings ); | |
| 75 | + $settings['html_no_load_ajax_first'] = $content_obj->content; | |
| 76 | + $content = TemplateAJAX::load_content_via_ajax( $settings, $callback ); | |
| 77 | + } else { // Load AJAX | |
| 78 | + $callback = [ | |
| 79 | + 'class' => get_class( $this ), | |
| 80 | + 'method' => 'render_courses', | |
| 81 | + ]; | |
| 82 | + $content = TemplateAJAX::load_content_via_ajax( $settings, $callback ); | |
| 83 | + } | |
| 84 | + | |
| 85 | + echo Template::instance()->nest_elements( $html_wrapper_widget, $content ); | |
| 86 | + } catch ( Throwable $e ) { | |
| 87 | + echo $e->getMessage(); | |
| 88 | + } | |
| 89 | + } | |
| 90 | + | |
| 91 | + /** | |
| 92 | + * Render template list courses with settings param. | |
| 93 | + * | |
| 94 | + * @param array $settings | |
| 95 | + * | |
| 96 | + * @return stdClass { content: string_html } | |
| 97 | + * @since 4.2.5.7 | |
| 98 | + * @version 1.0.1 | |
| 99 | + */ | |
| 100 | + public static function render_courses( array $settings = [] ): stdClass { | |
| 101 | + $listCoursesTemplate = ListCoursesTemplate::instance(); | |
| 102 | + $skin = $settings['skin'] ?? 'grid'; | |
| 103 | + $courses_limit = $settings['courses_limit'] ?? 0; | |
| 104 | + $courses_per_page = $settings['courses_per_page'] ?? 8; | |
| 105 | + $courses_order_by = $settings['order_by'] ?? $settings['courses_order_by_default'] ?? 'post_date'; | |
| 106 | + $total_pages = 0; | |
| 107 | + $paged = $settings['paged'] ?? 1; | |
| 108 | + $show_el_sorting = ( $settings['el_sorting'] ?? 'yes' ) === 'yes'; | |
| 109 | + $show_el_result_count = ( $settings['el_result_count'] ?? 'yes' ) === 'yes'; | |
| 110 | + $pagination_type = $settings['pagination_type'] ?? 'number'; | |
| 111 | + $courses_category_ids = $settings['courses_category_ids'] ?? []; | |
| 112 | + | |
| 113 | + if ( $courses_limit > 0 ) { | |
| 114 | + if ( $courses_per_page > $courses_limit ) { | |
| 115 | + $courses_per_page = $courses_limit; | |
| 116 | + } elseif ( $courses_per_page === 0 ) { | |
| 117 | + $courses_per_page = $courses_limit; | |
| 118 | + } | |
| 119 | + | |
| 120 | + $total_pages = LP_Database::get_total_pages( $courses_per_page, $courses_limit ); | |
| 121 | + } | |
| 122 | + | |
| 123 | + if ( $courses_per_page === 0 ) { | |
| 124 | + $courses_per_page = - 1; | |
| 125 | + } | |
| 126 | + | |
| 127 | + $filter = new LP_Course_Filter(); | |
| 128 | + $settings['order_by'] = $courses_order_by; | |
| 129 | + Courses::handle_params_for_query_courses( $filter, $settings ); | |
| 130 | + // Term | |
| 131 | + $filter->term_ids = array_merge( $filter->term_ids, $courses_category_ids ); | |
| 132 | + // End term | |
| 133 | + $total_rows = 0; | |
| 134 | + $filter->limit = $courses_per_page; | |
| 135 | + $courses = Courses::get_courses( $filter, $total_rows ); | |
| 136 | + $total_pages_result = LP_Database::get_total_pages( $courses_per_page, $total_rows ); | |
| 137 | + if ( $total_pages > 0 ) { | |
| 138 | + if ( $total_pages_result > $total_pages ) { | |
| 139 | + if ( $paged === $total_pages && $total_pages > 1 ) { | |
| 140 | + $number_courses_residual = $courses_limit - $courses_per_page * ( $paged - 1 ); | |
| 141 | + $courses = array_slice( $courses, 0, $number_courses_residual ); | |
| 142 | + } | |
| 143 | + | |
| 144 | + $total_rows = $courses_limit; | |
| 145 | + } else { | |
| 146 | + $total_pages = $total_pages_result; | |
| 147 | + } | |
| 148 | + } else { | |
| 149 | + $total_pages = $total_pages_result; | |
| 150 | + } | |
| 151 | + | |
| 152 | + // Handle layout | |
| 153 | + ob_start(); | |
| 154 | + $data_rs = [ | |
| 155 | + 'total_rows' => $total_rows, | |
| 156 | + 'paged' => $paged, | |
| 157 | + 'courses_per_page' => $courses_per_page, | |
| 158 | + ]; | |
| 159 | + | |
| 160 | + $section_top = [ | |
| 161 | + 'wrapper' => '<div class="learn-press-elms-courses-top">', | |
| 162 | + 'el_result_count' => $show_el_result_count ? $listCoursesTemplate->html_courses_page_result( $data_rs ) : '', | |
| 163 | + 'el_sorting' => $show_el_sorting ? $listCoursesTemplate->html_order_by( $courses_order_by ) : '', | |
| 164 | + 'close_wrapper' => '</div>', | |
| 165 | + ]; | |
| 166 | + echo Template::combine_components( $section_top ); | |
| 167 | + | |
| 168 | + $html_lis = ''; | |
| 169 | + foreach ( $courses as $courseObj ) { | |
| 170 | + $course = learn_press_get_course( $courseObj->ID ); | |
| 171 | + $html_lis .= static::render_course( $course, $settings ); | |
| 172 | + } | |
| 173 | + $section_list = [ | |
| 174 | + 'wrapper' => sprintf( '<ul class="learn-press-courses lp-list-courses-no-css %s">', esc_attr( $skin ) ), | |
| 175 | + 'list' => $html_lis, | |
| 176 | + 'wrapper_end' => '</ul>', | |
| 177 | + ]; | |
| 178 | + echo Template::combine_components( $section_list ); | |
| 179 | + | |
| 180 | + $data_pagination = [ | |
| 181 | + 'total_pages' => $total_pages, | |
| 182 | + 'type' => $pagination_type, | |
| 183 | + 'base' => add_query_arg( 'paged', '%#%', $settings['url_current'] ?? '' ), | |
| 184 | + 'paged' => (int) ( $settings['paged'] ?? 1 ), | |
| 185 | + ]; | |
| 186 | + echo $listCoursesTemplate->html_pagination( $data_pagination ); | |
| 187 | + | |
| 188 | + $content = new stdClass(); | |
| 189 | + $content->content = ob_get_clean(); | |
| 190 | + | |
| 191 | + return $content; | |
| 192 | + } | |
| 193 | + | |
| 194 | + /** | |
| 195 | + * Render single item course | |
| 196 | + * | |
| 197 | + * @param LP_Course $course | |
| 198 | + * @param array $settings | |
| 199 | + * | |
| 200 | + * @return string | |
| 201 | + */ | |
| 202 | + public static function render_course( LP_Course $course, array $settings = [] ): string { | |
| 203 | + $html_item = ''; | |
| 204 | + $singleCourseTemplate = SingleCourseTemplate::instance(); | |
| 205 | + | |
| 206 | + try { | |
| 207 | + $html_wrapper = [ | |
| 208 | + '<li class="course-item">' => '</li>', | |
| 209 | + ]; | |
| 210 | + | |
| 211 | + $title = sprintf( '<a href="%s">%s</a>', $course->get_permalink(), $course->get_title() ); | |
| 212 | + | |
| 213 | + $section = [ | |
| 214 | + 'image' => [ 'text_html' => $singleCourseTemplate->html_image( $course ) ], | |
| 215 | + 'author' => [ 'text_html' => sprintf( '<div>%s</div>', $course->get_instructor_html() ) ], | |
| 216 | + 'title' => [ 'text_html' => $title ], | |
| 217 | + 'price' => [ 'text_html' => sprintf( '<div>%s</div>', $singleCourseTemplate->html_price( $course ) ) ], | |
| 218 | + 'button' => [ | |
| 219 | + 'text_html' => sprintf( | |
| 220 | + '<div><a href="%s">%s</a></div>', | |
| 221 | + $course->get_permalink(), | |
| 222 | + __( 'View More', 'learnpress' ) | |
| 223 | + ), | |
| 224 | + ], | |
| 225 | + ]; | |
| 226 | + | |
| 227 | + ob_start(); | |
| 228 | + Template::instance()->print_sections( $section ); | |
| 229 | + $html_item = ob_get_clean(); | |
| 230 | + $html_item = Template::instance()->nest_elements( $html_wrapper, $html_item ); | |
| 231 | + } catch ( Throwable $e ) { | |
| 232 | + $html_item = $e->getMessage(); | |
| 233 | + } | |
| 234 | + | |
| 235 | + return $html_item; | |
| 236 | + } | |
| 237 | +} | |