XP on Rails Extreme Programming Blog

17Mar/080

Storia di un rilascio

Venerdi finalmente sono riuscito a mettere online il sito bruttiserramenti.it .

Le sorprese sono arrivate subito: il provider non supporta le pretty url di CodeIgniter (

siteurl/index.php/controller/method

).

Le conseguenze:

* tornare alla confusa sintassi

siteurl/index.php?c=controller&m=method

(per fortuna configurabile in CodeIgniter settando un flag nel file config)

* rinunciare a tutti gli url helper, tipo

echo site_url("controller/method/id");
  • evitare di usare
redirect('/controller/method/', 'refresh');

nei controller.

* eliminare l’interfaccia di amministrazione JTabyBackend e riscrivere tutto a mano.

Per quanto riguarda la parte di amministrazione, il primo elemento da sviluppare era una libreria per una semplice autenticazione e gestione della sessione utente.
Spulciando un po’ su internet, ecco il risultato:

<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
 
 class SimpleAuth {
 
  var $CI;
 
  function SimpleAuth() {
    $this->CI =& get_instance();
    $this->CI->load->database();
    $this->CI->load->library('session');
  }
 
  /**
   * Attempt to login using the given condition
   *
   * Accepts an associative array as input, containing login condition
   * Example: $this->simpleauth->try_login(array('username'=>$username, 'password'=>dohash($password)))
   *
   * @access  public
   * @param array login conditions
   * @return  boolean
   */

  function try_login($condition = array()) {
    $this->CI->db->select('id');
    $query = $this->CI->db->getwhere('users', $condition, 1, 0);
    if ($query->num_rows != 1) {
      return FALSE;
    } else {
      $row = $query->row();
      $this->CI->session->set_userdata(array('user_id'=>$row->id));
      return TRUE;
    }
  }
 
 
  /**
   * Attempt to login using session stored information
   *
   * Example: $this->simpleauth->try_session_login()
   *
   * @access  public
   * @return  boolean
   */

  function try_session_login() {
    if ($this->CI->session->userdata('user_id')) {
      $query = $this->CI->db->query('SELECT COUNT(*) AS total FROM users WHERE id = ' . $this->CI->session->userdata('user_id'));
      $row = $query->row();
      if ($row->total != 1) {
        // Bad session - kill it
        $this->logout();
        return FALSE;
      } else {
        return TRUE;
      }
    } else {
      return FALSE;
    }
  }
 
  /**
   * Logs a user out
   *
   * Example: $this->simpleauth->logout()
   *
   * @access  public
   * @return  void
   */

  function logout() {
    $this->CI->session->set_userdata(array('user_id'=>FALSE));
  }
 
?>

Una volta implementato il meccanismo di

login / logout

, mettere in piedi un controller ad uso esclusivo di utenti loggati è stato abbastanza semplice.

Infine, per implementare il CRUD delle news è bastato sfruttare la struttura Model di CodeIgniter.

<?php

class News extends Model {

    var $id = '';
    var $title  = '';
    var $body = '';
    var $created  = '';

    function News() {
      // Call the Model constructor
      parent::Model();
    }
   
    function get($id) {
      $query = $this->db->getwhere('news',array('id'=>$id));
      return $query->row_array();          
    }

     
    function insert_entry() {    
      $data = array(
             'title'=>$this->input->post('title'),
             'body'=>$this->input->post('body'),
             'created'=>date("Y-m-d H:m:s"),
             );

      $this->db->insert('news', $data);
    }

    function update_entry() {
      $data = array(
             'title'=>$this->input->post('title'),
             'body'=>$this->input->post('body'),
              );
      $this->db->where('id',$this->input->post('id'));
      $this->db->update('news', $data);
    }
   
    function delete_entry() {
      $data = array('id'=>$this->input->post('id'));
      $this->db->delete('news', $data);
    }
   
}

?>
10Feb/080

CodeIgniter

CodeIgniter is a powerful PHP framework with a very small footprint, built for PHP coders who need a simple and elegant toolkit to create full-featured web applications. If you’re a developer who lives in the real world of shared hosting accounts and clients with deadlines, and if you’re tired of ponderously large and thoroughly undocumented frameworks

Con queste parole, il team di CodeIgniter introduce il loro framework.
In effetti, devo dire che l’introduzione è veramente azzeccata.

CodeIgniter semplifica notevolmente lo sviluppo di applicazioni web di piccole dimensioni, fornendo allo sviluppatore strumenti essenziali come:

* struttura MVC
* possibilità di definire helpers custom
* possibilità di definire librerie custom
* scaffolding
* configurazione ridotta al minimo
* fast deploy (basta copiare il progetto sul server)
* documentazione veramente completa e dettagliata
* grande comunità di sviluppatori alle spalle

Gli aspetti che più mi hanno colpito e soddisfatto del framework sono senza dubbio la documentazione e la comunità di sviluppatori che gli gira intorno.
Grazie a loro ho infatti potuto includere nel mio sito una libreria per il templating delle pagine e un’ altra per l’autenticazione degli utenti (oltre allo scaffolding delle news come amministratore), abbattendo enormemente i tempi di sviluppo.

Devo dire che con una breve ricerca nell’help o nel Wiki, è possibile trovare qualsiasi informazione si possa avere di bisogno.

Concludendo, CodeIgniter mi ha molto soddisfatto e lo consiglierei a chiunque debba sviluppare un sito web in PHP.