Skip to content
Snippets Groups Projects
Baecker.php 7.72 KiB
Newer Older
<?php declare(strict_types=1);
// UTF-8 marker äöüÄÖÜ߀
/**
 * Class baecker for the exercises of the EWA lecture
 * Demonstrates use of PHP including class and OO.
 * Implements Zend coding standards.
 * Generate documentation with Doxygen or phpdoc
 *
 * PHP Version 7.4
 *
 * @file     baecker.php
 * @package  Page Templates
 * @author   Bernhard Kreling, <bernhard.kreling@h-da.de>
 * @author   Ralf Hahn, <ralf.hahn@h-da.de>
 * @version  3.1
 */

// to do: change name 'baecker' throughout this file
require_once './Page.php';
require_once './DB_Classes/OrderedArticle.php';
/**
 * This is a template for top level classes, which represent
 * a complete web page and which are called directly by the user.
 * Usually there will only be a single instance of such a class.
 * The name of the template is supposed
 * to be replaced by the name of the specific HTML page e.g. baker.
 * The order of methods might correspond to the order of thinking
 * during implementation.
 * @author   Bernhard Kreling, <bernhard.kreling@h-da.de>
 * @author   Ralf Hahn, <ralf.hahn@h-da.de>
 */
class Baecker extends Page
{
    // to do: declare reference variables for members
    // representing substructures/blocks

    /**
     * Instantiates members (to be defined above).
     * Calls the constructor of the parent i.e. page class.
     * So, the database connection is established.
     * @throws Exception
     */
    protected function __construct()
    {
        parent::__construct();
        // to do: instantiate members representing substructures/blocks
    }

    /**
     * Cleans up whatever is needed.
     * Calls the destructor of the parent i.e. page class.
     * So, the database connection is closed.
     */
    public function __destruct()
    {
        parent::__destruct();
    }

    /**
     * Fetch all data that is necessary for later output.
     * Data is returned in an array e.g. as associative array.
     * @return array An array containing the requested data.
     * This may be a normal array, an empty array or an associative array.
     */
    protected function getViewData():array
    {
        $query = "SELECT * FROM ordered_article;";
        $resultSet = $this->_database->query($query);
        $orderedArticleList = array();

        while ($row = $resultSet->fetch_assoc()) {

            $orderedArticle = new OrderedArticle(
                (int)$row["ordered_article_id"], (int)$row["ordering_id"], (int)$row["article_id"], (int)$row["status"]
            );

            $orderedArticleList[$orderedArticle->getOrderedArticleId()] = $orderedArticle;
        }
        $resultSet->free_result();
        return $orderedArticleList;
    }

    /**
     * First the required data is fetched and then the HTML is
     * assembled for output. i.e. the header is generated, the content
     * of the page ("view") is inserted and -if available- the content of
     * all views contained is generated.
     * Finally, the footer is added.
     * @return void
     */
    protected function generateView():void
    {
        $data = $this->getViewData(); //NOSONAR ignore unused $data
        $this->generatePageHeader('Bäcker',"",true); //to do: set optional parameters
        echo <<< HTML
        \n<section id="baecker">
            <h2>Bestellung</h2>

            <form id="formBaecker" accept-charset="UTF-8" action="#" method="post">\n
HTML;

        $noOrders = true;
        foreach ($data as $order){
            $query = "SELECT UNIQUE name FROM article, ordered_article
                   WHERE article.article_id = {$order->getArticleId()};";
            $resultSet = $this->_database->query($query);
            $resultArray = $resultSet->fetch_assoc();
            $resultSet->free_result();

            $pizzaName = htmlspecialchars($resultArray["name"]);
            $orderedArticleId = $order->getOrderedArticleId();

            $status = $order->getStatus();
            if ($status > 2 ) {
                continue;
            }
            else {
                $noOrders = false;
            }

            $statusArray = array_fill(0, 5, "");
            $statusArray[$status] = "checked";

            echo <<< HTML
                    <fieldset>
                        <legend>Bestellung {$order->getOrderingId()} Pizza {$pizzaName}</legend>
                        Status: <br>
                        <label>
                            <input type="radio" name="{$orderedArticleId}" value="0" {$statusArray[0]} onclick="document.forms['formBaecker'].submit();">
                        </label> <br>
                        
                        <label>
                            <input type="radio" name="{$orderedArticleId}" value="1" {$statusArray[1]} onclick="document.forms['formBaecker'].submit();">
                        </label> <br>
                        
                        <label>
                            <input type="radio" name="{$orderedArticleId}" value="2" {$statusArray[2]} onclick="document.forms['formBaecker'].submit();">
                        </label>
                    </fieldset>\n
HTML;
        }

        if ($noOrders) {

            echo <<< HTML
                \n<p>Es gibt keine Bestellungen</p>
HTML;
        }

        echo <<< HTML
            </form>
        </section>\n
HTML;

        $this->generatePageFooter();
    }

    /**
     * Processes the data that comes via GET or POST.
     * If this page is supposed to do something with submitted
     * data do it here.
     * @return void
     */
    protected function processReceivedData():void
    {
        parent::processReceivedData();
        // to do: call processReceivedData() for all members
        $data = $this->getViewData();
        foreach ($data as $order){
            $orderedArticleId = $order->getOrderedArticleId();
            if (isset($_POST["{$orderedArticleId}"]) && is_numeric($_POST["{$orderedArticleId}"])) {
                $status = $this->_database->real_escape_string($_POST["{$orderedArticleId}"]);
                $query = "UPDATE ordered_article SET status = {$status}
                       WHERE ordered_article.ordered_article_id = {$orderedArticleId};";
                $this->_database->query($query);
            }
        }

        // On Post => Reload
        if (isset($_POST["save"])) {
            header("HTTP/1.1 303 See Other");
            header('Location: ' . $_SERVER['REQUEST_URI']);
            die;
        }
    }

    /**
     * This main-function has the only purpose to create an instance
     * of the class and to get all the things going.
     * I.e. the operations of the class are called to produce
     * the output of the HTML-file.
     * The name "main" is no keyword for php. It is just used to
     * indicate that function as the central starting point.
     * To make it simpler this is a static function. That is you can simply
     * call it without first creating an instance of the class.
     * @return void
     */
    public static function main():void
    {
        try {
            $page = new Baecker();
            $page->processReceivedData();
            $page->generateView();
        } catch (Exception $e) {
            //header("Content-type: text/plain; charset=UTF-8");
            header("Content-type: text/html; charset=UTF-8");
            echo $e->getMessage();
        }
    }
}

// This call is starting the creation of the page.
// That is input is processed and output is created.
Baecker::main();

// Zend standard does not like closing php-tag!
// PHP doesn't require the closing tag (it is assumed when the file ends).
// Not specifying the closing ? >  helps to prevent accidents
// like additional whitespace which will cause session
// initialization to fail ("headers already sent").
//? >