.: HosiriS :.

Informatica e non solo

Archive for the ‘GLiAr’ Category

G.Li.Ar: adattiamo le query

Posted by hosiris su Maggio 19, 2010

Pian pianino il nostro applicativo sta prendendo forma. Dalla bozza iniziale, funzionale, ma imperfetta, pezzo dopo pezzo stiamo raggiungendo ottimi risultati che, lo voglio sottolineare, non richiedono delle conoscenze pazzesche.
Oggi ci dedicheremo alle query di selezione dei dati dal DB. Se avete letto qualcosina su Symfony, saprete che la gestione del modello si appoggia sull’ORM Propel (nel nostro caso, c’è la possibilità di usare Doctrine) e sulla classe Criteria. Di default quando viene creato il modello, il framework genera automaticamento le query di base, ma come facciamo a modificarle per aggiungere ulteriori parametri? Dobbiamo aggiungere solo un po’ di codice alle classi esistenti, ma niente di sconvolgente.
Innanzitutto decidiamo cosa fare. Il mio intento è quello di ordinare alfabeticamente tutte le informazioni, per cui alle nostre query dovremmo aggiungere una condizione “Order By”.
Come nello scorso post, mostrerò come agire prendendo in esempio un solo file, ma bisogna lavorare su ogni modulo ed in particolare sui seguenti file:


lib/model/ArticoliPeer.php
lib/model/AutoriPeer.php
lib/model/CategoriePeer.php
lib/model/EditoriPeer.php
lib/model/LibriPeer.php
lib/model/RivistePeer.php

Apriamo il primo file, noteremo la presenza di una classe vuota (in realtà non lo è, per chi non conoscesse la programmazione ad oggetti la clausola “extends” implica il fatto che questa classe erediti i metodi da una classe madre). Aggiungiamo la seguente funzione:


static public function doOrder(){
  $criteria = new Criteria();
  $criteria->addAscendingOrderByColumn(self::TITOLO);
  return self::doSelect($criteria);
}

da notare l’ordinamento fatto sul campo “TITOLO”, questo va modificato nei vari moduli in base alla colonna da considerare.
Adesso dobbiamo dire al controller di far riferimento alla giusta funzione, quindi modificheremo, rispettivamente:


apps/frontend/modules/articoli/actions/actions.class.php
apps/frontend/modules/autori/actions/actions.class.php
apps/frontend/modules/categorie/actions/actions.class.php
apps/frontend/modules/editori/actions/actions.class.php
apps/frontend/modules/libri/actions/actions.class.php
apps/frontend/modules/riviste/actions/actions.class.php

andremo a modificare l’azione “executeIndex()” in modo che si richiami la nuova funzione, quindi:


public function executeIndex(sfWebRequest $request)
{
  $this->Articolis = ArticoliPeer::doOrder();
}

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

G.Li.Ar: modifichiamo gli URL

Posted by hosiris su Maggio 18, 2010

Forse questa di oggi è la parte più noiosa, ma deve essere fatta per migliorare il nostro applicativo: modificheremo il routing di GLiAr.
Innanzitutto andiamo a creare un nuovo modulo, che ci permetterà di definire la Home Page:


$ ./symfony generate:module main frontend

eliminiamo il codice contenuto nell’azione executeIndex() del nuovo modulo. Andando in “http://gliar/frontend_dev.php/main” vedrete che sarete reindirizzati su una pagina che ha la struttura da noi definita nel layout, ma vuota nel content; potete modificare la vista del nuovo modulo per fa vedere quello che volete.
Adesso preoccupiamoci di reindirizzare l’applicazione sul nuovo modulo, per fare questo dobbiamo modificare il file apps/frontend/config/routing.yml, modificando la rotta della home page in questo modo:


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

