ソースを参照

Initial Commit

customers
Ruben De Baets 2年前
コミット
446201b665
11個のファイルの変更1498行の追加0行の削除
  1. 1
    0
      .gitignore
  2. 15
    0
      .vscode/launch.json
  3. 31
    0
      README.md
  4. 16
    0
      composer.json
  5. 1246
    0
      composer.lock
  6. 189
    0
      public/index.php
  7. バイナリ
      public/webshop.db
  8. 0
    0
      src/Controller/.gitkeep
  9. 0
    0
      src/DB/.gitkeep
  10. 0
    0
      src/Model/.gitkeep
  11. 0
    0
      src/Util/.gitkeep

+ 1
- 0
.gitignore ファイルの表示

@@ -0,0 +1 @@
vendor/

+ 15
- 0
.vscode/launch.json ファイルの表示

@@ -0,0 +1,15 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Listen for XDebug",
"type": "php",
"request": "launch",
"port": 9003,
"pathMappings": { "/src": "${workspaceRoot}" }
}
]
}

+ 31
- 0
README.md ファイルの表示

@@ -0,0 +1,31 @@
# Examen PHP 1 - 08/03/2022

De applicatie is een zeer eenvoudig order-systeem. Er zijn 3 klanten, waarvoor je en bestelling kan aanmaken. In de database kan je terugvinden welke productID's er zijn. Een bestelling aanmaken gebeurt in 2 stappen : eerst maak je het order aan (met een referentie), daarna kan je aan een bestaand order producten toevoegen.

Probeer de applicatie uit, bekijk aandachtig de code. Veel zaken moeten duidelijk zijn, waar nodig staat er extra uitleg.

> TIP: debug de applicatie en voeg zelf commentaar toe waar nodig om later snel aan de slag te gaan.

## Installatie

1. Fork deze repository (rechts boven) en maak mij collaborator (in de settings uiterst rechts)
2. Clone deze repository in een aparte folder.
3. Installeer de libraries in vendor: `docker run --rm -t -i -v ${PWD}:/app debaetsr/composer2 install`
4. start de lokale server: `docker run --rm -t -i -v ${PWD}:/src -p 8080:8000 debaetsr/php_xdebug`
5. Start de XDEBUG-server - deze configuratie staat reeds OK

> Zie de mattermost voor meer info omtrent deze commando's, in de pinned posts

### Opdracht

De index.php bevat enkele routes en database connecties. Pas de applicatie aan zodat het voldoet aan het Model - View - Controller systeem.

Maak gebruik van services en Twig! Alle dependencies zijn reeds geïnstalleerd indien je het `composer install` commando (hierboven) uitgevoerd hebt.

> TIP : De namespace is reeds geconfigureerd voor de `/src` folder. Zoek eerst deze uit!

Vergeet niet om gebruik te maken van commits en branches indien nodig. Je mag altijd je notities inscannen/fotograferen en doorsturen.

Er zijn geen instinkers, maar heb wel aandacht voor details.

> TIP : security is belangrijk!

+ 16
- 0
composer.json ファイルの表示

@@ -0,0 +1,16 @@
{
"require": {
"slim/slim": "4.*",
"slim/psr7": "^1.5",
"twig/twig": "^3.0",
"php-di/php-di": "^6.3"
},
"config": {
"platform-check": false
},
"autoload": {
"psr-4": {
"Shop\\": "src/"
}
}
}

+ 1246
- 0
composer.lock
ファイル差分が大きすぎるため省略します
ファイルの表示


+ 189
- 0
public/index.php ファイルの表示

@@ -0,0 +1,189 @@
<?php

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;

require __DIR__ . '/../vendor/autoload.php';

class myDB extends \SQLite3
{
public function __construct()
{
$this->open('./webshop.db');
}
}

$app = AppFactory::create();

$app->map(['GET', 'POST'], "/orders/{client}/create", function (Request $request, Response $response, array $args) {
if ($request->getMethod() == "GET") {
$db2 = new myDB();
$stmt2 = $db2->prepare("SELECT * FROM clients WHERE id = " . $args['client']);
$res2 = $stmt2->execute();
$a = $res2->fetchArray(SQLITE3_ASSOC);

$response->getBody()->write("<h1>Create order for" . $a['firstname'] . " " . $a['lastname'] . "</h1><hr/>");
$response->getBody()->write('<form action="/orders/' . $args['client'] . '/create" method="post">');
$response->getBody()->write('<label for="id">Reference: </label>');
$response->getBody()->write('<input type="text" name="reference">');
$response->getBody()->write('<input type="submit">');
$response->getBody()->write('</form>');

return $response;
} else {
$ref = $request->getParsedBody()['reference'];
$db2 = new myDB();
$sql = "insert into orders (reference, customer_id, vat, subtotal, total) values ('" . $ref . "', " . $args['client'] . ",0,0,0)";
$db2->exec($sql);
return $response->withHeader('Location', '/orders/' . $args['client']);
};
});

// Route with optional params, see https://www.slimframework.com/docs/v4/objects/routing.html#how-to-create-routes section Optional segments
$app->get('/orders[/{client}]', function (Request $request, Response $response, array $args) {
$db = new myDB();

if ($args['client']) {
// orders 1 client
$sql = "SELECT o.* FROM orders o LEFT JOIN clients c on o.customer_id = c.id where c.id = " . $args['client'];
$stmt = $db->prepare($sql);
$res = $stmt->execute();

// naam van de klant
$db2 = new myDB();
$stmt2 = $db2->prepare("SELECT * FROM clients WHERE id = " . $args['client']);
$res2 = $stmt2->execute();
$a = $res2->fetchArray(SQLITE3_ASSOC);
$response->getBody()->write('<a href="/orders/' . $args['client'] . '/create">Create order</a>');
$response->getBody()->write("<h1>ORDERS LIST FOR CLIENT " . $a['firstname'] . " " . $a['lastname'] . "</h1>");
$response->getBody()->write('<hr/>');
$response->getBody()->write("<table>");
} else {
// alle klanten
$response->getBody()->write("<h1>ORDERS LIST FOR ALL CLIENTS </h1>");
$response->getBody()->write('<hr/>');
$response->getBody()->write("<table>");
$sql = "SELECT o.* FROM orders o LEFT JOIN clients c on o.customer_id = c.id";
$stmt = $db->prepare($sql);
$res = $stmt->execute();
}

// toon de orders van 1 of alle klanten
while ($row = $res->fetchArray(SQLITE3_ASSOC)) {
// maak hier een deftige tabel van
$response->getBody()->write("<tr><td>" . " <a href=\"/order/" . $row['id'] . "\">" . $row["reference"] . "</a> " . $row['subtotal'] . " " . $row['vat'] . " " . $row['total'] . "</td></tr>");
}

$response->getBody()->write("</table>");
$response->getBody()->write('<hr/>');

$response->getBody()->write('<a href="/customers">Back to customer list</a> <a href="/orders">Back to order list</a>');

return $response;
});

$app->map(['GET', 'POST'], "/order/{id}/create", function (Request $request, Response $response, array $args) {

if ($request->getMethod() == "GET") {
$db2 = new myDB();
$stmt2 = $db2->prepare("SELECT * FROM orders WHERE id = " . $args['id']);
$res2 = $stmt2->execute();
$a = $res2->fetchArray(SQLITE3_ASSOC);

$response->getBody()->write("<h1>Create orderline for" . $a['reference'] . "</h1><hr/>");
$response->getBody()->write('<form action="/order/' . $args['id'] . '/create" method="post">');
$response->getBody()->write('<label for="id">product: </label>');
$response->getBody()->write('<input type="text" name="id">');
$response->getBody()->write('<label for="qty">qty: </label>');
$response->getBody()->write('<input type="text" name="qty">');
$response->getBody()->write('<input type="submit">');
$response->getBody()->write('</form>');
$response->getBody()->write('<hr/>');
$response->getBody()->write('<a href="/customers">Back to customer list</a> <a href="/orders">Back to order list</a>');
return $response;
} else {
$productid = $request->getParsedBody()['id'];
$qty = $request->getParsedBody()['qty'];
$db2 = new myDB();

// vraag details van het product op
$sqlproduct = "select * from products where id = " . $productid;
$stmtproduct = $db2->prepare($sqlproduct);
$resproduct = $stmtproduct->execute();
$product = $resproduct->fetchArray(SQLITE3_ASSOC);
$order_id = $args['id'];
$unitprice = $product['unitprice'];
$vatperc = $product['vatperc'];

// bereken de prijs van de lijn
$subtotal = $qty * $unitprice;
$vat = $subtotal * $vatperc / 100;
$total = $subtotal + $vat;

// voeg orderlijn toe
$sql = "insert into order_lines (order_id, product_id, qty, subtotal, vat, total) values ($order_id, $productid, $qty, $subtotal, $vat, $total)";
$db2->exec($sql);

// update het order met nieuwe totalen
$sql = "update orders set total = total + $total, subtotal = subtotal + $subtotal, vat = vat + $vat where id = $order_id";
$db2->exec($sql);

return $response->withHeader('Location', '/order/' . $args['id'] . '/create');
};
});

$app->get('/order/{id}', function (Request $request, Response $response, array $args) {

$db = new myDB();

// detail orderlijnen
$sql = "SELECT * FROM order_lines o LEFT JOIN products p on o.product_id = p.id where o.order_id = " . $args['id'];
$stmt = $db->prepare($sql);
$res = $stmt->execute();

// detail order
$db2 = new myDB();
$stmt = $db2->prepare("SELECT * FROM orders WHERE id = " . $args['id']);
$res2 = $stmt->execute();
$a = $res2->fetchArray(SQLITE3_ASSOC);
$response->getBody()->write('<a href="/order/' . $args['id'] . '/create">Add orderline</a>');


$response->getBody()->write("<h1>ORDER DETAILS FOR ORDER " . $a['reference'] . "</h1>");
$response->getBody()->write('<hr/>');
$response->getBody()->write("<table>");
while ($row = $res->fetchArray(SQLITE3_ASSOC)) {
// maak hier een deftige tabel van
$response->getBody()->write("<tr><td>" . " " . $row['id'] . " " . $row["itemnumber"] . " " . $row['name'] . " " . $row['qty'] . " " . $row['subtotal'] . " " . $row['vat'] . " " . $row['total'] . "</td></tr>");
}
$response->getBody()->write("</table>");
$response->getBody()->write('<hr/>');

$response->getBody()->write('<a href="/customers">Back to customer list</a> <a href="/orders">Back to order list</a>');

return $response;
});


$app->get('/customers', function (Request $request, Response $response, array $args) {
$db = new myDB();
$sql = "SELECT * FROM clients";
$stmt = $db->prepare($sql);
$res = $stmt->execute();

$response->getBody()->write("<h1>CUSTOMERS LIST </h1>");
$response->getBody()->write('<hr/>');
$response->getBody()->write("<table>");
while ($row = $res->fetchArray(SQLITE3_ASSOC)) {
// maak hier een deftige tabel van
$response->getBody()->write("<tr><td>" . " " . " <a href=\"/orders/" . $row['id'] . "\">" . $row["id"] . "</a> " . " " . $row['firstname'] . " " . $row['lastname'] . " " . $row['street'] . " " . $row['street2'] . " " . $row['zipcode'] . " " . $row['city'] . " " . $row['country'] . "</td></tr>");
}
$response->getBody()->write("</table>");

return $response;
});



$app->run();

バイナリ
public/webshop.db ファイルの表示


+ 0
- 0
src/Controller/.gitkeep ファイルの表示


+ 0
- 0
src/DB/.gitkeep ファイルの表示


+ 0
- 0
src/Model/.gitkeep ファイルの表示


+ 0
- 0
src/Util/.gitkeep ファイルの表示


読み込み中…
キャンセル
保存