.: HosiriS :.

Informatica e non solo

Archive for the ‘ToDoList’ Category

ToDoList con PHP e SQLite

Posted by hosiris su marzo 2, 2011

Quando ci si impegna nello sviluppo di una applicazione bisogna, come prima cosa, decidere gli strumenti da usare… reputo inutile sparare ad una mosca con un cannone, come è rischioso pescare squali con una canna da 2 metri. Bisogna, quindi, perdere del tempo per effettuare le giuste scelte.
Per questo motivo, nella realizzazione di una semplice todolist, ho deciso di usare PHP unito a SQLite: la mole di dati sarà molto bassa e l’applicazione server mi permette di accedere alla lista da qualsiasi posto io mi trovi.
Ma cominciamo con calma, vediamo alcuni concetti base per iniziare ad utilizzare un database di tipo SQLite.

SQLite è una applicazione cross platform scritta in C che fornisce la possibilità di organizzare i dati senza l’utilizzo di applicazioni server (come MySQL o Oracle). Concettualmente lavorare con un database di questo tipo, equivale ad aprire un file e scrivere i dati all’interno.
La sintassi è molto simile al linguaggio SQL, quindi non ci saranno novità in questo senso.

La prima cosa da fare è quella di abilitare i moduli php per utilizzare questa tecnologia, su ubuntu è estremamanete semplice perchè installando le librerie verrà automaticamente modificato il php.ini:

$ sudo apt-get install php5-sqlite

Adesso possiamo iniziare a programmare la nostra applicazione. Svilupperemo i componenti principali di un sistema CRUD (al momento ho sviluppato in maniera procedurale, ma sto già lavorando ad un classe specifica):

  • createdb.php: codice per la creazione del db e delle tabelle;
  • insertdata.php: codice per l’inserimento dei dati;
  • selectdata.php: codice per la selezione dei dati dal db;
  • editdata.php: modifica dei dati;
  • deletedata.php: per rimovere dati dal db

Inizializzare un db SQLite vuol dire accedere ad una risorsa, non ad un servizio, nel seguente modo:

$dbLink = sqlite_open("todolistdb.sqlite");
if(!is_resource($dbLink)){
    die ("ERRORE NELLA CREAZIONE DEL DATABASE");
}

Una volta che è stato aperto, possiamo eseguire la query per la creazione del DB:

    $query = "    CREATE TABLE items(
                    id_item INTEGER PRIMARY KEY,
                    item VARCHAR(50),
                    description TEXT,
                    ins_date DATE
                );";
    if(!@sqlite_query($dbLink, $query)){
        die("ERRORE NELLA CREAZIONE DELLA TABELLA") ;
    }

Credo sia inutile scrivere ogni query… il concetto di come funziona il tutto dovrebbe essere chiaro.
Il risultato sarà una cosa del genere:

Allego anche il codice php che comprende tutte le funzioni descritte prima.

DOWNLOAD TODOLIST

Annunci

Posted in PHP, Progetti Personali, Programmazione, SQLite, ToDoList | Leave a Comment »

Evviva le torte, ovvero ora tocca a CakePHP

Posted by hosiris su dicembre 26, 2010

A forza di suonare sinfonie ti vien fame, no (;P)? E quindi mi sono buttato a capofitto nello studio di CakePHP.
Certamente non ho le competenze per poter dare giudizi obiettivi, ma posso riferire quelle che sono le espressioni di un utente. A prima vista CakePHP sembra una applicazione molto più semplice di Symfony, la distinzione tra i vari componenti MVC è più netta rendendo più lineare la logica di programmazione. D’altro canto, Symfony è molto potente, rendendo possibile ogni progetto complesso. In conclusione non ho una preferenza e sono felice di portare nel mio bagaglio di conoscenze entrambi questi strumenti.
Voglio però riproporre un progetto che tempo fa sviluppai usando Symfony: la ToDo List. La versione di cake che sto utilizzando è la 1.3 e per l’installazione rimando alle guide che stanno sul sito. Una volta scompattato il tutto ci troviamo di fronte ad una semplice architettura. La cartella più importante è la app, all’interno della quale troviamo cartelle riguardanti le configurazioni, controller, model e view.
Cominciamo con il configurare la connessione al DB. Apriamo il file app/config/database.php (rinomiamo quello esistente) e modifichiamolo come segue:

<?php
class DATABASE_CONFIG {
  var $default = array(
    'driver' => 'mysql',
    'persistent' => false,
    'host' => 'localhost',
    'port' => 3306,
    'login' => 'user',
    'password' => 'pass',
    'database' => 'db',
  );
}
?>

