dga_feedback-2.0.0/dga_feedback.install
dga_feedback.install
<?php
/**
* @file
* Install, update and uninstall functions for the DGA Feedback module.
*/
use Drupal\Core\Database\Database;
/**
* Implements hook_schema().
*/
function dga_feedback_schema() {
$schema['dga_feedback'] = [
'description' => 'Stores user feedback submissions with Yes/No responses, reasons, and optional demographic data.',
'fields' => [
'id' => [
'type' => 'serial',
'not null' => TRUE,
'description' => 'Primary Key: Unique feedback ID.',
],
'entity_type' => [
'type' => 'varchar',
'length' => 32,
'not null' => TRUE,
'default' => 'node',
'description' => 'The entity type (e.g., node, user).',
],
'entity_id' => [
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'The ID of the entity being rated.',
],
'is_useful' => [
'type' => 'varchar',
'length' => 10,
'not null' => TRUE,
'description' => 'Whether the page was useful: "yes" or "no".',
],
'reasons' => [
'type' => 'text',
'size' => 'big',
'not null' => FALSE,
'description' => 'JSON array of selected reasons.',
],
'feedback' => [
'type' => 'text',
'size' => 'big',
'not null' => FALSE,
'description' => 'Optional feedback text from the user.',
],
'gender' => [
'type' => 'varchar',
'length' => 20,
'not null' => FALSE,
'description' => 'Optional gender selection (male, female).',
],
'url' => [
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'description' => 'The URL where the feedback was submitted.',
],
'user_id' => [
'type' => 'int',
'unsigned' => TRUE,
'not null' => FALSE,
'description' => 'The user ID who submitted the feedback (NULL for anonymous).',
],
'ip_address' => [
'type' => 'varchar',
'length' => 128,
'not null' => FALSE,
'description' => 'IP address of the user who submitted the feedback.',
],
'created' => [
'type' => 'int',
'not null' => TRUE,
'description' => 'Unix timestamp when the feedback was created.',
],
],
'primary key' => ['id'],
'indexes' => [
'entity' => ['entity_type', 'entity_id'],
'user_id' => ['user_id'],
'created' => ['created'],
'is_useful' => ['is_useful'],
],
];
return $schema;
}
/**
* Implements hook_install().
*/
function dga_feedback_install() {
\Drupal::logger('dga_feedback')->notice('DGA Feedback module installed.');
// Populate default bilingual configuration values.
$config = \Drupal::service('config.factory')->getEditable('dga_feedback.settings');
$defaults = [
'question_text_en' => 'Was this page useful?',
'question_text_ar' => 'هل كانت هذه الصفحة مفيدة؟',
'yes_button_text_en' => 'Yes',
'yes_button_text_ar' => 'نعم',
'no_button_text_en' => 'No',
'no_button_text_ar' => 'لا',
'stats_text_template_en' => '@percentage% of users said Yes from @count Feedbacks',
'stats_text_template_ar' => '@percentage% من المستخدمين قالوا نعم من @count تعليق',
'close_button_text_en' => 'Close',
'close_button_text_ar' => 'إغلاق',
'reasons_title_en' => 'Please tell us why',
'reasons_title_ar' => 'يرجى إخبارنا بالسبب',
'reasons_instruction_en' => 'you can select multiple options',
'reasons_instruction_ar' => 'يمكنك اختيار خيارات متعددة',
'reasons_yes_en' => "Content is relevant\nIt was well written\nThe layout made it easy to read\nSomething else",
'reasons_yes_ar' => "المحتوى ذو صلة\nكان مكتوبًا بشكل جيد\nجعل التخطيط القراءة سهلة\nشيء آخر",
'reasons_no_en' => "Content is not relevant\nContent is not accurate\nContent is too long\nSomething else",
'reasons_no_ar' => "المحتوى غير ذي صلة\nالمحتوى غير دقيق\nالمحتوى طويل جدًا\nشيء آخر",
'feedback_label_en' => 'Feedback',
'feedback_label_ar' => 'التعليقات',
'feedback_placeholder_en' => 'text placeholder',
'feedback_placeholder_ar' => 'نص توضيحي',
'gender_label_en' => "I'm",
'gender_label_ar' => 'أنا',
'gender_male_en' => 'Male',
'gender_male_ar' => 'ذكر',
'gender_female_en' => 'Female',
'gender_female_ar' => 'أنثى',
'submit_button_text_en' => 'Submit',
'submit_button_text_ar' => 'إرسال',
'submitted_success_text_en' => 'Your feedback is submitted!',
'submitted_success_text_ar' => 'تم إرسال تعليقك!',
'validation_yes_no_required_en' => 'Please select Yes or No first.',
'validation_yes_no_required_ar' => 'يرجى اختيار نعم أو لا أولاً.',
'validation_reason_required_en' => 'Please select at least one reason',
'validation_reason_required_ar' => 'يرجى اختيار سبب واحد على الأقل',
'validation_reason_invalid_en' => 'At least one valid reason must be selected.',
'validation_reason_invalid_ar' => 'يجب اختيار سبب واحد صالح على الأقل.',
'validation_feedback_required_en' => 'Please provide feedback text',
'validation_feedback_required_ar' => 'يرجى تقديم نص التعليق',
'validation_gender_required_en' => 'Please select your gender',
'validation_gender_required_ar' => 'يرجى اختيار جنسك',
'validation_submission_failed_en' => 'Submission failed. Please try again.',
'validation_submission_failed_ar' => 'فشل الإرسال. يرجى المحاولة مرة أخرى.',
'validation_unknown_error_en' => 'Unknown error',
'validation_unknown_error_ar' => 'خطأ غير معروف',
'button_submitting_text_en' => 'Submitting...',
'button_submitting_text_ar' => 'جاري الإرسال...',
'api_method_not_allowed_en' => 'Method not allowed. Use POST.',
'api_method_not_allowed_ar' => 'الطريقة غير مسموحة. استخدم POST.',
'api_invalid_json_en' => 'Invalid JSON data',
'api_invalid_json_ar' => 'بيانات JSON غير صالحة',
'api_invalid_useful_en' => 'is_useful must be "yes" or "no"',
'api_invalid_useful_ar' => 'يجب أن يكون is_useful "yes" أو "no"',
'api_rate_limit_en' => 'Too many submissions. Please try again later.',
'api_rate_limit_ar' => 'عدد كبير جدًا من الإرسالات. يرجى المحاولة مرة أخرى لاحقًا.',
'api_save_failed_en' => 'Failed to save feedback.',
'api_save_failed_ar' => 'فشل حفظ التعليق.',
'api_success_message_en' => 'Thank you for your feedback!',
'api_success_message_ar' => 'شكرًا لك على تعليقك!',
'rate_limit_max_submissions' => 20,
'rate_limit_time_window' => 3600,
'feedback_max_length' => 5000,
'reason_max_length' => 200,
'reason_max_count' => 10,
'refresh_delay' => 3000,
'menu_title_dga_feedback_en' => 'DGA Feedback',
'menu_title_dga_feedback_ar' => 'تعليقات DGA',
'menu_title_dashboard_en' => 'Feedback Dashboard',
'menu_title_dashboard_ar' => 'لوحة تحكم التعليقات',
'menu_title_settings_en' => 'Settings',
'menu_title_settings_ar' => 'الإعدادات',
'menu_title_translations_en' => 'Translations',
'menu_title_translations_ar' => 'الترجمات',
];
foreach ($defaults as $key => $value) {
if ($config->get($key) === NULL) {
$config->set($key, $value);
}
}
$config->save();
}
/**
* Implements hook_uninstall().
*/
function dga_feedback_uninstall() {
// Drop the database table automatically on uninstall.
$database = \Drupal::database();
$schema = $database->schema();
if ($schema->tableExists('dga_feedback')) {
$schema->dropTable('dga_feedback');
\Drupal::logger('dga_feedback')->notice('DGA Feedback table dropped on module uninstall.');
}
\Drupal::logger('dga_feedback')->notice('DGA Feedback module uninstalled.');
}
