Este nuevo componente se realizará sobre la estructura básica del framework, que ya incluye un login, sistema de mensajes (alertify), gestión de media (js y css), ayuda en formularios, gestor de menú, etc. Le permitirá agregar, editar y eliminar noticias en el sistema.
Este nuevo componente se realizará sobre la estructura básica del framework, que ya incluye un login, sistema de mensajes (alertify), gestión de media (js y css), ayuda en formularios, gestor de menú, etc. Le permitirá agregar, editar y eliminar noticias en el sistema.
Lo primero será agregar nuestro componente en el archivo components.xml para que el framework conozca lo necesario acerca del mismo:
<component> <name>noticias</name> <displayName>Noticias</displayName> <menu>true</menu> <menus> <menuItem> <name>main</name> <path>noticias/views/common/menu_main.phtml</path> <default>true</default> </menuItem> </menus> <sqlprefix>not_</sqlprefix> <enabled>true</enabled> </component> |
El nombre se usará para referirnos a él en el código y como identificador único. La opción menú, sirve para mostrar en el menú principal de la aplicación.
En la opción menuItem, podremos poner los menus que deseemos que use nuestro componente, y luego podrán ser definidos desde el controlador, solo deberemos setear la constante MENU con el nombre del menú que queramos cargar.
Archivos básicos:
Controllers |
Models |
Views |
Tables |
index |
noticia |
listadonoticias |
noticias |
firmante |
seccion (extern) |
editor |
firmantes |
|
firmante |
listadofirmantes |
|
|
|
menu_componente |
|
Analicemos como va quedando el contenido del controlador principal de nuestro componente noticias:
class indexController extends Controller{
public function __construct(){
parent::__construct();
Session::control();
}
//noticias/
public function index(){
$this->_view->renderizar('listado',true);
}
//noticias/nueva
public function nueva(){
$firmante = $this->loadModel('firmante');
$seccion = $this->loadModelFromOtherComponent('seccion','secciones');
$this->_view->_secciones = $seccion->getSecciones();
$this->_view->_firmantes = $firmante->getFirmantes();
$this->_view->renderizar('nueva',true);
}
}
Vemos cómo ejerce el sesión de control en el constructor. Si lo supera el método por defecto es index(), el cual llama a la vista listado.
El método nueva() ya es más interesante, vemos como carga los firmantes, los cuáles son un modelo del propio componente, y cómo también puede cargar modelos de otros componentes, como es el caso del componente sección. Aquí vemos pues una clara relación entre componentes.
Vemos un ejemplo de firmanteModel.php:
class firmanteModel extends Model{
public $id;
public $nombre;
public $email;
public function __construct(){
parent::__construct();
$this->cargaBD();
}
public function getFirmantes() {
try {
$firmantes = $this->_db->query("SELECT * FROM firmantes") or die(mysql_error().mysql_errno());
return $firmantes->fetchAll();
}
catch (PDOException $e) {
echo $e->getMessage();
return false;
}
}
}
Como resultado se llama a la vista, como por ejemplo nueva:
<form method="post" action="<?php echo BASE_URL.'noticias/nueva'; ?>">
<table>
<tr>
<td>
<?php Form::select($this->_firmantes,'id','nombre','Firmantes'); ?>
</td>
<td>
<?php Form::select($this->_secciones,'id','seccion','Secciones'); ?>
</td>
<td>Orden
<input type="text" name="orden" size="5" maxlength="9"/>
</td>
<td></td>
<td>
<?php Form::button('Guardar noticia','positive','add'); ?>
<?php Form::button('Ampliar noticia','regular','blue'); ?>
<?php Form::button('Eliminar noticia','negative','delete'); ?>
</td>
</tr>
</table>
<h2>Título</h2>
<textarea rows="1" name="texto"></textarea>
<h2>Subtítulo</h2>
<textarea rows="1" name="subtitulo"></textarea>
<h2>Entradilla</h2>
<textarea rows="4" name="entradilla"></textarea>
<h2>Texto</h2>
<textarea rows="15" name="texto"></textarea>
</form>
Vemos alguna otra función del framework, como la que proporciona la clase Form que nos ayuda a pintar elementos de formulario asociados a fuente de datos, como en el caso de los select, o no, como en el caso de los botones que simplemente agrega una imagen y estilo a los botones.