P4A framework: modificare il comportamento del bottone print nella simple toolbar

screenshot della simple toolbarIl widget simple toolbar del framework P4A include un bottone predefinito print per la funzione di stampa. Questa funzione, per default, esegue in javascript una semplice window.print() della maschera, ma in molti casi è necessario personalizzare la stampa.
Qui nasce un piccolo problema: mentre per gli altri bottoni, è possibile effettuare semplicemente l’override del metodo, con il print è necessario agire diversamente.

Il motivo risulta chiaro osservando il codice della classe base P4A_Simple_Toolbar in simple.php:

1
2
3
4
5
6
// ...
$print = & $this->addButton('print', 'print');
$print->dropAction('onclick');
$print->setProperty('onclick', 'window.print(); return false;');
$print->setAccessKey("P");
// ...

La chiamata al metodo dropAction() resetta qualsiasi altra azione, ecco il codice del metodo, tratto dalla classe base P4A_Widget in widget.php

1
2
3
4
5
6
7
// ...
function dropAction($action)
{
 $action = strtolower($action);
 unset($this->actions[$action]);
}
// ...

Successivamente il metodo setProperty() assegna la funzione javascript window.print() all’evento onClick() del bottone print.
Come aggirare l’ostacolo? Il sistema più semplice è quello di nascondere il bottone print di default, e crearne uno nuovo, avendo cura di passare come secondo parametro, la stringa “print” al metodo addButton() che identifica il nome dell’icona predefinita (print.png)

1
2
3
4
5
6
7
8
9
10
11
// Toolbar
$tool = & $this->build("p4a_simple_toolbar", "tool");
// Hide original print screen button
$tool->buttons->print->setInvisible();
// Add new button to print pdf
$tool->addButton('stampafattura','print');
// Intercept onClick and override with our own method
$this->intercept($tool->buttons->stampafattura,
                 'onClick','print_doc');
// Join toolbar with this mask
$tool->setMask($this);

Il primo parametro passato ad addButton() assegna il nome al nuovo bottone, quindi possiamo intercettare l’evento associato onClick() abbinadogli un nostro metodo (nell’esempio: print_doc() )

1
2
3
4
5
6
function print_doc()
{
 //...
 // Code to customize print
 //...
}

Conclusioni:

Gli americani direbbero: “a piece of cake” per ottenere la personalizzazione del bottone print della simple toolbar senza mettere mano al codice delle classi base del framework!

Riferimenti ed approfondimenti:

P4A framework: esempio di applicazione completa per la gestione delle fatture

Screenshot dell'applicazioneL’idea di realizzare questo esempio di applicazione in P4A è nata per comparare i tempi di sviluppo in un ambiente RAD di tipo WYSIWYG (MS Visual Basic) che genera desktop applications e un framework PHP che genera web applications. Dei vantaggi delle applicazioni web ho già scritto in un precedente articolo.
Il progetto è molto semplice: un programma che gestisce la fatturazione di una ditta che fa servizi, quindi senza magazzino.
Ho scelto questo progetto perché la realizzazione non presenta grosse difficoltà e può essere utile a qualcuno, ed anche perché ci sono dentro diversi aspetti che ricorrono anche in applicazioni più grandi, come ad esempio la gestione di tabelle master-detail e lo sviluppo di un report personalizzato in pdf.
Inoltre lo schema del database è pressoché identico a quello di un tutorial per l’approccio ai dati con Visual Basic .Net 2005 (Visual Basic 2005 passo-passo: Accesso ai dati),
in questo modo sarà più facile effettuare il confronto.
Va detto che non ho ancora realizzato l’equivalente in VB.Net, ma avendo una certa esperienza di VB6 posso dire quanto tempo avrei impiegato a realizzarlo: diciamo 2 giorni al massimo. Ebbene, considerando che la documentazione di P4A è piuttosto scarsa, che il framework non ha un’interfaccia grafica WYSIWYG con strumenti drag’n’drop e wizard per la creazione dei report, e infine, che non ho una conoscenza dello stesso paragonabile all’esperienza che ho con Visual Basic, mi sarei aspettato di impiegare come minimo il doppio del tempo, invece l’applicazione completa è stata realizzata in soli 2 giorni di lavoro nemmeno troppo assiduo (non c’erano clienti col fiato sul collo!).
Avessi voluto usare solo PHP e javascript, ci avrei messo davvero molto di più…!
Un buon risultato, visto che sappiamo quanto sia importante produrre applicazioni in breve tempo per tenere bassi i costi ed accontentare clienti sempre meno disposti ad investire grosse cifre sul software.

