75%
25%

Tokrat bom opisal eno preprosto uporabo pagerja v CakePHP aplikaciji. Primer bom navedel za novice. Recimo da hočemo na eni strani po 5 novic razvrščenih po datumu.

Na svežo si skopiramo nekam najnovejšo različico CakePHP frameworka. Jaz sem si dal zadevo v direktorij “cakephp”. Kam boste dali sami je vaša odločitev.

V app/config/core.php spremenimo vrednost konstante CAKE_SESSION_STRING v nek drug poljuben random string. To nam sistem tudi napiše. Imeti morate tudi pisljiv app/tmp direktorij.

Gremo k bistvu. Naredimo bazo. V bazi naredimo tabelo news z naslednjimi polji:

  1. CREATE TABLE `news` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `title` varchar(35) NOT NULL,
  4. `flash` text NOT NULL,
  5. `content` text NOT NULL,
  6. `hidden` tinyint(1) NOT NULL,
  7. `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  8. PRIMARY KEY (`id`),
  9. FULLTEXT KEY `content` (`content`),
  10. FULLTEXT KEY `flash` (`flash`)
  11. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Lahko bi uporabil samo id, title, content, created polja vendar sem zaradi nadlanjih zapisov tabelo malce razširil da se nebo treba takrat matrati :)

Sedaj preimenujemo app/config/database.php.default v database.php. V database.php nastavite vse potrebne podatke za povezavo do vaše baze.
Primer:

  1. class DATABASE_CONFIG {
  2.  
  3. var $default = array(
  4. 'driver' => 'mysql',
  5. 'persistent' => false,
  6. 'host' => 'localhost',
  7. 'login' => 'username_za_dostop_do_vase_baze',
  8. 'password' => 'geslo',
  9. 'database' => 'ime_vase_baze',
  10. 'prefix' => ''
  11. );
  12. }

F5 in sistem bi vam moral izpisati da se je uspešno povezal do vaše baze => “Your database configuration file is present.”. V primeru napake vam bo to sistem lepo povedal :)

Naredimo file app/app_controller.php. In dodamo vanj naslednje:

  1. < ?php
  2.  
  3. class AppController extends Controller {
  4.  
  5. public $ext = '.tpl';
  6.  
  7. }
  8.  
  9. ?>

Kaj nam app_controller.php omogoča ? Omogoča nam da v aplikaciji nastavimo neke nastavitve na neko vrednost ki jo hočemo da je veljavna povsod in ne samo v določenem kontrolerju. S spremenljivko $ext nastavimo končnico za template “.tpl”. Po defaultu uporablja sistem .ctp. Ta korak vam ni treba narediti vendar morate template ustvariti z .ctp končnico namesto .tpl.

Naredimo kontroler. app/controllers/news_controller.php
V news_controller.php file damo naslednje:

  1. < ?php
  2.  
  3. class NewsController extends AppController {
  4. public $name = 'News';
  5. public $uses = array('News');
  6.  
  7. public function index()
  8. {
  9.  
  10. }
  11. }
  12.  
  13. ?>

Naredimo model models/news.php. Dodamo naslednje:

  1. < ?php
  2.  
  3. class News extends AppModel {
  4. public $name = 'News';
  5. }
  6.  
  7. ?>

Naredimo tepmlate za prvo stran pri novicah app/views/news/index.tpl. Sedaj gremo na http://vas.host.name/direktorij_kjer_je_cakephp/news/. Če je kaj pravice na svetu potem nebi smeli dobiti nobenega error-ja.

Dodajmo nekaj vnosov v tabelo news.

  1. INSERT INTO `news` VALUES (1, 'Novica 1', 'Uvod za novico 1', 'Glavno besedilo za novico 1', 0, '2007-08-04 19:31:53');
  2. INSERT INTO `news` VALUES (2, 'Novica 2', 'Uvod za novico 1', 'Glavno besedilo za novico 2', 0, '2007-08-04 19:31:53');
  3. INSERT INTO `news` VALUES (3, 'Novica 3', 'Uvod za novico 3', 'Glavni opis za novico 3', 0, '2007-08-04 19:32:52');
  4. INSERT INTO `news` VALUES (4, 'Novica 4', 'Uvod za novico 4', 'Glavni opis za novico 4', 0, '2007-08-01 19:32:52');
  5. INSERT INTO `news` VALUES (5, 'Novica 5', 'Uvod za novico 5', 'Glavni opis za novico 5', 0, '2007-08-01 19:33:53');
  6. INSERT INTO `news` VALUES (6, 'Novica 6', 'Uvod za novico 6', 'Glavni opis za novico 6', 0, '2007-08-04 19:33:53');
  7. INSERT INTO `news` VALUES (7, 'Novica 7', 'Uvod za novico 7', 'Glavno besedilo za novico 7', 0, '2007-07-04 19:31:53');
  8. INSERT INTO `news` VALUES (8, 'Novica 8', 'Uvod za novico 8', 'Glavno besedilo za novico 8', 0, '2007-08-04 19:31:53');
  9. INSERT INTO `news` VALUES (9, 'Novica 9', 'Uvod za novico 9', 'Glavni opis za novico 9', 0, '2007-08-04 19:32:52');
  10. INSERT INTO `news` VALUES (10, 'Novica 10', 'Uvod za novico 10', 'Glavni opis za novico 10', 0, '2007-06-04 19:32:52');
  11. INSERT INTO `news` VALUES (11, 'Novica 11', 'Uvod za novico 11', 'Glavni opis za novico 11', 0, '2007-08-02 19:33:53');
  12. INSERT INTO `news` VALUES (12, 'Novica 12', 'Uvod za novico 12', 'Glavni opis za novico 12', 0, '2007-08-03 19:33:53');

V kontrolerju pridobimo podatke in vključimo pager in nato prikažimo zapise v index.tpl.

V news_controller.php dodajmo:

  1. public $paginate = array('limit' => 5, 'page' => 1);

V index() funkcijo dodajmo naslednje:

  1. $this->paginate['order'] = array('created' => 'desc');
  2. $this->set('News', $this->paginate('News'));

V prvi vrstici povemo pager-ju da naj rezultate sortira po polju created v padajočem načinu. V drugi vrstici pridobimo podatke iz baze in jih podamo v template index.tpl. V index.tpl bodo novice v $News spremenljivki.

Sedaj bi moral news_controller.php izgledati nekako takole:

  1. < ?php
  2.  
  3. class NewsController extends AppController {
  4. public $name = 'News';
  5. public $uses = array('News');
  6. public $paginate = array('limit' => 5, 'page' => 1);
  7.  
  8. public function index()
  9. {
  10. $this->paginate['order'] = array('created' => 'desc');
  11. $this->set('News', $this->paginate('News'));
  12. }
  13. }
  14.  
  15. ?>

Prikažimo podatke in pager v index.tpl.

V index.tpl:

  1. <table cellpadding="0" cellspacing="0" width="50%">
  2. <tr style="font-weight: bold;">
  3. <td>Naslov</td>
  4. <td>Uvod</td>
  5. <td>Dodano</td>
  6. </tr>
  7. < ?php
  8. if(!empty($News)) {
  9. foreach ($News as $Item) { ?>
  10. <tr>
  11. <td>< ?php echo $Item['News']['title']; ?></td>
  12. <td>< ?php echo $Item['News']['flash']; ?></td>
  13. <td>< ?php echo $Item['News']['created']; ?></td>
  14. </tr>
  15. < ?php }} ?>
  16. </table>
  17.  
  18.  
  19. <div style="text-align: center;">
  20. < ?php echo $paginator->prev('Nazaj'); ?>
  21. < ?php echo $paginator->numbers(); ?>
  22. < ?php echo $paginator->next('Naprej'); ?>
  23. </div>

Evo, to je cela umetnost :) Mislim da vsi štekate kaj sem nareidl v index.tpl ? I hope so :)

Naslednjič bomo o dodajanju in urejanju novic, zato zadevo le shranite da nebo treba še enkrat delat ;)

Zadevo si lahko ogledate na http://www.linux-si.org/cakephp/news/

Uporabil:
PHP 5.2.3
MySQL 5
CakePHP cake_1.2.0.5427alpha
http://www.linux-si.org/cakephp/news/

P.S. Ne me jebat za kake morebitne slovnične napake :D

iNobl: 29% [?]