소스 검색

Initial Commit

master
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. BIN
      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();

BIN
public/webshop.db 파일 보기


+ 0
- 0
src/Controller/.gitkeep 파일 보기


+ 0
- 0
src/DB/.gitkeep 파일 보기


+ 0
- 0
src/Model/.gitkeep 파일 보기


+ 0
- 0
src/Util/.gitkeep 파일 보기


Loading…
취소
저장