Diseño y programación de un portfolio web con CakePHP

Una de las secciones que más he cuidado de dejandomarcas.com v2.0 es el portfolio. Al programar con CakePHP he podido diseñar un controlador que me obtenga todos los datos de mis trabajos de forma clara y ordenada, dejando a la vista que se encargue de cómo quiero mostrarlo en pantalla.

A continuación voy a explicar cómo lo he hecho, tanto el código del controlador, como el diseño de la vista, para que si quereis montar una galería de imágenes o un portfolio personal, podais hacerlo de una forma sencilla, siempre utilizando CakePHP, así aprendemos un poquito de este maravilloso framework.

Creo el modelo -> app/models/portfolio.php

<?php 

// Este es el modelo que uso para trabajar con la bd
class Portfolio extends AppModel {
	
  // Nombre modelo
  public $name = 'Portfolio';
	
  // Nombre tabla BD
  public $useTable = 'portfolio';

  // Campo de ordenación por defecto
  public $order = 'Portfolio.id DESC';
	
  // Usado para la validacion de los datos de entrada dentro del panel de administracion
  public $validate = array(
    'nombre' => array('required' => array('rule' => 'notEmpty', 'message' => 'name can not be empty')),
    'descripcion' => array('required' => array('rule' => 'notEmpty', 'message' => 'description can not be empty'))
  );
}

?>

Creo el controlador -> app/controllers/home_controller.php


<?php

class HomeController extends AppController {

  // Nombre controlador
  public $name = 'Home';

  // Modelos empleados
  public $uses = array('Portfolio');

  // Disposición de diseño por defecto
  public $layout = 'main';

  // Componentes utilizados	
  public $components = array('String');

  // Helpers utilizados
  public $helpers = array('String');

  /* METODOS PUBLICOS */
	
  // Indice de trabajos
  public function index() {
	
    // Busco todos los registros
    $registers = $this->Portfolio->find("all", array("conditions" => array("Portfolio.ver" => 1)));
				
    // Seteo el registro y los medios
    $this->set('registers', $registers);
  }
	
  // Metodo para lanzar una URL del portfolio sumando uno a las visitas que ya tenia
  public function getURL($id) {

    // No renderizo la vista
    $this->autoRender = false;
		
    // Busco el registro correspondiente a la id recibida
    $register = $this->Portfolio->find("first", array("conditions" => array("Portfolio.id" => $id)));
		
    // Recupero la id
    $this->Portfolio->id = $id;
		
    // Sumo uno a las visitas
    $visitas = $register['Portfolio']['visitas'] + 1;

    // Guardo los datos
    if ($this->Portfolio->saveField('visitas', $visitas)) {
			
      // Lanzo la URL
      $this->redirect($register['Portfolio']['enlace']);
    }
  }
}
?>

Y por último, la vista -> app/views/themed/default/home/index.ctp


<div id="bread">
  <?php echo $html->image('main/blue-folder-open-document.png')?><?php echo __('latest works');?>
</div>
<?php
  // Recorro los registros del controlador
  foreach ($registers as $register) {
?>
  <div class="project">
    <div class="box">
      <a href="<?php echo $html->url(array('controller' => 'home', 'action' => 'getURL', $register['Portfolio']['id'])); ?>" target="_blank">
        <?php echo $html->image($register['Portfolio']['imagen'], array('alt' => __($register['Portfolio']['nombre'], true)))?>			
      </a>
    </div>
    <h2><?php echo $register['Portfolio']['nombre'];?></h2>
    <p>» <?php echo utf8_encode($register['Portfolio']['descripcion']);?></p>
  </div>
<?php
}
?>

Con estos tres archivos ya tengo declarado el modelo de datos que voy a utilizar junto con sus validaciones para el panel de administración, el controlador que me ayuda a declarar todos los métodos para gestionar los datos, y por último, la vista, que mostrará en pantalla los datos obtenidos.

El resultado es el que veis en http://www.dejandomarcas.com/index.php/home

¿Tenéis dudas?, pues animaros y comentar!

Anuncios

Buenas prácticas a la hora de programar

Muchas veces, cuando empezamos un nuevo proyecto, nos sentamos como locos y nos ponemos a escribir como alma que lleva el diablo. A la hora de programar o de realizar cualquier tarea en nuestra vida cotidiana, es recomendable pensar durante unos mínutos qué voy a hacer, cómo lo voy a hacer y con qué objetivo tengo que hacerlo.

A lo largo de mi experiencia como programador web, he aprendido una serie de buenas prácticas a la hora de desarrollar un proyecto. De la misma manera que calentamos y estiramos los músculos antes de salir a correr, debemos analizar la situación antes de liarnos a escribir líneas y líneas de código.

