Home Programación Joomla ¿Me corto las venas o me las dejo largas? Hacer un pdf

PostHeaderIcon ¿Me corto las venas o me las dejo largas? Hacer un pdf

Usar puntuación: / 0
MaloBueno 

En este paso vamos a crear un pdf en Joomla. Para ello necesitamos una extensión de php (que no de Joomla) para poder hacerlo. Yo utilizaré el fpdf pero existen otras. Yo uso ésta en primer lugar porque es sencilla y tiene las opciones básicas necesarias para usarse; en segundo lugar porque suele venir preinstalada en el servidor en el que instalemos joomla; y en tercer lugar porque en el caso en el que no viniese, es muy sencilla de encontrar la librería y descargarla. No explicaré la librería con mucho detalle pues no me parece que sea el objetivo de este tutorial ni me esforzaré mucho en hacer un pdf muy complicado. Mi idea es la siguiente: desarrollaré un pdf que tome de dos selects html dos equipos de la tabla equipos y escriba, en la parte superior del pdf, sus nombres. Explicaré también, pero sin código, como rellenar el pdf con por ejemplo los jugadores de cada equipo, como si fuéramos a imprimir un acta. Tampoco pretendo realizar un tutorial para fpdf en profundidad: explicaré simplemente las funciones que necesito para llevar a cabo mi propósito

Como siempre, trabajaremos con 4 ficheros: modelo, vista y controlador: default.php, donde colocaremos el formulario; view.html.php donde iniciaremos la vista y el modelo, actas.php donde irá el modelo con las funciones de la base de datos y el controlador del front end, controller.php que será el de siempre y dónde irá el grueso de la función. Vamos a ello.

Como siempre empezaremos por view.html.php en dónde simplemente definiremos tanto la vista como el modelo que usaremos: El archivo contendrá las siguientes líneas:

<?php

En primer lugar definiremos la restricción de acceso y la importación de las bibliotecas

defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.view');

Definimos la clase con una única función display

class gessegViewactas extends JViewLegacy {

function display($tpl=null) {

Finalmente definimos el modelo, del cual nos interesa sacar la lista de equipos

$model = $this->getModel( 'actas' );

$this->eq = $model->getEquipos();

parent::display($tpl);

}

}

?>

Como podemos observar ya hemos definido el modelo y de hecho ya hemos incluido la primera función del modelo, un get, por lo que vamos a ver el modelo y  a definir esa función (fichero /models/actas.php):

Lo primero como siempre la restricción de acceso y la importación de la librería de modelos

defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.model');

Definimos la clase

class gessegModelactas extends JModel {

Veamos la función para obtener los equipos. No nos entretendremos mucho en ella

function getEquipos(){

// Get the database connection

$db =& $this->_db;

if( empty($this->_Equipos) )

{

// Build query and get the limits from current state

$query = 'SELECT * FROM #__gesseg_Equipos ORDER BY nombre';

$limitstart = $this->getState('limitstart');

$limit = $this->getState('limit');

$this->_Equipos = $this->_getList($query,$limitstart,$limit);

}

// Return the list of equipos

return $this->_Equipos;

}

}

Una vez definido el modelo y la primera función del mismo, ¿a dónde vamos? Como ya sabemos cómo funciona Joomla deberíamos ir al formulario. ¿Pero cómo sabe Joomla que debe ir al formulario? Con la función parent::display($tpl). Esa es la llamada al default.php. Observermos el código de este fichero:

En realidad es un código que puede ser todo lo complicado que queramos. Sin embargo, por facilitar la explicación lo condensaremos a un simple formulario con dos selects y un input text, que simularán los dos equipos y el nombre del árbitro. Visto y entendido esto es fácil ampliarlo tanto como queramos. Así que vamos a verlo:

 

Empezamos con el código de php para la restricción de acceso y definiendo las variables que necesitamos: la vista y la tarea. Además vamos a definir que a esta parte solo tenga acceso un usuario registrado, por lo que debemos obtener el id del usuario que está logueado. Si no hubiera nadie logueado su id sería 0

<?php defined('_JEXEC') or die('Restricted access');

$view = 'actas';

$task = 'editActas';

$usuario = JFactory::getUser();

