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: