dga_feedback-2.0.0/dga_feedback.module

dga_feedback.module
<?php

/**
 * @file
 * Main module file for DGA Feedback module.
 */

/**
 * Implements hook_theme().
 */
function dga_feedback_theme($existing, $type, $theme, $path) {
  return [
    'dga_feedback_widget' => [
      'variables' => [
        'yes_percentage' => 0,
        'total_count' => 0,
        'url' => '',
        'entity_type' => NULL,
        'entity_id' => NULL,
        'texts' => [],
      ],
      'template' => 'dga-feedback-widget',
      'path' => $path . '/templates',
    ],
    'dga_feedback_admin' => [
      'variables' => [
        'overall_stats' => [],
        'usefulness_distribution' => [],
        'url_statistics' => [],
        'unique_url_count' => 0,
        'submissions' => [],
        'total_count' => 0,
        'current_page' => 0,
        'limit' => 50,
        'filters' => [],
        'sort_by' => 'created',
        'sort_direction' => 'DESC',
        'url_stats_limit' => 20,
        'url_stats_order_by' => 'count',
        'url_stats_order_direction' => 'DESC',
        'top_feedback_page' => NULL,
        'most_feedback_page' => NULL,
        'recent_activity' => [],
        'useful_percentage' => 0.0,
        'user_type_stats' => [],
      ],
      'template' => 'feedback-admin',
      'path' => $path . '/templates',
    ],
  ];
}

/**
 * Implements hook_preprocess_HOOK() for dga_feedback_admin template.
 */
function dga_feedback_preprocess_dga_feedback_admin(array &$variables) {
  // Extract variables from # prefixed keys (they come from render array)
  // and make them available without # prefix for the template.
  $mapping = [
    'overall_stats' => '#overall_stats',
    'usefulness_distribution' => '#usefulness_distribution',
    'url_statistics' => '#url_statistics',
    'unique_url_count' => '#unique_url_count',
    'submissions' => '#submissions',
    'total_count' => '#total_count',
    'current_page' => '#current_page',
    'limit' => '#limit',
    'filters' => '#filters',
    'sort_by' => '#sort_by',
    'sort_direction' => '#sort_direction',
    'url_stats_limit' => '#url_stats_limit',
    'url_stats_order_by' => '#url_stats_order_by',
    'url_stats_order_direction' => '#url_stats_order_direction',
    'top_feedback_page' => '#top_feedback_page',
    'most_feedback_page' => '#most_feedback_page',
    'recent_activity' => '#recent_activity',
    'useful_percentage' => '#useful_percentage',
    'user_type_stats' => '#user_type_stats',
    'pager' => '#pager',
  ];
  
  foreach ($mapping as $template_var => $render_key) {
    if (isset($variables[$render_key])) {
      $variables[$template_var] = $variables[$render_key];
      unset($variables[$render_key]);
    }
  }
  
  // Ensure all scalar values are properly set and not NULL.
  if (!isset($variables['unique_url_count'])) {
    $variables['unique_url_count'] = 0;
  }
  $variables['unique_url_count'] = (int) $variables['unique_url_count'];
  
  if (!isset($variables['total_count'])) {
    $variables['total_count'] = 0;
  }
  $variables['total_count'] = (int) $variables['total_count'];
  
  if (!isset($variables['current_page'])) {
    $variables['current_page'] = 0;
  }
  $variables['current_page'] = (int) $variables['current_page'];
  
  if (!isset($variables['limit'])) {
    $variables['limit'] = 50;
  }
  $variables['limit'] = (int) $variables['limit'];
  
  if (!isset($variables['url_stats_limit'])) {
    $variables['url_stats_limit'] = 20;
  }
  $variables['url_stats_limit'] = (int) $variables['url_stats_limit'];
  
  // Ensure arrays are set.
  if (!isset($variables['overall_stats'])) {
    $variables['overall_stats'] = [];
  }
  if (!isset($variables['usefulness_distribution'])) {
    $variables['usefulness_distribution'] = [];
  }
  if (!isset($variables['url_statistics'])) {
    $variables['url_statistics'] = [];
  }
  if (!isset($variables['submissions'])) {
    $variables['submissions'] = [];
  }
  if (!isset($variables['filters'])) {
    $variables['filters'] = [];
  }
  if (!isset($variables['recent_activity'])) {
    $variables['recent_activity'] = ['last_7_days' => ['count' => 0, 'useful_percentage' => 0.0], 'last_30_days' => ['count' => 0, 'useful_percentage' => 0.0]];
  }
  if (!isset($variables['useful_percentage'])) {
    $variables['useful_percentage'] = 0.0;
  }
  if (!isset($variables['user_type_stats'])) {
    $variables['user_type_stats'] = ['anonymous' => 0, 'authenticated' => 0];
  }
  
  // Ensure strings are set.
  if (!isset($variables['sort_by'])) {
    $variables['sort_by'] = 'created';
  }
  if (!isset($variables['sort_direction'])) {
    $variables['sort_direction'] = 'DESC';
  }
  if (!isset($variables['url_stats_order_by'])) {
    $variables['url_stats_order_by'] = 'count';
  }
  if (!isset($variables['url_stats_order_direction'])) {
    $variables['url_stats_order_direction'] = 'DESC';
  }
}

