[BETA] phpBB3 Football MOD Version 0.9.3

In diesem Forum können Mod-Autoren ihre Mods vorstellen, die sich noch im Entwicklungsstatus befinden. Der Einbau in Foren im produktiven Betrieb wird nicht empfohlen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
fasoulaki
Mitglied
Beiträge: 13
Registriert: 13.08.2015 00:04

Re: [BETA] phpBB3 Football MOD Version 0.9.3

Beitrag von fasoulaki »

football hat geschrieben:@fasoulaki
Kannst du deine offenen Probleme/Fragen noch einmal zusammenfassen?
Du bist ja anscheinend schon auf dem richtigen Weg, wenn nicht sogar schon fertig.
Als erstes möchte ich dir meinen Dank für dein hervorragendes Modul aussprechen. Ich bin total begeistert von deiner wundervollen Arbeit.
Vielen Dank auch, dass du dir die Zeit nimmst, mich bei der Erweiterung zu unterstützen.

Für ein Basketball-Tippspiel brauch ich ein anderen Algorithmus für die Berechnung der erzielten Punkte der Tipper.
Man tippt im Prinzip welche Mannschaft gewinnt und in welchem 5-Punkteintervall (5,10,15,...)die Punktedifferenz liegt.
Das Interval in dem die tatsächliche Differenz liegt, wird dann aus den Spielergebnissen berechnet und mit dem Tipp verglichen.

Ich bin gerade dabei nachzuvollziehen, wo genau ich das MOD ändern müsste, um das zu erreichen.
Meine erste Frage deswegen lautet:
1)Reicht es aus, die Funktion select_points() zu ändern und einen weiteren Modus durch eine zusätzlichen case Fall einzupflegen oder gibt es noch weitere Funktionen und Dateien, die man anpassen muss?
2)Ich möchte gerne mehr Punkte für richtige Tipps in der K.O. Phase als in der Gruppenphase eines Tuniers vergeben.
Was passiert, wenn ich, während das Tippspiel schon im Gange ist, am Ende der Gruppenphase in der Ligakonfiguration die Punktevergabe hochsetze.
Erhöhen sich dann die gesammelten Punkte der Tipper für die vergangenene Spieltage oder hat das dann nur Auswirkungen auf die zukünftigen Spieltage?

Außerdem bin ich gerade dabei die Funktionalität der Funktion select_points nachzuvollziehen (mein PHP und SQL ist ein wenig verstaubt :oops: )
Ich habe den Algorithmus in dieser Funktion noch nicht nachvollzogen. Jeder Hinweis und jede Erklärung was die Funktion macht und wie sie es macht ist sehr willkommen. z.B.
3) wofür ist dieser bolean parameter sum gut?
4) du beziehst dich im Code einmal auf Tabellen mit der Abkürzung b und m. Außerdem hast du noch diesen Parameter $creator='m'. Warum benutzt du manchmal 'm' direkt und manchmal diese creator Variable?

Code: Alles auswählen

            $select_part =     ($sum ? "SUM(IF(b.goals_home <> '' AND b.goals_guest <> ''," : 'IF(((m.status = 2) OR (m.status = 3)),') .
 
Wenn Sum = false findet also die Punktewertung nur statt, wenn die Tippabgabe für den Spieltag abgeschlossen wurde

Code: Alles auswählen

                                "IF(b.goals_home <> '' AND b.goals_guest <> '',
Die Auswertung findet nur statt, wenn ein Tipp voliegt

