getSetting('require_captcha_contact', true); $pageContent = null; $metaTitle = null; $metaDescription = null; $title = 'Contact Us'; if (class_exists('Modules\Configindex\Models\ConfigPage')) { try { $page = \Modules\Configindex\Models\ConfigPage::getByKey('contact', 1); if ($page) { $pageContent = $page->config_index_content; if ($page->config_index_title) { $title = $page->config_index_title; } $metaTitle = $page->config_index_meta_title; $metaDescription = $page->config_index_meta_description; } } catch (\Exception $e) { // Ignore if table not found or other error } } return new Response($this->view->render('contact/views/index.twig', [ 'title' => $title, 'page_content' => $pageContent, 'meta_title' => $metaTitle, 'meta_description' => $metaDescription, 'require_captcha_contact' => $requireCaptcha ])); } /** * Process contact form submission */ public function submit(Request $request): Response { // Handle JSON request body if ($request->getContentType() === 'json' || 0 === strpos($request->headers->get('Content-Type'), 'application/json')) { $data = json_decode($request->getContent(), true) ?? []; } else { $data = $request->request->all(); } // Basic validation if (empty($data['name']) || empty($data['email']) || empty($data['subject']) || empty($data['message'])) { if ($request->headers->get('Accept') === 'application/json') { return new JsonResponse([ 'success' => false, 'message' => 'Please fill in all required fields.' ], 400); } return new RedirectResponse(url('/contact?error=missing_fields')); } // Email format validation if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) { if ($request->headers->get('Accept') === 'application/json') { return new JsonResponse([ 'success' => false, 'message' => 'Please provide a valid email address.' ], 400); } return new RedirectResponse(url('/contact?error=invalid_email')); } // Captcha validation $requireCaptcha = $this->getSetting('require_captcha_contact', true); if ($requireCaptcha && empty($data['captcha_valid'])) { if ($request->headers->get('Accept') === 'application/json') { return new JsonResponse([ 'success' => false, 'message' => 'Invalid captcha. Please try again.' ], 400); } return new RedirectResponse(url('/contact?error=invalid_captcha')); } // Create contact record $contact = new Contact(); $contact->contacts_name = $data['name']; $contact->contacts_email = $data['email']; $contact->contacts_phone = $data['phone'] ?? ''; $contact->contacts_subject = apply_filters('contact.subject_sanitize', $data['subject']); $contact->contacts_message = apply_filters('contact.message_sanitize', $data['message']); $contact->contacts_status = 'new'; $contact->contacts_ip_address = $request->getClientIp(); $contact->contacts_user_agent = $request->headers->get('User-Agent'); $contact->save(); do_action('contact.submitted', $contact); if ($request->headers->get('Accept') === 'application/json') { return new JsonResponse([ 'success' => true, 'message' => 'Your message has been sent successfully. We will get back to you soon!' ]); } return new RedirectResponse(url('/contact?success=true')); } /** * Display list of contacts for admin */ public function list(Request $request): Response { $status = $request->query->get('status', 'all'); $contacts = Contact::query(); if ($status === 'unread') { $contacts = $contacts->unread(); } elseif ($status === 'read') { $contacts = $contacts->read(); } elseif ($status !== 'all') { $contacts = $contacts->status($status); } $contacts = $contacts->orderBy('created_at', 'desc')->get(); return $this->renderAdminView('contact/views/admin/index.twig', [ 'contacts' => $contacts, 'current_status' => $status, 'title' => 'Contact Messages Management' ]); } /** * Display contact details */ public function show(Request $request, int $id): Response { $contact = Contact::find($id); if (!$contact) { return new RedirectResponse(url('admin/contacts?error=not_found')); } // Mark as read if it's unread if (!$contact->isRead()) { $contact->markAsRead(); } return $this->renderAdminView('contact/views/admin/show.twig', [ 'contact' => $contact, 'title' => 'Contact Message Details' ]); } /** * Update contact status */ public function updateStatus(Request $request, int $id): Response { $contact = Contact::find($id); if (!$contact) { if ($request->headers->get('Accept') === 'application/json') { return new JsonResponse([ 'success' => false, 'message' => 'Contact not found.' ], 404); } return new RedirectResponse(url('admin/contacts?error=not_found')); } $status = $request->request->get('status'); $validStatuses = ['new', 'in_progress', 'resolved', 'closed']; if (!in_array($status, $validStatuses)) { if ($request->headers->get('Accept') === 'application/json') { return new JsonResponse([ 'success' => false, 'message' => 'Invalid status.' ], 400); } return new RedirectResponse(url('admin/contacts?error=invalid_status')); } $contact->contacts_status = $status; $contact->save(); if ($request->headers->get('Accept') === 'application/json') { return new JsonResponse([ 'success' => true, 'message' => 'Contact status updated successfully.' ]); } return new RedirectResponse(url('admin/contacts/' . $id)); } /** * Update contact response */ public function updateResponse(Request $request, int $id): Response { $contact = Contact::find($id); if (!$contact) { return new RedirectResponse(url('admin/contacts?error=not_found')); } $response = $request->request->get('response'); $contact->contacts_response = $response; // Auto update status if it is 'new' if ($contact->contacts_status === 'new' && !empty($response)) { $contact->contacts_status = 'resolved'; } $contact->save(); return new RedirectResponse(url('admin/contacts/' . $id . '?success=response_saved')); } /** * Delete contact */ public function delete(Request $request, int $id): Response { $contact = Contact::find($id); if (!$contact) { if ($request->headers->get('Accept') === 'application/json') { return new JsonResponse([ 'success' => false, 'message' => 'Contact not found.' ], 404); } return new RedirectResponse(url('admin/contacts?error=not_found')); } $contact->delete(); if ($request->headers->get('Accept') === 'application/json') { return new JsonResponse([ 'success' => true, 'message' => 'Contact deleted successfully.' ]); } return new RedirectResponse(url('admin/contacts')); } /** * Mark contact as read/unread */ public function toggleRead(Request $request, int $id): Response { $contact = Contact::find($id); if (!$contact) { if ($request->headers->get('Accept') === 'application/json') { return new JsonResponse([ 'success' => false, 'message' => 'Contact not found.' ], 404); } return new RedirectResponse(url('admin/contacts?error=not_found')); } if ($contact->isRead()) { $contact->markAsUnread(); $message = 'Contact marked as unread.'; } else { $contact->markAsRead(); $message = 'Contact marked as read.'; } if ($request->headers->get('Accept') === 'application/json') { return new JsonResponse([ 'success' => true, 'message' => $message, 'is_read' => $contact->isRead() ]); } return new RedirectResponse(url('admin/contacts/' . $id)); } /** * Get contact module setting */ private function getSetting(string $key, $default = null) { try { $module = \App\Models\Module::byName('contact')->first(); if ($module) { return $module->getSetting($key, $default); } } catch (\Throwable $e) { } return $default; } }