Creiamo il nostro database con una tabella (items) composta da:

id: primary key;
item: varchar(255);
description: text;
created_at
modified_at

Se ricordate a questo punto con Symfony avremmo creato applicazioni e moduli, i modelli venivano automaticamente generati dalla stessa applicazione. Con CakePHP, per lo meno in questa fase di conoscenza, creeremo manualmente i modelli (in questo caso parliamo di una sola tabella, quindi niente di complesso). Spostiamoci nella cartella app/controllers e creiamo il file items_controller.php:

<?php
class ItemsController extends AppController {
  var $name = 'Items';
  var $scaffolds;
}
?>

salviamo e spostiamoci in app/models e creiamo un file chiamato item.php:

<?php
class Item extends AppModel {
  var $name = 'Item';
  var $displayField = 'item';
}
?>

Immagino che già vi è passata la voglia… allora vi consiglio di andare con il vostro browser alla pagina http://vostrosito/items 😀 Siete stupiti vero?
è tutto praticamente pronto… tutto funziona ed il segreto sta all’interno della variabile $scaffolds. Ho scelto di iniziare dalla via difficile (che poi tanto difficile non è) perchè vorrei trasmettere la mia abitudine di sprofondare all’interno delle cose. Il motivo è semplice, se si comprendo i meccanismi di base non ci sarà più niente che potrà fermarci.
Continuando a leggere il manuale di cake comincerete a migliorare la vostra applicazione, conoscerete gli standard sul naming, conoscerete come trattare le view e come aggiungere azioni al controller.

Vien da se che il prossimo progetto che rivedrò sarà GLiAr, anche qui il motivo è semplice… purtroppo non sono riuscito a trovare supporto per imparare a gestire le relazioni molti a molti e CakePHP mi ha reso possibile questa attività dopo solo 1 ora di studio…

Buon divertimento.

Posted in CakePHP, CMS&MVC, Progetti Personali, Programmazione, ToDoList | Leave a Comment »

Symfony: amministriamo le nostre attività

Posted by hosiris su aprile 25, 2010

Ci siamo divertiti con le prime basi di Symfony. La mia applicazione brutta era e brutta e rimasta… senzo estetico proprio zero, ma son felice lo stesso perchè tutto funziona.
Adesso non rimane che soddisfare gli ultimi punti delle nostre specifiche: il pannello amministrativo. Avendo a che fare con una applicazione così semplice la creazione della sezione amministrativa è cosa da poco; cominciamo col creare una nuova applicazione e il modulo di backend:


$ ./symfony generate:app backend
$ ./symfony propel:generate-admin backend todo --module=todo

andando all’indirizzo http://todo/backend_dev.php/todo troverete una pagina che contiene i record inseriti nel db, con un pannello di gestione dei dati (tutto messo un pò a casaccio però).
Solo per rendere il pannello più accettabile diamo il comando:


$ ./symfony plugin:publish-assets

ricaricando la pagina, vedrete un ambiente molto più amichevole e comprensibile 😉

Con questo concludo il progetto della todo list. Non volevo raggiungere risultati eccezionali, ma imparare i concetti base di questo framework… diciamoci che viste le potenzialità usarlo per una todo list… fa ridere! Credo che si può essere d’accordo sul fatto che con uno strumento così potente di possono gestire progetti molto più complessi.
Quindi passerò ad un progetto diverso, magari cercando di capire qualcosa anche di grafica, che prevederà maggiori tabelle nel DB e maggiori specifiche: un gestionale per libri e articoli.

PS: Convinto del fatto che in gruppo di impara di più, se ci fosse qualche altro niubbo di symfony oppure qualcuno a cui potrebbe interessare collaborare con me, ad esempio su progetti personali, contattatemi!

Posted in PHP, Progetti Personali, Programmazione, Symfony, ToDoList | Leave a Comment »

Symfony: il form di inserimento.

Posted by hosiris su aprile 22, 2010

Oggi andiamo a modificare il form di inserimento dell’attività. Quando abbiamo creato il progetto Symfony ha creato automaticamente il form, ma come potete vedere sono presenti tutti i campi, invece a noi non interessa il campo completed, e vorremmo che il campo priority abbia una set di valori tra cui scegliere.
Le classi relativa al form sono contenute in lib/form, se aprite il file TodoForm.php non vedrete niente ed è in questo file che inseriremo le nostre personalizzazioni.
Cominciamo con il togliere il campo che indica il completamento dell’attività (da notare che per data ho inteso la data entro cui dovrebbe essere completata l’attività, se avete inteso la data di inserimento potete togliere anche quella):


