(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,
La verdad sism82, que me parece que deberia funcionar perfectamente. Lo unico que opino es que andaria bien si solamente la variable que modifican es la $content, si existiera otra variable de la clase padre que modifiquen los hijos se veran reflejados en la estructura de datos de ellos y no en la de todos como las modificaciones a $content. No se si me explico. En este caso la $content sera reemplazada por el $pages que utiliza la clase padre y sus hijos, con esto ya pueden todos los hijos escribir en la misma variable. Ahora, la clase FPDF tiene unas cuantas variables mas, cualquiera de ella que sea necesario que la modifique alguna de las clases hijas tienen que ser tambien compartida.