He aquí mi lista de buenas prácticas a la hora de programar:

  1. Antes de encender si quiera el ordenador, toma papel y lápiz y empieza a plasmar todo lo que se te ocurra del proyecto que tienes entre manos. Muchas veces necesitamos ver las cosas en papel para que nuestra mente se abra más de lo que pensábamos que estaba abierta.
  2. Organiza, plantea y asegura un buen plan de trabajo. Divide el proyecto por partes y asigna prioridades o fases de desarrollo.
  3. Si no usas un framework o ningún patrón de diseño, diseña un buen árbol de archivos para organizar el trabajo, evitarás tener carpetas duplicadas y archivos en lugares que no deberían estar.
  4. Organiza un entorno de desarrollo, uno de pre-producción y otro de producción.
  5. No diseñes/programes solo para un navegador, lamentablemente más del 80% de los usuarios siguen navegando con Iexplorer, incluso con la versión 6.
  6. A la hora de escribir tu código, es aconsejable comentar la fecha, hora, lugar, proyecto, etc. en la cabecera, nos ayudará a tener un plano temporal de cuándo programaste y por qué lo hiciste.
  7. Organiza bien el código, indenta, COMENTA, separa los diferentes bloques, indica qué estás haciendo y qué resultados necesitas.
  8. Hago incapie en comentar el código. Recuerda que no solo programas para tí. Si estás en una empresa o en un grupo de trabajo, el código que programes posiblemente pasará a otra persona, cuyos comentarios que incluiste le ayudarán a entender lo que has hecho y a seguir el trabajo. También es bueno comentar lo que haces porque, nunca se sabe cuándo tendrás que retomar un proyecto, o reutilizar una clase o un conjunto de funciones. Deja tus migas de pan y nunca perderás tu camino.
  9. Utiliza nombres de variables y funciones que sean acordes con lo que estás programando. Por ejemplo, si necesitas guardar la fecha de alta de un registro en el sistema, no uses $var o $fecha a secas, sé más intuitivo pues el nombre de las variables nos ayudan a comprender qué guardan en su interior. $created o $modified son términos de ejemplo.
  10. Documéntate, comparte, lee mucho código de otras personas. Tu mente es un lugar con espacio infinito para guardar información, no pienses que tu código es perfecto, pues millones de personas posiblemente ya han programado lo que estás haciendo y tienen un punto de vista muy interesante sobre tu problema. No dudes en leer el código de los demás, te ayudarán a enteder mejor el lenguaje de programación viendo su solución.
  11. Respalda tu información, haz backups de tu proyecto pues, no hay nada peor que estar trabajando y que por un corte de luz todo tu trabajo se vaya al traste.
  12. Reutiliza tu código todo lo que puedas, no repitas los mismos bloques una y otra vez. Recuerda que al modular estás ahorrando tiempo, costes, trabajo y lo más importante, factor de errores.
  13. Depura, depura y depura. No pares de depurar todo lo que hagas. Hasta el más mínimo error debería ser cotejado y tenido en cuenta antes de que un maravilloso FATAL ERROR arruine todo tu trabajo.
  14. Sal con tus amigos, haz deporte, come de forma sana y saludable, tómate dos cervezas a mi salud y recuerda, tienes una vida ahí fuera libre de ceros y de unos, de bucles y funciones, de clientes que no saben lo que quieren y de proyectos que nunca acaban. Disfruta!

Cuáles son vuestras prácticas a la hora de programar?

Pirámide de asteriscos con PHP – Modo avanzado

Tras explicar una forma básica de dibujar una pirámide de asteriscos con PHP, voy a tratar de explicar una forma un poquito más avanzada de hacerlo.

Lo bonito de la programación es que no hay una sola forma de hacer las cosas. Todo se puede analizar de muchas maneras y los resultados pueden ser los mismos. No obstante, dependiendo de nuestro análisis y de nuestra programación, podemos optimizar los resultados y conseguir que sean mucho más viables dependiendo de nuestro objetivo final.

El método que voy a tratar de explicar es una forma más avanzada de entender el problema. Para ello, voy a dibujar la pirámide dentro de un plano cartesiano.

<?php