class TodoForm extends BaseTodoForm{
  public function configure(){
    unset($this['completed']);
  }
}

Abbiamo detto anche di avere un insieme di valori predefiniti per la priorità, per cui apriamo lib/model/TodoPeer.php ed inseriamo:


class TodoPeer extends BaseTodoPeer{
  static public $priority = array(
    0 => 0,
    1 => 1,
    2 => 2,
    3 => 3,
    4 => 4,
    5 => 5,
    6 => 6,
    7 => 7,
    8 => 8,
    9 => 9
  );
// ...
}

ed aggiungiamo (al file lib/form/TodoForm.php):


//...
$this->widgetSchema['priority'] = new sfWidgetFormChoice(array(
  'choices' => TodoPeer::$priority,
  'expand' => false
  )
);
//...

Inoltre possiamo modificare le label, che al momento non sono altro che il nome dei campi del database:


//...
$this->widgetSchema->setLabels(
  array(
    'name' => 'Attività',
    'date' => 'Data conclusione',
    'priority => 'Priorità'
//...

inoltre impostiamo un helper per spiegare il significato del campo:


//...
$this->widgetSchema->setHelp('date', 'Rappresenta la data in cui si prevede che deve essere terminata l'attività.');
//...

Bene, adesso la classe è pronta! Non resta che modificare il template. L’azione che genera il form si trova in newSuccess.php e in editSuccess.php, entrambi i file fanno riferimento al partial _form, modifichiamo il file apps/frontend/modules/todo/templates/_form.php per rendere la grafiche più allettante.
Dalla prossima volta cominceremo ad analizzare le funzioni amministrative, ma prima voglio assimilare meglio tutto quello fatto fino ad adesso, aggiungerò dei css e del javascript!

Buona programmazione.

Posted in PHP, Progetti Personali, Programmazione, Symfony, ToDoList | Leave a Comment »

Symfony: giochiamo con MySQL

Posted by hosiris su aprile 21, 2010

Avete imparato a modificare le rotte? Avete raggiunto un risultato che vi piace?
Oggi analizziamo come personalizzare le query, perchè? Nelle specifiche volevamo che venissero mostrate solo le attività da completare e di mostrarle in ordine descrescente di priorità.
L’ORM Propel ci mette a disposizione un quantità elevata di strumenti (qui una guida), vediamo subito come usarli.

Aprite il file apps/frontend/modules/todo/actions/actions.class.php, notate come il metodo executeIndex() faccia uso di una classe di nome Criteria(). Questa ci permette di definire le query da eseguire.
Chiudete il file e apriamo lib/model/TodoPeer.php, apportiamo la seguente modifica:


class TodoPeer extends BaseTodoPeer{
  static public function getActive(){
    $criteria = new Criteria(); //creiamo l'istanza
    $criteria->add(self::COMPLETED, 0, Criteria::EQUAL); // aggiungiamo la clausola che ci permette di selezionare solo le attività incomplete
    $criteria->addDescendingOrderByColumn(self::PRIORITY); // aggiungiamo la condizione di ordinamento discendente
    return self::doSelect($criteria);
  }
}

Poi modifichiamo l’azione in modo da fare riferimento alla nuova funzione definita nel modello:


// apps/frontend/modules/todo/actions/action.class.php
...
public function executeIndex(sfWebRequest $request){
  $this->todos = TodoPeer::getActive();
}

Ed ecco raggiunti i nostri scopi in pochi passi.

Posted in PHP, Progetti Personali, Programmazione, Symfony, ToDoList | Leave a Comment »

Symfony: giorno di studio!

Posted by hosiris su aprile 20, 2010

Avete giocato un pò col codice? io mi sono sbizzarito un po’, ho fatto danni, ho dovuto ricominciare il progetto da capo… ma comunque spero abbiate notate che l’applicativo si può dire pronto. Certo è brutto, poco efficiente… e soprattutto lontane dalle specifiche che abbiamo definito ad inizio progetto, per questo tutto il lavoro che svolgeremo da adesso serve ad affinare il risultato.
Anzicchè scrivere oggi vi rimando a questo link, il motivo è molto semplice (e duplice): odio copiare ed inoltre è scritto molto bene già lì (perchè cercare di riscrivere?). Vi consiglio di leggerlo con calma, ci ho messo un po’ a comprenderne le dinamiche, ma una volta imparato non lo si dimentica più.

Farò invece degli esempi di applicazione della gestione delle rotte, solo per modificare un po’ l’aspetto dell’url.
Innanzitutto voglio fare in modo che quando accedo alla home del progetto non mi appaia il riquadro di benvenuto di symfony, ma la home di todo (il nome del progetto è orrendo… me ne devo inventare uno carino). Se avete letto la guida saprete che il file di configurazione si trova in apps/frontend/modules/todo/config/routing.yml, quindi apriamo il file e modifichiamo:


homepage:
  url: /
  param: { module: default, action: index }

in:


homepage:
  url: /
  param: { module: todo, action: index }

pulite la cache con ./symfony cc e da adesso per accedere alla home sarà sufficiente digitare http://todo/frontend_dev.php. Inoltre voglio modificare l’url in modo che quando clicco su una attività, mi appaia il nome dell’attività nell’indirizzo.
Modifichiamo sempre il file di routing, aggiungendo:


todo:
  url: /todo/:name
  param: { module: todo, action: show }

il fatto di aver messo :name implica l’aver inserito una variabile nell’url, non resta che dare un valore a questa variabile, quindi modifichiamo l’azione indexSuccess per fare in modo che venga passata la giusta variabile all’url:


// apps/frontend/modules/todo/templates/indexSuccess.php
...
<?php echo url_for('todo/show?id='.$todo-getId().'&name='.$todo->getName()) ?>
...

riaggiornate la cache, e provate a navigare tra le attività, noterete come nell’indirizzo apparirà il nome dell’attività.
Ci sono una marea di altre cose che è possibile fare. Leggendo la guida riuscirete a modificare ogni cosa a vostro piacimento.

Buona rotta.

Posted in PHP, Progetti Personali, Programmazione, Symfony, ToDoList | Leave a Comment »

Symfony: il modello

Posted by hosiris su aprile 19, 2010

Abbiamo iniziato a creare la nostra applicazione. Oggi analizzeremo il nostro modello, creando un opportuno database e generando le classi necesarie al funzionamento.
Comincaimo subito con l’editare il file di configurazione del database, se non conoscete il linguaggio YAML vi consiglio di dargli un’occhiata:


$ cd todo
$ vim config/schema.yml

e dentro incolliamo:


propel:
  todo:
    id: ~
    name: { type: varchar(255), required: true }
    date: { type: timestamp, required: true }
    description: { type: text}
    priority: { type: integer }
    completed: { type: boolean }

salvate, e passiamo alla creazione del DB. Suppongo che stiate usando mysql (comunque è possibile estendere tutto agli altri DBMS):


$ mysqladmin -uroot -p create todo
YoUrPaSs

Adesso dobbiamo avvisare symfony di quale db deve usare:


$ ./symfony configure:database "mysql:host=localhost;dbname=todo" root YoUrPaSs

Infine creiamo la struttura e le classi del modello:


$ ./symfony propel:build --all --no-confirmation

In questo modo troviamo tutto configurato. Adesso passiamo alla realizzazione di una visualizzazione. Creeremo un modulo che ci permetterà di vedere i dati presenti nel db.
Cominciamo subito col generare il modulo:


$ ./symfony propel:generate-module --with-show --non-verbose-templates frontend todo todo

Fatto questo, dal browser andate in http://localhost/frontend_dev.php/todo. Vedrete un interfaccia vuota. Provate a fare delle modifiche, agginugere attività.
Naturalmente ci si pone subito il problema di come modificare la vista, per rendere l’applicativo più presentabile.
Il layout viene generata dalla pagina apps/frontend/templates/layout.php. Potete sbizzarrirvi come volete nella gestione della interfaccia, io per il momento ho scritto solo questo:


<html>
  <head>
    <?php include_http_metas() ?>
    <?php include_metas() ?>
    <?php include_title() ?>
    <link rel="shortcut icon" href="/favicon.ico">
    <?php include_stylesheets() ?>
    <?php include_javascripts() ?>
  </head>
  <body>
    <div id="container">
      <div id="header"></div>
      <div id="content"><?php echo $sf_content; ?></div>
      <div id="footer"></div>
    </div>
  </body>
</html>

Applicando il seguente css:


// web/css/main.css
#header{
    border: 1px black solid;
}
#content{
    border: 1px black solid;
}
#footer{
    border: 1px black solid;
}