Code: Alles auswählen

                                    IF((b.goals_home + 0 < b.goals_guest) <> ($creator.goals_home + 0 < $creator.goals_guest) 
                                        OR (b.goals_home = b.goals_guest) <> ($creator.goals_home = $creator.goals_guest) 
                                        OR (b.goals_home + 0 > b.goals_guest) <> ($creator.goals_home + 0 > $creator.goals_guest),
                                        " .($sum ? '0' : "''") . ",
 
Hier wird geprüft ob Sieg,Niederlage bzw. Gleichstand richtig getippt worden ist, wenn nicht gib es keine Punkte.

Code: Alles auswählen

                            IF((b.goals_home = $creator.goals_home) AND (b.goals_guest = $creator.goals_guest),
                                            $points_result,
                                            IF((b.goals_home = b.goals_guest),
                                                $points_result - ABS(b.goals_home - $creator.goals_home),
                                                IF((($points_result - ABS(b.goals_home - $creator.goals_home) - ABS(b.goals_guest - $creator.goals_guest)) < $points_tendency),
                                                    $points_tendency,
                                                    $points_result - ABS(b.goals_home - $creator.goals_home) - ABS(b.goals_guest - $creator.goals_guest)
                                                )
                                            )
                                        )
                                    ),
                                    " .($sum ? '0' : "''") . '
                                ),
                                ' .($sum ? '0' : "''") . "
                            ) " .($sum ? ')' : '') . 'AS points';
Der eigentliche Algorithmus für die Berechnung der Punkte befindet sich im unteren Codeteil. Es würde also ausreichen, wenn ich diesen Code-Teil auf die Bedürfnisse meines Tipp-Spiels anopasse!
Zuletzt geändert von fasoulaki am 16.08.2015 19:01, insgesamt 7-mal geändert.
Benutzeravatar
DreamPromise
Mitglied
Beiträge: 3793
Registriert: 27.01.2004 17:56

Re: [BETA] phpBB3 Football MOD Version 0.9.3

Beitrag von DreamPromise »

Moin moin
football hat geschrieben: Vermutlich hast du einen User in phpBB gelöscht, der Teilnehmer dieser Tpprunde ist. Jetzt kann der Name nicht mehr ermittelt werden.
Richtig.
football hat geschrieben:Wenn du den User deaktivierst statt zu löschen tritt das Problem nicht auf.
Das ist leider zu spät.
Ich hab auch versucht den User über die MOD STK wieder herzustellen, aber erfolglos.
football hat geschrieben:Fehlerbeseitigung:
Erst einmal in phpmyadmin prüfen, ob es wirklich so ist:

Code: Alles auswählen

select distinct season, league, user_id  FROM phpbb_footb_bets WHERE user_id not in (SELECT DISTINCT user_id FROM phpbb_users);
Sollten hier user_id's gefunden werden, kannst du diese mit folgenden befehlen aus den Tipprundentabellen löschen.
[ externes Bild ]
football hat geschrieben:

Code: Alles auswählen

# Alle Tipprundeneinträge von Usern löschen
DELETE FROM phpbb_footb_bets WHERE user_id not in (SELECT DISTINCT user_id FROM phpbb_users);
DELETE FROM phpbb_footb_rank_matchdays WHERE user_id not in (SELECT DISTINCT user_id FROM phpbb_users);
DELETE FROM phpbb_footb_points WHERE user_id not in (SELECT DISTINCT user_id FROM phpbb_users);
Achtung das Löschen geht über alle Saisons und Ligen!
Gehen denn dann irgendwelche anderen User verloren ?
Oder gehen Tipps und/oder Spielstände verloren ?
Ich hab keine Ahnung von der Tragweite diese Codes.

Danke
fasoulaki
Mitglied
Beiträge: 13
Registriert: 13.08.2015 00:04

Basketball-Modus

Beitrag von fasoulaki »

Ich habe den neuen Punktealgorithmus geschrieben und er scheint hervorragend zu funktionieren.

Was jetzt noch fehlt ist, dass die erzielbaren Tipp-Punkte in den KO Runden schrittweise höher werden als in der Gruppenphase.
Sonst verlieren die Tipper, die weit zurück liegen oft das Interesse und steigen aus.
Wahrscheinlich könnte man das durch IF Abfragen auf m.matchday lösen.

Mir ist noch aufgefallen, dass man im Admin-Center nur maximal 99 Tore als Spielergebnis eintragen kann. Im Basketball werden aber relativ oft Punktestände über 100 erreicht.
Um dieses Problem zu lösen, muss man in der Datenbank den Typ der Spalte goals_home und goals_guest von char(2) auf char(3) erhöhen.
Außerdem muss in der Datei adm/style/acp_football_resutls.html in den folgenden Zeilen der Parameter maxlength von 2 auf 3 erhöht werden.

Code: Alles auswählen

<input style="text-align:right;" name="goals_home_{matches.NUMBER}" type="text" size="2" maxlength="3" value="{matches.GOALS_HOME}" 

Code: Alles auswählen

<input name="goals_guest_{matches.NUMBER}" type="text" size="2" maxlength="3" value="{matches.GOALS_GUEST}" onchange="document.getElementById('select_{matches.NUMBER}').checked = true;" />
Benutzeravatar
football
Mitglied
Beiträge: 862
Registriert: 03.05.2009 10:37
Kontaktdaten:

Re: [BETA] phpBB3 Football MOD Version 0.9.3

Beitrag von football »

Hallo fasoulaki,
die entscheidenden Stellen zur Berechnung mit deinem neuen Modus hast du richtig erkannt, lediglich in rules_popup.php wird der Modus noch ausgewertet,
aber dass kannst du vermutlich vernachässigen.
Da die Punkte je Spiel nicht abgespeichert werden sondern neu aktuell berechnet werden, hilft es nicht, die Punkte während der Saison zu erhöhen,
da sonst die Anzeige nicht stimmt und bei einer Änderung zusätzlich die Punkte in der Rangliste auch neu berechnet und abgespeichert werden.

Eine zusätzlichen IF-Abfrage auf m.matchday wäre eine denkbare Lösung, wenngleich dies die derzeit komplexe SQL noch komplizierter macht.
Viel Spass dabei, das bei deinem neuen Modus einzubauen.
Ja, im Fussball fallen selten mehr als 99 Tore in einem Spiel.
Kein Support per PN oder E-Mail. Support-Anfragen beantworte ich nur über diese Community.
Benutzeravatar
football
Mitglied
Beiträge: 862
Registriert: 03.05.2009 10:37
Kontaktdaten:

Re: [BETA] phpBB3 Football MOD Version 0.9.3

Beitrag von football »

DreamPromise hat geschrieben:Gehen denn dann irgendwelche anderen User verloren ?
Oder gehen Tipps und/oder Spielstände verloren ?
Ich hab keine Ahnung von der Tragweite diese Codes.
Andere User sind nicht betroffen, es werden nur die Tipps, die Platzierung in der Rangliste und die Ultimate Points also
die Gewinne dieses Users gelöscht.
Daher solltest du die Ergebnisse des 1. Spieltags abspeichern, damit der gelöschten Ranglistenplätze belegt werden und eventuelle Gewinne
nachfolgende Tipper bekommen.
Kein Support per PN oder E-Mail. Support-Anfragen beantworte ich nur über diese Community.
fasoulaki
Mitglied
Beiträge: 13
Registriert: 13.08.2015 00:04

Re: [BETA] phpBB3 Football MOD Version 0.9.3

Beitrag von fasoulaki »

football hat geschrieben:Hallo fasoulaki,
die entscheidenden Stellen zur Berechnung mit deinem neuen Modus hast du richtig erkannt, lediglich in rules_popup.php wird der Modus noch ausgewertet,
aber dass kannst du vermutlich vernachässigen.
Ach ja! Das ist bestimmt für das Popup Fenster gedacht, was sich öffnet, wenn man im Menu auf Tipprunden-Regeln klickt.
football hat geschrieben: Da die Punkte je Spiel nicht abgespeichert werden sondern neu aktuell berechnet werden, hilft es nicht, die Punkte während der Saison zu erhöhen,
da sonst die Anzeige nicht stimmt und bei einer Änderung zusätzlich die Punkte in der Rangliste auch neu berechnet und abgespeichert werden.

Eine zusätzlichen IF-Abfrage auf m.matchday wäre eine denkbare Lösung, wenngleich dies die derzeit komplexe SQL noch komplizierter macht.
Viel Spass dabei, das bei deinem neuen Modus einzubauen.
Ich habe jetzt zum testen den folgenden Algorithmus geschrieben, der die erzielbaren Punkte im Basketballmodus kontinuierlich in 5 Stufen in den ersten 5 Spieltagern erhöht.
Ist tatächlich ein wenig kompliziert geworden, funktioniert aber einwandfrei.
Es mag jedoch sein, dass bei vielen Tippern in der Tipprunden die Performance auf Grund der Komplexität leidet.
Für das echte Tunier werde ich natürlich die Spieltage, an denen die Punkte erhöht werden, auf vernünftige Werte setzen.
z.B. Ende der Vorrunde, Achtelfinale,Viertelfinale, Halbfinale, Finale

Code: Alles auswählen

            $select_part =     ($sum ? "SUM(IF(b.goals_home <> '' AND b.goals_guest <> ''," : 'IF(((m.status = 2) OR (m.status = 3)),') .
                                "IF(b.goals_home <> '' AND b.goals_guest <> '',
                                    IF((b.goals_home + 0 < b.goals_guest) <> ($creator.goals_home + 0 < $creator.goals_guest) 
                                        OR (b.goals_home = b.goals_guest) <> ($creator.goals_home = $creator.goals_guest) 
                                        OR (b.goals_home + 0 > b.goals_guest) <> ($creator.goals_home + 0 > $creator.goals_guest),
                                        " .($sum ? '0' : "''") . ",
                                        IF( ((ABS(b.goals_home-b.goals_guest)-1) DIV 5) =  ((ABS($creator.goals_home-$creator.goals_guest)-1) DIV 5),
                                            IF( $creator.matchday <=1,
                                                $points_result,
                                                IF( $creator.matchday <=2,
                                                    $points_result+3,
                                                    IF( $creator.matchday <=3,
                                                        $points_result+6,
                                                        IF( $creator.matchday <=4,
                                                            $points_result+9,
                                                            $points_result+12
                                                        )
                                                    )
                                                )
                                            ),
                                            IF( ABS( ((ABS(b.goals_home-b.goals_guest)-1) DIV 5) - ((ABS($creator.goals_home-$creator.goals_guest)-1) DIV 5) ) = 1,
                                                IF( $creator.matchday <=1,
                                                    $points_tendency,
                                                    IF( $creator.matchday <=2,
                                                        $points_tendency+2,
                                                        IF( $creator.matchday <=3,
                                                            $points_tendency+4,
                                                            IF( $creator.matchday <=4,
                                                                $points_tendency+6,
                                                                $points_tendency+8
                                                            )
                                                        )
                                                    )
                                                ),
                                                IF( $creator.matchday <=1,
                                                    $points_diff,
                                                    IF( $creator.matchday <=2,
                                                        $points_diff+1,
                                                        IF( $creator.matchday <=3,
                                                            $points_diff+2,
                                                            IF( $creator.matchday <=4,
                                                                $points_diff+3,
                                                                $points_diff+4
                                                            )
                                                        )
                                                    )
                                                )
                                            )
                                        )
                                    ),
                                    " .($sum ? '0' : "''") . '
                                ),
                                ' .($sum ? '0' : "''") . "
                            ) " .($sum ? ')' : '') . 'AS points';
Ich denke damit ist jetzt erst mal der Großteil der Arbeit abgeschlossen. Man müsste noch Schritt für Schritt alle Fussball spezifischen Elemente aus dem Modul entfernen, um den Basketball-Nutzer nicht zu verwirren aber das hat keine Eile.

Lieber football,
Ich führe seit genau 10 Jahren jedes Jahr zu jedem Basketball-Großereignis (EM,WM,Olympia) ein Tipp-Spiel durch. Bisher wurde das Tipp-Spiel manuell durchgeführt.
Die TIpper haben ihre Tipps in einen Thread gepostet und ich habe die Tipps in Excel kopiert und ausgewertet.
Ich wollte der Tipprunde zum 10jährigen Bestehen eine automatisierte Tippauswertung "schenken" mit mehr Comfort und zusätzlicher Funktionalität.
Mit meinen angestaubten SQL-Kenntnissen und den nicht vorhandenen PHP-Kenntnissen hätte ich so ein Tipp-Spiel aber auf keinen Fall alleine implementieren können.
Durch dein Modul ist mir das jetzt aber gelungen. Deswegen bedanke ich mich noch mal herzlich bei dir für deine Arbeit und wünsche dir alles Gute!
Viele Grüsse
fasoulaki
Benutzeravatar
football
Mitglied
Beiträge: 862
Registriert: 03.05.2009 10:37
Kontaktdaten:

Re: [BETA] phpBB3 Football MOD Version 0.9.3

Beitrag von football »

Schön, dass es jetzt funktioniert.

Wenn du nur 5 Spieltage hast, kannst du die verschachtelten IFs optimieren:
$points_result + ($creator.matchday -1) * 3
$points_result + ($creator.matchday -1) * 2
$points_diff + ($creator.matchday -1)
Kein Support per PN oder E-Mail. Support-Anfragen beantworte ich nur über diese Community.
fasoulaki
Mitglied
Beiträge: 13
Registriert: 13.08.2015 00:04

Re: [BETA] phpBB3 Football MOD Version 0.9.3

Beitrag von fasoulaki »

football hat geschrieben:Schön, dass es jetzt funktioniert.

Wenn du nur 5 Spieltage hast, kannst du die verschachtelten IFs optimieren:
$points_result + ($creator.matchday -1) * 3
$points_result + ($creator.matchday -1) * 2
$points_diff + ($creator.matchday -1)
Ah Ja danke aber die Gruppenphase hat 6 Spieltage und die KO-Runden (Achtel-, Viertel-, Halb-,Finale) habe ich in jeweils zwei Spieltagen organisiert, weil sie auch an zwei verschiedenen Tagen stattfinden.
Deswegen brauche ich diese IF Struktur. Die FIBA ändert auch mit gewisser Regelmäßigkeit das Spielsystem der Turniere.
Ich habe nur zum Testen mal fünf Spieltage angelegt.

Mir ist noch etwas aufgefallen, was nicht mit dem neuen Tipp-Modus zu tun hat.
Wenn ich im Admin-Center über "Teams verwalten" eine Mannschaft in eine Liga aufnehme, erscheint die Mannschaft erst mal nicht in der Liste "bestehende Teams"
Erst wenn ich unter "Spielpläne verwalten" ein Team in eine Spielansetzung einsetzte, erscheint die entsprechende Mannschaft in dieser Liste.
Hast du ne Idee woran das liegen kann?
Benutzeravatar
football
Mitglied
Beiträge: 862
Registriert: 03.05.2009 10:37
Kontaktdaten:

Re: [BETA] phpBB3 Football MOD Version 0.9.3

Beitrag von football »

Wenn ich in der CL einen Verein hinzufüge sehe ich diesen auch in der Liste, auch wenn ich diesen Verein im Spielplan noch nicht verwende.
Auch wenn ich eine neue Liga anlege und dann eine Mannschaft hinzufüge sehe ich diese sofort.
Von daher kann ich deinen Fehler leider nicht nachstellen.
Vielleicht tritt der Fehler nur bei der ersten Liga oder beim ersten Verein auf?
Wenn du jetzt noch einen Verein einfügst (kannst ihn ja danach wieder löschen), wird er auch nicht angezeigt?
Kein Support per PN oder E-Mail. Support-Anfragen beantworte ich nur über diese Community.
fasoulaki
Mitglied
Beiträge: 13
Registriert: 13.08.2015 00:04

Re: [BETA] phpBB3 Football MOD Version 0.9.3

Beitrag von fasoulaki »

football hat geschrieben:Wenn ich in der CL einen Verein hinzufüge sehe ich diesen auch in der Liste, auch wenn ich diesen Verein im Spielplan noch nicht verwende.
Auch wenn ich eine neue Liga anlege und dann eine Mannschaft hinzufüge sehe ich diese sofort.
Von daher kann ich deinen Fehler leider nicht nachstellen.
Vielleicht tritt der Fehler nur bei der ersten Liga oder beim ersten Verein auf?
Wenn du jetzt noch einen Verein einfügst (kannst ihn ja danach wieder löschen), wird er auch nicht angezeigt?
Nein leider tritt der Fehler bei der 2., 3., ... Liga und beim 3.,4.,... Verein ebenso auf.
Ich vermute, dass dieser Fehler nicht oft auffällt, weil die meisten Tippspiele die vorgefertigten Spielansetzungen per xml importieren und nicht oft manuell von Null an Tuniere/Ligen erstellt werden.
Der Fehler tritt übrigens auch bei einer jungfräulichen Installation ohne die Basketball-Hacks auf.
Ich werde genau nachschauen, warum das bei meiner Installation Probleme macht, sobald ich Zeit habe.
Ich dachte vielleicht ist das Problem (und auch die Lösung) bereits bekannt .