Quali sono le caratteristiche dell’esempio?

  • Una maschera per la gestione dell’intestazione della ditta
  • Una maschera per la gestione dell’anagrafica clienti (con ricerca per nome)
  • Una maschera per la gestione delle fatture divisa in dati fattura e dettaglio prestazioni
  • Una procedura di stampa della fattura in formato pdf
  • Una maschera per il riepilogo delle fatture emesse e la possibilità di filtraggio per periodo

Qualche screenshot…

maschera iniziale
maschera iniziale
intestazione della ditta
intestazione della ditta
anagrafica clienti
anagrafica clienti
gestione delle fatture: master
gestione delle fatture: master
gestione delle fatture: detail
gestione delle fatture: detail
stampa pdf
stampa pdf
riepilogo delle fatture
riepilogo delle fatture

 

Note tecniche:
Ho provato l’applicazione sia con P4A 2.1.7 che con l’ultima release 2.2.2.
Il funzionamento è corretto sia con PHP4.x e MySQL4.x che con PHP5.2.4 e MySQL5.0.x, in quest’ultimo caso però è necessario impostare la direttiva del php.ini: memory_limit = 64M, il default è 8M.
All’interno del pacchetto, nella directory ‘_private’ ci sono i dump .sql del database MySQL effettuati con phpMyAdmin e con Heidi, il nome del database deve essere: ‘base_app_invoices’.
Infine per la generazione del report in pdf, ho utilizzato la classe R&OS (pdf-php su Sourceforge), conosciuta anche come ezPdf e licenza di tipo Public Domain

Download:

Pacchetto zip completo di librerie R&OS

Conclusioni:

Se il rapporto 1:1 dei tempi di sviluppo con queste differenti tecnologie rimane lo stesso anche per applicazioni complesse, e constatato il vantaggio delle applicazioni web, è da considerare seriamente l’adozione di questo framework PHP fra i propri strumenti di lavoro.

Riferimenti ed approfondimenti:

P4A framework: in arrivo la versione 3 che si veste di Zend

P4A 2.2 logoGrandi novità in casa Crealabs: proprio mentre viene rilasciata la versione 2.2.0 che già introduce numerose ed interessanti caratteristiche, viene annunciata la tabella di marcia per lo sviluppo della rivoluzionaria versione 3.
La versione 2.2.0 (a cui ha già fatto seguito la 2.2.2) oltre a risolvere alcuni bugs, tra i quali il problema di un corretto salvataggio dei dati in tabelle con chiave primaria multipla, presenta le seguenti nuove caratteristiche:

  • Adozione di jQuery con tutti i vantaggi che derivano da questa potente libreria javascript
  • Implementazione di un sistema per la generazione di tooltip
  • Implementazione di un sistema di auto-completamento dei campi, per l’inserimento facilitato dei dati
  • Supporto per la costruzione di plugin personalizzati attraverso un helper system
  • Miglioramento della gestione di contenuti multimediali attraverso l’adozione di getID3

Un bel passo in avanti rispetto alle precedenti versioni, non c’è dubbio! Ma Giardina e Balliano non si sono adagiati sugli allori e si sono messi subito all’opera per costruire la rivoluzionaria versione 3.
Cosa c’è di rivoluzionario? ‘semplicemente’ questo:

  • Compatibilità solo per PHP5 (viene perduta la compatibilità con l’obsoleto PHP4)
  • Nuovo sistema di generazione di widget, con un vasto pacchetto di disponibilità e un supporto multi-browser garantito
  • Adozione di diverse caratteristiche di Zend Framework
  • Sostituzione di ADOdb con Zend_DB
  • Definitivamente risolti i problemi di compatibilità con i vari RDBMS utilizzabili (MySQL, PostgreSQL, Oracle, SQLite)
  • Sostituzione del sistema interno di formattazione e parsing delle date con Zend_Date
  • Sostituzione delle librerie interne per la localizzazione con Zend_locale
  • Sostituzione dell’attuale sistema di traduzione con Zend_Translate
  • Una nuova libreria ottimizzata in php5 per la gestione delle thumbnail sostituisce phpThumb
  • Abbandono dell’utilizzo del pacchetto PEAR

Conclusioni:

L’annunciato P4A versione 3 si veste dunque di Zend framework, e questo non può che fare bene! Il guadagno sarà in termini di compatibilità, robustezza, stabilità e probabilmente anche in performance.
Ci auguriamo che, a scapito di una perdita di compatibilità forse parziale con le vecchie versioni del framework, il nuovo strumento mantenga comunque quelle caratteristiche di semplicità ed immediatezza operativa che sono stati i cavalli di battaglia delle prime versioni.
D’altra parte in informatica tutto è in continua e rapida evoluzione, nessuno di noi può smettere di aggiornarsi, tanto più negli aspetti legati ai linguaggi di programmazione e ai loro ambienti, altrimenti saremmo ancora alle prese con COBOL-CICS (anche se pare che qualche dinosauro di questo tipo sopravviva ancora!)

Riferimenti ed approfondimenti:

P4A framework: come stampare un pdf

P4A: toolbar con pulsante pdfNella documentazione del framework PHP P4A della Crealabs, non ci sono informazioni troppo dettagliate su come
produrre report in formato pdf. Cercando nei thread del forum, ci sono diversi frammenti ed indizi, che
aiutano parecchio, ma si perde un po’ di tempo a metterli insieme per produrre il codice necessario a
generare il report come si desidera. In questo articolo mostrerò la soluzione che ho scelto mettendo insieme i vari indizi, e applicandola alla base application “Products Catalogue” distribuita sul sito della Crealabs come applicazione di esempio.

Step 1: scelta ed installazione delle librerie pdf

In questo thread del forum, viene suggerito di usare le librerie FPDF o R&OS.
Ho scelto R&OS semplicemente perché in passato avevo avuto qualche difficoltà con FPDF, probabilmente per mia colpa. Credo che siano in sostanza equvalenti.
Una volta scaricato il pacchetto, è necessario creare nella root della applicazione (nel nostro caso: localhost/p4a/applications/products_catalogue/) una cartella che si deve chiamare
libraries. All’interno di questa cartella vengono decompresse le librerie (nel nostro caso i due files: class.pdf.php e class.ezpdf.php) e la cartella fonts contenente i file per la generazione dei font.

Step 2: Aggiunta di un pulsante nella toolbar

A questo punto bisogna creare un pulsante per la generazione del report in pdf. Personalmente ho scelto di crearlo nella toolbar, ma evidentemente si può crearlo dove si vuole.
All’interno del file products.php sarà sufficiente aggiungere questo codice PHP:

1
2
3
4
5
6
7
8
9
10
// Toolbar
$toolbar = & $this->build("p4a_standard_toolbar",
                              "toolbar");
$toolbar->setMask($this);
$toolbar->addSeparator($position = "left");
// Aggiungo un pulsante alla toolbar per la stampa su pdf
$toolbar->addButton('stampapdf','pdf');
// Intercetto onClick per eseguire stampa_documento()
$this->intercept($toolbar->buttons->stampapdf,
                 'onClick','stampa_documento');

Notate che, per comodità, ho creato una variabile $toolbar contenente l’oggetto toolbar.
Il secondo parametro 'pdf' passato al metodo addButton crea automaticamente un img link all’icona pdf.png.
Questa icona deve essere presente nella cartella di default per il set di icone di P4A: localhost/p4a/icons/default/32/

In alternativa, si può impostare a NULL questo parametro per lasciare solo la scritta impostata ('stampapdf').

L’ultima riga di codice intercetta l’evento onClick sul pulsante ed esegue il metodo stampa_documento