Noterete come questa interfaccia sarà sempre presente durante la navigazione. Se volessimo modificare le informazioni che vengono visualizzate, che file dobbiamo editare? Symfony usa un metodo molto intelligente per indicare un template associato ad una azione, usa nome dell’azione seguito da Success.
Per cui le informazioni che vengono mostrate nella prima pagina possono essere visualizzate in apps/frontend/modules/todo/templates/indexSuccess.php. Modificando questo file potrete modificare lo stile di visualizzazione.
Notiamo che è possibile applicare un diverso file css semplicemente usando uno dei metodi helper messi a disposizione: use_stylesheet();.

Direi che avete acquisito molte informazioni per sta volta. Provate a giochicchiare un pò, modificate il modello, modifica la vista… ed enjoy yourself!

Posted in PHP, Progetti Personali, Programmazione, Symfony, ToDoList | Leave a Comment »

Symfony: proviamo a fare una todo list – intro

Posted by hosiris su aprile 17, 2010

Qualche mese fa parlai di Symfony, poi non ho più avuto tempo di metterci le mani, ma adesso voglio provare a creare una semplice applicazione: un lista delle cose da fare!
Cominciamo col descrivere cosa vogliamo che l’applicazione faccia:

  • un utente che accede alla home page vede la lista delle attività da svolgere
  • ordinati in base alla priorità
  • ha la possibilità di selezionare le attività complete
  • le attività complete non vengono visualizzate
  • al click vengono visualizzati i particolari dell’attività
  • l’utente può aggiugere delle nuove attività
  • un admin può eliminare l’attività
  • un admin può modificare l’attività

