Framework CodeIgniter guida alla creazione di un blog

sabato, marzo 15, 2008 18:55 scritto da neryo

Guida alla creazione di un blog con il framework codeigniter

Ecco a voi un’altro tutorial di sviluppo web, piú complesso rispetto al precedente, utilizzando il framework CodeIgniter. Questa guida é una bozza per la creazione di un semplice blog sfruttando le potenzialitá di questo versatile e potente framework, che come sappiamo stá maturando sempre piú interesse nel mondo dagli sviluppatori del web che credono fermamente nel pattern di sviluppo MVC.

Questo tutorial ha preso spunto quasi interamente dal tutorial di Michael Wales “Live tutorial codeigniter blog”, il quale presenta secondo me alcuni errori e imprecisioni, come ad esempio il non utilizzo delle classi che estendono il Model per fare interfacciarsi al database (pattern MVC), implementate in modo “sporco” direttamente all’interno del controller.
Inoltre ho esteso qualche funzionalitá non implementata come: la visione dei singoli post del blog, i commenti sui post, il logout.. ecc


Come al solito per iniziare a programmare scaricate il pacchetto di codeigniter sul sito ufficiale, al momento giunto alla versione 1.6.1 e scompattate tutto il contenuto dentro la cartella principale del vostro web server (solitamente htdocs), e rinominate la cartella in myblog.

Configurazioni del framework

Dentro la cartella system/application/config apportate le seguenti modifiche di configurazione ai files del framework, facendo particolare attenzione nei paramentri di configurazione del database che potrebbero differire da quelli che vi ho postato. Per capire cosa sono queste variabili consultate i commenti all’interno dei file di configurazione o fate riferimento diretto al manuale ufficiale di codeigniter.

autoload.php

  1. $autoload[‘libraries’] = array(‘database’, ’session’);
  2. $autoload[‘helper’] = array(‘url’, ‘form’);

config.php:

  1. $config[‘base_url’]    = "http://localhost/myblog";
  2. $config[‘log_threshold’] = 1;
  3. $config[‘encryption_key’] = "myblog";
  4. $config[’sess_cookie_name’]        = ‘myblog_sess’;
  5. $config[’sess_expiration’]        = 0;
  6. $config[’sess_encrypt_cookie’]    = TRUE;
  7. $config[‘global_xss_filtering’] = TRUE;
  8. $config[‘compress_output’] = TRUE;

database.php

  1. $db[‘default’][‘hostname’] = "localhost";
  2. $db[‘default’][‘username’] = "root";
  3. $db[‘default’][‘password’] = "";
  4. $db[‘default’][‘database’] = "myblog";

routes.php

  1. $route[‘default_controller’] = "blog";

Creazione del database del nostro blog (myblog)

