Tredun ohjelmistokehittäjien kurssimateriaaleja
Asenna CI-projekti repon juureen:
composer create-project codeigniter4/appstarter newsdemo --no-dev
Ota käyttöön intl-lisäosa (c:\xampp\php\php.ini)
extension=intl
Siirry uuden projektin kansioon ja asenna vielä tarvittavat kirjastot:
cd newsdemo
composer install
Ota käyttöön kehitysympäristö (development), muokkaa .env-tiedostoon:
CI_ENVIRONMENT = development
Käynnistä jossain muussa kuin default portissa (8080 on jo käytössä phpMyAdminilla):
php spark serve --port 8888
Avaa selain osoitteessa http://localhost:8888 niin näet CI:n tervetulosivun.
Kaikki koodi kirjoitetaan app - kansion sisälle. CI käyttää MVC - mallia, eli koodi jaetaan Model, Views ja Controllers - komponentteihin. Koska CI on oliopohjainen, nämä komponentit ovat olioita, jotka perivät (extends) parent class:ilta kaikki public ja protected metodit.
Avaa Controller - kansio. Siellä on kaksi tiedostoa: Home.php ja BaseController.php. Home.php:n sisällä on määritelty luokka (class) Home ja sille yksi metodi: index(). Metodi on siis vain funktio, joka on määritelty tietyn luokan olioille (object).
<?php namespace App\Controllers;
class Home extends BaseController
{
public function index()
{
return view('welcome_message');
}
}
Index() - metodi palauttaa view:n jonka nimi on “welcome_message”. Löydät sen Views - kansiosta.
Tehdään oma tervetulosivu views-kansioon. Tee uusi tiedosto, jonka nimi on my_welcome.php ja liitä sinne tämä koodi:
<!DOCTYPE html>
<html lang="fi">
<head>
<meta charset="UTF-8">
<title>CodeIgniter Tutoriaali</title>
</head>
<body>
<h1> Lue uutisia, tulet viisaammaksi! </h1>
<em>© 2021</em>
</body>
</html>
Vaihda myös Home-controller, käyttämään sitä:
view('my_welcome')
Jaa koodi vielä footer- ja header-osiin. Tee templates - kansio, ja sinne header.php ja footer.php - tiedostot.
Tallenna header.php tiedostoon sivuston kaikille sivuille yhteinen osuus:
<!DOCTYPE html>
<html lang="fi">
<head>
<meta charset="UTF-8">
<title>CodeIgniter Tutoriaali</title>
</head>
<body>
Tallenna footer.php - tiedostoon:
<em>© 2021</em>
</body>
</html>
Muutetaan Home-Controller:in index()-metodi rakentamaan sivu näistä kolmesta osasta:
$data = [
'name' => 'Tiina'
];
echo view('templates/header', $data);
echo view('my_welcome', $data);
echo view('templates/footer', $data);
Tässä on samalla otettu käyttöön $data-muuttuja, joka on taulukko, jonka avulla voidaan siirtää tietoa view:lle.
Ota käyttöön name-parametri header:issa (huom. $data-taulukkoon ei tarvitse enää viitata, muuttujaa voi käyttää suoraan):
<h1>Tervetuloa <?= $name; ?>:n uutisiin</h1>
Jotta sivulle ei joutuisi koskaan mitään vaarallista, on hyvä käyttää CI:n globaalia esc() funktiota (estää XSS-hyökkäykset)
<h1>Tervetuloa <?= esc($name); ?>:n uutisiin</h1>
Seuraavaksi haetaan tietokannasta uutiset uuden News-Controller:in ja News-Model:in avulla, mutta ennen sitä konffataan tietokantayhteys kuntoon.
Toivottavasti olet jo tehnyt newsdemo_db - tietokannan XAMPP:iin esim. käyttämällä migrations/seeds - työkalua. Käynnistä XAMPP.
Ota CI-projektissa tietokantayhteyskäyttöön muokkaamalla .env - tiedostoa: poista # - merkit, vaihda tietokannan nimi:
#--------------------------------------------------------------------
# DATABASE
#--------------------------------------------------------------------
database.default.hostname = localhost
database.default.database = newsdemo_db
database.default.username = root
database.default.password =
database.default.DBDriver = MySQLi
Huom! Jos olet hukannut koko .env - tiedoston, kopioi se tästä. Tallenna se varmuuden muoksi repoon myös nimellä env_local.
CI-frameworkissa tietoa haetaan tietokannasta Model-luokan avulla. Tee siis Models-kansioon uusi tiedosto: NewsModel.php ja tallenna siihen seuraava koodi (vaihda taulun nimi tarvittaessa):
<?php namespace App\Models;
use CodeIgniter\Model;
class NewsModel extends Model
{
protected $table = 'news';
public function getAllNews()
{
return $this->findAll();
}
}
Seuraavaksi tehdään uutisille kontrolleri. Tee Controllers-kansioon uusi tiedosto News.php, ja liitä siihen seuraava koodi:
<?php namespace App\Controllers;
use App\Models\NewsModel;
class News extends BaseController
{
public function index()
{
$model = new NewsModel();
$data = [
'news' => $model->getAllNews()
];
var_dump($data)
}
}
Jotta saamme tämän uuden kontrollerin toimintaan, siitä pitää kertoa reitittimelle eli avaa tiedosto: App/Config/Routes.php ja lisää sinne aikaisemman reitin alle uusi news-reitti (osoite):
$routes->get('/', 'Home::index');
$routes->get('/news', 'News::index'); //UUSI
Kokeile sivua, saatko tietokannasta jotain ulos (var_dump).
Lisätään uusi view uutisten katseluun. Tee uusi tiedosto: views/news/list_view.php, ja tallenna siihen seuraava koodi:
<h2>Uutiset alkavat:</h2>
<?php if (! empty($news) && is_array($news)) : ?>
<?php foreach ($news as $news_item): ?>
<h3><?= esc($news_item['title']); ?></h3>
<div class="main">
<p><?= esc($news_item['content']); ?></p>
</div>
<?php endforeach; ?>
<?php else : ?>
<h3>Ei uutisia</h3>
<p>Käynnistä tietokanta?</p>
<?php endif ?>
Ota tämä uusi view - käyttöön, korvaa var_dump NewsController:issa:
//var_dump($data);
echo view('templates/header', $data);
echo view('news/list_view', $data);
echo view('templates/footer', $data);
Ja muista lisätä $data:an myös aikaisempi lisätä parametri ‘name’:
$data = [
'news' => $model->getAllNews(),
'name' => 'Tiina'
];
Ensimmäinen osa demoa on nyt valmis. Olet saanut tietokannasta uutiset ruudulle.