← All changes
|
inc/TemplateHooks/CourseBuilder/CourseBuilderTemplate.php
+158
-15
4.3.7
→
4.4.8
View file →
| @@ -416,9 +416,9 @@ | ||
| 416 | 416 | |
| 417 | 417 | $hide_instructor_access_admin_screen = LP_Settings::is_hide_instructor_access_admin_screen(); |
| 418 | 418 | $wp_user = new WP_User( $userModel ); |
| 419 | 419 | $is_instructor = user_can( $wp_user, UserModel::ROLE_INSTRUCTOR ); |
| 420 | - $dashboard_url = admin_url(); | |
| 420 | + $dashboard_url = admin_url( 'edit.php?post_type=' . LP_COURSE_CPT ); | |
| 421 | 421 | |
| 422 | 422 | $footer = [ |
| 423 | 423 | 'wrapper' => '<div class="lp-cb-sidebar__footer">', |
| 424 | 424 | ]; |
| @@ -456,37 +456,180 @@ | ||
| 456 | 456 | * @return string |
| 457 | 457 | * @since 4..0 |
| 458 | 458 | */ |
| 459 | 459 | protected function html_nav_item_main( $slug, $tab_data ) { |
| 460 | - $tab_current = CourseBuilder::get_menu_current(); | |
| 461 | - $is_active = $slug === $tab_current; | |
| 462 | - $classes = [ 'lp-cb-sidebar__item', $slug ]; | |
| 460 | + $tab_current = CourseBuilder::get_menu_current(); | |
| 461 | + $sub_menu_items = $this->get_nav_item_sub_menu_items( $slug, $tab_data ); | |
| 462 | + $has_sub_menu = ! empty( $sub_menu_items ); | |
| 463 | + $has_active_submenu = $has_sub_menu && ! empty( | |
| 464 | + array_filter( | |
| 465 | + $sub_menu_items, | |
| 466 | + static function ( array $item ): bool { | |
| 467 | + return ! empty( $item['is_active'] ); | |
| 468 | + } | |
| 469 | + ) | |
| 470 | + ); | |
| 471 | + $is_active = $slug === $tab_current || ! empty( $has_active_submenu ); | |
| 472 | + $classes = [ 'lp-cb-sidebar__item', $slug ]; | |
| 463 | 473 | |
| 474 | + if ( $has_sub_menu ) { | |
| 475 | + $classes[] = 'has-sub-menu'; | |
| 476 | + } | |
| 477 | + | |
| 464 | 478 | if ( $is_active ) { |
| 465 | 479 | $classes[] = 'is-active'; |
| 466 | 480 | } |
| 467 | 481 | |
| 468 | - $icon = isset( $tab_data['icon'] ) ? $tab_data['icon'] : ''; | |
| 469 | - $title = $tab_data['title']; | |
| 470 | - $link = CourseBuilder::get_tab_link( $slug ); | |
| 482 | + if ( $has_sub_menu && $is_active ) { | |
| 483 | + $classes[] = 'is-expanded'; | |
| 484 | + } | |
| 471 | 485 | |
| 472 | - $item = [ | |
| 473 | - 'wrapper' => sprintf( '<li class="%s">', implode( ' ', $classes ) ), | |
| 474 | - 'content' => sprintf( | |
| 475 | - '<a href="%s" title="%s" aria-label="%s"> | |
| 476 | - %s | |
| 477 | - <span class="lp-cb-sidebar__item-title">%s</span> | |
| 486 | + $icon = isset( $tab_data['icon'] ) ? $tab_data['icon'] : ''; | |
| 487 | + $title = $tab_data['title']; | |
| 488 | + $link = CourseBuilder::get_tab_link( $slug ); | |
| 489 | + $sub_menu_id = 'lp-cb-sidebar-sub-menu-' . sanitize_html_class( $slug ); | |
| 490 | + $aria_current = $is_active && empty( $has_active_submenu ) ? ' aria-current="page"' : ''; | |
| 491 | + | |
| 492 | + if ( $has_sub_menu ) { | |
| 493 | + $content = sprintf( | |
| 494 | + '<div class="lp-cb-sidebar__item-control"> | |
| 495 | + <a href="%1$s" class="lp-cb-sidebar__item-link" title="%2$s" aria-label="%2$s"%3$s> | |
| 496 | + %4$s | |
| 497 | + <span class="lp-cb-sidebar__item-title">%5$s</span> | |
| 498 | + </a> | |
| 499 | + <button type="button" class="lp-cb-sidebar__sub-menu-toggle" aria-label="%6$s" aria-expanded="%7$s" aria-controls="%8$s"> | |
| 500 | + <span class="dashicons dashicons-arrow-down-alt2" aria-hidden="true"></span> | |
| 501 | + </button> | |
| 502 | + </div>', | |
| 503 | + esc_url( $link ), | |
| 504 | + esc_attr( $title ), | |
| 505 | + $aria_current, | |
| 506 | + $icon, | |
| 507 | + esc_html( $title ), | |
| 508 | + esc_attr( sprintf( __( 'Toggle %s submenu', 'learnpress' ), $title ) ), | |
| 509 | + $is_active ? 'true' : 'false', | |
| 510 | + esc_attr( $sub_menu_id ) | |
| 511 | + ); | |
| 512 | + } else { | |
| 513 | + $content = sprintf( | |
| 514 | + '<a href="%1$s" class="lp-cb-sidebar__item-link" title="%2$s" aria-label="%2$s"%3$s> | |
| 515 | + %4$s | |
| 516 | + <span class="lp-cb-sidebar__item-title">%5$s</span> | |
| 478 | 517 | </a>', |
| 479 | 518 | esc_url( $link ), |
| 480 | 519 | esc_attr( $title ), |
| 481 | - esc_attr( $title ), | |
| 520 | + $aria_current, | |
| 482 | 521 | $icon, |
| 483 | 522 | esc_html( $title ) |
| 484 | - ), | |
| 523 | + ); | |
| 524 | + } | |
| 525 | + | |
| 526 | + $item = [ | |
| 527 | + 'wrapper' => sprintf( '<li class="%s">', implode( ' ', $classes ) ), | |
| 528 | + 'content' => $content, | |
| 485 | 529 | 'wrapper_end' => '</li>', |
| 486 | 530 | ]; |
| 487 | 531 | |
| 532 | + if ( $has_sub_menu ) { | |
| 533 | + $item['content'] .= $this->html_nav_item_sub_menu( $sub_menu_items, $sub_menu_id, $title ); | |
| 534 | + } | |
| 535 | + | |
| 488 | 536 | return Template::combine_components( $item ); |
| 537 | + } | |
| 538 | + | |
| 539 | + protected function get_nav_item_sub_menu_items( string $parent_slug, array $tab_data ): array { | |
| 540 | + $items = []; | |
| 541 | + if ( ! empty( $tab_data['sub_menu'] ) && is_array( $tab_data['sub_menu'] ) ) { | |
| 542 | + $items = $this->normalize_nav_sub_menu_items( $parent_slug, $tab_data['sub_menu'] ); | |
| 543 | + } | |
| 544 | + | |
| 545 | + return $items; | |
| 546 | + } | |
| 547 | + | |
| 548 | + protected function normalize_nav_sub_menu_items( string $parent_slug, array $sub_menu ): array { | |
| 549 | + $is_admin = current_user_can( ADMIN_ROLE ); | |
| 550 | + $items = []; | |
| 551 | + | |
| 552 | + foreach ( $sub_menu as $key => $item ) { | |
| 553 | + if ( ! is_array( $item ) || ( ! empty( $item['admin_only'] ) && ! $is_admin ) ) { | |
| 554 | + continue; | |
| 555 | + } | |
| 556 | + | |
| 557 | + $title = $item['title'] ?? ''; | |
| 558 | + if ( '' === $title ) { | |
| 559 | + continue; | |
| 560 | + } | |
| 561 | + | |
| 562 | + $slug = ! empty( $item['slug'] ) ? (string) $item['slug'] : ( is_string( $key ) ? $key : sanitize_title( $title ) ); | |
| 563 | + if ( '' === $slug ) { | |
| 564 | + continue; | |
| 565 | + } | |
| 566 | + | |
| 567 | + $url = $item['url'] ?? ''; | |
| 568 | + if ( '' === $url ) { | |
| 569 | + $url = CourseBuilder::get_tab_link( $parent_slug, $slug ); | |
| 570 | + } | |
| 571 | + | |
| 572 | + if ( '' === $url ) { | |
| 573 | + continue; | |
| 574 | + } | |
| 575 | + | |
| 576 | + $is_active = false; | |
| 577 | + if ( $parent_slug === CourseBuilder::get_menu_current() ) { | |
| 578 | + $is_active = $slug === (string) CourseBuilder::get_item_id(); | |
| 579 | + } | |
| 580 | + | |
| 581 | + $items[] = [ | |
| 582 | + 'class' => is_string( $key ) ? $key : sanitize_title( $title ), | |
| 583 | + 'icon' => $item['icon'] ?? '', | |
| 584 | + 'is_active' => $is_active, | |
| 585 | + 'rel' => ! empty( $item['target'] ) && '_blank' === $item['target'] ? 'noopener noreferrer' : '', | |
| 586 | + 'slug' => $slug, | |
| 587 | + 'target' => $item['target'] ?? '', | |
| 588 | + 'title' => $title, | |
| 589 | + 'url' => $url, | |
| 590 | + ]; | |
| 591 | + } | |
| 592 | + | |
| 593 | + return $items; | |
| 594 | + } | |
| 595 | + | |
| 596 | + protected function html_nav_item_sub_menu( array $sub_menu_items, string $sub_menu_id, string $parent_title = '' ): string { | |
| 597 | + if ( empty( $sub_menu_items ) ) { | |
| 598 | + return ''; | |
| 599 | + } | |
| 600 | + | |
| 601 | + $content = ''; | |
| 602 | + | |
| 603 | + foreach ( $sub_menu_items as $item ) { | |
| 604 | + $target = '' !== $item['target'] ? sprintf( ' target="%s"', esc_attr( $item['target'] ) ) : ''; | |
| 605 | + $rel = '' !== $item['rel'] ? sprintf( ' rel="%s"', esc_attr( $item['rel'] ) ) : ''; | |
| 606 | + $active_class = ! empty( $item['is_active'] ) ? ' is-active' : ''; | |
| 607 | + $aria_current = ! empty( $item['is_active'] ) ? ' aria-current="page"' : ''; | |
| 608 | + | |
| 609 | + $content .= sprintf( | |
| 610 | + '<li class="lp-cb-sidebar__sub-menu-item %1$s%2$s"><a href="%3$s" class="lp-cb-sidebar__sub-menu-link"%4$s%5$s%6$s>%7$s<span class="lp-cb-sidebar__sub-menu-title">%8$s</span></a></li>', | |
| 611 | + esc_attr( sanitize_html_class( $item['class'] ) ), | |
| 612 | + esc_attr( $active_class ), | |
| 613 | + esc_url( $item['url'] ), | |
| 614 | + $target, | |
| 615 | + $rel, | |
| 616 | + $aria_current, | |
| 617 | + $item['icon'], | |
| 618 | + esc_html( $item['title'] ) | |
| 619 | + ); | |
| 620 | + } | |
| 621 | + | |
| 622 | + if ( '' === $content ) { | |
| 623 | + return ''; | |
| 624 | + } | |
| 625 | + | |
| 626 | + return sprintf( | |
| 627 | + '<ul id="%1$s" class="lp-cb-sidebar__sub-menu" aria-label="%2$s">%3$s</ul>', | |
| 628 | + esc_attr( $sub_menu_id ), | |
| 629 | + esc_attr( sprintf( __( '%s submenu', 'learnpress' ), $parent_title ) ), | |
| 630 | + $content | |
| 631 | + ); | |
| 489 | 632 | } |
| 490 | 633 | |
| 491 | 634 | public function html_btn_add_new() { |
| 492 | 635 | $tab_current = CourseBuilder::get_menu_current(); |