Merge branch 'main' of https://gitea.karlkuebelschule.de/MaxKupper/12IT_Lernfeld12_2026
This commit is contained in:
@@ -1,43 +1,50 @@
|
||||
<?php
|
||||
|
||||
class Chat {
|
||||
class Chat
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
|
||||
public function index() {
|
||||
if (!isset($_SESSION['user_id'])) {
|
||||
header("Location: " . PROJEKT_URL . "/Login");
|
||||
header("Location: /projekte/htdocs/login.php");
|
||||
exit;
|
||||
}
|
||||
|
||||
$currentUserId = $_SESSION['user_id'];
|
||||
|
||||
$chatModel = Factory::createChatModel();
|
||||
$userModel = Factory::createBenutzerModel();
|
||||
$currentUser = $userModel->getUserById($_SESSION['user_id']);
|
||||
$allUsers = $userModel->getAllUsers();
|
||||
|
||||
$selectedUser = null;
|
||||
$messages = [];
|
||||
$allUsers = $userModel->getAllUsersExcept($currentUserId);
|
||||
$currentUser = $userModel->getUserById( $currentUserId);
|
||||
$unreadCounts = $chatModel->getUnreadCounts($currentUserId);
|
||||
|
||||
// Prüfen, ob ein Kontakt ausgewählt wurde
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['contact_id'])) {
|
||||
$contactId = (int)$_POST['contact_id'];
|
||||
$selectedUser = $userModel->getUserById($contactId);
|
||||
|
||||
$chatModel = Factory::createChatModel();
|
||||
$messages = $chatModel->getMessagesBetweenUsers($currentUser['id'], $selectedUser['id']);
|
||||
// Unread in Kontakte einfügen
|
||||
foreach ($allUsers as &$user) {
|
||||
$user['unread'] = $unreadCounts[$user['id']] ?? 0;
|
||||
}
|
||||
|
||||
// Prüfen, ob eine Nachricht gesendet wird
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['message']) && isset($_POST['receiver_id'])) {
|
||||
$chatModel = Factory::createChatModel();
|
||||
$chatModel->senderID = $currentUser['id'];
|
||||
$chatModel->empfaengerID = (int)$_POST['receiver_id'];
|
||||
$chatModel->nachricht = trim($_POST['message']);
|
||||
$chatModel->insert();
|
||||
|
||||
// Nachricht nach dem Senden erneut laden
|
||||
$selectedUser = $userModel->getUserById($_POST['receiver_id']);
|
||||
$messages = $chatModel->getMessagesBetweenUsers($currentUser['id'], $selectedUser['id']);
|
||||
}
|
||||
|
||||
require_once(PROJEKT_VIEW_DIR . "/chat/index.php");
|
||||
// View laden
|
||||
require __DIR__ . "/../view/chat/index.php";
|
||||
}
|
||||
|
||||
// Nachrichten zwischen zwei Usern per AJAX laden
|
||||
public function loadMessages()
|
||||
{
|
||||
|
||||
if (!isset($_SESSION['user_id'])) exit;
|
||||
|
||||
$current = $_SESSION['user_id'];
|
||||
$other = (int)$_POST['user_id'];
|
||||
|
||||
$chatModel = new ChatModel();
|
||||
$messages = $chatModel->getMessagesBetweenUsers($current, $other);
|
||||
|
||||
// Direkt lesen markieren
|
||||
$chatModel->markAsRead($other, $current);
|
||||
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode($messages);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ require_once("../config/config.php");
|
||||
require_once("../libs/Database.php");
|
||||
require_once("../libs/Factory.php");
|
||||
require_once("../libs/Model.php");
|
||||
require_once("../libs/Controller.php");
|
||||
|
||||
|
||||
if (session_status() === PHP_SESSION_NONE) {
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
class Controller {
|
||||
|
||||
public function model($model) {
|
||||
require_once "../model/" . $model . ".php";
|
||||
return new $model();
|
||||
}
|
||||
|
||||
public function view($view, $data = []) {
|
||||
extract($data);
|
||||
require_once "../view/" . $view . ".php";
|
||||
}
|
||||
}
|
||||
@@ -27,6 +27,18 @@ class BenutzerModel extends Model {
|
||||
|
||||
public function getErrors() { return $this->errorArray; }
|
||||
|
||||
public function getAllUsersExcept($id)
|
||||
{
|
||||
$db = Database::getInstance()->getConnection();
|
||||
|
||||
$stmt = $db->prepare("SELECT id, vorname, nachname FROM user WHERE id != ?");
|
||||
$stmt->bind_param("i", $id);
|
||||
$stmt->execute();
|
||||
|
||||
return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
|
||||
}
|
||||
|
||||
|
||||
// --- Registrierung ---
|
||||
public function insert() {
|
||||
$this->validate();
|
||||
|
||||
@@ -1,50 +1,70 @@
|
||||
<?php
|
||||
|
||||
class ChatModel {
|
||||
|
||||
public $senderID;
|
||||
public $empfaengerID;
|
||||
public $nachricht;
|
||||
|
||||
// Nachricht in DB speichern
|
||||
public function insert() {
|
||||
class ChatModel
|
||||
{
|
||||
public function insert($sender, $receiver, $message)
|
||||
{
|
||||
$db = Database::getInstance()->getConnection();
|
||||
|
||||
$stmt = $db->prepare("
|
||||
INSERT INTO chat (user_sender, user_empfaenger, nachricht)
|
||||
VALUES (?, ?, ?)
|
||||
INSERT INTO chat (user_sender, user_empfaenger, nachricht, gelesen)
|
||||
VALUES (?, ?, ?, 0)
|
||||
");
|
||||
if (!$stmt) {
|
||||
throw new Exception("Fehler beim Vorbereiten der DB-Anfrage: " . $db->error);
|
||||
}
|
||||
|
||||
$stmt->bind_param("iis", $this->senderID, $this->empfaengerID, $this->nachricht);
|
||||
if (!$stmt->execute()) {
|
||||
throw new Exception("Fehler beim Einfügen in die DB: " . $stmt->error);
|
||||
}
|
||||
|
||||
return true;
|
||||
$stmt->bind_param("iis", $sender, $receiver, $message);
|
||||
$stmt->execute();
|
||||
}
|
||||
|
||||
// Nachrichten zwischen zwei Usern abrufen
|
||||
public function getMessagesBetweenUsers($user1, $user2) {
|
||||
public function getMessagesBetweenUsers($user1, $user2)
|
||||
{
|
||||
$db = Database::getInstance()->getConnection();
|
||||
|
||||
$stmt = $db->prepare("
|
||||
SELECT * FROM chat
|
||||
WHERE (user_sender = ? AND user_empfaenger = ?)
|
||||
SELECT * FROM chat
|
||||
WHERE (user_sender = ? AND user_empfaenger = ?)
|
||||
OR (user_sender = ? AND user_empfaenger = ?)
|
||||
ORDER BY id ASC
|
||||
");
|
||||
|
||||
if (!$stmt) {
|
||||
throw new Exception("Fehler beim Vorbereiten der DB-Abfrage: " . $db->error);
|
||||
}
|
||||
|
||||
$stmt->bind_param("iiii", $user1, $user2, $user2, $user1);
|
||||
$stmt->execute();
|
||||
$result = $stmt->get_result();
|
||||
return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
|
||||
}
|
||||
|
||||
return $result->fetch_all(MYSQLI_ASSOC);
|
||||
public function markAsRead($sender, $receiver)
|
||||
{
|
||||
$db = Database::getInstance()->getConnection();
|
||||
|
||||
$stmt = $db->prepare("
|
||||
UPDATE chat SET gelesen = 1
|
||||
WHERE user_sender = ? AND user_empfaenger = ?
|
||||
");
|
||||
|
||||
$stmt->bind_param("ii", $sender, $receiver);
|
||||
$stmt->execute();
|
||||
}
|
||||
|
||||
public function getUnreadCounts($receiverId)
|
||||
{
|
||||
$db = Database::getInstance()->getConnection();
|
||||
|
||||
$stmt = $db->prepare("
|
||||
SELECT user_sender, COUNT(*) AS unread
|
||||
FROM chat
|
||||
WHERE user_empfaenger = ? AND gelesen = 0
|
||||
GROUP BY user_sender
|
||||
");
|
||||
|
||||
$stmt->bind_param("i", $receiverId);
|
||||
$stmt->execute();
|
||||
|
||||
$rows = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
|
||||
|
||||
$out = [];
|
||||
foreach ($rows as $r) {
|
||||
$out[$r['user_sender']] = $r['unread'];
|
||||
}
|
||||
|
||||
return $out;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
</div>
|
||||
<div class="flex-1 overflow-y-auto" id="contacts-container">
|
||||
<?php foreach ($allUsers as $user): ?>
|
||||
<?php if ($user['id'] != $currentUser['id']): ?>
|
||||
<?php if ($user['id'] != $currentUserId): ?>
|
||||
<div class="contact p-2 cursor-pointer hover:bg-gray-100 flex justify-between items-center" data-userid="<?= $user['id'] ?>">
|
||||
<span><?= htmlspecialchars($user['vorname'] . ' ' . $user['nachname']) ?></span>
|
||||
<span class="badge bg-red-500 text-white rounded-full px-2 py-1 text-xs"
|
||||
@@ -37,8 +37,8 @@
|
||||
<div id="chat-window" class="flex-1 p-4 overflow-y-auto">
|
||||
<?php if(!empty($messages)): ?>
|
||||
<?php foreach($messages as $msg): ?>
|
||||
<div class="flex <?= $msg['user_sender'] == $currentUser['id'] ? 'justify-end' : 'justify-start' ?> mb-2">
|
||||
<div class="<?= $msg['user_sender'] == $currentUser['id'] ? 'bg-blue-500 text-white' : 'bg-gray-300 text-black' ?> p-2 rounded max-w-xs break-words">
|
||||
<div class="flex <?= $msg['user_sender'] == $currentUserId ? 'justify-end' : 'justify-start' ?> mb-2">
|
||||
<div class="<?= $msg['user_sender'] == $currentUserId ? 'bg-blue-500 text-white' : 'bg-gray-300 text-black' ?> p-2 rounded max-w-xs break-words">
|
||||
<?= htmlspecialchars($msg['nachricht']) ?>
|
||||
</div>
|
||||
</div>
|
||||
@@ -54,7 +54,7 @@
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const currentUserId = <?= $currentUser['id'] ?>;
|
||||
const currentUserId = <?= $currentUserId ?>;
|
||||
let currentChatUserId = null;
|
||||
|
||||
const ws = new WebSocket('ws://localhost:8080');
|
||||
|
||||
@@ -80,6 +80,27 @@ class ChatServer implements MessageComponentInterface {
|
||||
$stmt->close();
|
||||
$db->close();
|
||||
}
|
||||
|
||||
protected function countUnread($receiverId, $senderId) {
|
||||
$db = new mysqli("localhost","root","","projekte");
|
||||
|
||||
$stmt = $db->prepare("
|
||||
SELECT COUNT(*)
|
||||
FROM chat
|
||||
WHERE user_empfaenger = ?
|
||||
AND user_sender = ?
|
||||
AND gelesen = 0
|
||||
");
|
||||
$stmt->bind_param("ii", $receiverId, $senderId);
|
||||
$stmt->execute();
|
||||
$stmt->bind_result($count);
|
||||
$stmt->fetch();
|
||||
|
||||
$stmt->close();
|
||||
$db->close();
|
||||
return $count;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Server starten
|
||||
|
||||
Reference in New Issue
Block a user