Beiträge von Silversurfer20002

Ich habe einen Blog Artikel verfasst - Wie benutze ich die Suche richtig - Bitte diesen beachten und auch umsetzen bevor Ihr ein Neues Thema eröffnet!

    🔥 Grillzone-Erweiterung für xTIPP

    Funktionsbeschreibung & Installationsanleitung

    Erstmal ein großes Lob an die Entwickler von xTIPP – das Ding ist wirklich durchdacht, sauber gebaut und macht einfach Spaß. Wir nutzen es intern für ein Abteilungs-Tippspiel, und genau weil die Basis so gut ist, hat es sich gelohnt, ein bisschen draufzubauen.

    Unser Szenario: Am Ende der Saison gibt es ein Grillfest. Und damit nicht immer nur die Letzten bestraft werden, wollten wir frei wählbare Plätze in der Rangliste als „Grilldienst" markieren – also z.B. Platz 4, Platz 10, der Vorletzte und der Letzte. Außerdem haben wir die Startseite etwas vereinfacht, weil einige Kollegen eine klarere Navigation gebraucht haben.

    Das Ergebnis ist ein Overlay-Paket, das auf eine bestehende xTIPP-Installation aufgesetzt wird – ohne die originalen Dateien zu ersetzen und ohne SSH.

    Was die Erweiterung macht

    Vereinfachte Startseite – sofort loslegen

    Nach dem Login erscheinen die wichtigsten Aktionen als große, klare Schaltflächen direkt auf der Startseite. Kein Suchen im Menü, kein Scrollen – einfach draufklicken und tippen. Gruppenranglisten erscheinen automatisch als eigene Buttons, sobald Tippgruppen angelegt sind. Startseite nach dem Login – Tippen, Rangliste und Gruppenranglisten auf einen Blick

    Grillzone in der Rangliste – wer muss an den Grill?

    In der Gesamt-Rangliste werden die konfigurierten Plätze farbig hervorgehoben und mit Symbol + Text markiert. Die Markierung passt sich automatisch an die Teilnehmerzahl an – „Letzter" ist immer der letzte, egal ob 8 oder 30 Leute mitspielen. Auf den Screenshot unten mal kurz schauen – da sieht man sofort, was gemeint ist: Rangliste: Platz 4 ist markiert – Dummy 07 darf ran an den Grill 🔥


    Admin-Bereich: Grillzone konfigurieren – zwei Klicks, fertig

    Unter Admin → Grillzone lässt sich alles bequem über die Oberfläche einstellen. Welche Plätze betroffen sind, wie das Label heißt, welches Symbol angezeigt wird – alles ohne Datei-Editor oder SSH. Einfach einstellen, speichern, fertig. Grillzone-Einstellungen im Adminbereich – Label, Symbol und beliebig viele Platzierungen


    Grillzone aktivierenEin-/Ausschalter für die gesamte Funktion
    Textz.B. „Grilldienst" oder „Grillmeister"
    SymbolEmoji oder kurzer Text, z.B. 🔥, 🍖, 😬
    PlatzierungenBeliebig viele Einträge, kombinierbar

    Mögliche Platzierungsarten:

    • Platznummer – fester Platz, z.B. Platz 4
    • Erster – immer Platz 1
    • Letzter – immer der letzte Platz
    • Vorletzter – immer der zweitletzte Platz
    • Vom letzten Platz abziehen – z.B. „4 vom Letzten" = viertletzter Platz

    Installation

    Voraussetzungen

    • Webhosting mit PHP (z.B. all-inkl.com)
    • Zugang zum Dateimanager oder FTP
    • Originale xTIPP-ZIP
    • Das Paket xtipp-live-custom-package.zip

    Variante A – Frische Installation

    Schritt 1: xtipp-live-custom-package.zip auf den Server laden und entpacken. Es entsteht ein Ordner xtipp/ mit dem Unterordner custom_public/.

    Schritt 2: Den Inhalt der originalen xTIPP-ZIP in den Ordner xtipp/ kopieren:

    Code
    1. xtipp/
    2. app/
    3. bootstrap/
    4. config/
    5. database/
    6. public/ ← originaler xTIPP-Webroot
    7. custom_public/ ← Webroot dieser Installation
    8. ...

    Schritt 3: Im Hosting-Panel die Domain auf xtipp/custom_public zeigen lassen – nicht auf xtipp/public.

    Schritt 4: Im Browser aufrufen:

    Code
    1. https://deine-domain.de/install_overlay.php
    Button „Overlay jetzt installieren" klicken. Das Skript kopiert alle Erweiterungs-Dateien automatisch an die richtigen Stellen.

    Schritt 5: Die Datei xtipp/custom_public/install_overlay.php im Dateimanager löschen oder umbenennen (z.B. in install_overlay.php.bak), damit sie nicht mehr öffentlich aufrufbar ist.

    Schritt 6: xTIPP normal im Browser einrichten (Datenbank, Admin-Account usw.).

    Schritt 7: Im Adminbereich unter Admin → Grillzone die gewünschten Plätze eintragen und aktivieren. Fertig.

    Variante B – Bestehende Installation erweitern

    Schritt 1: xtipp-live-custom-package.zip auf den Server laden und entpacken.

    Schritt 2: Die laufende xTIPP-Installation in den Ordner xtipp/ kopieren. .env und Datenbankverbindung bleiben unberührt.

    Schritt 3: Domain im Hosting-Panel auf xtipp/custom_public umstellen.

    Schritt 4: Im Browser aufrufen:

    Code
    1. https://deine-domain.de/install_overlay.php
    Button „Overlay jetzt installieren" klicken.

    Schritt 5: xtipp/custom_public/install_overlay.php im Dateimanager löschen oder umbenennen (z.B. in install_overlay.php.bak), damit sie nicht mehr öffentlich aufrufbar ist.

    Schritt 6: Seite im Browser prüfen. Falls nötig: im Adminbereich unter Konfiguration → System den Cache leeren.

    Schritt 7: Unter Admin → Grillzone die Plätze konfigurieren und aktivieren.

    Hinweise

    Schreibrechte für config/grill.php: Damit der Adminbereich speichern kann, muss xtipp/config/grill.php vom Webserver beschreibbar sein. Falls es hakt: Dateirechte im Dateimanager auf 664 oder 666 setzen.

    Kein SSH nötig: Die gesamte Installation läuft über Browser und Dateimanager.

    Hier mal noch ein Screenshot davon:

    wenn man zu den Punkten nach hinten scrollt, dann passiert das.


    Was mir jetzt aber auch noch aufgefallen ist, du gibst mit deinem Code den Vor und Nachnamen auch dann aus, wenn es im Admincenter nicht aktiviert ist. Ich hab nämlich Vor- und Nachname deaktiviert, aber rein für mich in der Datenbank den Vor und Nachnamen eingetragen. Im restlichen Tippspiel wird das dann nirgends mehr angezeigt. In deiner Änderung aber schon.

    habe es analog der anderen Rankings angepasst.

    Kleiner Schönheitsfehler auf Mobilgeräten.


    Beim Scrollen bleibt die Überschrift Name stehen (was auch gut so ist) aber die Usernamen darunter scrollen mit weg.


    Ich hoffe ist verständlich.

    Habe das bei mir auf dem Iphone nochmal getestet dort tritt dieses Problem nicht auf. Welchen Mobile-Browser benutzt du? Dann könnte ich mal nach dem Problem googeln.

    Funktioniert bei mir auch - danke Silversurfer20002 :thumbup::thumbup::thumbup:


    Kannst du vielleicht bei den Gruppenspielern auch noch den Rang aus der Gesamtrangliste mit anzeigen? Dann wäre es perfekt ;)

    Denke das ist möglich die Frage ist ob das für Alle anderen auch ok, gewünscht ist.
    Kennst du dich ein bisschen aus mit Programmieren?? dann könnte ich die sagen was du ändern musst.

    also bei mir funktioniert es nicht. >Die Eieruhr läuft bei mir

    Habe nochmal neu rein kopiert, irgendwie hat das Forum den Code verändert oder ich war zu doof zum kopieren. Habe jetzt nochmal den Code in ein anderes X-Tipp übertragen läuft sofort. Bei der Kopie aus dem Forum hatte ich das gleiche Problem. Im Anhang nochmal als Datei

    Habe es hin bekommen, jetzt werden jeweils unter der Zeile der Gruppe die einzelnen Mitglieder als Rangliste ausgegeben.
      FiedlWdd kannst du mal den Code prüfen und übernehmen? Ist wahrscheinlich eher laienhaft aber er tut.


    in der Datei /app/Http/Controllers/RankingController.php



    /resources/views/ranking/group_list.blade.php


    Hallo zusammen,

    da ich mehre Tippspiele habe und auch in allen mit tippe wollte ich mir den Aufwand sparen meine Tipps zu übertragen. Daher habe ich mir ein php Skript erstellt welches die Tipps aus einem Tippspiel in die anderen überträgt. Die Ausführung geschieht entweder per CronJob oder aufruf. Ich hoffe das ist für den Ein oder Andern interressant.


    Aufruf:
    Cron:

    * * * * * curl "http://deine-domain.de/Tippspiel_update.php?username=admin&password=password123"

    Web:


    * * * * * http://deine-domain.de/Tippspi…dmin&password=password123"


    PHP-Datei:


    <?php

    ini_set('display_errors', 1);

    ini_set('display_startup_errors', 1);

    error_reporting(E_ALL);


    // Einfache Passwort-Authentifizierung

    $valid_username = 'admin'; // Benutzername

    $valid_password = 'password123'; // Passwort


    // Authentifizierung prüfen

    $username = $_GET['username'] ?? '';

    $password = $_GET['password'] ?? '';


    if ($username !== $valid_username || $password !== $valid_password) {

    echo 'Unauthorized';

    exit;

    }


    // Datenbankverbindungsdetails

    $db1 = [

    'host' => 'localhost',

    'user' => 'username1',

    'pass' => 'password1',

    'name' => 'db1'

    ];


    $db2 = [

    'host' => 'localhost',

    'user' => 'username2',

    'pass' => 'password2',

    'name' => 'db2'

    ];


    $db3 = [

    'host' => 'localhost',

    'user' => 'username3',

    'pass' => 'password3',

    'name' => 'db3'

    ];


    // Funktion zur Herstellung einer Datenbankverbindung

    function connectDB($db) {

    $mysqli = new mysqli($db['host'], $db['user'], $db['pass'], $db['name']);

    if ($mysqli->connect_error) {

    die("Verbindung fehlgeschlagen: " . $mysqli->connect_error);

    }

    return $mysqli;

    }


    try {

    // Daten aus db1 abrufen

    $mysqli1 = connectDB($db1);

    $result = $mysqli1->query("SELECT * FROM tips WHERE user_id = 1");


    if (!$result) {

    throw new Exception("Fehler beim Abrufen der Daten aus db1: " . $mysqli1->error);

    }


    if ($result->num_rows > 0) {

    // Funktion zum Einfügen oder Aktualisieren von Daten in der Ziel-Datenbank

    function insertOrUpdate($mysqli, $data) {

    // Prüfen, ob die Kombination bereits existiert

    $stmt = $mysqli->prepare("SELECT COUNT(*) FROM tips WHERE game_id = ? AND user_id = ?");

    if (!$stmt) {

    throw new Exception("Fehler beim Vorbereiten der Abfrage: " . $mysqli->error);

    }

    $stmt->bind_param("ii", $data['game_id'], $data['user_id']);

    $stmt->execute();

    $stmt->bind_result($count);

    $stmt->fetch();

    $stmt->close();


    if ($count > 0) {

    // Update

    $stmt = $mysqli->prepare("UPDATE tips SET home_goals = ?, guest_goals = ?, created_at = ?, updated_at = ?, deleted_at = ? WHERE game_id = ? AND user_id = ?");

    if (!$stmt) {

    throw new Exception("Fehler beim Vorbereiten der Update-Abfrage: " . $mysqli->error);

    }

    $stmt->bind_param("iisssii", $data['home_goals'], $data['guest_goals'], $data['created_at'], $data['updated_at'], $data['deleted_at'], $data['game_id'], $data['user_id']);

    $stmt->execute();

    $stmt->close();

    } else {

    // Insert

    $stmt = $mysqli->prepare("INSERT INTO tips (game_id, user_id, home_goals, guest_goals, created_at, updated_at, deleted_at) VALUES (?, ?, ?, ?, ?, ?, ?)");

    if (!$stmt) {

    throw new Exception("Fehler beim Vorbereiten der Insert-Abfrage: " . $mysqli->error);

    }

    $stmt->bind_param("iiissss", $data['game_id'], $data['user_id'], $data['home_goals'], $data['guest_goals'], $data['created_at'], $data['updated_at'], $data['deleted_at']);

    $stmt->execute();

    $stmt->close();

    }

    }


    // Verbindung zu db2 herstellen

    $mysqli2 = connectDB($db2);


    // Verbindung zu db3 herstellen

    $mysqli3 = connectDB($db3);


    // Alle Datensätze durchlaufen und einfügen oder aktualisieren

    while ($data = $result->fetch_assoc()) {

    insertOrUpdate($mysqli2, $data);

    insertOrUpdate($mysqli3, $data);

    }


    echo "Daten erfolgreich übertragen und aktualisiert!";

    } else {

    echo "Keine Daten für user_id = 1 gefunden.";

    }


    // Verbindungen schließen

    if (isset($mysqli1)) $mysqli1->close();

    if (isset($mysqli2)) $mysqli2->close();

    if (isset($mysqli3)) $mysqli3->close();


    } catch (Exception $e) {

    echo "Fehler: " . $e->getMessage();

    }

    ?>