if ($usuario->id!=0){

?>

A continuación, ya en código html, definimos el formulario, la tabla y los campos

<form method="post" action="<?php echo JRoute::_('index.php'); ?>" name="actas" id="actas">

<table class=adminlist>

Los dos primeros campos que necesitamos son los selects de los equipos. Los mostramos con un foreach de la variable que definimos en el view como $this->eq

<tr>

<td>

<label for="Equipos">Equipo Local:</label>

</td>

<td>

<select name="equipo1">

<option value="0" selected> Selecciona un equipo

<?php foreach ($this->eq as $eq): ?>

<option value="<?php echo $eq->id;?>"><?php echo $eq->nombre; ?> </option>

<?php endforeach; ?>

</select>

</td>

</tr>

<tr>

<td>

<label for="Equipos">Equipo visitante:</label>

</td>

<td>

<select name="equipo2">

<option value="0" selected> Selecciona un equipo

<?php foreach ($this->eq as $eq): ?>

<option value="<?php echo $eq->id;?>"><?php echo $eq->nombre; ?> </option>

<?php endforeach; ?>

</select>

</td>

</tr>

Finalmente añadiremos un campo input text para añadir el nombre del árbitro

<tr>

<td>

<label for="arbitro">Arbitro:</label>

</td>

<td>

<input type="text" name="arbitro" id="arbitro" maxlength="50" />

</td>

</tr>

Finalmente vamos a ver cómo termina el fichero

</table>

Empezamos definiendo el nombre de la tarea y de la vista y de otros elementos necesarios

<input type="hidden" name="task" value="insertaracta">

<input type="hidden" name="tmpl" value="component">

<input type="hidden" name="option" value="com_gesseg">

<input type="hidden" name="boxchecked" value="0" />

<input type="hidden" name="view" value="<?php echo $view; ?>" />

</form

Recordemos que esto puede hacerlo solo usuarios registrados y que eso lo comprobamos arriba con un if, por lo que tendremos que cerrar ese if.

<?php } ?>

Como se dijo antes, se podría añadir toda la información que quisiésemos mediante etiquetas html. De momento lo dejaremos así, pero prometo que, en otro post, más adelante, añadiré o mejoraré éste con, por ejemplo, un campo fecha.

Nos queda por ver el controlador y el xml para poder usarlo. En el default vimos que necesitábamos definir una tarea. Esa tarea es el punto de entrada al controlador, es decir, es la función del controlador que hará todo el trabajo. Esa es lo que nos falta por ver. En el controller.php habrá que añadir el código de control:

Lo primero como siempre, definir modelo y vista, y asociarlos

public function insertaracta(){

$vista = $this->getView('actas','html');

$modelo = $this->getModel('actas','gessegModel');

$vista->setModel($modelo, true);

Lo siguiente será coger los datos que se pasan desde el formulario con la función JRquest::getVar.

$arbitro = JRequest::getVar('arbitro');

$EqLocal = JRequest::getVar('equipo1');

$EqVisit = JRequest::getVar('equipo2');

¿Qué ocurre con estos datos? Nosotros en el default especificamos que si bien en los select se iban a mostrar los nombres de los equipos ($eq->nombre) el valor iba a ser el identificador de los mismos. Por ello en la variable $EqLocal y $EqVisit se encontrarán los valores id de los equipos que juegan. Si lo que queremos es poner el nombre de los equipos (algo lógico por otra parte) debemos consultarlos en la base de datos, es decir, en el modelo actas.php de la carpetas models. Será una función que devuelva el nombre de un equipo dado su id por parámetro:

 

function getNombreEquipo($id){

$db =& $this->_db;

if( empty($this->_nomEquipo) )

{

// Build query and get the limits from current state

$query = 'SELECT nombre FROM #__gesseg_equipos WHERE id='.$id;

$limitstart = $this->getState('limitstart');

$limit = $this->getState('limit');

$this->_nomEquipo= $this->_getList($query,$limitstart,$limit);

}

 

// Return the list of equipos

foreach ($this->_nomEquipo as $seq) return $eq->nombre;

}

No hay mucho que explicar. Funciones como esta hemos visto varias.

Volviendo al controlador añadiremos una llamada a esta función por cada equipo, local y visitante, en controller.php

$equipoLocal=$modelo->getNombreEquipo($EqLocal);

$equipoVisitante=$modelo->getNombreEquipo($EqVisit);

Con esto tenemos, en principio, toda la información necesaria para crear un pdf. Veamos cómo crearlo.

En primer lugar importamos la librería del pdf fpdf

require_once('fpdf/fpdf.php');

A continuación creamos el pdf como un nuevo objeto de la clase fpdf

$pdf=new FPDF();

A continuación añadiremos una página al pdf, la primera y en nuestro caso, única. Por cada página que quieras añadir tendrá que añadir esta línea de código

$pdf->AddPage();

También definiré el color del texto que será negro, es decir 0,0,0 los componentes de los colores primarios

$pdf->SetTextColor(0, 0, 0);

Quiero añadir una imagen. Uso la siguiente función especificando la ruta de la imagen, la posición de la misma, desde la izquierda y desde arriba y el tamaño de la imagen

$pdf->Image('images/logochico.jpg',2,2,20);//logo (imagen (ruta), distancia a la izquierda (2), distancia arriba (2), tamaño (20))

Y ahora empiezo a añadir los textos. Lo haremos con dos funciones: En la primera establecemos el tipo de letra, por orden, fuente, efectos (negrita, cursiva o subrayada) y tamaño. Esta función habrá que usarla siempre que queramos cambiar alguno de esos valores. La segunda función es la que escribe el texto y tendrá los siguientes parámetros también por orden: Posición desde la izquierda, posición desde arriba y texto. A mí el texto me gusta ponerlo dentro de un utf8_decode() para que me respete las tildes y caracteres especiales. Veámoslo.

$pdf->SetFont('Times','B',40);

$pdf->Text(25,10,utf8_decode('PARTIDO'));//izquierda, altura, texto

$pdf->Text(20,20,utf8_decode($equipoLocal));

$pdf->Text(160,20,utf8_decode($equipoVisitante));

Equipo Local y Equipo Visitante están a la misma altura (20) pero en distintas posición horizontal, el local a 20 mm de la izquierda el visitante a 160 mm de la izquierda

$pdf->SetFont('Times','',20);

$pdf->Text(150,30,utf8_decode($arbitro));

El árbitro aparece también con letra Times, pero sin efectos y tamaño 20

Voy a colocar justo debajo del árbitro una línea horizontal como tope

$pdf->Line(25, 35 , 200, 35);//línea que va desde el 25 35 (izquierda,arriba) hasta el 200 35 (izquierda arriba)

Como vimos antes ahora podríamos añadir toda la información que quisiésemos pero lo vamos a dejar así. Tenemos que terminar diciéndole al pdf que hemos terminado, que guarde el fichero dónde le diré y que lo muestre en pantalla. Se podría hacer una cosa sola (guardarlo en una carpeta o mostrarlos por pantalla) pero yo quiero hacer las dos cosas. Hay ligeras diferencias entre hacerlo todo junto o hacer una cosa sola.

La guardaré en la carpeta actas con el nombre acta y la fecha y hora con extensión pdf

$file=’actas/acta'.date('d-m-Y H:m:s').'.pdf';

La función Output define el final del pdf y la salida, en este caso al fichero

$pdf->Output($file);

Finalmente lo muestro con header location

header('Location: ‘.$file);

Hay muchísimo que añadir y muchísimo que contar. Ahí van algunas cosas que se me han ocurrido y que aclaro a modo de conclusión:

  1. El pdf se puede embellecer todo lo que queramos. Siempre animo a la experimentación en este sentido
  2. También se puede combinar con una base de datos, por ejemplo, podríamos insertar los datos del acta en una tabla. Para esto bastaría con crear una función en el modelo y llamarla.
  3. Debajo de todos estos datos se podría añadir la lista de jugadores de cada equipo, por ejemplo, el estadio, la fecha y hora del partido, observaciones, escudos… Todo lo que se nos ocurra. En el fondo no será más que coger datos del formulario (JRequest) o consultar datos de una tabla de la base de datos (modelo) o imágenes y escribir esos datos en el pdf.
  4. Fpdf provee muchísimas más funciones de las que yo he usado. Ánimo a investigar por Internet todas las posibilidades
  5. Ahora mismo no recuerdo que más cosas podría añadir, pero seguro que con el tiempo se me ocurren algunas. Puedes colaborar con un comentario y resolver dudas, y añadiré cualquier cosilla que se me ocurra y que pueda ayudar a desarrollar.

Como vimos en otros posts necesitamos un enlace para crear una entrada de menú a esta vista. Lo haremos con un xml. Ese archivo se encuentra en /views/actas/tmpl/default.xml.

<?xml version="1.0" encoding="utf-8"?>

<metadata>

<layout title="historico">

Nombre con el que queremos que aparezca en la selección del tipo de menú

<message>

<![CDATA[COM_GESSEG_HISTORICO_VIEW_DEFAULT_DESC]]>

Nombre de la vista

</message>

</layout>

</metadata>

 

 

 

 

 

 

 

 

Escribir un comentario


Código de seguridad
Refescar

PostHeaderIcon Más Comentado

PostHeaderIcon Últimos Comentarios

mod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_counter
mod_vvisit_counterHoy1490
mod_vvisit_counterAyer1493
mod_vvisit_counterEsta semana10789
mod_vvisit_counterLa semana pasada10142
mod_vvisit_counterEste mes27347
mod_vvisit_counterEl mes pasado44972
mod_vvisit_counterTodos los días1432917

We have: 151 guests online
Hoy es: Dic 16, 2017