da questo momento sarà sufficiente visitare http://gliar/frontend_dev.php per ritrovarci di fronte alla homepage.
Ho modificato il file di layout aggiungendo il link alla home page e al modulo riviste (dimenticato la volta scorsa).
Attualmente l’url generato ha una forma poco leggibile, ma possiamo fare in modo che il risultato sia come il seguente:

e per farlo dobbiamo modificare nuovamente il file di routing (mostrerò gli esempi per un solo caso, ma questo va ripetuto per ogni modulo):


# apps/frontend/config/routing.yml
show_art:
  url: /articoli/:id/:titolo
  class: sfPropelRoute
  options: { model: Articoli, type: object }
  param: { module: articoli, action: show }
  requirements:
    sf_method: [get]

quello scritto corrisponde al dire a symfony di mostrare una url che abbia una forma del tipo “/articoli/:id/:titolo” dove con il formato “:+nome” diciamo a symfony di aspettarsi una variabile.
Fatto questo siamo costretti a modificare la vista del modulo per fare in modo che siano passati i giusti parametri:


<h2>Lista degli articoli</h2>
<table>
  <thead>
    <tr>
      <th>Titolo</th>
      <th>Data</th>
    </tr>
  </thead>
  <tbody>
    <?php foreach ($Articolis as $Articoli): ?>
    <tr>
      <td><a href="<?php echo url_for(array(
                                        'module' => 'articoli',
                                        'action' => 'show',
                                        'id'     => $Articoli->getId(),
                                        'titolo' => $Articoli->getTitolo(),
                                     )) ?>"><?php echo $Articoli->getTitolo() ?></a></td>
      <td><?php echo $Articoli->getData() ?></td>
    </tr>
    <?php endforeach; ?>
  </tbody>
</table>
<a href="<?php echo url_for('articoli/new') ?>">Aggiungi Articolo</a>

avrete notato il cambiamento di forma nell’helper “url_for”, questo perchè utilizzando questa metodologia possiamo rendere la chiamata più leggibile.
Scrivere l’intero codice mi sembra una cosa inutile che renderebbe il post illegibile, quindi vi fornisco due metodologie per accedere al codice:

1) SVN: svn co http://osiride.no-ip.org/svn/GLiAr
2) WEB: GLiAr

con il primo metodo, per chi non conoscesse svn, potrete scaricare l’intero progetto sul vostro pc ed inoltre vi permette di mantenere aggiornato il progetto con le modifiche da me apportate.

Per il momento vi consiglio di spendere molto tempo sulle rotte e sulla modifica dei moduli. Cercate di raggiungere ottimi risultati essendo pignoli con voi stessi… si impara solo quando non si è mai soddisfatti.

Buon divertimento

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

G.Li.Ar: le viste (2)

Posted by hosiris su Maggio 15, 2010

Nell’ultimo post avevo presentato una modifica di base sulle viste, nel poco tempo a disposizione ho modificato ulteriormente l’aspetto del mio applicativo, senza raggiungere effetti stilistici spettacolari, ma rendendolo più carino da vedere. Ho principalmente modificato il foglio di stile, producendo una soluzione a due colonne:


<!-- web/css/main.css -->
body {
    font-family: Verdana, Arial;
    width: 800px;
    position: absolute;
    left: 50%;
    margin-left: -400px;
}
div#header h1 {
    border: 1px black solid;
    font-size: 24px;
    text-align: center;
    padding: 10px;
}
div#menu {
    float: left;
    display: block;
}
div#menu ul {
    list-style: none;
    margin: 0;
    padding: 10px;
}
div#menu a {
    font-size: 10px;
    text-decoration: none;
    color: #000;
}
div#menu a:hover {
    background: #000;
    color: #aff;
}
div#content {
    font-size: 10px;
    margin: 0 10px 20px 20px;
    float: left;
}
div#footer {
    clear: both;
}
div#footer h3 {
    border: 1px black solid;
    font-size: 8px;
    text-align: center;
    padding: 5px;
}