/* 

 * Para trazar la piramide usare un plano cartesiano hecho con matrices

 * Este es un ejemplo de como quedara el plano sin valores

 *

 * $plane = array (0 => array(0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0),

 *           	   1 => array(0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0),

 *           	   2 => array(0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0),

 *           	   3 => array(0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0),

 *           	   4 => array(0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0),

 *           	   5 => array(0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0),

 *           	   6 => array(0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0)

 *                );

 *

 * Los parametros que voy a usar son los siguientes

 *

 * @param $rows int indica el numero de filas que va a tener la piramide

 * @param $char string indica el simbolo que vamos a usar para pintar la piramide
 * @Param $view int (opcional) indica si quiero pintar la piramide o el plano cartesiano
 *
 * return $piramide string si $view es true
 * return $plane array si $view es false
 *

**/

function crear_piramide ($rows, $char, $view = true) {



	// Creo el plano cartesiano, la piramide, las columnas y los acumuladores

	$plane = array();
	$range = null;
	$piramide = null;
	$cols = 0;
	$cont_pos = 0;
	$cont_neg = 0;



	/* Calculo el numero de columnas a partir de las filas. Hay que tener en cuenta 
	 * si el numero es par o impar para que la piramide quede bien dibujada en el 
	 * centro del plano cartesiano
	**/
	if (($rows % 2) != 0) {

		// El numero de filas es impar, calculo las columnas

		$cols = ($rows * 3) - 4;
	
	} else {

		// El numero de filas es par, calculo las columnas
		$cols = ($rows * 2) - 1;
	}
	
	// Creo los acumuladores para calcular los rangos que tengo que marcar
	$cont_pos = (($cols + 1) / 2) - 1;
	
	// Al ser el primer valor o pico de la piramide, el contador negativo es igual que el positivo

	$cont_neg = $cont_pos;
	

	// Recorro todas las filas

	for ($i = 0; $i < $rows; $i++) {
	
		// Creo el rango que quiero marcar dentro de cada fila
		$range = range($cont_neg, $cont_pos);

	

		// Recorro todas las columnas

		for ($j = 0; $j < $cols; $j++) {
		
			// Si la columna obtenida esta dentro de mi rango
			if (in_array($j, $range)) {
			
       
                                // Guardo valor 1 y pinto el asterisco
				$c[$j] = '1';
				$piramide .= $char;
				
			} else {
				
				// Si no esta, guardo valor 0
				$c[$j] = '0';
			}

		}
		

		// Guardo la fila generada dentro del plano cartesiano

		array_push($plane, $c);
		
		// Añado un salto de carro para seguir con la siguiente linea
		$piramide .= "<br />";
		
		// Actualizo los contadores para volver a calcular los rangos

		$cont_pos++;

		$cont_neg--;

	}
	
	// Devuelvo la opcion elegida en el parametro $view
	if ($view)
		return $piramide;
	else
		print_r($plane);

}

// Forma de uso

$piramides = crear_piramide (5, '*');

echo $piramides;

?>

Si ejecutáis esta función, el resultado por defecto será este:

          *
         ***
        *****
       *******
      *********

También podéis cambiar el asterisco por cualquier otro símbolo:

<?php

$piramides = crear_piramide (5, '[]');
echo $piramides;

// Resultado
         []
       [][][]
     [][][][][]
   [][][][][][][]
 [][][][][][][][][]

?>

Si quereis ver cómo ha quedado nuestro plano cartesiano, solo tenéis que modificar el tercer parámetro pasándolo como false:

<?php

$piramides = crear_piramide (5, '*', false);

echo $piramides;

