WEB PROGRAMIRANJEPHP 2PHP 2
MVC arhitektura i CodeIgniter
2014/2015. dr Nenad Kojić
� CI je MVC framework za PHP programski jezik
� CodeIgniter je MVC framework otvorenog koda koji se koristi za
izradu web aplikacija
� Razvijen je u cilju da se omogući brži razvoj projekata u odnosu
na programiranje od nule u čistom PHP-u.
� Ovo se postiže na taj način što se pruža bogat set klasa za � Ovo se postiže na taj način što se pruža bogat set klasa za
najveći broj zadataka koji se uobičajeno postavljaju u razvoju
savremenih dinamičkih sajtova.
� Cilj je da se programerima omogući da se što više fokusiraju na
kreativnost, na taj način da je potrebno što manje koda koji
treba da nešto uradi.
� Takođe je popularan zato što je to jedan od najbržih PHP
frameworka, a to je posledica toga što sam framework koristi
jako malo resursa.
� Preuzeti poslednju veriziju sa sajta
http://ellislab.com/codeigniter
� Raspakovati datoteku, i smestiti je u web server (npr. Pod
imenom CodeI)
� Nakon startovanja web servera, i ukucavanja URL adrese
127.0.0.1/CodeI, dobija se izgled kao na slici
To je to!!!
� M – Model (predstavlja biznis logiku, i zadužen za rad sa
podacima iz baze podataka i njihovu obradu )
� V – View (predstavlja podatke koji se prikazuju korisniku. To
može biti cela web strana, deo strane, RSS, ...)
� C – Controller (predstavlja vezu između Model-a i View-a. � C – Controller (predstavlja vezu između Model-a i View-a.
Prepopoznaje http requeste, analizira URL adresu i komunicira sa
korisnikom)
� Ukucavanjem URL adrese od strane autora, dolazi se do faze
Routinga, koja treba da obezbedi analizu delova URL adrese
� Pre dolaska do Controllera, omogućeno je filtriranje podataka
zbog povećanja sigurnosti
� Nakon obrade od strane kontrolera, i dobijanja svih podataka od � Nakon obrade od strane kontrolera, i dobijanja svih podataka od
Model-a i drugih celina, kontroler vraća tražene podatke nazad,
preko View-a, i ako je caching aktivan, deo tih podataka se
snima, da bi se sa ponovnim zahtevom to brže obradilo
� Kod standarnog PHP koda
index.php
Podfolder, sa dodatnim
fajlovima
http://127.0.0.1/index.php
Rootkontakt.php
proizvodi.php
fajlovima
http://127.0.0.1/proizvodi.php
� Kod Codeigniter-a
index.php
Korisnik
Root
http://127.0.0.1/index.php/kontakt
Application
Controllers Model View
kontakt.php
� http://127.0.0.1/index.php/controller/method
Ime kontroleraIme metoda unutar
kontrolera
� http://127.0.0.1/index.php/controller/method/a/b
Parametri prozvanog
metoda
� U root direktorijumu CodeIgnitera nalaze se folderi:
application, system i user_guide.
� Folder Application je predviđen da sadrži datoteke koje
korisnik treba da pravi ili ih prilagodi svojim potrebama. korisnik treba da pravi ili ih prilagodi svojim potrebama.
� Folder system sadrži samu srž frameworka sa glavnim
klasama potrebnim za njegov rad.
� Folder user_guide sadrži uputstva za rad.
� U folderu application nalazi se folder config, koji je za
početak rada vrlo bitan.
� U config folderu podešavanja su podeljena po grupama tako
da je svaka grupa smeštena u poseban php fajl.
� U ovim fajlovima podešavanja se nalaze u asocijativnim� U ovim fajlovima podešavanja se nalaze u asocijativnim
nizovima, čije se vrednosti posle pozivaju prilikom svakog
poziva frameworku.
autoload.php� Ovde se navode komponente koje želimo da se automatski pokreću zajedno sa sistemom. To
mogu biti: paketi, biblioteke, helperi, modeli, konfiguracioni fajlovi. Postoje određene klase zakorišćenje koje se pokreću automatski pa se ne navode ovde.
config.php� Ovde se konfigurišu osnovne opcije CI-a. Definisanje polaznog urla, index strane, charseta,
dozvoljenih url karaktera, prefiks za ekstendovane core klase, kod za enkripciju, parametrisesija, cookie-a, globalno XSS filtriranje. Jedna od interesantnih funkcija koja ovde može da se sesija, cookie-a, globalno XSS filtriranje. Jedna od interesantnih funkcija koja ovde može da se podesi je rad sa sesijama koje se čuvaju u bazi podataka, čime se postiže bolja sigurnost ipreglednost istih.
database.php� Postavljaju se podešavanja za povezivanje na bazu podataka sa kojom ce framework raditi.
Podržane su MySQL (4.1+), MySQLi, MS SQL, Postgres, Oracle, SQLite, i ODBC baze podataka.doctype.php� Definišu se html doctype koji će se koristiti.routes.php� Podešava se interno rutiranje zahteva koji stižu CodeIgniteru. Ukratko korisnik može da poziva
određenu stranu, da dobija odgovor od neke druge, a da toga nije svestan. Takođe ovde se navodi podrazumevani kontroler i strana koja će se koristiti za 404 grešku.
smileys.php� Podešavaju se parametri sličica koje će ugrađeni smily helper ispisivati.
� index.php/ nesto je strana kroz koju se framework inicijalizuje što znači da svaki poziv ka sajtu mora
početi sa ovom stranom.
� Ipak je moguće skloniti ovaj sement iz URL-a i na taj način omogućiti kompaktnije linkove koji se uz to
i bolje rangiraju na pretraživačima.
� Prvo u root pored index.php moramo staviti .htaccess fajl sa sledećim sadržajem:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /proconscale/RewriteBase /proconscale/
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]
RewriteCond %{REQUEST_URI} ^application.*
RewriteRule ^(.*)$ /index.php?/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>
<IfModule !mod_rewrite.c>
ErrorDocument 404 /index.php
</IfModule>
� Na kraju u application/config/config.php za $config['index_page'] trebamo staviti vrednost prazan
string.
� Svaki od foledera za realizaciju MVC arhitekture, može imati
jedan ili više php fajlova
� Glavna koordinacije je kroz kontroler
� Svi kontroleri koji se pišu dolaze od CI_Controller� Svi kontroleri koji se pišu dolaze od CI_Controller
� Unutar kontrolera može biti više nezavisnih funkcija
� Svaka od njih može ali ne mora imati argumente
� Jako je bitno kako se poziva strana ili funkcionalnost u CI
� Na sličan način dobijaju se i modeli iz CI_Model
<?php
class Controller extends CI_Controller{
public function method($a, $b){
// kod metoda// kod metoda}
}?>
Napomena: U kontroleru su potrazumevano učitane neke klase kaošto su:
� input – služi za dohvatanje post, get ili cookie podataka.� output – omogućuje controlleru da šalje ispis bez korišćenja view-a� load – koristi se za učitavanje klasa, modela, biblioteka itd.
<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class prva extends CI_Controller {
public function prva_1()
{
Bez argumenata
{
echo("Ovo je prva 1");
}
}
?> Kontroler
prva.php
Sadržaj index.php
stranice je za sada
nebitan
<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class prva extends CI_Controller {
public function prva_1($a, $b)
{
prva.php
Sa argumentima
{
echo("Ovo je prva_1 sa parametrima koji su prosledjeni \$a=$a i \$b=$b");
}
}
?>
Bez drugog
argumenta
<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class prva extends CI_Controller {
public function prva_1($a, $b=“drugi”)
{
echo("Ovo je prva_1 sa parametrima koji su prosledjeni \$a=$a i \$b=$b");
prva.php
Podrazumevana
vrednost
echo("Ovo je prva_1 sa parametrima koji su prosledjeni \$a=$a i \$b=$b");
}
}
?>
<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class prva extends CI_Controller {
public function prva_1($a, $b="drugi") {
echo("Ovo je prva_1 sa parametrima koji su prosledjeni \$a=$a i \$b=$b");
}
public function druga_1(){public function druga_1(){
echo("Ovo je druga bez parametara");
}
}
?>
prva.php
<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class prva extends CI_Controller {
public function index() {
echo("Eeeee, ovo je prva strana!"); }
public function prva_1($a, $b="drugi"){public function prva_1($a, $b="drugi"){
echo("Ovo je prva_1 sa parametrima koji su prosledjeni \$a=$a i \$b=$b"); }
public function druga_1(){
echo("Ovo je druga bez parametara"); }
}
?>
P
r
eS
a
d
a
<?phpif ( ! defined('BASEPATH')) exit('No direct script access allowed');
class prva extends CI_Controller {
public function __construct() { parent::__construct();echo("Inicijalizacija! <br/>"); } __construct()
public function index() {echo("Eeeee, ovo je prva strana!"); }
public function prva_1($a, $b="drugi") {echo("Ovo je prva_1 sa parametrima koji su prosledjeni \$a=$a i \$b=$b"); }
public function druga_1() {echo("Ovo je druga bez parametara"); }
}?>
<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class prva extends CI_Controller {
public function index() {
echo("Eeeee, ovo je prva strana!"); }Kontroler
prva.php
public function proba() {
$this->load->view("proba"); }
}
?>
prva.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Welcome to first page</title>
</head></head>
<body>
<div >
<h1>Welcome to CodeIgniter!</h1>
Text ...
</div>
</body>
</html>
<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class prva extends CI_Controller {
public function index() {
echo("Eeeee, ovo je prva strana!"); }zaglavlje.php
public function proba() {
$this->load->view("zaglavlje");
$this->load->view("proba"); }
}
?>
zaglavlje.php
<h1> Ovo je zaglavlje </h1>
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class prva extends CI_Controller {
public function index() {
echo("Eeeee, ovo je prva strana!"); }
proba.php
<div >
<h1>Welcome to CodeIgniter!</h1>
Ovo je parametar $cc <?php echo $cc; ?>
public function proba($a) {
$this->load->view("zaglavlje");
echo ("Promenljiva a je $a <br/>");
$x = array('cc' => $a);
$this->load->view("proba", $x);}
}
?>
Ovo je parametar $cc <?php echo $cc; ?>
</div>
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class model_proba extends CI_Model
{
public function dohvati_studenta($podatak)
{
// sada se $podatak ne koristi, ali bi služio za neki upit bazi podataka
return array('smer' => 'IT', 'godina'=> 2, 'ime'=> 'Pera Peric');
}
}
?>
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class prva extends CI_Controller {
public function index() {
echo("Eeeee, ovo je prva strana!"); }
public function proba($a){
$this->load->model("model_proba");
$informacija = $this->model_proba->dohvati_studenta("nesto");
// nesto je vraceno od modela, u ovom slucaju niz, i smesten u $informacija// nesto je vraceno od modela, u ovom slucaju niz, i smesten u $informacija
echo ('Ime je: '. $informacija['ime'] ." <br/>");
echo ('Godina je: '.$informacija['godina'] ." <br/>");
echo ('Smer je: '.$informacija['smer'] ." <br/>");
$this->load->view("zaglavlje");
echo ("Promenljiva a je $a <br/>");
$x = array('cc' => $a);
// dodavanje jos podataka koje se prosledjuju view-u
$x['student'] = $informacija;
$this->load->view("proba", $x);
} } ?>
<!DOCTYPE html>
<html>
<head><meta charset="utf-8">
<title>Welcome to first page</title><title>Welcome to first page</title>
</head>
<body>
<div > <h1>Welcome to CodeIgniter!</h1>
Ovo je parametar $cc <?php echo $student['godina']; ?>
</div>
</body>
</html>
<?phpclass Home extends CI_Controller{ function index () //prikaz početne stranice sajta sa izlistanim svim
proizvodima{$this->load->model('home_model');$this->load->model('home_model');$data['categories']=$this->home_model->get_categories();$data['products']=$this->home_model->get_products2();$data['groups']=$this->home_model->get_groups();
$data['main_content']='home';$this->load->view('/includes/template',$data);}...}
<?php
class Home_model extends CI_Model
{
function get_categories() //vraća sve kategorije
{
$sql="SELECT * FROM kategorije";$sql="SELECT * FROM kategorije";
$q = $this->db->query($sql)->result();
return $q;
}
function get_groups() //vraća sve grupe proizvoda
{
$query=$this->db->query('SELECT * FROM grupe');
return $query->result();
}
}
WEB PROGRAMIRANJEPHP 2PHP 2
MVC arhitektura i CodeIgniter
2014/2015. dr Nenad Kojić