Tredun ohjelmistokehittäjien kurssimateriaaleja
Lisätän uusi view lomakkeelle, tallenna se nimellä: views/news/create.php:
<?= \Config\Services::validation()->listErrors(); ?>
<h2>Lisää uusi uutinen</h2>
<form action="/news/create" method="post">
<?= csrf_field() ?>
<label for="title">Otsikko</label>
<input type="input" name="title" /><br />
<label for="content">Teksti</label>
<textarea name="content"></textarea><br />
<input type="submit" name="submit" value="Luo uutinen" />
</form>
Lomakkeen ensimmäinen rivi käyttää CI:n sisäänrakennettua form validator - kirjastoa ja ilmoittaa jos syötteessä on virheitä. csrf_field() luo näkymättömän input-kentän, joka sisältää csrf-token:in. Tämä estää väärinkäytökset, koska token on kertakäyttöinen, ja näin tunnistetaan tieto, joka tulee sivuston itse luoman lomakkeen kautta.
Lisätään NewsController:iin uusi metodi, joka hoitaa sekä lomakkeen luomisen (get), että sen lähettämisen (post). Liitä seuraava koodi jo olemassa olevan luokan metodiksi.
public function create()
{
$model = new NewsModel();
if ($this->request->getMethod() === 'post' && $this->validate([
'title' => 'required|min_length[3]|max_length[255]',
'content' => 'required'
]))
{
$model->save([
'title' => $this->request->getPost('title'),
'content' => $this->request->getPost('content'),
'user_id' => 1 // HUOM! vaihda kun kirjautuminen on kunnossa!
]);
$data = [
'message' => "lisääminen"
];
echo view('templates/header');
echo view('news/success', $data);
echo view('templates/footer');
}
else
{
echo view('templates/header');
echo view('news/create');
echo view('templates/footer');
}
}
CI-framework tarjoaa request - olion, josta voidaan kysyä siihen liittyviä arvoja, kuten HTTP metodia (getMethod()) tai lomakekenttiä (getPost(‘title’)). Jälkimmäinen vastaa $_POST[‘title] - kenttää.
Tallentaminen tietokantaan toimii automaattisesti NewsModel():n save()-metodin kautta ja lomakkeen validointiin käytetään CI:n omaa form validation - kirjastoa.
Tarvitset vielä onnistumisen ilmoitusnäkymän (*news/views/success.php), joka ilmoittaa että lisääminen onnistui.
<h2>Uutisen <?= $message ?> onnistui!</h2>
CI:n model-luokka ei kirjoita tietokantaan mitään, ettet kerro sille mitä kenttiä sen kautta on sallittua/turvallista päivittää. Lisää olemassaolevaan NewsModel:iin seuraava rivi:
protected $allowedFields = ['title', 'content', 'user_id'];
Lisää vielä reitit app/conf/routes.php - tiedostoon:
$routes->match(['get', 'post'], '/news/create', 'News::create');
Lisää “poista” - linkki uutisten listaukseen (views/news/list_view.php):
<p><a href="<?php echo base_url(); ?>/news/delete/<?php echo $news_item['id']; ?>">Poista uutinen</a></p>
Tämä luo esimerkiksi reitin: /news/delete/1 (joka poistaa uutisen, jonka id on 1).
Käytämme tässä url:in rakentamiseen lisääksi funktiota base_url(), jotta voimme määrittää webbiserverimme portiksi jotain muuta kuin 8080. Muokkaa .env - tiedostoon base_url:
app.baseURL = 'http://localhost:8888'
Lisää uusi metodi NewsController:iin:
public function delete($id = null)
{
$model = new NewsModel();
$model->where('id', $id)->delete();
return redirect()->to(base_url('news'));
}
$routes->get('/news/delete/(:num)', 'News::delete/$1');
` Tee uusi muokkauslomake (views/news/edit.php):
<?= \Config\Services::validation()->listErrors(); ?>
<h2>Muokkaa uutista</h2>
<?php if (! empty($news_item)): ?>
<form action="<?php echo base_url(); ?>/news/update/<?php echo $news_item['id']; ?>" method="post">
<?= csrf_field() ?>
<label for="title">Otsikko</label>
<input type="input" name="title" value="<?= $news_item['title'] ?>"/><br />
<label for="content">Teksti</label>
<textarea name="content"><?= $news_item['content'] ?></textarea><br />
<input type="submit" name="submit" value="Tallenna uutinen" />
</form>
<?php else: ?>
<h2>Uutista ei enää ole</h2>
<?php endif ?>
Lisää “muokkaa” - linkki uutisten listaukseen (views/news/list_view.php):
<p><a href="<?php echo base_url(); ?>/news/edit/<?php echo $news_item['id']; ?>">Muokkaa uutista</a></p>
Lisää NewsController:iin uusi metodi, joka hakee muokattavan uutisen tietokannasta ja avaa sen editointinäkymään:
public function edit($id = null)
{
$model = new NewsModel();
$data = [
'news_item' => $model->where('id', $id)->first()
];
echo view('templates/header');
echo view('news/edit', $data);
echo view('templates/footer');
}
Lisää uusi reitti:
$routes->get('/news/edit/(:num)', 'News::edit/$1');
Lisää metodi, joka hoitaa muokkausten tallentamisen tietokantaan.
public function update($id = null)
{
$model = new NewsModel();
if ($this->request->getMethod() === 'post' && $id !== null && $this->validate([
'title' => 'required|min_length[3]|max_length[255]',
'content' => 'required'
]))
{
$newsdata = [
'title' => $this->request->getPost('title'),
'content' => $this->request->getPost('content'),
];
$model->update($id, $newsdata);
$data = [
'message' => "päivittäminen"
];
echo view('templates/header');
echo view('news/success', $data);
echo view('templates/footer');
}
else
{
return $this->response->redirect(base_url('/news'));
}
}
Lisää reitti päivityksen hoitavalle NewsController:in metodille.
$routes->get('/news/update/(:num)', 'News::update/$1');