/**
 * Implements hook_page_attachments().
 *
 * SIMPLIFIED: Try to add CSRF token, but don't fail if we can't.
 */
function dga_feedback_page_attachments(array &$attachments) {
  $current_user = \Drupal::currentUser();
  
  if ($current_user->hasPermission('access toolbar')) {
    if (!isset($attachments['#attached']['library'])) {
      $attachments['#attached']['library'] = [];
    }
    $attachments['#attached']['library'][] = 'dga_feedback/toolbar_icon';
  }

  if (!$current_user->isAuthenticated()) {
    try {
      $request = \Drupal::request();
      $session = $request->getSession();
      if ($session) {
        $csrf_token = \Drupal::service('session.csrf_token')->get('session');
        if (!empty($csrf_token)) {
          if (!isset($attachments['#attached']['drupalSettings'])) {
            $attachments['#attached']['drupalSettings'] = [];
          }
          $attachments['#attached']['drupalSettings']['csrfToken'] = $csrf_token;
        }
      }
    }
    catch (\Exception $e) {
      // Silent fail - JavaScript will handle token fetching
    }
  }
  
  // Add CSS to fix admin menu selected color (override green to default gray)
  if (!isset($attachments['#attached']['library'])) {
    $attachments['#attached']['library'] = [];
  }
  $attachments['#attached']['library'][] = 'dga_feedback/admin_menu_fix';
}

/**
 * Implements hook_menu_links_discovered_alter().
 */
function dga_feedback_menu_links_discovered_alter(array &$links) {
  if (isset($links['dga_feedback.admin'])) {
    if (!isset($links['dga_feedback.admin']['options'])) {
      $links['dga_feedback.admin']['options'] = [];
    }
    if (!isset($links['dga_feedback.admin']['options']['attributes'])) {
      $links['dga_feedback.admin']['options']['attributes'] = [];
    }
    if (!isset($links['dga_feedback.admin']['options']['attributes']['class'])) {
      $links['dga_feedback.admin']['options']['attributes']['class'] = [];
    }
    $links['dga_feedback.admin']['options']['attributes']['class'][] = 'toolbar-icon--dga-feedback';
    $links['dga_feedback.admin']['options']['attributes']['data-icon'] = 'dga-feedback';
  }
}

/**
 * Implements hook_preprocess_menu().
 */
function dga_feedback_preprocess_menu(&$variables) {
  if (isset($variables['items'])) {
    foreach ($variables['items'] as $key => &$item) {
      if (isset($item['url'])) {
        try {
          if ($item['url']->isRouted() && $item['url']->getRouteName() === 'dga_feedback.admin') {
            if (!isset($item['attributes'])) {
              $item['attributes'] = [];
            }
            if (!isset($item['attributes']['class'])) {
              $item['attributes']['class'] = [];
            }
            $item['attributes']['class'][] = 'toolbar-icon--dga-feedback';
          }
        }
        catch (\Exception $e) {
          // Ignore URLs without routes or external URLs.
          continue;
        }
      }
    }
  }
}

/**
 * Implements hook_local_tasks_alter().
 */
function dga_feedback_local_tasks_alter(&$local_tasks, $route_name) {
  if (isset($local_tasks['primary']) && is_array($local_tasks['primary'])) {
    $keys_to_remove = [];
    $config = \Drupal::config('dga_feedback.settings');
    $language_manager = \Drupal::languageManager();
    $current_lang = $language_manager->getCurrentLanguage()->getId();
    $is_arabic = ($current_lang === 'ar');

    $parent_title_en = $config->get('menu_title_dga_feedback_en') ?: 'DGA Feedback';
    $parent_title_ar = $config->get('menu_title_dga_feedback_ar') ?: 'تعليقات DGA';
    $parent_titles = [$parent_title_en, $parent_title_ar, 'DGA Feedback', 'تعليقات DGA'];

    foreach ($local_tasks['primary'] as $key => $task) {
      if (isset($task['#link'])) {
        $link_id = $task['#link']['id'] ?? '';
        $link_title = $task['#link']['title'] ?? '';
        $link_route = $task['#link']['route_name'] ?? '';

        if ($link_route === 'dga_feedback.admin' && $link_id === 'dga_feedback.admin' && in_array($link_title, $parent_titles)) {
          $keys_to_remove[] = $key;
        }
      }
    }

    foreach ($keys_to_remove as $key) {
      unset($local_tasks['primary'][$key]);
    }

    if (!empty($local_tasks['primary'])) {
      $local_tasks['primary'] = array_values($local_tasks['primary']);
    }
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc