Mostrando entradas con la etiqueta PHP. Mostrar todas las entradas
Mostrando entradas con la etiqueta PHP. Mostrar todas las entradas

miércoles, 21 de octubre de 2015

Un MVC básico para los primeros proyectos con PHP

Alguna ves quisiste hacer un sistema sencillo, que funcionara bien y sin complicarte tanto la vida?

Eso me pasó cuando recién comenzaba con php, en los primeros proyectos con él en la universidad me dió bastante trabajo, aunque eran proyectos sencillos, el no saber como manejar/abordar la resolución de esos problemas me hizo trabajar de más, pero al grano...

Este ejemplo está hecho para quien recién comienza con php y no tenga que programar con el clásico "página uno → página dos", con todo el código remezclado en un solo archivo de 800 líneas como me pasó en mis primeros días, si no que hagan algo un poco más decente y entendible, también por esto último utilicé programación procedimental al estilo de lo que usaba por aquellos días.

La idea es que se entienda el principio de como funciona el sistema, para que luego
puedan modificarlo a gusto y utilizar el estilo de programación que más les agrade, o por lo menos ese es el plan.

Creo en el principio de que hay que quemar etapas y la de "página uno → página dos" con todo el código en la misma página "html, php, js, mysql etc", hay que quemarla y rápido si es posible hasta evitarla desde el inicio... ya ahora si, vamos a ver como es que funciona este ejemplo.

La estructura de las carpetas es la siguiente:

Para explicar brevemente las carpetas y su función;
Carpeta DB: solo está allí porque contiene la base de datos para este ejemplo, deben entrar y seleccionar el archivo "dbprueba_php.php" que les creará la base de datos con lo necesario para que todo funcione correctamente.

Carpeta css: contiene los archivos css necesarios para el template.

Carpeta img: contiene las imágenes del sistema.

Carpeta js: donde guardo todos los archivos javascript o jquery.

Carpeta lib: la utilizo para guardar la conexión a la base de datos.

Carpeta system: contiene las carpetas necesarias para el mvc.

Carpeta controller: es donde están los controladores del sistema y donde se define como debe funcionar el mismo (donde se deberían tomar las decisiones).

Carpeta model: tiene la mayoría del código php y mysql, es donde se deberían resolver los problemas, no tomar las decisiones, es el back-end.

Carpeta view: aquí se guarda el código html que será el front-end del sistema, debería tener la menor cantidad de código php, js, etc., posible.

Carpeta admin: lo mismo que la anterior con la diferencia que esta es para administración del sistema, es decir cuando se logra superar el login.

Para no aburrirlos con el cuento explico el sistema resumido, la carpeta model se supone sea el back-end del sistema, donde va la mayoría del código que resuelve los problemas, la carpeta view que contiene las vistas es el front-end del sistema y esa es básicamente su función, y con la carpeta controller se toman las decisiones de como debe funcionar el sistema, es donde organizamos todo lo mencionado anteriormente para hacer que todo funcione como debería.

El archivo index.php:

No hay mucho que explicar, con "session_start" se inicia la sesión, con los "if" determinamos si ya se inició una sesión, en el primer caso si no la hemos iniciado utilizaremos "controller.php", una ves iniciemos la sesión estaremos utilizando "controller2.php".

El archivo controller.php:

El archivo contiene un "switch case" y dos funciones, una para el "header" y otra para el "footer".

Con el "if" determinamos si hemos enviado algo a través de "get_action", en este caso lo único que podemos enviar es "login", pero de entrada o presionando inicio estaremos dentro del "if" y veremos la página de entrada al sistema, pueden ver que contiene la función header, un include a la carpeta view y termina con la función footer, prácticamente es como armar un rompecabezas, o algo así, pero quiero que vean que tenemos tres cosas distintas que se están organizando dentro de ese "if" para mostrar algo en especifico.

Luego está el "switch case" dentro del "else", en ese punto debimos presionar "login" para estar dentro del "switch case".

En ese caso hago un "require" a la conexión y luego está el "switch case", que contiene la opción "login" y la opción "default".

En "login" hago un "include" a la carpeta model, está vista header, otro "include" a la carpeta view, vista footer, y otro "include" más a la carpeta model, en este caso para los mensajes, es donde guardo todos los mensajes en ves de colocarlos directamente en cada archivo,

Por último "default", estaremos dentro de esta opción en caso de enviar algo diferente a "login", por ejemplo si presionamos login y luego en la barra del navegador cambiamos login por "logines" por ejemplo, no saldrá una página mostrando un error y nos redireccionará de nuevo al inicio.

Y básicamente resumiendo bastante así es más o menos como funciona, el archivo "controller2.php" tiene el mismo funcionamiento con la salvedad que es donde manejaremos las opciones de administración, se maneja de la misma manera con los "case".

Todo lo anterior, en mi caso me resulta muy sencillo y fácil de entender, es por eso que lo elegí como ejemplo, si descargan el archivo y se fijan en los nombres de los archivos notarán que tienen sus nombres en común, por ejemplo, si creo un archivo para agregar un usuario en view y le coloco por nombre "adduser" en la carpeta model creo un archivo con el mismo nombre, lo mismo en el controller, creo una opción "adduser" para trabajar con esa opción, del mismo modo, si necesito hacer validaciones creo otro archivo con el mismo nombre y con extensión .js en la carpeta js, y así notarán que es todo un poco más ordenado.

La carpeta con el ejemplo la pueden descargar desde la siguiente dirección:
mvc-basico-php.

