Empi: Kartenbuchung/Reservierungsprogramm

Kartenbuchung/Reservierungsprogramm

Hallo zusammen.

Was ich Prinzipell vorhabe:
Ich/wir brauchen eine Seite wos z.b. 20 Reihen/ 40 Sitzplätze (pro Reihe) angezeigt werden. Hierbei handelt es sich um Plätze für eine Veranstaltung.
Die Sitzpltäre sollen verschiedene Preiskategorien haben. Der User kann sich jetzt einen (auch mehrere, aber erst später) Platz mit einem Mausklick auswählen und anschliesend in einem Formular Name/Adresse/e-Mail,... angeben. Daraufhin soll er ein Mail zugesant bekommen, wo er den "Auftrag" bestätigen muss und erst dann wird dem User eine Rechnung(Überweisungsanweisung) zugeschickt +  der Sitz reserviert + der Sitz natürlich anders eingefärbt + ist nicht mehr ausgewählbar + der Admin bekommt eine e-mail.
Ich hoffe es ist im groben klar auf was ich hinauswill.
Hab Kenntnis ind Java Script, Php, asp, mysql, c#,... allerdings schon länger nichts mehr damit gemacht.

Was ich jetzt schonmal so zum anfangen gemacht habe.

In HTML eine Tabelle mit x,y Felder angelegt und quadratische Bilder eingefügt (20pixelX20pixel). Bilder mit ID versehen + ONCLICK-Event für Javascriptfunktion.
Bei Klick alle bilder "zurückgesetzt" + da Bild auf das gesetzt wurde geändert.

Nur:
Muss ich jetzt für jeden Platz eine Funktion schreiben, was sehr viel arbeit ist und 2. möchte ich aus einer Datei (MySQL Datenbank zur zeit nicht vorhanden) die Platz/Preiskategorie/Bereits reserviert auslesen können --> sodass ich nur diese Datei ändern muss. (z.B. Zweidimensionales Array mit char-wert --> 0=kein Platz; 1=Preiskat.1; 2= Preiskat.2; 9 = Reserviert)

Wo ich jetzt hänge ist:
Wie kann ich die Tabelle am bestem automatisch erstellen lassen, bzw. wie löse ich das mit Reihe+Platz am einfachst? <-- das er mir beim laden der Seite das zweidimensionale Array ein eine Tablle "umwandelt" mit Grün=Preiskat.1 Geld=Preiskat.2 Rot=Reserviert.

Den ausgewählten Platz dann in eine andere PHP-Datei übergenem und dann eine Bestitigungsmail verschicken lassen (per phpmailer),.... sollte kein problem für mich sein.

bzw. würdet ihr mir einen komplett anderen weg empfehlen?

mfg und vielen dank für die Hilfe
empi

ps: falls ich mich wo unklar ausgedrückt habe lasst es mich wissen
pps: bitte PHP ;-)

  1. Ahoi,

    naja, wenig Arbeit ist das in jedem Falle nicht. Vermutlich würdest Du einem Programmierer dafür 500,- in die Hand drücken müssen, wenn nicht gar mehr.

    Die Einzelteile sind dabei ja eher unproblematisch. Schwieriger, das ganze a) sicher und b) übersichtlich herzustellen und c) erweiterbar.

    In PHP funktioniert das natürlich, in der Regel mit Anbindung an Mysql.

    Dank und Gruß,

    frankx

  2. Guten Tag,

    Nur:
    Muss ich jetzt für jeden Platz eine Funktion schreiben, was sehr viel arbeit ist und 2. möchte ich aus einer Datei (MySQL Datenbank zur zeit nicht vorhanden) die Platz/Preiskategorie/Bereits reserviert auslesen können --> sodass ich nur diese Datei ändern muss. (z.B. Zweidimensionales Array mit char-wert --> 0=kein Platz; 1=Preiskat.1; 2= Preiskat.2; 9 = Reserviert)

    Du solltest die Daten unbedingt in einer Datenbank speichern.

    Wo ich jetzt hänge ist:
    Wie kann ich die Tabelle am bestem automatisch erstellen lassen, bzw. wie löse ich das mit Reihe+Platz am einfachst? <-- das er mir beim laden der Seite das zweidimensionale Array ein eine Tablle "umwandelt" mit Grün=Preiskat.1 Geld=Preiskat.2 Rot=Reserviert.

    Du fragst die Status der Plätze aus einer Datenbank, erzeugst eine Matrix und selektierst dann pro Feld den Status. Dementsprechend blendest du die gewünschte Farbe ein. Jedem Feld weißt du einen eindeutigen Bezeichner, eine ID, zu, und versiehst jedes Feld mit einem Action-Handler, der einer Funktion die Feld-ID übergibt. Diese ändert dann den Status des Feldes dementsprechend. Natürlich musst du noch den Status der gewählten Plätze in der Datenbank aktualisieren, sonst vergibst du Plätz ggf. doppelt.

    Insgesamt ist das ganze nicht ganz trivial.

    ps: falls ich mich wo unklar ausgedrückt habe lasst es mich wissen

    Du könntest vor dem Abschicken deine Rechtschreibung überprüfen.

    Gruß
    Christoph Jeschke

    --
    Zend Certified Engineer
    Certified Urchin Admin
    1. Ahoi,

      Du fragst die Status der Plätze aus einer Datenbank, erzeugst eine Matrix und selektierst dann pro Feld den Status. Dementsprechend blendest du die gewünschte Farbe ein. Jedem Feld weißt du einen eindeutigen Bezeichner, eine ID, zu, und versiehst jedes Feld mit einem Action-Handler, der einer Funktion die Feld-ID übergibt.

      Eigentlich müsstest Du jedem freien Feld die Möglichkeit geben, es zu belegen. Dazu wäre auch eine checkbox tauglich. Die ganze Tabelle wäre dann ein Formular, was du so an den Server schickst, damit die Bestellung erstmal im Warenkorb landet.

      Insgesamt ist das ganze nicht ganz trivial.

      Man muss zum Beispiel darauf achten, dass nicht zwischen "ich pack das in den Warenkorb" und "ich schicke die Bestellung ab" jemand anderes bereits die Karten gekauft hat. Entweder es zulassen, oder aber einen zwischen-Status einführen, der dann aber auch sauber wieder aufgelöst werden müsste.

      Dank und Gruß,

      frankx

      1. Ahoi,

        Eigentlich müsstest Du jedem freien Feld die Möglichkeit geben, es zu belegen. Dazu wäre auch eine checkbox tauglich. Die ganze Tabelle wäre dann ein Formular, was du so an den Server schickst, damit die Bestellung erstmal im Warenkorb landet.

        in etwa so:

          
        <?php  
        /**  
         * 24.3.2009  
         * @author R. Sauer-Ernst  
         */  
          
        class Model_Ticketsystem //will become an absctract class sometime  
        {  
            private $_rows = 0;  
            private $_seatsPerRow = 0;  
            private $_categories = array();  
            private $_tickets = array();  
          
            public function __construct() {  
               define ("ROW_SEAT_SEPARATOR","_");  
               // could be the function to overwrite when extending abstract class  
               $this->_init();  
            }  
          
            private function _createTickets() {  
                for ($rowNr = 1; $rowNr <= $this->_rows; $rowNr++) {  
                    for ($seatNr = 1; $seatNr <= $this->_seatsPerRow; $seatNr++) {  
                        // id is commaseparated rownumber and seatnumber  
                        $id = $rowNr . ROW_SEAT_SEPARATOR . $seatNr;  
                        $this->_tickets[$id]["row"] = $rowNr;  
                        $this->_tickets[$id]["seat"] = $seatNr;  
                        $this->_tickets[$id]["category"] = $this->_getCategory($rowNr);  
                    }  
                }  
                $this->_readData();  
                $this->setStatus();  
            }  
          
            private function _getCategory ($rowNr) {  
               $categoryCount = count($this->_categories);  
               $rowsPerCat = $this->_rows/$categoryCount;  
               $categoryNr = floor(($rowNr-1)/$rowsPerCat);  
                return $this->_categories[$categoryNr];  
            }  
          
            public function setStatus ($statusList = array()) {  
                //read data base  
                    foreach ($this->_tickets as $id => $values) {  
                    if (isset($statusList[$id])) {  
                        $this->_tickets[$id]["status"] = $statusList[$id];  
                    } elseif (!isset($this->_tickets[$id]["status"])) {  
                        $this->_tickets[$id]["status"] = "frei";  
                    }  
                }  
            }  
          
            private function _readData() {  
                //read data base  
                $ticketsRead = unserialize(file_get_contents(DB_FILE_NAME));  
                foreach ($this->_tickets as $id => $value) {  
                    if(isset($ticketsRead[$id])) {  
                        $this->_tickets[$id] = $ticketsRead[$id];  
                    }  
                }  
            }  
          
            public function saveData() {  
                //read data base  
                file_put_contents(DB_FILE_NAME, serialize($this->_tickets));  
            }  
            protected function _init() {  
                // writing config here  
                $this->_rows = ROWS;  
                $this->_seatsPerRow = SEATS_PER_ROW;  
                $this->_categories = $GLOBALS["categories"]; // former: array("Parkett","Rang","Empore");  
                // setting unique key and assign categories  
                $this->_createTickets();  
            }  
          
            public function getTickets() {  
                return $this->_tickets;  
            }  
        }  
          
        class TicketsystemController  
        {  
            private $_model;  
            public function __construct($model, $view) {  
               $this->_model = $model;  
               $this->_view = $view;  
               $this->_view->tickets = $this->_model->getTickets();  
            }  
            public function index() {  
                $this->_view->message = "Index";  
            }  
            public function read() {  
            }  
            public function clear() {  
                foreach ($this->_view->tickets as $id => $value) {  
                    $clear[$id] = "frei";  
                }  
                $this->_model->setStatus($clear);  
                $this->_model->saveData();  
                $this->_view->tickets = $this->_model->getTickets();  
            }  
            public function save() {  
                $this->_model->setStatus($_POST);  
                $this->_model->saveData();  
               $this->_view->tickets = $this->_model->getTickets();  
            }  
            public function __call($name, $arguments) {  
               $this->_view->message = "no action " . $name ;  
            }  
        }  
          
        class View_Ticketsystem  
        {  
          public function __get($name) {  
                return $this->$name;  
          }  
          public function __set($name, $value) {  
                $this->$name = $value;  
          }  
        }  
          
        class Dispatcher_Ticketsystem  
        {  
            private static $_instance = Null;  
            public function __construct() {  
                $this->_model = new Model_Ticketsystem;  
                $this->_view = new View_Ticketsystem;  
                $controller = new TicketsystemController($this->_model, $this->_view);  
                call_user_method($this->_route(), $controller);  
            }  
          
            private function _route() {  
                if (! isset($_GET["action"])) {  
                    return "index";  
                }  
                return $_GET["action"];  
            }  
            public static function dispatch() {  
                self::$_instance = new self();  
                return self::$_instance;  
            }  
            public function getView() {  
                return $this->_view;  
            }  
        }  
        // database  
        define ("DB_FILE_NAME","testtickets.ser.php");  
        // for this purpose define rows and seats and categories  
        define ("ROWS",9);  
        define("SEATS_PER_ROW",14);  
        $GLOBALS["categories"] = array("Parkett","Rang","Empore");  
        // setup db if on first run  
        if(!file_exists(DB_FILE_NAME)) {  
            file_put_contents(DB_FILE_NAME, serialize(array()));  
        }  
        $view = Dispatcher_Ticketsystem::dispatch()->getView();  
        ?><html>  
        <head>  
        <style type="text/css">  
        .message {border:1px solid red}  
        table {border: 1px solid brown}  
        .Parkett {border: 2px solid green; background-color: green;}  
        .Rang {border: 2px solid blue; background-color: blue;}  
        .Empore {border: 2px solid pink; background-color: pink;}  
        </style>  
        </head>  
        <body>  
        <p class="menu">  
        <?php foreach (array("read","index","clear") as $link):?>  
        [<a href="?action=<?=$link?>"><?=$link?></a> ]  
        <?php endforeach?>  
        </p>  
        <h1>Ticketsystem</h1>  
        <?php switch($_GET["action"]):  
        default:?>  
        <p class="message">Message: <?=$view->message?></p>  
        <?php case "index":?>  
        <h2>index</h2>  
        <?php break;?>  
        <?php case "save":?>  
        <p>data should be saved:</p>  
        <pre>  
        <?php var_dump($_POST)?>  
        </pre>  
        <?php case "clear"?>  
        <p>data cleared</p>  
        <?php case "read":?>  
        <h2>reading data</h2>  
        <form action="?action=save" method="post">  
        <table>  
        <tr>  
        <?php foreach ($view->tickets as $id => $ticket):?>  
        <?php if ($ticket["status"] == "on") {  
            $checked = 'checked="checked" disabled="disabled"';  
        } else {  
            $checked = "";  
        }  
        ?>  
        <?php if ($ticket["row"] > $prevRow):?>  
        </tr><tr>  
        <?php $prevRow = $ticket["row"]?>  
        <?php endif?>  
        <td class="<?=$ticket["category"]?>">  
        <label><?=$id?></label>  
        <input name="<?=$id?>" type="checkbox" <?=$checked;?>>  
        </td>  
        <?php endforeach?>  
        </tr>  
        </table>  
        <input type="submit">  
        </form>  
        <p>  
        <?php foreach ($GLOBALS["categories"] as $category):?>  
        [<span class="<?=$category?>"><?=$category?></span>]  
        <?php endforeach;?>  
        <?php case "clear"?>  
        <pre><?php var_dump($view->tickets)?></pre>  
        <?php break;?>  
        <?php endswitch;?>  
        </body>  
        
        

        Dank und Gruß,

        frankx

    2. Hello,

      Du fragst die Status der Plätze aus einer Datenbank, erzeugst eine Matrix und selektierst dann pro Feld den Status. Dementsprechend blendest du die gewünschte Farbe ein. Jedem Feld weißt du einen eindeutigen Bezeichner, eine ID, zu, und versiehst jedes Feld mit einem Action-Handler,

      Ich würde mit einem Image und einer Image-Map arbeiten, die alle Plätze anzeigt. Da es relativ einfarbig ist, dürfte das Bild nicht zuviele Bytes bekommen.

      Das Image würde ich per GD-Lib auf dem Server berechnen. Dauert nicht lange, da es sich nur um wenige Farben handelt.

      grüne Plätze sind noch zu verkaufen
      gelbe Plätze sind in Bearbeitung, also vermutlich gleich vergeben
      rote Plätze sind verkauft

      Auf JavaScript würde ich vollkommen verzichten.

      Liebe Grüße aus Syburg

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de