| 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 |
} |
| 238 |
|