XP on Rails Extreme Programming Blog

31Mar/080

Frameworks Javascript

Quanto un framework javascript contribuisce al successo di una applicazione web?

Mi sono posto questa domanda qualche giorno fa, mentre stavo scribacchiando un po’ di codice per un social network Rails che ho iniziato a sviluppare.

Il problema si e’ posto non appena ho iniziato ad abbozzare lo studio dell’interfaccia. Per dare un aspetto moderno all’applicazione, il design della pagina doveva contenere:

* tab panels
* modal windows
* splash screens
* resize dinamico di elementi DOM

( Come e’ noto, Rails fornisce prototype come framework javascript. Questa libreria puo’ essere o non essere utilizzata nel proprio progetto, a patto di rinunciare alle magie degli helpers come

form_remote_tag

o dei file rjs.
Sinceramente non mi sento di approvare la scelta del core team di Rails di inculdere una libreria javascript di default. Penso che un framework dovrebbe essere javascript agnostic, in modo da garantire allo sviluppatore la scelta della libreria preferita. )

Questa digressione per giungere infine alla domanda di partenza: puo’ un framework javascript determinare il successo di un’applicazione web?

Secondo me si.

Le moderne applicazioni web 2.0 necessitano di interfacce sempre piu’ avanzate, intuitive, veloci e usabili.
Non e’ piu’ possibile al giorno d’oggi pensare di basare la propria interfaccia solo utilizzando css.
Come detto sopra, diventa necessario introdurre tab panels, splash screens, gallerie dinamice di immagini ecc. L’uso di AJAX poi diventa la discriminante per l’interazione veloce dell’utente.

Ecco dunque l’utilita’ dei framework javascript: fornire allo sviluppatore tutti gli strumenti necessari e le API per manipolare e attraversare il DOM della pagina, gestire eventi, realizzare effetti ecc.

La scelta della libreria da utilizzare diventa un fattore importante ed elemento chiave da valutare gia’ durante la pianificazione del progetto.
Il design dell’interfaccia a questo punto puo’ essere infatti definito anche in base a cio’ che il framework javascript fornisce.

Tagged as: No Comments
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);
    }
   
}

?>
10Mar/080

Rails Plugins

Una delle feature piu’ interessanti di Rails e’ senza dubbio il meccanismo dei plugin.

L’utilizzo di plugin permette infatti di estendere la propria applicazione aggiungendo in modo quasi trasparente funzionalita’ nuove sviluppate dalla comunita’ intorno a Rails.

Ecco una lista dei plugin indispensabili che ogni web application dovrebbe avere:

GENERALE:

* RESTful authentication

* Acts As Taggable On Steroids

* Acts as Ferret

* ACL System2 Ownership

BLOGGING:

* Acts As Blog

* acts_as_textiled

* WhiteList

* acts_as_commentable

GEOCODING:

* GeoKit

* YM4R/GM

ECOMMERCE:

* Active Merchant

TEMPLATING:

* Liquid

Tagged as: , No Comments