USER
saya ada aplikasi dan saya nambah fitur chat tapi tidak terkirim ini kodenya
ini untuk controllernya
<?php
namespace App\Controllers\siswa;
use App\Models\siswa\ChatModel;
use CodeIgniter\Controller;
use App\Models\siswa\UserModel;
class Chat extends Controller
{
protected $chatModel;
protected $userModel;
public function __construct()
{
$this->chatModel = new ChatModel();
$this->userModel = new UserModel();
}
public function index()
{
$current_user = service('authentication')->user();
$user_id = $current_user ? $current_user->id : 0;
$users = $this->userModel->findAll();
return view('mahasiswa/chat/index', [
'user_id' => $user_id,
'users' => $users
]);
}
public function sendMessage()
{
log_message('debug', 'Starting sendMessage method.');
$rules = [
'sender_id' => 'required|is_natural_no_zero',
'receiver_id' => 'required|is_natural_no_zero',
'message' => 'required|string'
];
if (!$this->validate($rules)) {
$errors = $this->validator->getErrors();
log_message('error', 'Validation failed: ' . print_r($errors, true));
return $this->response->setJSON(['status' => 'error', 'message' => 'Validation failed.'])->setStatusCode(400);
}
$sender_id = $this->request->getPost('sender_id');
$receiver_id = $this->request->getPost('receiver_id');
$message = $this->request->getPost('message');
log_message('debug', 'Sender ID: ' . $sender_id);
log_message('debug', 'Receiver ID: ' . $receiver_id);
log_message('debug', 'Message: ' . $message);
try {
if ($this->chatModel->save([
'sender_id' => $sender_id,
'receiver_id' => $receiver_id,
'message' => $message,
'created_at' => date('Y-m-d H:i:s')
])) {
log_message('debug', 'Message saved successfully.');
return $this->response->setJSON(['status' => 'success']);
} else {
log_message('error', 'Failed to save message. Validation errors: ' . print_r($this->chatModel->errors(), true));
return $this->response->setJSON(['status' => 'error', 'message' => 'Failed to save message.'])->setStatusCode(500);
}
} catch (\Exception $e) {
log_message('critical', 'Exception occurred: ' . $e->getMessage());
return $this->response->setJSON(['status' => 'error', 'message' => 'Exception occurred: ' . $e->getMessage()])->setStatusCode(500);
}
}
public function fetchMessages($sender_id, $receiver_id)
{
$messages = $this->chatModel->where(['sender_id' => $sender_id, 'receiver_id' => $receiver_id])
->orWhere(['sender_id' => $receiver_id, 'receiver_id' => $sender_id])
->orderBy('created_at', 'ASC')
->findAll();
return $this->response->setJSON($messages);
}
}
ini modelsnya
<?php
namespace App\Models\siswa;
use CodeIgniter\Model;
class ChatModel extends Model
{
protected $table = 'chats';
protected $primaryKey = 'id';
protected $allowedFields = ['sender_id', 'receiver_id', 'message', 'created_at'];
protected $useTimestamps = true; // Ensure timestamps are used
}
ini viewnya
<?= $this->extend('mahasiswa/layout/main') ?>
<?= $this->section('content') ?>
<div class="chat-page">
<div class="user-list">
<?php foreach ($users as $user): ?>
<div class="user-item" data-user-id="<?= $user['id'] ?>" data-user-name="<?= $user['name'] ?>" data-user-photo="<?= base_url('/uploads/foto/' . $user['foto']) ?>">
<img src="<?= base_url('/uploads/foto/' . $user['foto']) ?>" alt="<?= $user['name'] ?>" class="user-photo">
<span class="user-name"><?= $user['name'] ?></span>
</div>
<?php endforeach; ?>
</div>
<div class="chat-container">
<div id="chat-header" class="chat-header">
<img id="chat-header-photo" src="" alt="User Photo" class="chat-header-photo">
<span id="chat-header-name" class="chat-header-name">Select a user to chat</span>
</div>
<div id="chat-box" class="chat-box"></div>
<form id="chat-form" class="chat-form">
<?= csrf_field() ?>
<input type="hidden" name="sender_id" value="<?= $user_id ?>">
<input type="hidden" name="receiver_id" id="receiver_id">
<input type="text" name="message" class="chat-input" placeholder="Type your message...">
<button type="submit" class="chat-send-button">Send</button>
</form>
</div>
</div>
<style>
.chat-page {
display: flex;
}
.user-list {
width: 200px;
border-right: 1px solid #ccc;
padding: 10px;
}
.user-item {
display: flex;
align-items: center;
padding: 10px;
cursor: pointer;
border-bottom: 1px solid #ccc;
}
.user-item:hover {
background-color: #f0f0f0;
}
.user-photo {
width: 40px;
height: 40px;
border-radius: 50%;
margin-right: 10px;
}
.chat-container {
flex-grow: 1;
display: flex;
flex-direction: column;
max-width: 600px;
margin: auto;
padding: 20px;
border: 1px solid #ccc;
border-radius: 5px;
background-color: #f9f9f9;
}
.chat-header {
display: flex;
align-items: center;
padding: 10px;
border-bottom: 1px solid #ccc;
margin-bottom: 20px;
}
.chat-header-photo {
width: 50px;
height: 50px;
border-radius: 50%;
margin-right: 10px;
}
.chat-header-name {
font-size: 18px;
font-weight: bold;
}
.chat-box {
flex-grow: 1;
margin-bottom: 20px;
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
background-color: #fff;
height: 400px;
overflow-y: scroll;
}
.chat-form {
display: flex;
}
.chat-input {
flex-grow: 1;
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
margin-right: 10px;
}
.chat-send-button {
padding: 10px 20px;
border: none;
border-radius: 5px;
background-color: #007bff;
color: #fff;
cursor: pointer;
}
.chat-send-button:hover {
background-color: #0056b3;
}
</style>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
const base_url = '<?= base_url() ?>';
const sender_id = $('input[name="sender_id"]').val();
function fetchMessages(receiver_id) {
$.get(`${base_url}siswa/chat/fetchMessages/${sender_id}/${receiver_id}`, function(data) {
let chatBox = $('#chat-box');
chatBox.html('');
data.forEach(message => {
chatBox.append(`<div class="chat-message"><strong>${message.sender_id == sender_id ? 'You' : 'Them'}:</strong> ${message.message}</div>`);
});
chatBox.scrollTop(chatBox[0].scrollHeight);
}).fail(function() {
console.error('Error fetching messages');
});
}
$('.user-item').on('click', function() {
const receiver_id = $(this).data('user-id');
const receiver_name = $(this).data('user-name');
const receiver_photo = $(this).data('user-photo');
$('#receiver_id').val(receiver_id);
$('#chat-header-photo').attr('src', receiver_photo);
$('#chat-header-name').text(receiver_name);
fetchMessages(receiver_id);
});
$('#chat-form').on('submit', function(e) {
e.preventDefault();
const receiver_id = $('#receiver_id').val();
$.post(`${base_url}siswa/chat/sendMessage`, $(this).serialize(), function(response) {
if (response.status === 'success') {
fetchMessages(receiver_id);
$('input[name="message"]').val(''); // Clear message input
} else {
console.error('Error sending message');
}
}, 'json');
});
});
</script>
<?= $this->endSection() ?>
ini routesnya
$routes->group('siswa', ['filter' => 'siswa'], function($routes) {
$routes->get('getExchangeRates', 'siswa\Dashboard::getExchangeRates');
$routes->get('weather', 'siswa\Dashboard::getWeather');
$routes->get('', 'siswa\Dashboard::index'); // Rute default untuk beranda
$routes->get('beranda', 'siswa\Dashboard::index'); // Rute untuk beranda
//$routes->get('/kunjungan', 'Dashboard::index');
$routes->get('kunjungan', 'siswa\kunjungan::index'); //rute kunjungan
$routes->get('add_data_kunjungan', 'siswa\kunjungan::add_data_kunjungan'); // rute tambah kunjungan
$routes->post('proses_add_kunjungan', 'siswa\kunjungan::proses_add_kunjungan'); // rute proses tambah kunjungan
$routes->get('edit_data_kunjungan/(:any)', 'siswa\kunjungan::edit_data_kunjungan/$1'); // rute edit kunjungan
$routes->post('proses_edit_kunjungan', 'siswa\kunjungan::proses_edit_kunjungan'); // rute proses edit kunjungan
$routes->get('delete_data_kunjungan/(:any)', 'siswa\kunjungan::delete_data_kunjungan/$1'); // rute hapus kunjungan
//ini routes buat laporan magang
$routes->get('magang', 'siswa\magang::index'); //rute magang
$routes->get('add_data_magang', 'siswa\magang::add_data_magang'); // rute tambah magang
$routes->post('proses_add_magang', 'siswa\magang::proses_add_magang'); // rute proses tambah magang
$routes->get('edit_data_magang/(:any)', 'siswa\magang::edit_data_magang/$1'); // rute edit magang
$routes->post('proses_edit_magang', 'siswa\magang::proses_edit_magang'); // rute proses edit magang
$routes->get('delete_data_magang/(:any)', 'siswa\magang::delete_data_magang/$1'); // rute hapus magang
$routes->get('upload/magang/(:any)', 'siswa\magang::viewPdf/$1');// rute view pdf
//ini routes buat laporan akhir
$routes->get('akhir', 'siswa\akhir::index'); //rute akhir
$routes->get('add_data_akhir', 'siswa\akhir::add_data_akhir'); // rute tambah akhir
$routes->post('proses_add_akhir', 'siswa\akhir::proses_add_akhir'); // rute proses tambah akhir
$routes->get('edit_data_akhir/(:any)', 'siswa\akhir::edit_data_akhir/$1'); // rute edit akhir
$routes->post('proses_edit_akhir', 'siswa\akhir::proses_edit_akhir'); // rute proses edit akhir
$routes->get('delete_data_akhir/(:any)', 'siswa\akhir::delete_data_akhir/$1'); // rute hapus akhir
$routes->get('upload/akhir/(:any)', 'siswa\akhir::viewPdf/$1');// rute view pdf
//ini routes buat laporan
$routes->get('pelaporan', 'siswa\pelaporan::index'); //rute pelaporan
$routes->get('add_data_pelaporan', 'siswa\pelaporan::add_data_pelaporan'); // rute tambah pelaporan
$routes->post('proses_add_pelaporan', 'siswa\pelaporan::proses_add_pelaporan'); // rute proses tambah pelaporan
$routes->get('upload/akhir/(:any)', 'siswa\Pelaporan::viewFile/$1');
$routes->get('pelaporan/pagination', 'siswa\Pelaporan::pagination');
//ini routes buat laporan pengaduan
$routes->get('pengaduan_fasilitas', 'siswa\PengaduanFasilitas::index'); //rute pengaduan_fasilitas
$routes->get('add_data_pengaduan_fasilitas', 'siswa\PengaduanFasilitas::add_data_pengaduan_fasilitas'); // rute tambah pengaduan_fasilitas
$routes->post('proses_add_pengaduan_fasilitas', 'siswa\PengaduanFasilitas::proses_add_pengaduan_fasilitas'); // rute proses tambah pengaduan_fasilitas
$routes->get('upload/akhir/(:any)', 'siswa\PengaduanFasilitas::viewFile/$1');
//buat kegiatan
$routes->get('kegiatan', 'siswa\Kegiatan::index');
$routes->post('kegiatan/store', 'siswa\Kegiatan::store');
$routes->post('kegiatan/delete/(:num)', 'siswa\Kegiatan::delete/$1');
$routes->post('kegiatan/update-status/(:num)', 'siswa\Kegiatan::updateStatus/$1');
//info akun
$routes->get('user/info-akun/(:num)', 'siswa\User::edit/$1');
$routes->post('user/update_akun', 'siswa\User::update_akun');
//info pribadi
$routes->get('user/info-pribadi/(:num)', 'siswa\User::editPribadi/$1');
$routes->post('user/update_data', 'siswa\User::update_data');
$routes->get('chat', 'siswa\Chat::index');
$routes->post('chat/sendMessage', 'siswa\Chat::sendMessage');
$routes->get('chat/fetchMessages/(:num)/(:num)', 'siswa\Chat::fetchMessages/$1/$2');
// Tambahkan route siswa lainnya di sini
});