Step 3: Aggiunta del metodo stampa_documento

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function stampa_documento()  
// funzione per la stampa su pdf
  {
  require('class.ezpdf.php');
  $pdf =& new Cezpdf('a4','portrait');
  $pdf->selectFont($_SERVER['DOCUMENT_ROOT'].
                   P4A_APPLICATION_PATH.
                   '/libraries/fonts/Helvetica');
  $db =& p4a_db::singleton();
  $res = $db->getAll("SELECT model,
   brands.description AS brand,
   categories.description AS category, selling_price
   FROM products
   LEFT JOIN brands
   ON brands.brand_id = products.brand_id
   LEFT JOIN categories
   ON categories.category_id = products.category_id");
  $pdf->ezTable($res,'','Products',array('fontSize'=>12));
  $type = 'application/pdf';
  $filename = 'report.pdf';
  header("Pragma: public");
  header("Cache-Control: must-revalidate, post-check=0,
         pre-check=0");
  header("Cache-Control: private", false);
  header("Content-type: $type");
  header("Content-Disposition: attachment;
          filename=\"$filename\"");
  $pdfcode = $pdf->output(1); // flusso dati senza header
  header("Content-Length: " . strlen($pdfcode));
  echo $pdfcode;
  die();
  }

Note: nella variabile $res viene memorizzato un’array multidimensionale associativo che è il risultato della query. Come esempio ho preparato una query di tipo JOIN perché nella maggior parte dei casi, è proprio questo il tipo utilizzato.

Il path per la scelta dei font deve essere assoluto, per averlo in termini relativi è possibile utilizzare la variabile $_SERVER['DOCUMENT_ROOT'] propria del PHP e la costatnte P4A_APPLICATION_PATH propria del framework P4A.

Per forzare il browser ad aprire il report pdf in una nuova finestra, ho cambiato l’header del documento generato, specificando che il contenuto è un attachment. Altrimenti, il contenuto viene riconosciuto come mime-type 'application/pdf' e (a seconda dei browser utilizzati) viene aperto nella stessa finestra.

Infine il nuovo processo viene terminato attraverso l’istruzione die();

Download:

Il sorgente comprende anche le librerie R&OS e l’SQL per creare il database con alcuni record d’esempio per il report in pdf. Il report generato è visualizzabile qui.

Conclusioni:

Il framework P4A è uno strumento davvero ben fatto, gli autori hanno fatto un gran lavoro, adesso sta a noi utilizzatori, attraverso l’interscambio di informazioni, generare la documentazione necessaria al suo sviluppo.
A tal proposito è mia intenzione produrre altra documentazione su altri aspetti di comune interesse agli utilizzatori di questo ottimo framework.

Riferimenti ed approfondimenti:


Valerio Maglietta ha scritto:

Definire ottima questa imbeccata di Mario Spada e’ il minimo…
L’unica aggiunta che mi sento di consigliare è quello di preprocessare il contenuto della stringa da stampare tramite iconv.
Ovvero per noi Italiani:

$res = iconv(‘UTF-8’, ‘CP1252’, $res);

prima dare in pasto $res a ezTable come nell’esempio precedente

In questa maniera caratteri accentati, simbolo euro e simili, non ci daranno problemi.
Nel mio caso (so linux Ubuntu 7.10) la codifica iniziale è UTF-8 ma potrebbe essere differente (ISO-8859-1, ISO-8859-16).
CP1252 è la codifica Windows Western European (sembra che R&OS sia stato sviluppato proprio sotto win…).

Grazie 1k Mario!

Un framework PHP facile, moderno e italiano: P4A

Esempio di applicazione p4aL’utilizzo di un framework fornisce ai programmatori PHP che hanno scelto le applicazioni web come via di sviluppo, un comodo strumento per la costruzione delle maschere, le connessioni ai database, l’implementazione di menù e pulsantiere e tutti gli altri aspetti dell’applicazione che sono accessori indispensabili di qualsiasi programma. In questo modo lo sviluppatore si può concentrare maggiormente sulla logica dell’applicazione, lasciando al framework e ai suoi widget il compito della presentazione e della interazione con i dati.
Per chi ha scelto come linguaggio di sviluppo il PHP, non c’è che l’imbarazzo della scelta. Ma quali sono i criteri per fare una scelta corretta?

Secondo la mia opinione, principalmente due: il tipo di prodotto che si deve realizzare e il tempo di apprendimento per padroneggiare il framework. Altri criteri importanti sono la documentazione e la portabilità. Infatti se il framework richiede, per la propria installazione, requisiti difficilmente presenti sulla maggior parte dei provider, sarà poi difficile mettere in piedi un prodotto competitivo. Avendo l’esigenza di sviluppare un’applicazione per la gestione della produzione di una piccola impresa, la nostra scelta è caduta su un framework tutto italiano sviluppato da Andrea Giardina e Fabrizio Balliano della Crealabs denominato: P4A (PHP for Applications).

Quali sono i principali vantaggi di P4A?

  • Semplicità dell’installazione e portabilità
  • Apprendimento molto rapido
  • Persistenza dello stato durante l’esecuzione dell’applicazione
  • Presenza di utili widget per menù, navigazione del database, creazione di form e tabelle
  • Presenza di un buon numero di applicazioni base ed esempi
  • Semplicità del codice sorgente
  • Struttura moderna, orientata agli oggetti
  • l’HTML generato presenta un buon grado di accessibilità
  • Supporto ajax
  • Possibilità di interagire con gli autori in lingua italiana (chi fa questo mestiere dovrebbe conoscere bene l’inglese… ma esprimersi in madre lingua è sempre un’altra cosa!)

E quali, invece, gli svantaggi?

  • Manuali inesistenti
  • Documentazione delle classi completa ma poco dettagliata
  • Inadatto ai siti web veri e propri (gli autori stessi dichiarano che il framework è stato progettato per applicazioni web di tipo gestionale)
  • Impossibilità di avere il completo controllo del codice, ma questa è una caratteristica comune a tutti i framework, anzi quelli più complessi sono anche molto più criptici

Conclusioni:

Il framework P4A rappresenta un ottimo strumento per la realizzazione di applicazioni web, anche complesse, soprattutto di tipo gestionale. La semplicità di installazione ed utilizzo ripagano ampiamente la minore dotazione e flessibilità rispetto ai blasonati Zend Framework, Symphony e CakePhp. Seppure la dotazione manualistica è inesistente, l’ampio numero di esempi disponibili in rete e la presenza di un forum abbastanza attivo supplisce a questa mancanza. Infine l’attività di manutenzione e sviluppo da parte degli autori insieme al fatto che il prodotto ha ottenuto il ragguardevole numero di 130.000 download è garanzia di vitalità e supporto anche nel futuro.

Riferimenti ed approfondimenti: