Browse Source

pridan zzz materiál

master
skrabanek 1 month ago
parent
commit
e6e3b73f19
  1. 19
      php/zzz_sqlite-join/actions/delete.php
  2. 4
      php/zzz_sqlite-join/actions/index.php
  3. 22
      php/zzz_sqlite-join/actions/insert.php
  4. 47
      php/zzz_sqlite-join/actions/update.php
  5. 62
      php/zzz_sqlite-join/admin.php
  6. 55
      php/zzz_sqlite-join/index.php
  7. 75
      php/zzz_sqlite-join/init.php
  8. 42
      php/zzz_sqlite-join/update.php
  9. 19
      php/zzz_sqlite-up-del/actions/delete.php
  10. 4
      php/zzz_sqlite-up-del/actions/index.php
  11. 22
      php/zzz_sqlite-up-del/actions/insert.php
  12. 47
      php/zzz_sqlite-up-del/actions/update.php
  13. 53
      php/zzz_sqlite-up-del/index.php
  14. 37
      php/zzz_sqlite-up-del/init.php
  15. 42
      php/zzz_sqlite-up-del/update.php
  16. 87
      php/zzz_sqlite-uvod/index.php
  17. BIN
      php/zzz_sqlite-uvod/ukazka.sqlite

19
php/zzz_sqlite-join/actions/delete.php

@ -0,0 +1,19 @@
<?php
require "../init.php";
//Příprava dat
$id = $_GET["id"];
//SQL příkaz s přijímaní dat z formuláře
$query = $pdo->prepare("DELETE FROM intro WHERE id = :id");
// KONTROLA -> echo $sql . "<br>";
//vykonání příkazu a následný "report"
if ($query->execute(["id" => $id])) {
echo "příkaz byl vykonán";
header("Location: /?del=$id");
} else {
echo "Error: DELETE selhal";
}
?>

4
php/zzz_sqlite-join/actions/index.php

@ -0,0 +1,4 @@
<?php
header("Location: /");
?>

22
php/zzz_sqlite-join/actions/insert.php

@ -0,0 +1,22 @@
<?php
require "../init.php";
//Příprava dat
$nazev = $_GET["nazev"];
$autor = $_GET["autor"];
$rok_vydani = $_GET["rok_vydani"];
//SQL příkaz s přijímaní dat z formuláře
$query = $pdo->prepare("INSERT INTO intro (nazev, autor, rok_vydani) VALUES (:nazev, :autor, :rok_vydani)");
// KONTROLA -> echo $sql . "<br>";
//vykonání příkazu a následný "report"
if ($query->execute(["nazev" => $nazev, "autor" => $autor, "rok_vydani" => $rok_vydani])) {
$last_id = $pdo->lastInsertId();
echo "příkaz byl vykonán - ID:" . $last_id;
header("Location: /?id=$last_id");
} else {
echo "Error: INSERT selhal";
}
?>

47
php/zzz_sqlite-join/actions/update.php

@ -0,0 +1,47 @@
<?php
require "../init.php";
//Příprava dat
$id = $_POST["id"];
$nazev = $_POST["nazev"];
$autor = $_POST["autor"];
$rok_vydani = $_POST["rok_vydani"];
// základ SQL
$sql = "UPDATE intro SET ";
$params = [];
//Dynamické doplnění
if ($nazev != "") {
$sql = $sql . "nazev = :nazev ";
$params["nazev"] = $nazev;
//zajištění čárky pro více úprav
if ($autor != "" || $rok_vydani != "") {
$sql = $sql . ", ";
}
}
if ($autor != "") {
$sql = $sql . "autor = :autor ";
$params["autor"] = $autor;
//zajištění čárky pro více úprav
if ($rok_vydani != "") {
$sql = $sql . ", ";
}
}
if ($rok_vydani != "") {
$sql = $sql . "rok_vydani = :rok_vydani ";
$params["rok_vydani"] = $rok_vydani;
}
//SQL zakončení
$sql = $sql . "WHERE id = :id";
$params["id"] = $id;
//echo $sql;
$query = $pdo->prepare($sql);
if ($query->execute($params)) {
echo "příkaz byl vykonán";
header("Location: /?up=$id");
} else {
echo "Error: UPDATE selhal";
}

