lunes, 26 de mayo de 2014

[Parte 3] PHP

Incluyendo multiples archivos

En PHP frecuentemente usamos archivos de HTML tales como cabeceras, pies de paginas, contenido, conecciones a la base de datos, etc. Para simplemente No tener que crear el mismo archivo en todos los scripts de PHP que creemos, simplemente las llamaremos donde las necesitamos ahorrandonos codigo y haciendolo todo mas simple. 

Existen 4 funciones para incluir archivos externos:

include(), include_once(), require(), require_once().

Y para usarlas simplemente usuariamos la siguiente sintaxis:

include('RutaDelArchivoAgregar.Extension');

require('RutaDelArchivoAgregar.Extension');


En muchos casos se crean una carpeta includes/ donde se colocan los archivos que seran incluidos, tambien casi por regla estandarizada creamos archivos a incluir sea .php o .html de la siguiente forma:

Miarchivo.inc.html
Miarchivo.inc.php

Asi de simple nos dariamos cuenta que ese archivo se esta incluyendo dentro a algun otro...

Las diferencias entre las funciones include() y require() son que con include() la funcion no pararia el script sino que se seguira ejecutando el script en si y con require() la funcion pararia el script y mostraria un error. En este caso es mas recomendable usar un require() en caso de conexiones a bases de datos y un include() en caso de archivos HTML.

Y con las mismas funciones *_once() seria como checar si el archivo ya esta incluido, de manera que si ya esta incluido... ¿para que lo incluimos de nuevo?... Esto en caso de caso que no necesitemos incluirlo de nuevo... Lo que hace es checar si el archivo ya se incluyo.

Veamos un ejemplo donde tenemos una pagina y tenemos que agregar tal coneccion un gran numero de veces en algun script php, o simplemente una pagina donde tenemos varias partes y el menu lo queremos cambiar... tendriamos que cambiar todo el menu. Pero si usamos archivos incluidos simplemente los tendriamos que agregar una vez:



Aqui en la imagen anteror estamos haciendo dos includes el de la cabecera y el del pie de pagina y en el index solo agregamos nuestro contenido...

Esto nos ahorraria mucho trabajo a la hora de modificar un menu en todas las paginas. 


El codigo es el siguiente:

index.php



 <!DOCTYPE html>
<html>
<?php
 $title = "Mi primera pagina web";
 include("header.inc.php");
?>
<div class="box">
 <h3 style="text-align:center;">lorem ipsum</h3>
 <p><img src="neko.jpg" class="img-polaroid" width="200" style="float:left;"></p>
 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Omnis, ex, consequuntur, dolorem magni inventore tempora harum molestias voluptatum assumenda distinctio temporibus ratione minima voluptatibus esse dolores quo voluptas provident nemo.</p>
 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reiciendis amet dicta voluptate totam rerum eos excepturi sint doloribus. Fugit, atque, repellendus molestiae autem sapiente porro animi dicta reprehenderit ea commodi.</p>
 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reiciendis amet dicta voluptate totam rerum eos excepturi sint doloribus. Fugit, atque, repellendus molestiae autem sapiente porro animi dicta reprehenderit ea commodi.</p>
 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reiciendis amet dicta voluptate totam rerum eos excepturi sint doloribus. Fugit, atque, repellendus molestiae autem sapiente porro animi dicta reprehenderit ea commodi.</p>
 <p style="float:right"><iframe width="300" src="http://www.youtube.com/embed/QH2-TGUlwu4" frameborder="0" allowfullscreen></iframe></p>
 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reiciendis amet dicta voluptate totam rerum eos excepturi sint doloribus. Fugit, atque, repellendus molestiae autem sapiente porro animi dicta reprehenderit ea commodi.</p>
 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reiciendis amet dicta voluptate totam rerum eos excepturi sint doloribus. Fugit, atque, repellendus molestiae autem sapiente porro animi dicta reprehenderit ea commodi.</p>
 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reiciendis amet dicta voluptate totam rerum eos excepturi sint doloribus. Fugit, atque, repellendus molestiae autem sapiente porro animi dicta reprehenderit ea commodi.</p>
 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reiciendis amet dicta voluptate totam rerum eos excepturi sint doloribus. Fugit, atque, repellendus molestiae autem sapiente porro animi dicta reprehenderit ea commodi.</p>
 </div>
<?php
 include("footer.inc.php");
?>
</html>




header.inc.php


 <head>
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
 <link rel="stylesheet" type="text/css" href="bootstrap/css/bootstrap.css">
 <script src="bootstrap/js/bootstrap.js"></script> 
 <title><?php echo $title; ?></title>
 <meta charset="utf-8" /> 
 <style type="text/css">
  .menu{
   width:200px;
   float: right;
   margin:5px;
  }
  .footer {
      background-color: #F5F5F5;
      height: 60px;
      text-align: center;
      padding-top: 10px;
  }
  .box img{
   margin:5px;
   text-align: justify;
  }
 </style>
</head>
<body>
<div class="container">
 <div class="page-header">
  <h1>Mi Cabecera</h1>
 </div>
 <div class="menu">
  <ul class="nav nav-tabs nav-stacked">
   <li><a href="">Link</a></li>
   <li><a href="">Link</a></li>
   <li><a href="">Link</a></li>
   <li><a href="">Link</a></li>
   <li><a href="">Link</a></li>
  </ul>
 </div>

footer.inc.php

  <div class="footer muted">
  <div class="container">
   <p>Pie de pagina</p>
  </div>
 </div>
</div>
</body>

Nota: En este caso para los estilos estamos utilizando el framework bootstrap 2, puedes encontrar el curso completo en este mismo BLOG.

Si te das cuenta en este ejemplo solo usamos el include()... Usemos el require() para ver en que casos es importante usarlo...



Tenemos el archivo conexion.php


 <?php
 $con = mysqli_connect("localhost","root","");
 mysqli_select_db($con,"usuarios_api");
 $consulta = "SELECT * FROM usuarios";
 $resultado = mysqli_query($con,$consulta);
 $array_resultados = mysqli_fetch_array($resultado,MYSQLI_ASSOC);
?>




El cual conecta a la base de datos y pide algun registro para que se muestre en el footer (pie de pagina), en este caso no es necesario entender el codigo de arriba por que todavia no vamos en esa parte...


Y el footer.inc.php se cambio de la siguiente forma:


   <div class="footer muted">
  <div class="container">
   <p>
   2014 &copy; by
   <?php 
    require('conexion.php');
    echo $array_resultados['usuario']; 
    ?></p>
  </div>
 </div>
</div>
</body>



Lo unico que hay que entender aqui es que requiero el archivo conexion.php por que si no mi script no se ejecutara correctamente. Y esa es la diferencia de require() a include().




Ruta relativa VS Ruta Absoluta

La ruta absoluta es la cual se indica desde 0, es decir, desde donde viene el archivo, por ejemplo:

C:\Xampp\htdocs\Proyecto\Includes\ejemplo.php

Como puedes ver la ruta es un poco larga y ademas no es compatible con todos los sistemas, ya que si estuviesemos en Linux la ruta seria algo parecido a la siguiente:

/var/www/proyecto/includes/ejemplo.php

Las rutas relativas en cuando a compatibilidad son mejores, ya que si las mueves de servidor no importa seguiran funcionando. Y la otra ventaja es que son menos largas... Une ejemplo es que nuestro archivo que estamos escribiendo codigo en el momento se encuentra en proyecto/ pero queremos incluir un archivo, el de ejemplo.php que se encuentra dentro de la carpeta includes/, quedaria algo mas o menos asi:

/includes/ejemplo.php

Y simple y sencillamente funcionaria tanto en windows como en linux o macos.

Crea tus propias funciones

La sintaxis de una funcion es la siguiente:

function nombre_funcion (){ //codigo funcion }

Y en caso de que contenga parametros es la siguiente:

function nombre_function($parametro1,$parametro2,...){ // codigo funcion}

Las funciones son case-sensitive (se refiere a que diferencia entre mayuscula o minuscula), una funcion llamada: simple_funcion() no es lo mismo que Simple_Funcion() o sImpLe_FuNCiOn(),etc.

Una funcion se usa cuando:

* Una parte de codigo es repetida muchas veces
* Una parte de codigo es dificil y podemos simplemente llamarla

Pongamos de ejemplo una funcion la cual creamos para que cree anuncios con su url, y cada vez que el usuario vuelve a entrar a la pagina web, crea un anuncio diferente. Esto seria de mucha utilidad si lo creeamos en multiples partes del codigo:


 function anuncios(){
  global $imagen_url;
  $imagenes = array('1-http://localhost1','2-http://localhost2','3-http://localhost3','4-http://localhost4','5-http://localhost5','6-http://localhost6','7-http://localhost7');
  shuffle($imagenes);
  $imagen_url = $imagenes[0];
  $imagen_url = explode("-", $imagen_url);
 }

Para acceder a la funcion anuncios tan solo la llamamos desde donde queramos usando su nombre y parentesis: anuncios() y se llamaria, en este caso por que no incluye argumentos.

Explicacion de la funcion anterior:

En la funcion anterior jugamos con un array donde tenemos nuestro nombre de imagen y su divisor sera -, randomizamos el array usando la funcion shuffle(), luego tomamos la primera imagen solamente, esa imagen la "cortamos" usando el divisor y se creara un nuevo array con nuevos valores el cual contendra 1 y el otro http://localhost1 si fuese el caso, ya que cada vez sale diferente imagen por que se "randomiza" con shuffle().


Ahora veamos un ejemplo de una funcion donde apliquemos argumentos (con argumentos nos referimos cuando es necesario pasarle 1 o mas valores a una funcion, aunque muchas veces puede ser tratado como opcional), en esta funcion usaremos un formulario donde pediremos la fecha de nacimiento del usuario para sacar su edad:



El codigo del script es el siguiente:



 <?php
 function calcular_edad($fecha){
  global $cumpleanios;

  $fecha = explode("/", $fecha);
  list($mes,$dia,$anio) = $fecha;

  $fecha_actual = date("m/d/Y");
  $fecha_actual = explode("/", $fecha_actual);
  list($mes1,$dia1,$anio1) = $fecha_actual;
 

  if($mes1 == $mes && $dia1 == $dia){
   $cumpleanios = "Feliz cumpleaños :)";
  }
  elseif($mes1 < $mes ){
   $cumpleanios = $anio1 - $anio - 1;
  }
  elseif ($mes1 == $mes && $dia1 != $dia) {
   $cumpleanios = $anio1 - $anio - 1;
  }
  else{
   $cumpleanios = $anio1 - $anio;
  }
 }
 if (isset($_POST['date'])) {
  $fecha = $_POST['date'];
  $nombre = $_POST['nombre'];
  calcular_edad($fecha);
  echo "<h3>$nombre tu edad es: $cumpleanios</h3>";
 }
?>
<!DOCTYPE html>
<html>
 <head>
  <title>Descubrir edad</title>
  <meta charset="utf-8" />
   <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
  <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
  <script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
  <script>
   $(function() {
    $( "#datepicker" ).datepicker({
     changeMonth: true,
     changeYear: true,
     yearRange: "1900:2025"
    });
   });
  </script>
 </head>
 <body>
  <form action="" method="post">
   <h3>Proporciona tu fecha de nacimiento</h3>
   <p><b>Nombre:</b><input type="text" name="nombre" /></p>
   <p><b>Fecha de nacimiento:</b><input type="text" name="date" id="datepicker" /></p>
   <p><input type="submit" name="enviar"></p>
  </form>
 </body>
</html>




Explicacion del codigo:

Lo que cuenta aqui mas que nada es la funcion, la cual te da la edad del usuario que ingrese su fecha de nacimiento. Lo que hacemos es coger la fecha del usuario y pasarlo a unas variables $mes,$dia,$año con la funcion list() y con explode() las convertimos en un array dividiendolas desde /... Entonces cogemos la fecha del usuario y la fecha actual, hacemos comparaciones para saber si la fecha es igual a su cumpleaños: le deseamos un feliz cumpleaños, si el mes de la fecha actual es menor al que nos da el significa que todavia no cumple años, o si el mes es igual y el dia no pues todavia no cumple años, pero si no entonces si cumple años.

Nota: Estamos haciendo uso de Jquery UI, para saber mas puedes consultar la pagina oficial de Jquery UI.

En la funcion hacemos uso del parametro $fecha este no es un valor opcional, si no le das este valor en la funcion simplemente nos daria un error, por lo cual este valor debe ingresarse, no necesariamente la variable tiene que ser igual que la otra. En caso de que un parametro sea opcional tendrias que dar una fecha por defecto... De esta manera el llamado a la funcion fue:

calcular_edad($fecha);

Ambito en las variables

En este caso de las funciones si que era muy importante el ambito, ya que les estaba dando a algunas variables ambito global para poder hacer referencia a ellas al llamar la funcion.

La variable local, son las que estan dentro de un bloque y solamente cuentan alli, es como en la funcion anterior, sino le agregas como variable global solamente puede valer alli y entonces cuando las llamas causarian algun error.

La variable global es accedida desde todos los ambitos. Puedes usar la palabra global $nombre_tu_variable, para convertir esa variable con ambito global en caso de que tenga otro ambito.

Hasta aqui la parte 3 de PHP, espera la parte 4, dejame tu comentario si tienes dudas o si crees que le falto algo mas y podria incluirlo en la siguiente parte, un saludo :)

No hay comentarios:

Publicar un comentario en la entrada