diff --git a/app.php b/app.php index fb41627..1e939f0 100644 --- a/app.php +++ b/app.php @@ -212,6 +212,127 @@ route('', '/sklad/smazat/{id}/', function ($req, $params){ return redirect('/sklad/'); }); +// procházky + +$singletons['event_form'] = function () { + $form = new severak\forms\form(['method'=>'post']); + $form->field('name', ['label'=>'Název', 'required'=>true]); + $form->field('subtitle', ['label'=>'Upoutávka', 'type'=>'textarea']); + $form->field('text', ['label'=>'Popis', 'type'=>'textarea']); + $form->field('date', ['label'=>'Datum', 'type'=>'date', 'required'=>true]); + $form->field('time', ['label'=>'Čas', 'type'=>'time', 'required'=>true]); + $form->field('facebook_url', ['label'=>'URL události na FB']); + $form->field('is_future', ['label'=>'Pozvánka?', 'type'=>'checkbox']); + $form->field('stop_ids', ['label'=>'ID zastávek']); + $form->field('place_description', ['label'=>'Místo srazu']); + $form->field('lon', ['type'=>'hidden']); + $form->field('lat', ['type'=>'hidden']); + $form->field('_sbt', ['label'=>'Uložit?', 'type'=>'submit']); + + $form->rule('lon', function ($v, $o) { + return !empty($o['lon']) && !empty($o['lat']); + }, 'Musí být vyplněny souřadnice'); + + return $form; +}; + + +route('GET', '/event/edit/', function ($req){ + if (!user()) return redirect('/login/'); + /** @var severak\database\rows $rows */ + $rows = di('rows'); + $page = $_GET['page'] ?? 1; + $pois = $rows->page('events', [], ['datetime'=>'asc'], $page, 30); + $pages = $rows->pages; + + return render('event_list', ['pois'=>$pois, 'pages'=>$pages, 'page'=>$page]); +}); + + +route('', '/event/add/', function ($req){ + if (!user()) return redirect('/login/'); + /** @var Psr\Http\Message\ServerRequestInterface $req */ + /** @var severak\database\rows $rows */ + $rows = di('rows'); + /** @var severak\forms\form $form */ + $form = di('event_form'); + + if ($req->getMethod()=='POST') { + $form->fill($req->getParsedBody()); + if ($form->validate()) { + $slug = slugify($form->values['name']); + $rows->insert('events', [ + 'name'=>$form->values['name'], + 'text'=>$form->values['text'], + 'subtitle'=>$form->values['subtitle'], + 'place_description'=>$form->values['place_description'], + 'facebook_url'=>$form->values['facebook_url'], + 'stop_ids'=>$form->values['stop_ids'], + 'slug'=>$slug, + 'lon'=>$form->values['lon'], + 'lat'=>$form->values['lat'], + 'is_future'=>$form->values['is_future'] ?? 0, + 'datetime'=>strtotime($form->values['date'] . 'T' . $form->values['time']) + ]); + return redirect('/prochazka/' . $slug . '/'); + } + } + + return render('form', ['form'=>$form, 'title'=>'Přidat položku']); +}); + +route('', '/event/edit/{id}/', function ($req, $params){ + if (!user()) return redirect('/login/'); + /** @var Psr\Http\Message\ServerRequestInterface $req */ + /** @var severak\database\rows $rows */ + $rows = di('rows'); + /** @var severak\forms\form $form */ + $form = di('event_form'); + + $item = $rows->one('events', $params['id']); + if (!$item) return notFound(); + + $item['date'] = date('Y-m-d', (int) $item['datetime']); + $item['time'] = date('H:i', (int) $item['datetime']); + + $form->fill($item); + + if ($req->getMethod()=='POST') { + $form->fill($req->getParsedBody()); + if ($form->validate()) { + $slug = slugify($form->values['name']); + $rows->update('events', [ + 'name'=>$form->values['name'], + 'text'=>$form->values['text'], + 'subtitle'=>$form->values['subtitle'], + 'place_description'=>$form->values['place_description'], + 'facebook_url'=>$form->values['facebook_url'], + 'stop_ids'=>$form->values['stop_ids'], + 'slug'=>$slug, + 'lon'=>$form->values['lon'], + 'lat'=>$form->values['lat'], + 'is_future'=>$form->values['is_future'] ?? 0, + 'datetime'=>strtotime($form->values['date'] . 'T' . $form->values['time']) + ], $params['id']); + return redirect('/prochazky/' . $slug . '/'); + } + } + + return render('form', ['form'=>$form, 'title'=>'Upravit položku']); +}); + +route('', '/prochazky/{slug}/', function ($req, $params){ + /** @var Psr\Http\Message\ServerRequestInterface $req */ + /** @var severak\database\rows $rows */ + $rows = di('rows'); + $prochazka = $rows->one('events', ['slug'=>$params['slug']]); + $Parsedown = new Parsedown(); + $prochazka['text'] = $Parsedown->text($prochazka['text']); + if (!$prochazka) return notFound(); + + return render('prochazka', ['prochazka'=>$prochazka]); + +}); // OBSLUHA diff --git a/db/schema.sql b/db/schema.sql index b58994b..36f5528 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -1,5 +1,22 @@ -- Adminer 4.7.5 SQLite 3 dump +CREATE TABLE "events" ( + "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, + "name" text NOT NULL, + "slug" text NOT NULL, + "subtitle" text NULL, + "text" integer NULL, + "datetime" integer NOT NULL, + "facebook_url" text NULL, + "lon" integer NOT NULL, + "lat" integer NOT NULL, + "place_description" text NULL, + "stop_ids" text NULL, + "is_future" integer NOT NULL DEFAULT '1' +); + +CREATE UNIQUE INDEX "events_slug" ON "events" ("slug"); + CREATE TABLE "poi" ( "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "slug" text NOT NULL, @@ -14,12 +31,6 @@ CREATE TABLE "poi" ( CREATE UNIQUE INDEX "poi_slug" ON "poi" ("slug"); - -CREATE TABLE sqlite_sequence(name,seq); - -INSERT INTO "sqlite_sequence" ("name", "seq") VALUES ('users', 1); -INSERT INTO "sqlite_sequence" ("name", "seq") VALUES ('poi', 0); - CREATE TABLE "users" ( "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "member_id" integer NULL, diff --git a/tpl/_header.php b/tpl/_header.php index 259f3d4..9a3b4a9 100644 --- a/tpl/_header.php +++ b/tpl/_header.php @@ -34,6 +34,10 @@ body zájmu + + procházky + + diff --git a/tpl/prochazka.php b/tpl/prochazka.php new file mode 100644 index 0000000..a764493 --- /dev/null +++ b/tpl/prochazka.php @@ -0,0 +1,73 @@ +$prochazka['name'] ?? null]); +?> +

+ +
+ + + + } + + + + + + + + + + + + + +
odkaz na událostzde
datum a čas
místo srazu
+ +
+ + + + + + + + + +