62
php/zzz_sqlite-join/admin.php

@ -0,0 +1,62 @@
<?php
//napojení na DB
require "init.php";
//příprava k zobrazení dat
$query = $pdo->prepare("SELECT vypujceni.id, zakaznici.username, intro.nazev, vypujceni.vraceno, vypujceni.datum_vypujceni, vypujceni.datum_vraceni
FROM vypujceni
INNER JOIN zakaznici ON vypujceni.id_zakaznici = zakaznici.id
INNER JOIN intro ON vypujceni.id_intro = intro.id");
$query->execute();
$vypujcky = $query->fetchAll(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=, initial-scale=1.0">
<title>ADMIN</title>
<style>
td, th{
border: 1px solid black;
};
</style>
</head>
<body>
<h1>Admin page</h1>
<h3><a href="/">HOME</a></h3>
<!-- TABULKA V ADMINU -->
<table>
<!-- HLAVIČKA -->
<tr>
<th>id</th>
<th>uživatel</th>
<th>název knihy</th>
<th>vráceno</th>
<th>Datum vypujčení</th>
<th>Datum vrácení</th>
</tr>
<!-- DATA Z DATABAZE -> GENEROVANI PHP -->
<?php
//vypsat data
foreach ($vypujcky as $row) {
echo "<tr>";
echo "<td>". $row["id"]."</td>";
echo "<td>". $row["username"]."</td>";
echo "<td>". $row["nazev"]."</td>";
//dynamické využití proměnné
if ($row["vraceno"]) {
echo "<td>Vráceno</td>";
} else {
echo "<td>Nevráceno</td>";
}
echo "<td>". $row["datum_vypujceni"]."</td>";
echo "<td>". $row["datum_vraceni"]."</td>";
echo "</tr>";
}
?>
</table>
</body>
</html>

55
php/zzz_sqlite-join/index.php

@ -0,0 +1,55 @@
<?php
//napojení na DB
require "init.php";
//příprava k zobrazení dat
$query = $pdo->prepare("SELECT * FROM intro ORDER BY id DESC");
$query->execute();
$books = $query->fetchAll(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>KNIHOVNA</title>
</head>
<body>
<h1>Knihovna</h1>
<h3><a href="/update.php">UPDATE DATA</a></h3>
<h3><a href="/admin.php">ADMIN</a></h3>
<!-- FORMULÁŘ PRO ODESILÁNÍ NOVÝ KNÍŽKY -->
<form action="/actions/insert.php" method="get">
<input type="text" name="nazev" id="nazev" placeholder="nazev"><br>
<input type="text" name="autor" id="autor" placeholder="autor"><br>
<input type="number" name="rok_vydani" id="rok_vydani" placeholder="Rok vydání"><br>
<input type="submit" value="Odeslat">
</form>
<!-- ALERT při vytvoření knihy -->
<?php
if (isset($_GET["id"])){
echo "<h2>Byla vytvořena kniha s ID:".$_GET["id"]."</h2>";
}
if (isset($_GET["del"])){
echo "<h2>Byla odstraněna kniha s ID:".$_GET["del"]."</h2>";
}
if (isset($_GET["up"])){
echo "<h2>Byla upravena kniha s ID:".$_GET["up"]."</h2>";
}
?>
<!-- TABULKA PRO VYPISOVÁNÍ Z DATABÁZE -->
<ul>
<?php
//vypsat data
foreach ($books as $row) {
echo "<li>" . $row["id"]. ") ". $row["nazev"]." <-- ". $row["autor"]." | rok: ".$row["rok_vydani"];
echo ' <a href="/actions/delete.php?id='.$row["id"].'">Vymazat</a>';
echo "</li>";
}
?>
</ul>
</body>
</html>

75
php/zzz_sqlite-join/init.php

@ -0,0 +1,75 @@
<?php
//napojení na DB (SQLite přes PDO)
$db_file = __DIR__ . "/database.sqlite";
try {
$pdo = new PDO("sqlite:" . $db_file);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Chyba připojení k databázi: " . $e->getMessage());
}
//zapnutí foreign keys
$pdo->exec("PRAGMA foreign_keys = ON");
//vytvoření tabulek pokud neexistují
$pdo->exec("CREATE TABLE IF NOT EXISTS intro (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nazev VARCHAR(64) NOT NULL,
autor VARCHAR(64) NOT NULL,
rok_vydani INTEGER NOT NULL
)");
$pdo->exec("CREATE TABLE IF NOT EXISTS zakaznici (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username VARCHAR(64) NOT NULL,
first_name VARCHAR(64) NOT NULL,
last_name VARCHAR(64) NOT NULL
)");
$pdo->exec("CREATE TABLE IF NOT EXISTS vypujceni (
id INTEGER PRIMARY KEY AUTOINCREMENT,
id_zakaznici INTEGER NOT NULL,
id_intro INTEGER NOT NULL,
datum_vypujceni DATETIME NOT NULL,
datum_vraceni DATETIME NOT NULL,
vraceno INTEGER NOT NULL,
FOREIGN KEY (id_zakaznici) REFERENCES zakaznici(id),
FOREIGN KEY (id_intro) REFERENCES intro(id)
)");
//vložení výchozích dat pokud jsou tabulky prázdné
$query = $pdo->prepare("SELECT COUNT(*) FROM intro");
$query->execute();
$count = $query->fetchColumn();
if ($count == 0) {
$pdo->exec("INSERT INTO intro (id, nazev, autor, rok_vydani) VALUES
(1, 'Kytice', 'Jaromir Erben', 1901),
(2, 'Karlštejn', 'Nějaky autor', 2022),
(3, 'Steti', 'Neznamy', 2002),
(4, 'Médeia', 'Euripidés', 5),
(5, 'Evžen Oněgin', 'A. S. Puškin', 1823),
(6, 'RUR', 'K. Čapek', 1920),
(7, 'Spalovač mrtvol', 'L. Fuks', 1967),
(8, 'Petr a Lucie', 'R. Rolland', 1920)
");
$pdo->exec("INSERT INTO zakaznici (id, username, first_name, last_name) VALUES
(1, 'franta', 'Frantíšek', 'Novák'),
(2, 'pepa', 'Josef', 'Tyl'),
(3, 'kubino', 'Jakub', 'Pospíšil'),
(4, 'asvo', 'Alena', 'Svobodová'),
(5, 'olhe', 'Olga', 'Helclová')
");
$pdo->exec("INSERT INTO vypujceni (id, id_zakaznici, id_intro, datum_vypujceni, datum_vraceni, vraceno) VALUES
(1, 2, 3, '2023-01-12 10:27:56', '2023-02-01 12:00:00', 0),
(2, 2, 4, '2023-01-12 10:28:39', '2023-02-01 12:00:00', 0),
(3, 2, 7, '2023-01-12 10:30:19', '2023-02-01 13:15:30', 1),
(4, 4, 8, '2023-01-12 10:31:10', '2023-02-01 13:15:30', 1),
(5, 4, 4, '2023-01-12 10:31:23', '2023-02-01 13:15:30', 1),
(6, 5, 6, '2023-01-12 10:31:53', '2023-02-01 13:15:30', 0)
");
}
?>

42
php/zzz_sqlite-join/update.php

@ -0,0 +1,42 @@
<?php
//napojení na DB
require "init.php";
//příprava k zobrazení dat
$query = $pdo->prepare("SELECT * FROM intro");
$query->execute();
$books = $query->fetchAll(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>UPDATE</title>
</head>
<body>
<h1>UPDATE DATA</h1>
<!-- FORMULÁŘ PRO ODESILÁNÍ NOVÝ KNÍŽKY -->
<form action="actions/update.php" method="post">
<input type="text" name="id" id="id" placeholder="ID"><br>
<input type="text" name="nazev" id="nazev" placeholder="nazev"><br>
<input type="text" name="autor" id="autor" placeholder="autor"><br>
<input type="number" name="rok_vydani" id="rok_vydani" placeholder="Rok vydání"><br>
<input type="submit" value="Odeslat">
</form>
<!-- TABULKA PRO VYPISOVÁNÍ Z DATABÁZE -->
<ul>
<?php
//vypsat data
foreach ($books as $row) {
echo "<li>" . $row["id"]. ") ". $row["nazev"]." <-- ". $row["autor"]." | rok: ".$row["rok_vydani"];
echo ' <a href="delete.php?id='.$row["id"].'">Vymazat</a>';
echo "</li>";
}
?>
</ul>
</body>
</html>

19
php/zzz_sqlite-up-del/actions/delete.php

@ -0,0 +1,19 @@
<?php
require "../init.php";
//Příprava dat
$id = $_GET["id"];
//SQL příkaz s přijímaní dat z formuláře
$query = $pdo->prepare("DELETE FROM intro WHERE id = :id");
// KONTROLA -> echo $sql . "<br>";
//vykonání příkazu a následný "report"
if ($query->execute(["id" => $id])) {
echo "příkaz byl vykonán";
header("Location: /?del=$id");
} else {
echo "Error: DELETE selhal";
}
?>

4
php/zzz_sqlite-up-del/actions/index.php

@ -0,0 +1,4 @@
<?php
header("Location: /");
?>

22
php/zzz_sqlite-up-del/actions/insert.php

@ -0,0 +1,22 @@
<?php
require "../init.php";
//Příprava dat
$nazev = $_GET["nazev"];
$autor = $_GET["autor"];
$rok_vydani = $_GET["rok_vydani"];
//SQL příkaz s přijímaní dat z formuláře
$query = $pdo->prepare("INSERT INTO intro (nazev, autor, rok_vydani) VALUES (:nazev, :autor, :rok_vydani)");
// KONTROLA -> echo $sql . "<br>";
//vykonání příkazu a následný "report"
if ($query->execute(["nazev" => $nazev, "autor" => $autor, "rok_vydani" => $rok_vydani])) {
$last_id = $pdo->lastInsertId();
echo "příkaz byl vykonán - ID:" . $last_id;
header("Location: /?id=$last_id");
} else {
echo "Error: INSERT selhal";
}
?>

47
php/zzz_sqlite-up-del/actions/update.php

@ -0,0 +1,47 @@
<?php
require "../init.php";
//Příprava dat
$id = $_POST["id"];
$nazev = $_POST["nazev"];
$autor = $_POST["autor"];
$rok_vydani = $_POST["rok_vydani"];
// základ SQL
$sql = "UPDATE intro SET ";
$params = [];
//Dynamické doplnění
if ($nazev != "") {
$sql = $sql . "nazev = :nazev ";
$params["nazev"] = $nazev;
//zajištění čárky pro více úprav
if ($autor != "" || $rok_vydani != "") {
$sql = $sql . ", ";
}
}
if ($autor != "") {
$sql = $sql . "autor = :autor ";
$params["autor"] = $autor;
//zajištění čárky pro více úprav
if ($rok_vydani != "") {
$sql = $sql . ", ";
}
}
if ($rok_vydani != "") {
$sql = $sql . "rok_vydani = :rok_vydani ";
$params["rok_vydani"] = $rok_vydani;
}
//SQL zakončení
$sql = $sql . "WHERE id = :id";
$params["id"] = $id;
//echo $sql;
$query = $pdo->prepare($sql);
if ($query->execute($params)) {
echo "příkaz byl vykonán";
header("Location: /?up=$id");
} else {
echo "Error: UPDATE selhal";
}

53
php/zzz_sqlite-up-del/index.php

@ -0,0 +1,53 @@
<?php
//napojení na DB
require "init.php";
//příprava k zobrazení dat
$query = $pdo->prepare("SELECT * FROM intro ORDER BY id DESC");
$query->execute();
$books = $query->fetchAll(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>KNIHOVNA</title>
</head>
<body>
<h1>Knihovna</h1>
<h3><a href="/update.php">UPDATE DATA</a></h3>
<!-- FORMULÁŘ PRO ODESILÁNÍ NOVÝ KNÍŽKY -->
<form action="/actions/insert.php" method="get">
<input type="text" name="nazev" id="nazev" placeholder="nazev"><br>
<input type="text" name="autor" id="autor" placeholder="autor"><br>
<input type="number" name="rok_vydani" id="rok_vydani" placeholder="Rok vydání"><br>
<input type="submit" value="Odeslat">
</form>
<!-- ALERT při vytvoření knihy -->
<?php
if (isset($_GET["id"])){
echo "<h2>Byla vytvořena kniha s ID:".$_GET["id"]."</h2>";
}
if (isset($_GET["del"])){
echo "<h2>Byla odstraněna kniha s ID:".$_GET["del"]."</h2>";
}
if (isset($_GET["up"])){
echo "<h2>Byla upravena kniha s ID:".$_GET["up"]."</h2>";
}
?>
<!-- TABULKA PRO VYPISOVÁNÍ Z DATABÁZE -->
<ul>
<?php
//vypsat data
foreach ($books as $row) {
echo "<li>" . $row["id"]. ") ". $row["nazev"]." <-- ". $row["autor"]." | rok: ".$row["rok_vydani"];
echo ' <a href="/actions/delete.php?id='.$row["id"].'">Vymazat</a>';
echo "</li>";
}
?>
</ul>
</body>
</html>

37
php/zzz_sqlite-up-del/init.php

@ -0,0 +1,37 @@
<?php
//napojení na DB (SQLite přes PDO)
$db_file = __DIR__ . "/database.sqlite";
try {
$pdo = new PDO("sqlite:" . $db_file);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Chyba připojení k databázi: " . $e->getMessage());
}
//vytvoření tabulky pokud neexistuje
$pdo->exec("CREATE TABLE IF NOT EXISTS intro (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nazev VARCHAR(64) NOT NULL,
autor VARCHAR(64) NOT NULL,
rok_vydani INTEGER NOT NULL
)");
//vložení výchozích dat pokud je tabulka prázdná
$query = $pdo->prepare("SELECT COUNT(*) FROM intro");
$query->execute();
$count = $query->fetchColumn();
if ($count == 0) {
$pdo->exec("INSERT INTO intro (id, nazev, autor, rok_vydani) VALUES
(1, 'Kytice', 'Jaromir Erben', 1901),
(2, 'Karlštejn', 'Nějaky autor', 2022),
(3, 'Steti', 'Neznamy', 2002),
(4, 'Médeia', 'Euripidés', 5),
(5, 'Evžen Oněgin', 'A. S. Puškin', 1823),
(6, 'RUR', 'K. Čapek', 1920),
(7, 'Spalovač mrtvol', 'L. Fuks', 1967),
(8, 'Petr a Lucie', 'R. Rolland', 1920)
");
}
?>

42
php/zzz_sqlite-up-del/update.php

@ -0,0 +1,42 @@
<?php
//napojení na DB
require "init.php";
//příprava k zobrazení dat
$query = $pdo->prepare("SELECT * FROM intro");
$query->execute();
$books = $query->fetchAll(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>UPDATE</title>
</head>
<body>
<h1>UPDATE DATA</h1>
<!-- FORMULÁŘ PRO ODESILÁNÍ NOVÝ KNÍŽKY -->
<form action="actions/update.php" method="post">
<input type="text" name="id" id="id" placeholder="ID"><br>
<input type="text" name="nazev" id="nazev" placeholder="nazev"><br>
<input type="text" name="autor" id="autor" placeholder="autor"><br>
<input type="number" name="rok_vydani" id="rok_vydani" placeholder="Rok vydání"><br>
<input type="submit" value="Odeslat">
</form>
<!-- TABULKA PRO VYPISOVÁNÍ Z DATABÁZE -->
<ul>
<?php
//vypsat data
foreach ($books as $row) {
echo "<li>" . $row["id"]. ") ". $row["nazev"]." <-- ". $row["autor"]." | rok: ".$row["rok_vydani"];
echo ' <a href="delete.php?id='.$row["id"].'">Vymazat</a>';
echo "</li>";
}
?>
</ul>
</body>
</html>

87
php/zzz_sqlite-uvod/index.php

@ -0,0 +1,87 @@
<?php
// =============================================
// ÚVOD DO SQLITE + PHP (PDO)
// =============================================
// SQLite = databáze uložená v jednom souboru
// Nepotřebujeme žádný server (jako MySQL)
// PDO = univerzální způsob jak se v PHP připojit k databázi
// =============================================
// 1) PŘIPOJENÍ K DATABÁZI
// -----------------------
// Soubor "ukazka.sqlite" se vytvoří automaticky
$pdo = new PDO("sqlite:" . __DIR__ . "/ukazka.sqlite");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 2) VYTVOŘENÍ TABULKY (pokud ještě neexistuje)
// -----------------------------------------------
$pdo->exec("CREATE TABLE IF NOT EXISTS zaci (
id INTEGER PRIMARY KEY AUTOINCREMENT,
jmeno TEXT NOT NULL,
vek INTEGER NOT NULL
)");
// 3) ZPRACOVÁNÍ FORMULÁŘE - přidání žáka
// ----------------------------------------
if (isset($_POST["pridat"])) {
$jmeno = $_POST["jmeno"];
$vek = $_POST["vek"];
// prepare + execute = bezpečný způsob vkládání dat
$query = $pdo->prepare("INSERT INTO zaci (jmeno, vek) VALUES (:jmeno, :vek)");
$query->execute(["jmeno" => $jmeno, "vek" => $vek]);
// přesměrování zpět (aby se formulář neposlal znovu při refreshi)
header("Location: index.php");
exit;
}
x
// 4) ZPRACOVÁNÍ SMAZÁNÍ
// ----------------------
if (isset($_GET["smazat"])) {
$id = $_GET["smazat"];
$query = $pdo->prepare("DELETE FROM zaci WHERE id = :id");
$query->execute(["id" => $id]);
header("Location: index.php");
exit;
}
// 5) NAČTENÍ VŠECH ŽÁKŮ Z DATABÁZE
// -----------------------------------
$query = $pdo->prepare("SELECT * FROM zaci ORDER BY id DESC");
$query->execute();
$zaci = $query->fetchAll(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="UTF-8">
<title>SQLite úvod</title>
</head>
<body>
<h1>Seznam žáků</h1>
<!-- FORMULÁŘ pro přidání -->
<form method="post">
<input type="text" name="jmeno" placeholder="Jméno" required>
<input type="number" name="vek" placeholder="Věk" required>
<button type="submit" name="pridat">Přidat</button>
</form>
<!-- VÝPIS z databáze -->
<ul>
<?php foreach ($zaci as $zak): ?>
<li>
<?= $zak["id"] ?>) <?= $zak["jmeno"] ?> - <?= $zak["vek"] ?> let
<a href="?smazat=<?= $zak["id"] ?>">smazat</a>
</li>
<?php endforeach; ?>
</ul>
<?php if (empty($zaci)): ?>
<p>Žádní žáci v databázi.</p>
<?php endif; ?>
</body>
</html>

BIN
php/02ukazka.sqlite → php/zzz_sqlite-uvod/ukazka.sqlite

Binary file not shown.
Loading…
Cancel
Save