il codice dovrebbe essere di facile lettura, ma specifico alcuni passaggi importanti. Il body è centrato, quindi tutto il contenuto verrà automaticamente centrato. La soluzione a due colonne è tableless, utilizzando il metodo “float: left” sul div menu e content, non dimenticate di impostare nel div footer la voce: “clear: both” altrimenti il footer andrà a sovrapporsi alle due colonne. Ho modificato i parametri del menu “ul” eliminando le decorazioni tipiche del tag anchor e aggiungendo un effetto rollover al passaggio del mouse.

Il risultato è il seguente:

Certo il bianco e nero, lo rende ancora bruttino, ma per me è già un seccesso così!
Potrete apprezzare il fatto che, tramite il pattern decorator, la struttura base riamarrà costante nella navigazione, mentre quello che starà nel content va modificato. A tal fine io ho lavorato sui template dei moduli “libri” e “articoli”.
Ad esempio una semplice modifica al file “apps/frontend/modules/libri/templates/editSuccess.php” (se non ricordate i nomi dei template, vi ricordo che la vista per una data azione è data dal nome dell’azione + “Success”) porta a questo risultato:

Alla prossima… e come sempre: Buon divertimento!

Posted in GLiAr, PHP, Progetti Personali, Programmazione, Symfony | 2 Comments »

G.Li.Ar: le viste

Posted by hosiris su Maggio 8, 2010

Ci siamo lasciati con la creazione dei modelli. Se avete fatto delle prove avrete di certo notato che quasi tutte le funzionalità sono attive, bisogna sistemare poche relazioni tra modelli.
Ma per il momento preoccupiamoci di che aspetto dovrebbe avere la nostra applicazione… io ho un senso estetico pessimo quindi, a parte le modifiche su symfony, vi consiglio di creavi una vostra interfaccia. Io mi limiterò a posizionare i blocchi lì dove voglio.
Modificheremo il template della pagina principale e il template per i moduli Libri e Articoli.
Per modificare il template del frontend, modifichiamo:


<!-- apps/frontend/templates/layout.php -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <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="header">
      <h1>G.Li.Ar: GESTIONE LIBRI E ARTICOLI</h1>
    </div>
    <div id="menu">
      <ul>
        <li><a href="<?php echo url_for('libri/index') ?>">Libri</a></li>
        <li><a href="<?php echo url_for('articoli/index') ?>">Articoli</a></li>
        <li><a href="<?php echo url_for('autori/index') ?>">Autori</a></li>
        <li><a href="<?php echo url_for('categorie/index') ?>">Categorie</a></li>
        <li><a href="<?php echo url_for('editori/index') ?>">Editori</a></li>
      </ul>
    </div>
    <div id="content">
      <?php echo $sf_content ?>
    </div>
    <div id="footer">
      <p>Powered by Se]{eM</p>
    </div>
  </body>
</html>

In questo modo abbiamo creato un menù contenente i link a tutti i moduli e abbiamo dato un titolo al nostro sito.
Se ricordiamo come funziona symfony, possiamo facilmente trovare quali file modificare per definire la vista dei moduli: la vista associata all’azione di index sarà indexSuccess, quindi:


<!-- apps/frontend/modules/libri/templates/indexSuccess.php -->
<h2>Lista dei libri</h2>
<table>
  <thead>
    <tr>
      <th>Titolo</th>
      <th>Data</th>
      <th>Isbn</th>
    </tr>
  </thead>
  <tbody>
    <?php foreach ($Libris as $Libri): ?>
    <tr>
      <td><a href="<?php echo url_for('libri/show?id='.$Libri->getId()) ?>"><?php echo $Libri->getTitolo() ?></a></td>
      <td><?php echo $Libri->getData() ?></td>
      <td><?php echo $Libri->getIsbn() ?></td>
    </tr>
    <?php endforeach; ?>
  </tbody>
</table>
<a href="<?php echo url_for('libri/new') ?>">New</a>


<!-- apps/frontend/modules/articoli/templates/indexSuccess.php -->
<h2>Lista degli articoli</h2>
<table>
  <thead>
    <tr>
      <th>Titolo</th>
      <th>Data</th>
    </tr>
  </thead>
  <tbody>
    <?php foreach ($Articolis as $Articoli): ?>
    <tr>
      <td><a href="<?php echo url_for('articoli/show?id='.$Articoli->getId()) ?>"><?php echo $Articoli->getTitolo() ?></a></td>
      <td><?php echo $Articoli->getData() ?></td>
    </tr>
    <?php endforeach; ?>
  </tbody>
</table>
<a href="<?php echo url_for('articoli/new') ?>">New</a>

in questo modo abbiamo presentato solo i dati di interesse. Solo dopo aver cliccato su un elemento verrà mostrata una pagina contenente tutte le informazioni.
Certo questa interfaccia è brutta e magari qualcuno vorrebbe qlcs di più colorito, se conoscete le regole css potete facilmente modificare il file web/style/main.css.
Per il momento è tutto, vedremo come definire le rotte e come trattare le relazioni con cardinalità n ad n, magari definendo prima una interfaccia di login per le operazioni che vogliamo essere fatte solo dal root.

Buon divertimento

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

G.Li.Ar: lavoriamo sui moduli

Posted by hosiris su Maggio 1, 2010

Abbiamo lavorato sul modello e creato la nostra applicazione frontend. Creiamo adesso i nostri moduli:


$ ./symfony propel:generate-module --with-show --non-verbose-templates frontend autori autori
$ ./symfony propel:generate-module --with-show --non-verbose-templates frontend categorie categorie
$ ./symfony propel:generate-module --with-show --non-verbose-templates frontend editori editori
$ ./symfony propel:generate-module --with-show --non-verbose-templates frontend riviste riviste
$ ./symfony propel:generate-module --with-show --non-verbose-templates frontend libri libri
$ ./symfony propel:generate-module --with-show --non-verbose- templates frontend articoli articoli

adesso potete visualizzare entrambi i moduli (ad esempio: http://gliar/frontend_dev.php/libri). Se provate ad aggiungere un elemento noterete la presenza di un errore, questo perchè synfony necessita di una rappresentazione testuale degli elementi, per cui in ogni classe del modello aggiungiamo il seguente codice:


// lib/model/Articoli.php
public function __toString(){
  return $this->getTitolo();
}
// lib/model/Autori.php
public function __toString(){
  return sprintf('$s $s', $this->getNome(), $this->getCognome());
}
// lib/model/Categorie.php
public function __toString(){
  return $this->getName();
}
// lib/model/Editori.php
public function __toString(){
  return $this->getName();
}
// lib/model/Libri.php
public function __toString(){
  return $this->getTitolo();
}
// lib/model/Riviste.php
public function __toString(){
  return $this->getName();
}

Attenzione a mettere il doppio underscore prima di toString.
Per il momento finisco qua, mi aspettano 14 ore di autobus…

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

G.Li.Ar: il modello

Posted by hosiris su aprile 28, 2010

Avendo definito le specifiche, passiamo all’analisi del modello. Tratterò libri ed articoli in tabelle separate cercando di ottimizzare il trattamento dei dati.
Creiamo il progetto:


$ mkdir -p gliar/lib/vendor
$ cp symfony.tar.gz gliar/lib/vendor
$ cd gliar/lib/vendor
$ tar xvzf symfony.tar.gz
$ cd ../..
$ php lib/vendor/symfony/data/bin/symfony generate:project gliar --orm=Propel

Lo schema del DB è il seguente:

Per la realizzazione dello schema ho usato DIA.
Da questo schema deriva la configurazione che va inserita nel file config/schema.yml:


propel:
  editori:
    id: ~
    nome: { type: varchar(255), required: true }
  riviste:
    id: ~
    nome: { type: varchar(255), required: true }
    id_editore: { type: integer, foreignTable: editori, foreignReference: id }
  categorie:
    id: ~
    nome: { type: varchar(255), required: true }
    descrizione: { type: longvarchar }
  autori:
    id: ~
    nome: { type: varchar(255), required: true }
    cognome: { type: varchar(255), required: true }
    data_nascita: { type: date }
    data_decesso: { type: date }
    luogo_nascita: { type: varchar(255) }
  libri:
    id: ~
    titolo: { type: varchar(255), required: true }
    descrizione: { type: longvarchar }
    indice: { type: longvarchar }
    numero_pagine: { type: integer }
    data: { type: date }
    prezzo: { type: double }
    ISBN: { type: varchar(50) }
    id_editore: { type: integer, foreignTable: editori, foreignReference: id }
  articoli:
    id: ~
    titolo: { type: varchar(255), required: true }
    sommario: { type: longvarchar }
    pagina_inizio: { type: integer }
    numero_pagine: { type: integer }
    data: { type: date }
    id_rivista: { type: integer, foreignTable: riviste, foreignReference: id }
  autori_libri:
    id_autore: { type: integer, foreignTable: autori, foreignReference: id }
    id_libro: { type: integer, foreignTable: libri, foreignReference: id }
  autori_articoli:
    id_autore: { type: integer, foreignTable: autori, foreignReference: id }
    id_articolo: { type: integer, foreignTable: articoli, foreignReference: id }
  categorie_libri:
    id_categoria: { type: integer, foreignTable: autori, foreignReference: id }
    id_libro: { type: integer, foreignTable: libri, foreignReference: id }
  categorie_articoli:
    id_categoria: { type: integer, foreignTable: autori, foreignReference: id }
    id_articolo: { type: integer, foreignTable: articoli, foreignReference: id }

Adesso creiamo l’applicazione e generiamo le classi del modello:


$ ./symfony generate:app frontend
$ mysqladmin -uroot -p create gliar_db
SeCrEt
$ ./symfony configure:database "mysql:host=localhost;dbname=gliar_db" root SeCrEt
$ ./symfony propel:build-all --no-confirmation

Dal prossimo post cominceremo a creare i moduli e personalizzare le viste e le rotte.
Do per scontato la creazione dell’host virtuale per la visualizzazione dell’applicazione.

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

Gestione Libri e Articoli: G.Li.Ar

Posted by hosiris su aprile 27, 2010

Comincio, con questo post, il tentativo di sviluppo di una applecazione che ha come scopo la gestione della mia libreria (moltissimi libri in cartaceo, molti di più in digitale) e degli articoli delle riviste che leggo.
Sono a conoscenza del fatto che ne esistono a bizzeffe… ma con quelli non potrei fare pratica con symfony e poi… che piacere c’è?
Questo noioso post descriverà le specifiche che guideranno la progettazione della mia applicazione. Sempre nella idea di apprendimento comunitario, se qualcuno fosse interessato e vorrebbe dire la sua, faccia pure senza problemi! Per questo progetto prevedo di utilizzare svn come sistema di versioning.
Come dovrebbe funzionare questa applicazione?

  • l’accesso alla home page mostrerà una pagina statica
  • visualizzazione della lista dei libri
  • i libri sono ordinati per categoria e per ordine alfabetico
  • visualizzazione della lista degli articoli
  • ordinati per rivista e per pagina
  • ricerca dei libri o articoli in base a delle parole chiave
  • visualizzazione della lista degli autori
  • visualizzazione della lista delle categorie
  • cliccando su un oggetto si accede a info dettagliate
  • un utente può solo visualizzare dati
  • un admin o un utente con permessi può effettuare modifiche

Per il momento non mi viene altro… bene a domani… analizzeremo il modello dei dati.

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