martes, 24 de marzo de 2015

Gestión de un parque informático en MVC



El objetivo es crear varios archivos PHP que permitan mostrar y buscar las máquinas en un parque informático. También será necesario visualizar un gráfico que represente el número de máquinas por sala. Estos archivos deben respetar la arquitectura Modelo Vista Controlador. 

Inicio:



Lista:



Búsqueda:



Gráfico:



Solución:

A continuación se muestra el contenido de la carpeta principal:

  • La página ver.php:
<?php // Dispatcher secundario
// Archivo comun
require(’comun.php’);
$controlador->ver();// acción del controlador
?>
  • La página común.php:
<?php // código común a todos los dispatchers
define(’ROOT’, ’/’);
define(’WEBROOT’, ’’); // Archivo de Core
require(ROOT.’core/model.php’);
require(ROOT.’core/controlador.php’); //echo ’Conexión a la BDD’;
require(ROOT.’controladores/parque.php’); // Inicialización del controlador
$controlador = new parque();
?>
  • La página formulario_busqueda.php:
<?php // Dispatcher secundario
require(’comun.php’);
$ controlador->formulario_busqueda(); // acción del controlador
?>
  • La página indice.php:
<?php // Dispatcher principal
require(’comun.php’);
$ controlador->indice(); // acción del controlador
?>
  • La página lista.php:
<?php // Dispatcher secundario
require(’comun.php’);
$ controlador->busqueda(""); //acción de controlado
?>
  • La página busqueda.php:
<?php // Dispatcher secundario
require(’comun.php’);
extract($_POST); // Importante las variables en la tabla
de símbolos. Permiten meter contenido el contenido
de $_POST[’addip’] en la variable $addip
$controlador->busqueda($addip); // acción del controlador
?>
  • La página controladores/parque.php:
<?php
class parc extends controlador {
var $models = array(’parque_model’);
//Action indice
function indice(){
$this->render(’indice’); //llamada de la vista indice.php
}
function busqueda($ip){
$d[’record’] = $this->parque_model->getByIP($ip);
$this->set($d);
$this->render(’busqueda’); //llamada de la vista busqueda.php
}
//ver el número de PC por sala (limitado a los 8 primeros)
function ver(){
$d[’record’] = $this->parque_model->getNumeroPCSalla();
$nb_maximum = 0; //mayor número de PC
$val1=0; // número de PC en una sala
$val2=0; // numéro de la sala
$tabla_PC = array(); //clave de la tabla = n° de sala,
valor de la tabla = número de PC en la sala
foreach($d[’record’] as $clave=>$val) {
$val1 = $val["número"];
if ($val1 > $num_maximo) {
$num_maximo = $val1;
}
$val2 = $val["sala"];
$tabla_PC[$val2] = $val1;
}
$nombre_element = count($tabla_PC); //número de elementos en la tabla
$largoImage = 450;
altoImage = 400;
$image = imagecreate($largoImage, $altoImage);
$blanco = imagecolorallocate($image, 255, 255, 255);
$negro = imagecolorallocate($image, 0, 0, 0);
$azul = imagecolorallocate($image, 100, 100, 255);
// trazo horizontal para representar el eje de las salas
imageline($image, 10, $altoImage-10, $largoImage-10,
$altoImage-10, $negro);
// ver número de las salas
for ($j=1; $j<=$numero_element; $j++) {
imagestring($image, 0, $j*40, $altoImage-10, $j, $negro);
}
// trazo vertical que representa el número de PC
imageline($image, 10, 10, 10, $altoImage-10, $negro);
$num_maximo = $num_maximo+1; //para ver un gráfico un poco
más alto que el número máximo
// traza de los rectángulos
for ($j=1; $j<=$numero_element; $j++) {
// el número máximo de PC proporcional al alto de la imagen
$altoRectangulo =
round(($tabla_PC[$j]*$altoImage)/$num_maximo);
imagefilledRectangulo($image, $j*40-6,
$altoImage-$altoRectangulo, $j*40+8, $altoImage-10, $azul);
imagestring($image, 0, $j*40-6,
$altoImage-$altoRectangulo-10, $tabla_PC[$j], $negro);
}
imagestring($image, 3, 0, 0, "Número de PC.", $negro);
imagestring($image, 3, $largoImage-100, $altoImage-30,
"N° de sala.", $negro);
imagepng($image, "./images/miImagen.png");
imagedestroy($image);
$this->render(’ver’); //llamada de la vista ver.php
}
function formulario_busqueda(){
$this->render(’formulario_busqueda’);
//llamada de la vista formulario_busqueda.php
}
}
?>
  • La página core/controlador.php:
<?php
class controlador{
var $vars = array();
var $layout = ’default’;
function __construct(){
if(isset($_POST)){
$this->data = $_POST;
}
if(isset($this->models)){
foreach($this->models as $v){
$this->loadModel($v); //charga del modelo, aquí parque_model
}
}
}
function set($d){
$this->vars = array_merge($this->vars,$d);
//fusiona las tablas $this->vars et $d
}
// inclusión del archivo que se pasa como parámetro
Function render($filename){
extract($this->vars); //Importa las variables en la tabla
de símbolos.
ob_start();
require(ROOT.’views/’.get_class($this).’/’.$filename.’.php’);
$content_for_layout = ob_get_clean(); //Lee el contenido de
memoria de salida y la borra
//Esto permite recuperar el contenido de la vista y almacenar
en la variable $content_for_layout
require(ROOT.’views/layout/’.$this->layout.’.php’);
}
function loadModel($name){
require_once(ROOT.’models/’.strtolower($name).’.php’);
$this->$name = new $name();
}
} ?>
  • La página core/model.php:
<?php /** * Object Model * Permite las interactiones con la base
de datos * */
class Model{
public $table;
public $id;
private static $base;
private static $servidor=’127.0.0.1’;
private static $bdd=’parque_info’; //nombre de la base de datos
private static $user=’root’ ;
private static $mdp=’’ ;
public function __construct()
{
//Conexión a la base de datos
Model::$base = mysqli_connect(Model::$servidor,
Model::$user,Model::$mdp,Model::$bdd);
}
public function __destruct(){
Model::$base = null;
}
/** * Permite recuperar varias líneas en la BDD
* @param $data conditiones de recuperación * */
public function find($data=array()){
$conditions = "1=1";
$fields = "*";
$limit = "";
$order = "id DESC";
extract($data); // Importa las variables en la tabla de símbolos.
if(isset($data["limit"])){
$limit = "LIMIT ".$data["limit"];
}
$sql = "SELECT ".$fields." FROM ".$this->table." WHERE "
$conditions." ORDER BY ".$order." ".$limit;
$req = mysqli_query(Model::$base, $sql) or die(mysqli_error
(Model::$base)."<br/> => ".$sql);
$d = array();
while($data = mysqli_fetch_assoc($req)){
$d[] = $data;
}
return $d;
}
/** * Permite hacer una consulta compleja * @param $sql
Consulta a realizar * */
public function query($sql){
$req = mysqli_query(Model::$base, $sql)
or die(mysqli_error(Model::$base)."<br/> => ".$sql);
$d = array();
while($data = mysqli_fetch_assoc($req)){
$d[] = $data;
}
return $d;
}
}
/** * Permite cargar un modelo * @param $name Nombre del
modelo a cargar * */
static function load($name){
require("$name.php");
return new $name();
}
} ?>
  • La página models/parque_model.php:
<?php
class parque_model extends Model{
var $table = ’ordenadores’; //nombre de la tabla
//devuelve los registros en función de sus dirección IP
function getByIP($ip){
return $this->query("SELECT id, ip, mac, numero, salla FROM
".$this->table." WHERE ip LIKE ’".$ip."%’ ORDER BY ip ASC");
}
//devuelve el número de PC por sala
function getNumeroPCSalla(){
return $this->query("SELECT count(id) as numero, salla FROM
".$this->table." GROUP BY Sala order by sala LIMIT 8");
}
}
?>
  • La página views/layout/default.php:
<HTML>
<HEAD> <TITLE> Parque inform&&aacute;tico </TITLE> </HEAD>
<BODY> <h1>Gesti&oacute;n del parque inform&aacute;tico</h1>
<?php echo $content_for_layout;?> <p> <a href="<?php echo
WEBROOT; ?>indice.php">Inicio</a> </p>
<BODY>
</HTML>
  • La página views/parque/ver.php:
<img src="./images/miImagen.png" name="graph"/>
  • La página views/parque/formulario_busqueda.php.
<body>
<h2> Selecci&oacute;n de una m&aacute;quina de dominio</h2>
<form name="formip" method="post" action="<?php echo
WEBROOT; ?>busqueda.php"> <p>Direcci&oacute;n IP del parque:</p>
<p><input name="addip" size="15" maxlength="15" type="text"></p>
<p><input value="Buscar" type="submit"></p>
</form>
</body>
  • La página views/parque/indice.php:
<h2> <a href="<?php echo WEBROOT; ?>Lista.php">Lista</a> </h2>
<h2> <a href="<?php echo WEBROOT; ?>formulario_busqueda.php">
B&uacute;squeda</a> </h2>
<h2> <a href="<?php echo WEBROOT; ?>ver.php">
Ver gr&aacute;fico</a> </h2>
  • La página views/parque/busqueda.php:
<h2><a>Ver m&aacute;quinas</a></h2>
<?php
if (isset($record[0])) { //si hay máquinas
echo "<table border=1 width=\"100%\">";
$Lista_indices=array_keys((array)$record[0]);
echo "<tr>";
while($indice=each($Lista_indices)) {
echo "<th>";
echo $indice[’value’];
echo "</th>";
}
echo "</tr>";
foreach((array)$record as $clave_tabla=>$linea) {
echo "<tr>";
foreach($linea as $clave=>$valor) {
echo "<td align=center>";
echo $valor;
echo "</td>";
}
echo "</tr>";
}
echo "</table>";
}
else {
echo "No existen máquinas que cumplan sus criterios.";
}
?>
Para terminar, el script de creación de la tabla y de inserción de datos.
--
-- Estructura de la tabla `ordenadores`
--
DROP TABLE IF EXISTS `ordenadores`;
CREATE TABLE IF NOT EXISTS `ordenadores` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ip` char(15) NOT NULL,
`mac` char(17) NOT NULL,
`nombre` char(15) NOT NULL,
`sala` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=82 ;
--
-- Contenido de la tabla `ordenadores`
--
INSERT INTO `ordenadores` (`id`, `ip`, `mac`, `nombre`, `sala`) VALUES
(47, ’178.17.5.4’, ’00:1a:73:7d:e0:eb’, ’pc-x’, 2),
(45, ’172.17.5.2’, ’00:14:6c:65:86:ab’, ’pc-w’, 2),
(16, ’172.17.4.21’, ’00:0d:56:c2:f2:5a’, ’pc-01’, 2),
(17, ’192.17.4.22’, ’00:0d:56:c2:f3:a7’, ’pc-02’, 1),
(18, ’172.17.4.23’, ’00:0d:56:c2:e8:4d’, ’pc-03’, 1),
(22, ’172.17.4.27’, ’00:0d:56:c2:f3:ad’, ’pc-07’, 1),
(23, ’178.17.4.28’, ’00:11:85:10:f4:bf’, ’pc-08’, 2),
(24, ’172.17.4.29’, ’00:11:85:11:01:2b’, ’pc-09’, 1),
(25, ’172.17.4.30’, ’00:11:85:14:4e:37’, ’pc-10’, 1),
(26, ’192.17.4.31’, ’00:11:85:14:4d:99’, ’pc-11’, 1),
(27, ’172.17.4.32’, ’00:11:85:62:71:05’, ’pc-12’, 1),
(28, ’172.17.4.33’, ’00:11:85:14:4e:22’, ’pc-13’, 1),
(29, ’176.17.4.34’, ’00:11:85:14:4d:ab’, ’pc-14’, 1),
(30, ’172.17.4.35’, ’00:0f:b5:85:0c:21’, ’pc-15’, 3),
(31, ’168.17.4.36’, ’00:14:85:7d:d2:35’, ’pc-16’, 3),
(32, ’172.17.4.37’, ’00:14:85:7a:a9:8c’, ’pc-17’, 3),
(79, ’178.17.4.38’, ’00:14:85:7D:CF:AA’, ’pc-18’, 4),
(34, ’178.17.4.39’, ’00:14:85:79:78:fa’, ’pc-19’, 4),
(39, ’172.17.4.43’, ’00:14:85:7a:78:dc’, ’pc-23’, 3),
(40, ’172.17.4.44’, ’00:14:85:7a:78:a5’, ’pc-24’, 3),
(41, ’172.17.4.45’, ’00:14:85:7a:78:de’, ’pc-25’, 5);



Espero haber ayudado en algo. Hasta la próxima oportunidad!








No hay comentarios:

Publicar un comentario en la entrada