Ich denke, dass der relevante Code in der Datei includes/acp/acp_football_teams.php steht.
Der relevante Code steht unter dem Kommentar //Get us all the teams:

Code: Alles auswählen

    // Get us all the teams
        $sql = 'SELECT t.*,
                SUM(IF(m.team_id_home = t.team_id, 1 , 0)) AS matches_home,
                SUM(IF(m.team_id_guest = t.team_id, 1 , 0)) AS matches_away
            FROM ' . FOOTB_TEAMS . ' AS t 
            JOIN ' . FOOTB_MATCHES . " AS m ON (m.season = $season AND m.league = $league AND (m.team_id_home = t.team_id OR m.team_id_guest = t.team_id)) 
            WHERE t.season = $season 
                AND t.league = $league
            GROUP BY t.team_id
            ORDER BY team_id ASC";
        $result = $db->sql_query($sql);
        $rows_teams = $db->sql_fetchrowset($result);
        $db->sql_freeresult($result);

        // Check if the user is allowed to delete a team.
        if ($user->data['user_type'] != USER_FOUNDER && $config['football_founder_delete'])
        {
            $allow_delete = false;
        }
        else
        {
            $allow_delete = true;
        }

        $row_number = 0;
        $matches = 0;
        foreach ($rows_teams as $row_team)
        {
            $row_number++;
            $row_class = (!($row_number % 2)) ? 'bg1 row_light' : 'bg2 row_dark';
            $matches += ($row_team['matches_home'] + $row_team['matches_away']) / 2;
            $template->assign_block_vars('teams', array(
                'ROW_CLASS'        => $row_class,
                'TEAM'            => $row_team['team_id'],
                'TEAM_IMAGE'    => ($row_team['team_symbol']) ? $phpbb_root_path . 'football/images/flags/' . $row_team['team_symbol'] : $phpbb_root_path . 'football/images/flags/blank.gif',
                'TEAM_NAME'        => $row_team['team_name'],
                'TEAM_SHORT'    => $row_team['team_name_short'],
                'TEAM_MATCHES'    => $row_team['matches_home'] + $row_team['matches_away'],
                'TEAM_HOME'        => $row_team['matches_home'],
                'TEAM_GROUP'    => $row_team['group_id'],
                'TEAM_ROUND'    => $row_team['matchday'],
                'U_EDIT'        => "{$this->u_action}&action=edit&s=" . $season . "&l=" .$league . "&t=" .$row_team['team_id'],
                'U_DELETE'        => ($allow_delete) ? "{$this->u_action}&action=delete&s=" . $season . "&l=" . $league . "&t=" . $row_team['team_id'] : '',
                )
            );
        } 
Wenn keine Spielansetzung eingepflegt worden ist, gibt es logischerweise auch in der Tabelle footb_matches noch keine Einträge team_id_home und team_id_guest.
Welche Auswirkung hat das auf den Code?

Die Auswirkung ist, dass der JOIN bei den Zeilen fehlschlägt, bei denen keine Spielansetzungen existieren.
Lösung: Dem JOIN muss ein LEFT vorrausgehen, dann werden auch all die Zeilen der FOOTB_TEAMS berücksichtigt, die die JOIN Condition nicht erfüllen.
Habe ich ausprobiert! Jetzt ist der Fehler weg und ich sehe alle Mannschaften in der Liga.

Kann es sein, dass sich unterschiedliche MYSQL Datenbank-Versionen unterschiedlich bezüglich des JOIN Statements verhalten?
Antworten

Zurück zu „[3.0.x] Mods in Entwicklung“