// Resultado
Array ([0] => Array([0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 1 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0)
          [1] => Array([0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 1 [5] => 1 [6] => 1 [7] => 0 [8] => 0 [9] => 0 [10] => 0)
          [2] => Array([0] => 0 [1] => 0 [2] => 0 [3] => 1 [4] => 1 [5] => 1 [6] => 1 [7] => 1 [8] => 0 [9] => 0 [10] => 0)
          [3] => Array([0] => 0 [1] => 0 [2] => 1 [3] => 1 [4] => 1 [5] => 1 [6] => 1 [7] => 1 [8] => 1 [9] => 0 [10] => 0)
          [4] => Array([0] => 0 [1] => 1 [2] => 1 [3] => 1 [4] => 1 [5] => 1 [6] => 1 [7] => 1 [8] => 1 [9] => 1 [10] => 0)
)

?>

Como siempre, esta no es ni mucho menos la forma más eficiente ni definitiva de resolver el problema. También hay que tener en cuenta que este tipo de ejercicios nos ayudan a comprender cómo funciona un lenguaje de programación y cómo debemos abordar un problema real.

Os animo a que comenteis vuestra solución.

Cómo comprobar si un webservice está online

En el proyecto actual donde estoy trabajando, tenemos el sistema configurado con varias pasarelas de pago. Hay una que es la principal y por la cual se hacen el 90% de las transacciones diarias, pero es cierto que hay veces en las que este servicio se ve interrumpido o simplemente se ha caído.

He encontrado varias formas de verificar el estado de un webservice. Todas funcionan a la perfección cuando está online, pero cuando se encuentra offline viene el problema…

Mi solución personal:

function checkURL($url) {
     // Primero, compruebo si la URL es una URL valida
     if(!filter_var($url, FILTER_VALIDATE_URL)) {
          return 0;
     }

     // Inicializo y configuro una peticion con CURL
     $curlInit = curl_init($url);

     // Limito el tiempo de espera en 5 segundos y configuro las opciones
     curl_setopt($curlInit, CURLOPT_CONNECTTIMEOUT, 5); 
     curl_setopt($curlInit, CURLOPT_HEADER, true);
     curl_setopt($curlInit, CURLOPT_NOBODY, true);
     curl_setopt($curlInit, CURLOPT_RETURNTRANSFER, true);

     // Obtengo una respuesta
     $response = curl_exec($curlInit);
     curl_close($curlInit);

     if ($response) return 1;
     return 0;
}

// Forma de uso
$url = "http://www.google.com";
echo checkURL($url);

La ventaja está en la línea curl_setopt($curlInit, CURLOPT_CONNECTTIMEOUT, 5); ya que me permite tener un tiempo de espera bastante prudente, de manera que, si en cinco segundos no responde el servicio, paso automáticamente al siguiente sin “molestar” mucho al usuario.

Saludos!

Pirámide de asteriscos con PHP

Después del famoso hello world!, lo siguiente que uno suele aprender es a montar una pirámide de asteriscos con pocas líneas de código. Es un código sencillo que ayuda a entender los bucles y a abrir la mente para pensar como una máquina (modular todos los pasos uno a uno).

He creado una sencilla función que permite crear pirámides de asteriscos con el número de filas que le digamos, aquí os la dejo:

function crear_piramide ($filas) {
	$cadena = null;
	for ($i = 1; $i <= $filas; $i++) {
		for ($h = $i; $h <= $i; $h++) {
			$cadena .= "*";
		}
		echo $cadena."<br />";
	}
}

// Forma de uso
crear_piramide (9);

Ahora lo suyo sería hacer un pequeño formulario donde puedas insertar el número de filas y que se generara la pirámide automáticamente, pero eso ya es tarea vuestra jeje

Saludos!!

Variable como nombre de otra variable

Acabo de dar con la solución a un problema que me ha traido de cabeza más de una vez, y es que en actionscript (mi especialidad) es de lo más lógico, común y usado, pero claro, en PHP me veía buscando métodos alternativos para salir del paso.

Se trata de usar el valor de una variable como nombre de otra variable. Suena paranoico, pero ahora mismo os explico su utilidad.

Imaginar que teneis un formulario en el que teneis 20 campos para poner las edades de 20 personas distintas, tenemos por tanto edad1, edad2, edad3…, edad20 como nombres de los campos. Una vez validado el formulario, necesitaríamos recojer las 20 edades para procesarlas:

<?php

// Recojo el valor de los $_POST en sus propias var
extract ($_REQUEST);

// $total lo recojo del form, me dice el total de variables a procesar
for ($i = 1; $i <= $total; $i++) {
$var = "edad";
$$var = "edad".$i;
echo "Edad pasajero ".$i.": "$_POST[$edad]." años<br />";
}

?>

Ahí está el truco. Si tengo $var = “ciudad”; y luego hago $$var = “madrid”, al hacer un echo a $ciudad me devuelve “madrid”.

Seguro que hay mil formas más fáciles de hacerlo, y las encontraré jejeje pero ésta me ha salvado de mucho tiempo pensando y escribiendo más líneas de código innecesario.

Saludos!!!

Ayamontecenter.com

Ayamontecenter.com

Este es el nombre de mi último proyecto. Lo he cerrado esta mañana en Ayamonte (Huelva) y el cliente ha quedado la mar de contento.

 Se trata de la página oficial del hotel Don Diego, que pasará a llamarse Ayamonte Center. Entre las características de la web cabe destacar la autogestión de todo el contenido, pero lo más importante es el sistema de reservas que les he desarrollado.

Mediante una serie de módulos autogestionables, el administrador del hotel puede alimentar el cupo de habitaciones que va a vender durante un periodo de tiempo estipulado. Se pueden vender con la tarifa oficial o con las ofertas que se vayan insertando.

De todas formas voy a modificar el sistema para que tenga un par de opciones más que he visto en Booking.com y así hacerlo perfecto para revenderlo jeje

URL: http://www.ayamontecenter.com

Saludos!

Consultor tecnico informatico

Ese es mi nuevo trabajo… digamos que mis funciones serán desde la visita para el análisis de un proyecto empresarial, hasta la elaboración y presentación del mismo.

Como veis, sigo mi andadura como autónomo y el jueves firmé esta colaboración con el Grupo-Open, aquí en Sevilla. Es una forma de subcontratar y así hacerme un nombre en este mundillo. La verdad es que es muy cómodo porque me irán pasando clientes para trabajar, de forma tal que no tendré que buscarlos yo jejeje.

Si a esto le sumo lo que ya tengo entre manos, me voy a sacar una buena pasta al mes, que al fin y al cabo, eso es lo que realmente importa.

Saludos!!

CSS – Rodear una imagen con texto

La verdad es que es un efecto bastante sencillito y que da muy buenos resultados. El ejemplo claro sería un periódico, donde podemos observar como el texto rodea a la imagen.

 Si ponemos una imagen y después el texto, nos quedaría algo como esto:

Dejandomarcas.com

 Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fusce sapien ante, cursus ut, luctus vel, viverra ut, diam. Curabitur turpis pede, consectetuer a, dictum eu, rutrum sed, diam. Cras ac leo quis pede eleifend laoreet. Integer sollicitudin turpis. Morbi quis risus. Vestibulum sed nulla quis quam rhoncus volutpat. Curabitur orci quam, luctus imperdiet, dapibus vel, aliquet et, turpis. Aliquam dapibus nisi. Nullam arcu quam, dapibus a, porttitor vel, ornare vitae, ligula. Aliquam vulputate. Nunc faucibus. Proin at arcu vitae augue porta volutpat.

 El truco para que la imagen se quede rodeada por el texto es añadirle el estilo float y después la posición (left en este caso):

Dejandomarcas.comLorem ipsum  sit amet, consectetuer adipiscing elit. Fusce sapien ante, cursus ut, luctus vel, viverra ut, diam. Curabitur turpis pede, consectetuer a, dictum eu, rutrum sed, diam. Cras ac leo quis pede eleifend laoreet. Integer sollicitudin turpis. Morbi quis risus. Vestibulum sed nulla quis quam rhoncus volutpat. Curabitur orci quam, luctus imperdiet, dapibus vel, aliquet et, turpis. Aliquam dapibus nisi. Nullam arcu quam, dapibus a, porttitor vel, ornare vitae, ligula. Aliquam vulputate. Nunc faucibus. Proin at arcu vitae augue porta volutpat.

 De esta manera, ya tenemos la posición correcta. Tan solo habría que retocar los márgenes o el padding para dejarlo totalmente justificado.

El código final de la imagen es:

<img src=http://www.dejandomarcas.com/imagenes/logo_gif.gifborder=”0″ alt=”Dejandomarcas.com” style=”float:left” />

Un saludo!

Validar una tarjeta de credito

Dado que estoy trabajando en una web en la que el sistema pide al usuario una tarjeta de crédito como justificante de pago, me surgió la duda de cómo se podría validar la tarjeta. Claro, lo siguiente que me vino a la cabeza es qué significa cada dígito de los 16 que está comprendido la numeración de la misma.

Investigando en internet (donde sino…) he logrado sacar el patrón. La validación, eno, se consigue tomando las cifras en las posiciones impares y multiplicándolas por dos. Si al multiplicar alguna de ellas por dos, el número resultante es mayor que 9, se suman las dos cifras del resultado. Los números obtenidos se suman entre sí y se suman también los números que ocupan una posición par. Si el resultado es un múltiplo de 10 es que el número de tarjeta es correcto (o al menos es coherente).

A continuación, mi código PHP para validar cualquier tarjeta de crédito:

<?
function validar_tarjeta ($numero) {
$suma = 0;
for ($i = 0; $i < 16; $i++) {
if ($i % 2) {
$suma += $numero[$i]; //par
}else{ //impar
if ($numero[$i] != 9) {
$suma += 2 * $numero[$i] % 9;
}else{
$suma += 9;
}
}
}
if ($suma % 10 == 0 && $suma < 150) {
return true;
}else{
return false;
}
}
?>

Tan solo tenemos que pasarle como parámetro el número de la tarjeta y listo, ya podremos validar si la tarjeta es válida o no.

Ojo, esta función lo único que valora es si la numeración de la tarjeta es coherente. No significa que porque el valor devuelto sea true la tarjeta sea real, puesto que he probado con tarjetas caducadas y funciona. Recordar que con esta función podreis saber si la tarjeta que ha introducido es real o si se la ha inventado (que de ser así… menuda capacidad de inventiva jeje).

Saludos!

A %d blogueros les gusta esto: