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']);
}
}
}
