Freeze

Bei einem Event ist mir aufgefallen was in Dotlan noch fehlt: Ein Knopf mit dem man sämtliche Turnier-Anmeldungen, den Cateringverkauf und die Sitzplan-Anmeldephase beenden kann.
Warum? Damit ich ein Abbild der Datenbank machen kann (für die LAN) und ab dann keine wichtigen Änderungen durch die User im Internet durchgeführt werden können. D.h. nach dem Knopfdruck kann sich niemand mehr im Internet an einem Turnier anmelden und wundern, warum er auf der LAN nicht angemeldet ist.

Features

  • Zugriff nur mit der Dotlan-Admin-Rolle „User“
  • Auswahl aus allen Events (Vorauswahl: aktuelles)
  • Sitzplan-Ende-Zeit auf jetzt ändern
  • Alle Turnieranmeldungen schließen
  • Alle Cateringruppen deaktivieren
  • Löschen aller Turnierteilnehmer, die nicht für die LAN-Party bezahlt haben

Screenshot

freeze_modul

Quelltext

ACHTUNG: Es gibt mittlerweile eine neue Version – diese ist allerdings eingearbeitet in ein Framework, das wir für dotlan geschrieben haben, um unser altes Planungstool abzulösen. Daher ist es nicht standalone einsetzbar – hier der Code dazu: https://github.com/lantreff/dotlan_project/tree/master/tools/freeze

Hier die Standalone-Version:

  1. Im Dotlan-Verzeichnis den Ordner „freeze“ anlegen
  2. Folgende index.php herunterladen und in dem Ordner „freeze“ speichern
freeze/index.php
<?php
############################################################
# Freeze-Button Modul for dotlan v1.0                      #
#                                                          #
# Copyright (C) 2010 Torsten Amshove <torsten@amshove.net> #
############################################################
include_once("../global.php");
$PAGE->sitetitle = $PAGE->htmltitle = _("Freeze");
 
if($ADMIN->check(ADMIN_USER)){
  $output .= "<br>";
 
  if($_POST["submit"]){
    $output .= "<b>F&uuml;hre freeze aus:<br>";
    $event_id = mysql_real_escape_string($_POST["event_id"]);
    if($_POST["sitzplan"] == 1){
      $DB->query("UPDATE events SET seatreserveend = '".date("Y-m-d H:i:s",time())."' WHERE id = '".$event_id."' LIMIT 1");
      $output .= " - Sitzplan-Anmeldung Ende auf JETZT gesetzt.<br>";
    }
    if($_POST["turniere"] == 1){
      $DB->query("UPDATE t_turnier SET topen = 0 WHERE teventid = '".$event_id."'");
      $output .= " - Alle Turnieranmeldungen gestoppt.<br>";
    }
    if($_POST["turnier_abmeldung"] ==1){
      $query = $DB->query("SELECT p.tnid AS tnid, p.user_id AS user_id
                           FROM `t_teilnehmer` AS n, t_turnier AS t, t_teilnehmer_part AS p
                           WHERE n.tid = t.tid
                             AND t.teventid = '".$event_id."'
                             AND p.tnid = n.tnid
                             AND p.user_id NOT IN (SELECT user_id FROM event_teilnehmer WHERE event_id = '".$event_id."')");
      $tnids = array();
      $userids = array();
      while($data = $DB->fetch_array($query)){
        if(!in_array($data["tnid"],$tnids)) $tnids[] = $data["tnid"];
        if(!in_array($data["user_id"],$userids)) $userids[] = $data["user_id"];
        $DB->query("DELETE FROM t_teilnehmer_part WHERE tnid = '".$data["tnid"]."' AND user_id = '".$data["user_id"]."' LIMIT 1");
      }
 
      foreach($tnids as $tnid){
        $DB->query("DELETE FROM t_teilnehmer WHERE tnid = '".$tnid."' AND tnanz = 1");
        $data = $DB->query_first("SELECT tnid FROM t_teilnehmer WHERE tnid = '".$tnid."' AND tnleader IN (".implode(",",$userids).")");
        if(!empty($data["tnid"])){
          $query = $DB->query("SELECT user_id FROM t_teilnehmer_part WHERE tnid = '".$tnid."'");
          if($DB->num_rows($query) > 0){
            $new_tnleader = mysql_result($query,0,'user_id');
            $DB->query("UPDATE t_teilnehmer SET tnleader = '".$new_tnleader."' WHERE tnid = '".$tnid."' LIMIT 1");
          }else{
            $DB->query("DELETE FROM t_teilnehmer WHERE tnid = '".$tnid."' LIMIT 1");
          }
        }
      }
 
      $output .= " - Abgemeldete User aus Turnieren gel&ouml;scht. WICHTIG: unter <a href='/admin/support'>/admin/support</a> den Cache leeren!<br>";
    }
    if($_POST["catering"] == 1){
      $DB->query("UPDATE catering_groups SET active = 0");
      $output .= " - Alle Catering Artikelgruppen versteckt.<br>";
    }
    $output .= "</b><br><br>";
  }
 
  $res = $DB->query("SELECT id, name FROM events ORDER BY id");
 
  $output .= "<form action='index.php' method='POST'>";
  $output .= "<select name='event_id'>";
  while($data = $DB->fetch_array($res)){
    $output .= "<option value='".$data["id"]."'";
    if($data["id"] == $EVENT->next) $output .= " selected ";
    $output .= ">".$data["name"]."</option>";
  }
  $output .= "</select><br>";
  $output .= "<input type='checkbox' name='sitzplan' value='1'> Sitzplan-Anmeldung Ende auf JETZT setzen.<br>";
  $output .= "<input type='checkbox' name='turniere' value='1' checked> Turnieranmeldungen stoppen.<br>";
  $output .= "<input type='checkbox' name='turnier_abmeldung' value='1' checked> Abgemeldete User aus Turnieren l&ouml;schen.<br>";
  $output .= "<input type='checkbox' name='catering' value='1' checked> Catering Artikelgruppen verstecken.<br>";
  $output .= "<input type='submit' name='submit' value='Ausf&uuml;hren'>";
  $output .= "</form>";
}
 
$PAGE->render($output);
?>