(introducción)
Estoy usando la classe "FPDF" (www.fpdf.org) que genera PDF's dinámicos desde PHP. Bien, dicha classe tiene como ejemplos bastantes "classes" que extienden a la classe padre para aportar nuevas funcionalidades.
Hasta aquí todo OK, .. el detalle está que cada extensión funciona por sí sola pero hay funcionalidades de várias extensiones (que extenden a la classe padre) que me gustaría usar.
Actualmente .. lo único que hago es tomar todos esos métodos y demás lógica del las classes "extensoras" (no sé como llamarlo) y las uno (cut-and-poaste) sobre una classe "extended". Supongo que esto si bien funciona . .no será lo "políticamente correcto" .. así que quería saber si UDs. conocen la técnica para trabajar este tipo de problemas .. Supongo que algún array como "contenedor" y temas similares .. pero mi conocimiento de OOP es bajo .. sólo soy "usuario" de OOP con este requerimiento. (para ejemplos .. please con "peritas y manzanas" xDD).
En resumen dispongo de N classes que extienden a la padre tipo:
Código PHP:
class PDF extends FPDF {
var $DisplayPreferences='';
function DisplayPreferences($preferences) {
$this->DisplayPreferences.=$preferences;
}
function _putcatalog()
{
parent::_putcatalog();
if(is_int(strpos($this->DisplayPreferences,'FullScreen')))
$this->_out('/PageMode /FullScreen');
if($this->DisplayPreferences) {
$this->_out('/ViewerPreferences<<');
if(is_int(strpos($this->DisplayPreferences,'HideMenubar')))
$this->_out('/HideMenubar true');
if(is_int(strpos($this->DisplayPreferences,'HideToolbar')))
$this->_out('/HideToolbar true');
if(is_int(strpos($this->DisplayPreferences,'HideWindowUI')))
$this->_out('/HideWindowUI true');
if(is_int(strpos($this->DisplayPreferences,'DisplayDocTitle')))
$this->_out('/DisplayDocTitle true');
if(is_int(strpos($this->DisplayPreferences,'CenterWindow')))
$this->_out('/CenterWindow true');
if(is_int(strpos($this->DisplayPreferences,'FitWindow')))
$this->_out('/FitWindow true');
$this->_out('>>');
}
}
}
Código PHP:
class PDF_Javascript extends FPDF {
var $javascript;
var $n_js;
function IncludeJS($script) {
$this->javascript=$script;
}
function _putjavascript() {
$this->_newobj();
$this->n_js=$this->n;
$this->_out('<<');
$this->_out('/Names [(EmbeddedJS) '.($this->n+1).' 0 R ]');
$this->_out('>>');
$this->_out('endobj');
$this->_newobj();
$this->_out('<<');
$this->_out('/S /JavaScript');
$this->_out('/JS '.$this->_textstring($this->javascript));
$this->_out('>>');
$this->_out('endobj');
}
function _putresources() {
parent::_putresources();
if (!empty($this->javascript)) {
$this->_putjavascript();
}
}
function _putcatalog() {
parent::_putcatalog();
if (isset($this->javascript)) {
$this->_out('/Names <</JavaScript '.($this->n_js).' 0 R>>');
}
}
}
Código PHP:
$pdf=new PDF();
$pdf->SetDisplayMode('fullpage');
$pdf->DisplayPreferences('HideMenubar,HideToolbar,HideWindowUI');
$pdf->AddPage();
$pdf->SetFont('Arial','',16);
$pdf->Write(6,'Only the document should appear, no interface element.');
$pdf->Output();
He visto que algunas veces se extienden en "cadena" (el padre al hijo .. del hijo al nieto ... ) .. Podría servir .. pero realmente no son "padre ->hijo" sino todas son al padre (nuevos métodos). (tal vez aquí esté confundido .. esa es la impresión que me dá sin haber leido mucha teoría al respecto sobre modelos y temas afines).
Un salduo,