upskill-event-manager/includes/class-hvac-trainer-navigation.php
bengizmo 5a302f2312 feat: Add admin and master trainer support to navigation system
Enhanced navigation system to support multiple user types:

 USER TYPE SUPPORT:
- HVAC Trainers: Full navigation access
- HVAC Master Trainers: Full navigation + Master Dashboard link
- WordPress Admins: Full navigation + Master Dashboard link

 NAVIGATION UPDATES:
- Added Master Dashboard as main menu item for masters/admins
- Updated capability checks to allow admin access to all items
- Created user_can_access_item() helper method for flexible permissions
- Admins can now access all trainer functionality

 MASTER DASHBOARD INTEGRATION:
- Master Dashboard link prominently displayed for qualified users
- Maintains existing Master Trainer submenu structure
- Clean separation between regular trainer and master trainer features

 CAPABILITY SYSTEM:
- hvac_trainer: Basic trainer navigation
- hvac_master_trainer: Enhanced navigation with master features
- manage_options: Full administrative access to all features

Navigation now properly displays for WordPress administrators, providing full access to the HVAC trainer system while maintaining proper role-based permissions.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-30 23:19:28 -03:00

375 lines
No EOL
13 KiB
PHP

<?php
/**
* HVAC Trainer Navigation System
*
* @package HVAC_Community_Events
* @since 2.0.0
*/
if (!defined('ABSPATH')) {
exit;
}
/**
* HVAC_Trainer_Navigation class
*/
class HVAC_Trainer_Navigation {
/**
* Constructor
*/
public function __construct() {
// Register shortcode
add_shortcode('hvac_trainer_navigation', array($this, 'render_navigation'));
// Add navigation to trainer pages
add_action('hvac_before_trainer_content', array($this, 'display_navigation'));
// Enqueue styles
add_action('wp_enqueue_scripts', array($this, 'enqueue_styles'));
}
/**
* Enqueue navigation styles
*/
public function enqueue_styles() {
if ($this->is_trainer_page()) {
wp_enqueue_style(
'hvac-trainer-navigation',
HVAC_PLUGIN_URL . 'assets/css/hvac-trainer-navigation.css',
array(),
HVAC_PLUGIN_VERSION
);
}
}
/**
* Check if current page is a trainer page
*/
private function is_trainer_page() {
$current_url = home_url(add_query_arg(array(), $GLOBALS['wp']->request));
return strpos($current_url, '/trainer/') !== false || strpos($current_url, '/master-trainer/') !== false;
}
/**
* Get navigation menu items
*/
private function get_menu_items() {
$user = wp_get_current_user();
$is_master = in_array('hvac_master_trainer', $user->roles);
$is_admin = current_user_can('manage_options');
$menu_items = array(
'dashboard' => array(
'label' => 'Dashboard',
'url' => '/trainer/dashboard/',
'icon' => 'dashicons-dashboard',
'capability' => 'hvac_trainer'
),
'events' => array(
'label' => 'Events',
'url' => '#',
'icon' => 'dashicons-calendar-alt',
'capability' => 'hvac_trainer',
'submenu' => array(
'create' => array(
'label' => 'Create Event',
'url' => '/trainer/event/manage/',
'icon' => 'dashicons-plus-alt'
),
'summary' => array(
'label' => 'Event Summary',
'url' => '/trainer/event-summary/',
'icon' => 'dashicons-list-view'
),
'certificates' => array(
'label' => 'Generate Certificates',
'url' => '/trainer/generate-certificates/',
'icon' => 'dashicons-awards'
),
'reports' => array(
'label' => 'Certificate Reports',
'url' => '/trainer/certificate-reports/',
'icon' => 'dashicons-analytics'
)
)
),
'venues' => array(
'label' => 'Venues',
'url' => '#',
'icon' => 'dashicons-location',
'capability' => 'hvac_trainer',
'submenu' => array(
'list' => array(
'label' => 'All Venues',
'url' => '/trainer/venue/list/',
'icon' => 'dashicons-list-view'
),
'add' => array(
'label' => 'Add New Venue',
'url' => '/trainer/venue/manage/',
'icon' => 'dashicons-plus-alt'
)
)
),
'organizers' => array(
'label' => 'Organizers',
'url' => '#',
'icon' => 'dashicons-building',
'capability' => 'hvac_trainer',
'submenu' => array(
'list' => array(
'label' => 'All Organizers',
'url' => '/trainer/organizer/list/',
'icon' => 'dashicons-list-view'
),
'add' => array(
'label' => 'Add New Organizer',
'url' => '/trainer/organizer/manage/',
'icon' => 'dashicons-plus-alt'
)
)
),
'profile' => array(
'label' => 'Profile',
'url' => '#',
'icon' => 'dashicons-admin-users',
'capability' => 'hvac_trainer',
'submenu' => array(
'view' => array(
'label' => 'View Profile',
'url' => '/trainer/profile/',
'icon' => 'dashicons-visibility'
),
'edit' => array(
'label' => 'Edit Profile',
'url' => '/trainer/profile/edit/',
'icon' => 'dashicons-edit'
)
)
)
);
// Add Master Dashboard as main menu item for master trainers and admins
if ($is_master || $is_admin) {
$menu_items['master-dashboard'] = array(
'label' => 'Master Dashboard',
'url' => '/master-trainer/master-dashboard/',
'icon' => 'dashicons-star-filled',
'capability' => 'hvac_master_trainer'
);
}
// Add master trainer items if applicable (for master trainers or WordPress admins)
if ($is_master || $is_admin) {
$menu_items['master'] = array(
'label' => 'Master Trainer',
'url' => '#',
'icon' => 'dashicons-star-filled',
'capability' => 'hvac_master_trainer',
'submenu' => array(
'dashboard' => array(
'label' => 'Master Dashboard',
'url' => '/master-trainer/master-dashboard/',
'icon' => 'dashicons-dashboard'
),
'trainers' => array(
'label' => 'All Trainers',
'url' => '/master-trainer/trainers/',
'icon' => 'dashicons-groups'
),
'reports' => array(
'label' => 'Global Reports',
'url' => '/master-trainer/reports/',
'icon' => 'dashicons-chart-area'
)
)
);
}
return apply_filters('hvac_trainer_menu_items', $menu_items);
}
/**
* Check if user can access item (admins can access everything)
*/
private function user_can_access_item($capability) {
// WordPress admins can access everything
if (current_user_can('manage_options')) {
return true;
}
// Otherwise check the specific capability
return current_user_can($capability);
}
/**
* Get current page identifier
*/
private function get_current_page() {
$current_url = home_url(add_query_arg(array(), $GLOBALS['wp']->request));
// Map URLs to page identifiers
$page_map = array(
'/trainer/dashboard/' => 'dashboard',
'/trainer/event/manage/' => 'events.create',
'/trainer/event-summary/' => 'events.summary',
'/trainer/generate-certificates/' => 'events.certificates',
'/trainer/certificate-reports/' => 'events.reports',
'/trainer/venue/list/' => 'venues.list',
'/trainer/venue/manage/' => 'venues.add',
'/trainer/organizer/list/' => 'organizers.list',
'/trainer/organizer/manage/' => 'organizers.add',
'/trainer/profile/' => 'profile.view',
'/trainer/profile/edit/' => 'profile.edit',
'/master-trainer/master-dashboard/' => 'master.dashboard',
'/master-trainer/trainers/' => 'master.trainers',
'/master-trainer/reports/' => 'master.reports'
);
foreach ($page_map as $url => $page_id) {
if (strpos($current_url, $url) !== false) {
return $page_id;
}
}
return '';
}
/**
* Check if menu item is active
*/
private function is_menu_active($item_id, $current_page) {
// Check exact match
if ($item_id === $current_page) {
return true;
}
// Check parent match
if (strpos($current_page, $item_id . '.') === 0) {
return true;
}
return false;
}
/**
* Render navigation shortcode
*/
public function render_navigation($atts = array()) {
if (!is_user_logged_in()) {
return '';
}
// Show navigation for trainers, master trainers, or WordPress admins
if (!current_user_can('hvac_trainer') && !current_user_can('hvac_master_trainer') && !current_user_can('manage_options')) {
return '';
}
$atts = shortcode_atts(array(
'type' => 'horizontal', // horizontal or vertical
'show_icons' => 'yes',
'show_submenu' => 'hover' // hover, click, or always
), $atts);
ob_start();
?>
<nav class="hvac-trainer-nav hvac-trainer-nav-<?php echo esc_attr($atts['type']); ?>"
data-submenu="<?php echo esc_attr($atts['show_submenu']); ?>">
<?php $this->render_menu_items($atts); ?>
</nav>
<?php
return ob_get_clean();
}
/**
* Render menu items
*/
private function render_menu_items($atts) {
$menu_items = $this->get_menu_items();
$current_page = $this->get_current_page();
echo '<ul class="hvac-nav-menu">';
foreach ($menu_items as $item_id => $item) {
// Check capability (allow admins to access everything)
if (isset($item['capability']) && !$this->user_can_access_item($item['capability'])) {
continue;
}
$is_active = $this->is_menu_active($item_id, $current_page);
$has_submenu = !empty($item['submenu']);
$classes = array('hvac-nav-item');
if ($is_active) {
$classes[] = 'hvac-nav-active';
}
if ($has_submenu) {
$classes[] = 'hvac-nav-has-submenu';
}
echo '<li class="' . esc_attr(implode(' ', $classes)) . '">';
// Main menu link
echo '<a href="' . esc_url($item['url']) . '" class="hvac-nav-link">';
if ($atts['show_icons'] === 'yes' && !empty($item['icon'])) {
echo '<span class="dashicons ' . esc_attr($item['icon']) . '"></span>';
}
echo '<span class="hvac-nav-label">' . esc_html($item['label']) . '</span>';
if ($has_submenu) {
echo '<span class="dashicons dashicons-arrow-down-alt2 hvac-nav-arrow"></span>';
}
echo '</a>';
// Submenu
if ($has_submenu) {
echo '<ul class="hvac-nav-submenu">';
foreach ($item['submenu'] as $sub_id => $subitem) {
$sub_is_active = ($item_id . '.' . $sub_id === $current_page);
echo '<li class="hvac-nav-subitem' . ($sub_is_active ? ' hvac-nav-active' : '') . '">';
echo '<a href="' . esc_url($subitem['url']) . '" class="hvac-nav-sublink">';
if ($atts['show_icons'] === 'yes' && !empty($subitem['icon'])) {
echo '<span class="dashicons ' . esc_attr($subitem['icon']) . '"></span>';
}
echo '<span class="hvac-nav-label">' . esc_html($subitem['label']) . '</span>';
echo '</a>';
echo '</li>';
}
echo '</ul>';
}
echo '</li>';
}
echo '</ul>';
}
/**
* Display navigation on trainer pages
*/
public function display_navigation() {
if ($this->is_trainer_page()) {
echo do_shortcode('[hvac_trainer_navigation]');
}
}
/**
* Render mobile navigation toggle
*/
public function render_mobile_toggle() {
?>
<button class="hvac-nav-mobile-toggle" aria-label="Toggle navigation">
<span class="hvac-nav-toggle-icon"></span>
</button>
<?php
}
}