Questo é il dump del mio database mysql, contenente le query di creazione delle tabelle necessarie e alcuni dati.

  1. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
  2.  
  3. CREATE TABLE `comments` (
  4. `id` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  5. `post_id` smallint(5) UNSIGNED NOT NULL,
  6. `name` varchar(60) collate latin1_general_ci NOT NULL,
  7. `email` varchar(100) collate latin1_general_ci NOT NULL,
  8. `body` text collate latin1_general_ci NOT NULL,
  9. `created_on` varchar(10) collate latin1_general_ci NOT NULL,
  10. PRIMARY KEY  (`id`),
  11. KEY `post_id` (`post_id`)
  12. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci COMMENT=‘Comments on Posts’ AUTO_INCREMENT=1 ;
  13.  
  14. CREATE TABLE `posts` (
  15. `id` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  16. `title` varchar(255) collate latin1_general_ci NOT NULL,
  17. `slug` varchar(255) collate latin1_general_ci NOT NULL,
  18. `author_id` smallint(5) UNSIGNED NOT NULL,
  19. `body` text collate latin1_general_ci NOT NULL,
  20. `created_on` varchar(10) collate latin1_general_ci NOT NULL,
  21. PRIMARY KEY  (`id`),
  22. KEY `author_id` (`author_id`)
  23. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci COMMENT=‘Blog Posts’ AUTO_INCREMENT=5 ;
  24.  
  25. INSERT INTO `posts` (`id`, `title`, `slug`, `author_id`, `body`, `created_on`) VALUES
  26. (1, ‘test1′, ‘test1′, 1, ‘test’, ‘1205594625′),
  27. (2, ‘test2′, ‘test2′, 1, ‘test2′, ‘1205594637′),
  28. (3, ‘test3′, ‘test3′, 1, ‘test3′, ‘1205594651′),
  29. (4, ‘test4′, ‘test4′, 1, ‘test4′, ‘1205596145′);
  30.  
  31. CREATE TABLE `users` (
  32. `id` smallint(2) UNSIGNED NOT NULL AUTO_INCREMENT,
  33. `username` varchar(20) collate latin1_general_ci NOT NULL,
  34. `password` varchar(100) collate latin1_general_ci NOT NULL,
  35. `email` varchar(100) collate latin1_general_ci NOT NULL,
  36. `display_name` varchar(40) collate latin1_general_ci NOT NULL,
  37. PRIMARY KEY  (`id`)
  38. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci COMMENT=‘Registered Users Information’ AUTO_INCREMENT=3 ;
  39.  
  40. INSERT INTO `users` (`id`, `username`, `password`, `email`, `display_name`) VALUES
  41. (1, ‘admin’, ‘admin’, , ),
  42. (2, ‘test’, ‘test’, ‘test@test.it’, ‘test’);

Importate questo database come preferite, tramite phpmyadmin o tramite la shell di mysql utilizzando il comando source. Vi ho inserito alcuni dati cosí potete subito visualizzare alcuni post e loggarvi e rendervi conto subito del funzionamento dell’applicazione.

Partiamo innanzitutto con il controller principale ovvero la classe blog che come abbiamo settato parte di default al momento dell’avvio di questa applicazione. Questa classe di nome blog.php andrá salvata all’interno di system/application/controllers.

  1. < ?php
  2.  
  3. if (!defined(‘BASEPATH’)) exit(‘No direct script access allowed’);
  4.  
  5. class Blog extends Controller {
  6.  
  7. // costruttore
  8. function Blog() {
  9.   parent::Controller(); //richiama il costruttore padre
  10. }
  11.  
  12. // funzione principale che richiama la vista principale front con la lista dei post
  13. function index() {
  14.  
  15.   // parametri per il titolo del blog
  16.   $data[‘title’] = "Questo e’ il mio blog";
  17.   $data[‘heading’] = "Header del mio blog";
  18.  
  19.   if ($this->session->userdata(‘logged_in’)) {
  20.     $data[‘user’][‘logged_in’] = TRUE;
  21.   } else {
  22.     $data[‘user’][‘logged_in’] = FALSE;
  23.   }
  24.  
  25.   $this->load->database();
  26.   $this->load->model(‘blog_model’); // richiamo il modello
  27.  
  28.   $data[‘posts’] = $this->blog_model->get_posts();
  29.  
  30.   $this->load->view(‘blog/front’, $data);
  31. }
  32.  
  33. // Metodo per visualizzare un post del blog
  34. function article($id = false) {
  35.  
  36.   $this->load->helper(‘url’);
  37.  
  38.   if (!$id) redirect(‘blog’);
  39.  
  40.   $this->load->database();
  41.   $this->load->model(‘blog_model’);
  42.  
  43.   $data[‘blog’] = $this->blog_model->get_post($id);
  44.  
  45.   $this->load->view(‘blog/article’, $data);
  46. }
  47.  
  48. // metodo per l’inserimento di un post nel blog
  49. function write() {
  50.  
  51.   if ($this->session->userdata(‘logged_in’) === FALSE) {
  52.   redirect(‘blog’);
  53. }
  54.  
  55.  $this->load->library(‘validation’); // libreria per i controlli sui campi
  56.  
  57.  $rules[‘title’] = ‘trim|required|min_length[3]|max_length[255]‘;
  58.  $rules[‘body’] = ‘trim|required’;
  59.  $this->validation->set_rules($rules);
  60.  
  61.  $fields[‘title’] = ‘title’;
  62.  $fields[‘body’] = ‘body’;
  63.  $this->validation->set_fields($fields);
  64.  
  65. if ($this->validation->run()) { // se tutto e’ valido
  66.   $this->load->helper(‘date’);
  67.  
  68.  // array di dati in post
  69.  $insert = array(
  70.    ‘title’ => $this->input->post(‘title’),
  71.    ’slug’ => url_title($this->input->post(‘title’)),
  72.    ‘author_id’ => $this->session->userdata(‘logged_in’),
  73.    ‘body’ => $this->input->post(‘body’),
  74.    ‘created_on’ => now()
  75.  );
  76.  
  77.   $this->db->insert(‘posts’, $insert);
  78.   redirect(‘blog’);
  79.  
  80. } else {
  81.   $this->load->view(‘blog/write’);
  82. }
  83. }
  84.  
  85. function comments(){
  86.  
  87.   $this->db->where(‘post_id’, $this->uri->segment(3));
  88.   $data[‘query’] = $this->db->get(‘comments’);
  89.   $this->load->view(‘blog/comments’, $data);
  90. }
  91.  
  92. function comment_insert(){
  93.  
  94.    $this->db->insert(‘comments’, $_POST);
  95.    redirect(‘blog/comments/’.$_POST[‘post_id’]);
  96. }
  97.  
  98. }
  99.  
  100. ?>

Come potete vedere rispetto al tutorial di Michael, la parte relativa all’interfacciamento al database, é stata delegata ad un’altra classe chiamata “Blog_model” che estende naturalmente la classe di default “Model”, rispettando quindi quello che il pattern MVC consiglia di fare; inoltre ho inserito due metodi per la gestione dei commenti sui post del blog: uno per la visualizzazione e uno per l’inserimento di nuovi commenti.
Il nome del file che si interfaccia al database per la lettura dei post del blog é blog_model.php e sará contenuto, come potete immaginare, nella cartella system/application/models/.

  1. < ?php
  2.  
  3. if (!defined(‘BASEPATH’)) exit(‘No direct script access allowed’);
  4.  
  5. class Blog_model extends Model {
  6.  
  7.  // preleva tutti i post dal db
  8.  function get_posts() {
  9.  
  10.    $query = $this->db->get(‘posts’);
  11.  
  12.    foreach ($query->result_array() as $row){
  13.     $result[] = $row;
  14.    }
  15.  
  16.  return $result;
  17. }
  18.  
  19. // preleva un singolo post
  20. function get_post($post_id) {
  21.  
  22.   $query = $this->db->where(‘id’, $post_id)->get(‘posts’);
  23.   $result = $query->row_array();
  24.  
  25.  return $result;
  26.  }
  27.  
  28. }
  29.  
  30. ?>

Ora passiamo alle parte di viste che vengono richiamate dal Blog controller, utilizzando i dati forniti dal modello attraverso l’interrogazioni del database. Questi files devono essere salvati nella cartella system/application/views/ dentro la sottocartella creata di nome blog/ .

front.php
E’ la vista principale, che ci permette di effettuare il login e visualizzare i post del blog.

  1.  
  2. <h1>< ?=$title;?></h1>
  3.  
  4.  
  5. <h2>< ?=$heading;?></h2>
  6.  
  7.  
  8. < ?php
  9.  
  10. if ($user[‘logged_in’] === TRUE) {
  11.  echo anchor(‘user/logout’, ‘Logout’);
  12.  echo
  13.  
  14.  
  15. < ?
  16. if(isset($posts)){
  17.  foreach ($posts as $id => $post) {
  18.    echo ‘Post #’ . $id . ‘: ‘;
  19.     echo anchor(‘blog/article/’ . $id, $post[‘title’]);
  20.     echo ;
  21.   }
  22. }
  23. ?>

write.php
La form per l’inserimento dei post del blog, accessibile come possiamo vedere dal controller solo agli utenti autenticati.

  1. < ?= form_open(‘blog/write’); ?>
  2.  
  3. <label for="title">Title:</label>
  4. <input id="title" name="title" size="50" type="text" />
  5.  
  6. <label for="body">Body:</label>
  7. <textarea id="body" cols="60" rows="10" name="body"></textarea>
1 Stella2 Stelle3 Stelle4 Stelle5 Stelle (1 voti, media: 5,00 di 5)
Loading ... Loading ...

8 Risposte a “Framework CodeIgniter guida alla creazione di un blog”

  1. CheCk dice:

    16-03-2008 alle 15:37

    Veramente interessante questo tutorial.. come anche il precedente… da tenere assolutamente in considerazione!

  2. Simona dice:

    28-04-2008 alle 12:29

    Hello
    I’ve followed your tutorial but when I finally finish it and try to test it, I get a strange error:
    Fatal error: ob_start() [ref.outcontrol]: Cannot use output buffering in output buffering display handlers in C:\Program Files\xampp\htdocs\blog\system\libraries\Exceptions.php on line 160

    Any idea why? Could you please help?
    Thanks

  3. wdex dice:

    12-05-2008 alle 18:31

    Ho lo stesso errore anch’io.
    ———————————–
    I have the same error.

  4. wdex dice:

    12-05-2008 alle 18:50

    ho sostituito
    $config['compress_output'] = TRUE;
    con
    $config[‘compress_output’] = FALSE;

    e funziona.

  5. Nereigric dice:

    15-05-2008 alle 05:52

    Hello my friends :) ;)

  6. sebastiano dice:

    07-06-2008 alle 19:30

    la login non funziona da sempre l errore ….. non riesco a capire perchè…..probabilemte cè un errore nella logica oppure sono io che sbaglio… puoi aiutarmi???

  7. admin dice:

    07-06-2008 alle 19:39

    sicuramente hai sbagliato qlc, io il blog ce l ho funzionante.. comunque senza sapere che errore ti da non riesco ad aiutarti.. neryo

  8. cAr dice:

    09-12-2008 alle 17:17

    ho il seguente problema?

    Parse error: syntax error, unexpected $end in C:\wamp\www\CodeIgniter\system\application\views\blog\front.php on line 17

    grazie mille

Lascia una commento

(*) campi obbligatori

Spam protection by WP Captcha-Free