Estructura de un proyecto Web

¡Hola a todos!

Esta semana no voy a escribir ningún tutorial sobre la API de Twitter o sobre cómo realizar esto o lo otro en PHP. Esta vez vamos a hablar de como organizar un proyecto web.

En primer lugar, me gustaría indicar que hay varias formas de generar una estructura óptima de un proyecto web, esta puede variar en función de las necesidades del proyecto, por lo tanto, esta entrada estará basada en como me organizo yo para crear un proyecto web.

Carpeta Css [Editado][Oxicode]

/plugins/selectizrs/css/selectizrs.css

Carpeta JS [Editado][Oxicode]

/plugins/highchart/js/highchart.js
/plugins/jquery/js/jquery.js
/plugins/selectizrs/js/selectizrs.js

Carpeta Images

Esta carpeta almacenará todas las imágenes, en el caso de que tenga de la la aplicación web.

Carpeta inc

Esta carpeta incluirá todas las clases en PHP necesarias para que la aplicación funcione.

Para organizar un poco mejor esta carpeta seguiremos las siguientes pautas:

  • Crear un archivo config.php donde incluiremos los credenciales de la base de datos.

<?php /** * * @package  Estructura proyecto web * @author   Alejandro Esquiva Rodríguez <alejandro@geekytheory.com> * @license  GeekyTheory License * @link     https://twitter.com/alex_esquiva */ define("SERVER","localhost"); define("USER","user"); define("PASS","pass"); define("DB","db"); //OTROS DATOS define("DEBUG","true"); ?>

  • Crear un archivo llamado functions.php que incluya las demás clases

<meta charset="UTF-8"> <?php require_once("config.php"); if(DEBUG == "true"){ ini_set('display_errors', 1); }else{ ini_set('display_errors', 0); } require_once("Tools.php"); require_once("Table1Class.php"); require_once("Table2Class.php");

  • Crear una clase llamada Tools.php que incluya funciones generales, para conectar/desconectar la base de datos o para obtener datos fácilmente a partir de una sentencia SQL.

<?php include_once 'functions.php'; /** * Clase que contiene funciones útiles sobre la funcionalidad del programa * * @package  Estructura Aplicación WEB * @author   Alejandro Esquiva Rodríguez <alejandro@geekytheory.com> * @license  GeekyTheory License * @link     https://twitter.com/alex_esquiva * */ class Tools{ /** * Devuelve una instancia de la conexión a la base de datos * @return type */ function connectDB(){ $conexion = mysqli_connect(SERVER, USER, PASS, DB); if($conexion){ }else{ echo 'Ha sucedido un error inexperado en la conexion de la base de datos<br>'; } mysqli_query ($conexion,"SET NAMES 'utf8'"); mysqli_set_charset($conexion, "utf8"); return $conexion; } /** * Desconecta la base de datos a partir de la instancia que le pasamos * @param type $conexion * @return type */ function disconnectDB($conexion){ $close = mysqli_close($conexion); if($close){ }else{ echo 'Ha sucedido un error inexperado en la desconexion de la base de datos<br>'; } return $close; } /** * Obtenemos un array multidimensional a partir de una sentencia SQL de entrada * @param type $sql * @return type */ function getArraySQL($sql){ //Creamos la conexión $conexion = $this->connectDB(); //generamos la consulta if(!$result = mysqli_query($conexion, $sql)) die(mysqli_error($conexion)); $rawdata = array(); //guardamos en un array multidimensional todos los datos de la consulta $i=0; while($row = mysqli_fetch_array($result)) { $rawdata[$i] = $row; $i++; } $this->disconnectDB($conexion); return $rawdata; } /** * Dibujamos en pantalla una tabla a partir de un array multidimensional de entrada * @param type $rawdata */ function displayTable($rawdata){ //DIBUJAMOS LA TABLA echo '<table class="table table-striped table-bordered table-condensed">'; $columnas = count($rawdata[0])/2; //echo $columnas; $filas = count($rawdata); //echo "<br>".$filas."<br>"; //Añadimos los titulos for($i=1;$i<count($rawdata[0]);$i=$i+2){ next($rawdata[0]); echo "<th><b>".key($rawdata[0])."</b></th>"; next($rawdata[0]); } for($i=0;$i<$filas;$i++){ echo "<tr>"; for($j=0;$j<$columnas;$j++){ echo "<td>".$rawdata[$i][$j]."</td>"; } echo "</tr>"; } echo '</table>'; } function displayError($title,$message){ ?> <div class="row"> <div class="col-sm-4"> </div> <div class="col-sm-4"> <div class="page-header"> <h1><?php echo $title; ?></h1> </div> <div class="alert alert-info"> <?php echo $message; ?> </div> </div> <div class="col-sm-4"> </div> </div> <?php } }

  • Crear una clase por cada tabla de la base de datos llamada (Nombre de la tabla)Class.php que permita insertar, modificar y obtener datos de esta tabla. Además si la tabla está indexada con un primary key se puede crear una variable global de clase para obtener datos específicos.

<?php include_once 'functions.php'; /** * Esta clase contiene las funciones necesarias para gestionar la tabla table1 de la base de datos * * @package  Estructura Aplicación WEB * @author   Alejandro Esquiva Rodríguez <alejandro@geekytheory.com> * @license  Geeky Theory License * @link     https://twitter.com/alex_esquiva * */ class Table1{ public $ID = 0; /** * Crea una nueva fila en la tabla table1. * @param type $name * @param type $name_twitter * @param type $fecha_inicio * @param type $fecha_final * @return type */ function create($campo1,$campo2,$campo3/*,...*/){ $connect = new Tools(); $conexion = $connect->connectDB(); $sql = "insert into table1 (campo1,campo2,campo3) values ('".$campo1."','".$campo2."','".$campo3."');"; $consulta = mysqli_query($conexion,$sql); if($consulta){ }else{ echo "No se ha podido insertar en la base de datos<br><br>".mysqli_error($conexion); } $connect->disconnectDB($conexion); return $consulta; } /** * Modifica la tabla con los datos introducidos * @param type $name * @param type $name_twitter * @param type $fecha_inicio * @param type $fecha_final * @return type */ function update($campo1,$campo2,$campo3/*,...*/){ $connect = new Tools(); $conexion = $connect->connectDB(); $sql = "UPDATE table1 SET " . "campo1 = '$campo1', " . "campo2 = '$campo1', " . "campo3 = '$campo1' WHERE ID = $this->ID ;"; $consulta = mysqli_query($conexion,$sql); if(!$consulta){ echo "No se ha podido modificar la base de datos<br><br>".mysqli_error($conexion); } $connect->disconnectDB($conexion); return $consulta; } /** * Borra el elemento a partir de un ID dado * @param type $ID * @return type */ function delete($ID){ $connect = new Tools(); $conexion = $connect->connectDB(); $sql = "DELETE FROM table1 WHERE ID=$ID;"; $consulta = mysqli_query($conexion,$sql); if($consulta){ }else{ echo "No se ha podido borrar la table1<br><br>".mysqli_error($conexion); } $connect->disconnectDB($conexion); return $consulta; } /** * Devuelve un array con la información de una fila a partir de un ID * @return type */ function getData(){ //Creamos la consulta $sql = "SELECT * FROM table1 WHERE ID = $this->ID;"; //obtenemos el array $tool = new Tools(); $array = $tool->getArraySQL($sql); return $array; } function getCampo1(){ //Creamos la consulta $sql = "SELECT campo1 FROM table1 WHERE ID = $this->ID;"; //obtenemos el array $tool = new Tools(); $array = $tool->getArraySQL($sql); return $array[0][0]; } /** * Devuelve Toda la información de la tabla table1 * @return type */ function getAllInfo(){ //Creamos la consulta $sql = "SELECT * FROM table1;"; //obtenemos el array $tool = new Tools(); $array = $tool->getArraySQL($sql); return $array; } }

Carpeta mod

header.php footer.php

Scripts de la raiz principal

Aquí será donde crearemos los scripts php/javascript que mostrarán la información de la aplicación. Un pequeño ejemplo de este uso puede ser el siguiente:

<?php //Incluimos todas las clases y funciones del proyecto require_once 'inc/functions.php'; //insertamos el header require_once 'mod/header.php'; //Mostramos todos los datos de la tabla1 $table1 = new Table1(); print_r($table1->getAllInfo()); //Mostramos todos los datos de la tabla2 que tenga como id = 2 $tabla2 = new Table2(); $table2->ID = 2; print_r($table2->getData()); //Por último insertamos el footer require_once 'mod/footer.php';

Y esto es todo, esta es la estructura que suelo seguir a la hora de realizar un proyecto web. Sobre todo me gustaría indicar que hay mil maneras de hacerlo mejor y óptimo, pero así es como me siento cómodo a la hora de programar, por lo tanto dependerá de cada uno crearse su estructura ideal para crear aplicaciónes WEB.

Y tú, ¿Qué estructura usas?, ¿Es similar a esta o añades más cosas?

Saludos! @alex_esquiva