Il nostro progetto prevederà due applicazioni: frontend e backend. Nella prima applicazione lavoreranno gli utenti, mantre nella seconda gli admin.

Abbiamo definito lo scenario e le applicazioni. Vediamo adesso la costruzione del DB. Sarà un modello molto semplice, con una tabella e pochi campi:

  • id: int, autoincrement, primary
  • name: varchar(255), required
  • data_in: datetime
  • description: text
  • priority: int
  • completed: boolean

Cominciamo con la parte pratica… tutta sta teoria m’ha fatto venire il mal di testa.
Creiamo la cartella del progetto:


$ mkdir -p todo/lib/vendor

e copiamo il pacchetto scaricato da symfony (ho usato la versione 1.4):


$ cd todo/lib/vendor
$ wget http://www.symfony-project.org/get/symfony-1.4.4.zip
$ unzip symfony-1.4.4.zip
$ mv symfony-1.4.4 symfony
$ rm symfony-1.4.4.zip

Vi consiglio di controllare che la configurazione di php sia ok:


$ php symfony/data/bin/check_configuration.php

ritorniamo alla cartella principale e creiamo il progetto:


$ cd ../..
$ php lib/vendor/symfony/data/bin/symfont generate:project todo --orm=Propel

A questo punto la vostra cartella di sarà popolata di tanta roba (non scappate, pian pianino capiremo come usare tutto). Creiamo subito la prima applicazione:


$ ./symfony generate:app frontend

Notate come generate:project ci abbia aiutati creando un file che ci evita di scrivere ogni volta il path completo.
A questo punto non ci rimane che impostare il web server in maniera da puntare al nostro progetto. Sulla guida di symfony sono descritti tre metodi, ma io uso solo un metodo per tutto quello che faccio: l’utilizza dei VirtualServer.
Per prima cosa diciamo al pc dove trovare il nome (a meno che non vogliate usare l’ip):


$ sudo vim /etc/hosts

Aggiungere una riga con scritto: 127.0.0.1 todo. Poi creiamo il file di configurazione:


$ cd /etc/apache2/sites-enabled/
$ sudo vim 001-todo

e buttateci dentro tutto quello che segue:


<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName todo
DocumentRoot /media/Volume/Progetti/todosf/web/
<Directory />
  Options FollowSymLinks
  AllowOverride None
</Directory>
<Directory /media/Volume/Progetti/todosf/web/>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride None
  Order allow,deny
  allow from all
</Directory>
Alias /sf /media/Volume/Progetti/todosf/lib/vendor/symfony/data/web/sf
<Directory "/media/Volume/Progetti/todosf/lib/vendor/symfony/data/web/sf">
  AllowOverride All
  Allow from All
</Directory>
</VirtualHost>

Questa è una configurazione minimale utile a far girare il progetto, chi conosce apache può aggiungere quello che vuole, ad esempio per il log degli errori… etc!
Salvate e riavviate il server. Adesso andando sul bowser e scrivendo http://todo, vi apparirà:

Con questo ci fermiamo per oggi! Se non conoscete Symfony vi consiglio di leggervi i primi 4 capitoli della guida! Vi farete le idee più chiare.

Posted in PHP, Progetti Personali, Programmazione, Symfony, ToDoList | Leave a Comment »