Para entrar como administrador al sistema el nombre y passw del login es "admin01".

Espero les funcione y ayude en sus proyectos.

domingo, 8 de marzo de 2015

Envió de correo con PHPMailer y Gmail (Xampp)

Hay muchas maneras de enviar correos a través de PHP, pero casi siempre es un dolor de cabeza (no soy el primero que lo escribe), con PHPMailer es algo si se quiere sencillo, en este ejemplo estoy utilizando "xampp-linux-5.6.3-0" y "PHPMailer V5.2.9 (master.zip)".

Para comenzar, PHPMailer tiene ejemplos que podemos seguir y partir de allí, están dentro de la carpeta "examples" y pueden servir de ayuda, también el archivo "README" contiene un ejemplo básico y es el que tomé para este ejemplo.

<?php require 'PHPMailerAutoload.php'; $mail = new PHPMailer; $mail->SMTPDebug = 2; /* Enable verbose debug output */ $mail->isSMTP(); /* Set mailer to use SMTP */ $mail->Host = 'smtp.gmail.com'; /* Specify main and backup SMTP servers */ $mail->SMTPAuth = true; /* Enable SMTP authentication */ $mail->Username = 'usuario@gmail.com'; /* SMTP username */ $mail->Password = 'Super~Password'; /* SMTP password */ $mail->SMTPSecure = 'tls'; /* Enable TLS encryption, 'ssl' also accepted */ $mail->Port = 587; /* TCP port to connect to */ $mail->Helo = 'localhost'; /* Permite usar EHLO / HELO */ $mail->Hostname = 'gmail.com'; /* Permite usar un hostname */ $mail->From = 'usuario@gmail.com'; /* Correo Gmail */ $mail->FromName = 'Pedro Pérez'; /* Nombre de usuario Gmail */ $mail->addAddress('usuario-2@live.com', 'Fulanito de Tal'); /* Add a recipient / correo de destino */ // $mail->addAddress('ellen@example.com'); /* Name is optional */ // $mail->addCC('cc@example.com'); // $mail->addBCC('bcc@example.com'); // $mail->addAttachment('/var/tmp/file.tar.gz'); /* Add attachments / agregar un archivo*/ // $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); /* Optional name */ $mail->isHTML(true); /* Set email format to HTML / Comentar para texto plano */ $mail->Subject = 'Prueba de Email usando PHPMailer y Gmail'; /* Asunto */ $mail->Body = 'Aquí se escribe el mensaje a mostrar!!'; /* Lo que se mostrará en el mensaje */ if(!$mail->send()) { echo 'Message could not be sent.'; echo 'Mailer Error: ' . $mail->ErrorInfo; } else { echo 'Message has been sent'; } ?>

Quedaría más o menos así:


Nada del otro mundo, además que está comentado, pero para que no queden dudas explico lo más importante.

"require 'PHPMailerAutoload.php';" → dependencia de PHPMailer.

SMTPDebug = 2; → activamos el modo debug.
isSMTP(); → utilizamos SMTP.
Host = 'smtp.gmail.com'; → SMTP de gmail.
SMTPAuth = true; → Actíva la autenticación SMTP.
SMTPSecure = 'tls'; → Usamos tls.
Port = 587; → El puerto de conexión es el 587.
Helo = 'localhost'; → Usamos EHLO / HELO.
Hostname = 'gmail.com'; → Asignamos un hostname.
Username = 'usuario@gmail.com'; → Usuario de Gmail.
Password = 'clave'; → Su contraseña.
From = 'usuario@gmail.com'; → Usuario de Gmail.
FromName = 'Nombre Ap.'; → Nombre del usuario de Gmail.
addAddress('destino@live.com', 'Nombre Des.'); → Correo de destino.

addAttachment('/var/tmp/file.tar.gz'); → Archivo adjunto.
isHTML(true); → Activamos / Desactivamos HTML.
Subject = 'Correo de aviso'; → El asunto de correo.
Body = 'Este es el mensaje'; → El mensaje como tal.

Comentar que en "Helo" se puede colocar lo que se desee, es lo que se muestra justo antes de la dirección ip, (Received: from localhost ([190.61.55.55])), y "Hostname" es lo que se mostrará en al final de "message-ID", (Message-ID: <2b4366312uw3eebe1z3s@gmail.com>), para terminar, si queremos enviar el correo en "texto plano" debemos comentar "isHTML(true);".

Con esto ya estaría todo listo para enviar un correo, si se presenta algún problema con en mi caso, que no podía enviar el correo por problemas de certificados la solución la conseguí y fue algo sencillo, añadir unas líneas de código y listo.

El error es algo parecido a esto:

Warning: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /Applications/XAMPP/xamppfiles/htdocs/phpMailer/class.smtp.php on line 338

La Solución es agregar algunas líneas de código al archivo "class.smtp.php", las líneas a agregar van cerca de la línea número 242 y debería quedar más o menos así.

public function connect($host, $port = null, $timeout = 30, $options = array()) { if(count($options)==0){ $options["ssl"]=array("verify_peer"=>false,"verify_peer_name"=>false,"allow_self_signed"=>true); }

Ejemplo:


El comentario de donde tomé el ejemplo está en el siguiente enlace:
Comentario en hithub.

Solucionado lo anterior, sin ningún problema se debería poder enviar mensajes, si tienen problemas con los acentos, pueden editar el archivo "class.phpmailer.php" en la línea 47 "public $CharSet = 'iso-8859-1';" y colocar "'UTF-8'" en lugar de "'iso-8859-1'".

Descargar PHPMailer.