Watek dla zainteresowanych zmianami :)
A wiec jeszcze przed wakacjami dodalem pare nowych rozwiazan do serwisu, ktore mozna obejrzec tutaj
Ostatnio natchnelo mnie do kontynuowania prac nad projektem. Doszedlem jednak do wniosku, ze kod calego systemu jest nieco przestarzaly, malo skalowalny. Zaczelem myslec nad nowymi rozwiazaniami i napisalem nowe "jadro" systemu ;) na ktore sklada sie framework nad ktorym pracuje. Postanowilem wykorzystac mozliwosci PHP5 i wobec tego engine jest niemalze w calosci obiektowe. Mam nadzieje, ze rowniez czytelniejsze dla programisty.
Przede wszystkim oparte jest na bibliotekach/modulach, ktore wlaczamy. W configu aplikacji mozna ustalic jakie biblioteki beda wlaczane na starcie, czyli np.:
$autoload['library'] = array('config', 'input', 'error', 'lang', 'cache'); // itd...
$autoload['helper'] = array('url', 'form');
Helpery to jak zapewne wiadomo, dodatkowe pojedyncze funkcje ktore mozna wykorzystac w kodzie. Mozna pisac wlasne biblioteki i wlaczac je podczas dzialania programu jezeli beda potrzebne:
$core->load->library('foo');
Oczywiscie nadal bedzie funkcjonowac klasa template. Jezeli ktos ma ochote moze wykorzystywac ja do tworzenia szablonow.
Ja jednak oparlem nowy core o wzorzec MVC. Mamy wiec w katalogu z programem, katalogi:
- template (widoki)
- model (ew. modele)
- controller (kontrolery)
Mam tez mechanizm routingu, dzieki ktoremu we frameworku mozemy ustalic szczegoly zadania. Np. dla 4programmers konfig moze wygladac tak:
$config['route'][] = array(
'url' => 'login/:method',
'class' => 'login',
'method' => ':method',
'dir' => 'ucp'
);
$config['route'][] = array(
'url' => 'user/:id/:class/:method',
'class' => ':class',
'method' => ':method',
'default' => 'index',
'dir' => 'ucp'
);
$config['route'][] = array(
'url' => '*',
'class' => 'index',
'method' => 'main'
);
Mowiac najprosciej - jezeli user wejdzie poprzez URL: http://4programmers.net/Login zostaje skierowany do kontrolera /controller/ucp/login.php:
class login
{
public function main()
{ // funkcje logowania }
}
Jezeli user wchodzi poprzez http://4programmers.net/User/5656 - kierujemy do panelu usera. Wszystkie inne URL'e - np. 4programmers.net/Delphi/Gotowce kierowane sa do innego kontrolera, ktory odczytuje zawartosc artykulu.
Ok, ale mowilem o widokach. Ze mozna uzywac klasy template, ale testowalem po prostu z uzyciem zwyklych wstawek PHP:
<form action="" method="post">
Imie: <input type="text" name="name" value="<?= $core->validate->name; ?>" /><br/>
Wiek: <input type="text" name="age" value="<?= $core->validate->age; ?>" /><br/>
<input type="submit" name="submit" />
</form>
Natomiast w kontrolerze:
<?php
class login extends controller
{
function main()
{
$this->load->library('validate');
$this->load->helper('form');
if ($this->input->post('submit'))
{
$data = array(
'name' => array(
array('string', false, 5, 50),
array('email')
),
'age' => array('num', false, 2, 10)
);
if ($error = $this->validate->post($data))
{
echo $this->validate->error();
}
else
{
echo 'Dobrze';
exit;
}
}
$this->load->view('form');
}
?>
To taki przyklad ;) Kontroler sprawdza tutaj czy dane w _POST sa prawidlowe (ladujemy biblioteke validator), czyli pole "name" musi byc stringiem o dlugosci 5-50 i dodatkowo prawidlowym adresem e-mail [diabel] Jezeli wszystko ok, wyswietlamy komunikat "Dobrze".
A czemu w kontrolerze jest takie cos:
value="<?= $core->validate->name; ?>" />
Jezeli uzytkownik zle wpisze swoj wiek, a dobrze imie, formularz zostanie przeladoawny, a jako value bedzie wpisana wartosc (zeby nie trzeba bylo drugi raz przepisywac ;)). Mam nadzieje, ze nowa wersja Coyote pozwoli szybko pisac kolejne moduly, tak aby przyspieszyc rozwoj.
Dlugie przez caly czas przy tym, zapewne troche potrwa zanim obecny kod przepisze pod nowe jadro. Wowczas umieszcze na serwer i ew. do CVS w osobnej galezi zeby nie kolidowalo z obecna wersja.
Myslalem rowniez nad implementacja jakiegos prostego ORM. Chodzi mi o proste operacje typu: "dodaj komentarz", "edytuj komentarz", "usun komentarz". Zeby nie trzeba bylo pisac zapytan za kazdym razem do tego.