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

Comprobar user-agent iphone o android con PHP

¿Cómo puedo comprobar si el cliente que visita mi web usa iPhone o Android?

Mi solución personal en forma de función:

<?php

// Compruebo el user-agent mediante una expresion regular
function iPhoneCheck() {
    if (preg_match('/iPhone/i', $_SERVER['HTTP_USER_AGENT']) || preg_match('/Android/i', $_SERVER['HTTP_USER_AGENT']))
        return true;
    else
        return false;
}

// Forma de uso
if (iPhoneCheck()) {
    
    // Resto de codigo y acciones

}

?>

¿Cómo lo haceis vosotros?

background-image: ese gran aliado

Un factor importante a la hora de diseñar nuestra web es el background. Yo siempre opto por un color sólido, pero es cierto que a veces queda mejor un pequeño pattern con una imagen simple. El efecto queda perfecto: imagen de poco tamaño, totalmente personalizable, acorde con el css de nuestro layout, y totalmente compatible con cualquier navegador.

¿Cómo puedo conseguir un pattern atractivo sin necesidad de volverme loco con Photoshop?, fácil, visitando AVA7 Patterns, una magnífica web que pone a nuestra disposición cientos y cientos de formas de crear nuestro patrón.

Espero que también os guste :)

¿Necesitas inspiración?

Es cierto que a la hora de diseñar un formulario, un layout, un header, y un larguísimo etc. para cualquiera de nuestros proyectos necesitamos inspirarnos en algo para poder encontrar ese diseño sólido que andamos buscando.

Durante muchos años, páginas como cssmania o csszendgarden han sido motivo de visita obligada para conseguir ese toque final que andamos buscando, pero existe algo más concreto en la red? es decir, y si necesito diseñar una página 404 para mi web?

Os presento PatternTap.com

Pattern Tap is here to satisfy and encourage the inspiration needs of my interface design peers and peeps. We aspire to be the one stop pattern shop for your next inspiration need.

Sin duda una de mis web favoritas y de asistencia obligada en mis marcadores. Desde aquí se puede conseguir muchísima inspiración en múltiples de sets de diseños. Formularios, navegaciones, cabeceras, layouts, comentarios, listas, subnavegación, y un maravilloso etc. que nos ayudarán a conseguir ese diseño que tanto vamos buscando.

Espero que os guste :)

User experience

Es difícil medir la experiencia de un usuario en nuestra web. Gracias a Google Analytics y a otras aplicaciones, podemos hacernos una idea de qué está pasando desde que un cliente entra en nuestra página hasta que se va. Pero, realmente es fiable?.

Otra buena práctica es la de buscar a una persona totalmente ajena al proyecto y al campo, sentarla delante de un ordenador y observar cómo navega por nuestro site. Tomar apuntes, fijarse bien donde clica y donde no, ver si se ha dado cuenta de ese magnífico banner que tanto te ha costado diseñar, etc.

Acabo de encontrar una herramienta magnífica que nos ayuda en esta tarea. Se trata de CrazyEgg, una empresa especializada en User Experience que ofrece sus servicios para poder medir este hecho.

El sistema se basa en 4 factores principales: Heatmap, Scrollmap, Confetti y Overlay.

Heatmap nos permite ver los clicks de nuestros usuarios mediante un mapa de calor. Cuanto más azul es el color, menos clics ha habido, y cuanto más rojo, más clics ha tenido dicho enlace. Es genial como se ve el montaje en directo.

 

Scrollmap nos permite medir el factor de rebote. Si tenemos una página muy “larga”, podemos observar qué factor de scroll ha hecho el cliente, de manera que podamos cazar al cliente que entra, echa un ojo, y se va sin hacer nada.

 

Confetti puede que sea de las más interesantes, ya que no solo nos permite ver los clics como Heatmap, sino que también nos lo fragmenta en enlaces referidos, sources, términos de búsqueda o keywords y un largo etc.

 

Overlay nos muestra un resumen del número de clics que ha tenido un enlace.

Vale, pero cuánto cuesta todo esto?, pues no es caro, en serio, por 9 euros al mes podemos tener derecho a tener 10 páginas monotorizadas.

 

Más información CrazyEgg

Dejandomarcas.com V2.0

Ya está arriba la nueva versión de Dejandomarcas.com

He procedido a reprogramar toda la aplicación usando CakePHP. El diseño también ha sufrido un cambio drástico, mostrando una cara mucho más limpia, más fresca y mucho más intuitiva.

Espero que os guste :]

¿Spam en Whatsapp?

Durante los últimos días he recibido un par de mensajes en whatsapp notificando que debía copiar y pegar dicho mensaje a todos mis contactos para verificar mi cuenta. Este tipo de spam ya se hizo muy popular en páginas como Hotmail o Yahoo.

En el mensaje, se asegura que los servidores de Whatsapp han estado saturados y que se va a proceder a una tarea de mantenimiento, y se incita a los usuarios a reenviar el texto a sus contactos con el fin de difundir la noticia. En caso contrario, advierte de que Whatsapp dejará de estar operativo.

A través de su cuenta oficial en Twitter, Whatsapp Inc. ha confirmado que dicho mensaje en cadena sobre el servicio que está circulando “no es verdad”. “Por favor, no la haga caso y no la reenvíe”, aconseja la compañía.

Aquí el mensaje:


Este mensaje es para informarles a todos nuestros usuarios, que nuestros servidores han estado recientemente muy congestionados, por lo que estamos pidiendo su ayuda para solucionar este problema. Necesitamos que nuestros usuarios activos reenvien este mensaje a cada una de las personas de su lista de contactos a fin de confirmar nuestros usuarios activos que utilizan WhatsApp, si usted no envía este mensaje a todos sus contactos de WhatsApp, entonces su cuenta permanecerá inactiva con la consecuencia de perder todos sus contactos. El símbolo de actualización automática en su SmartPhone, aparecera con la transmisión de este mensaje. Su SmartPhone se actualizará dentro de las 24 horas siguientes, contará con un nuevo diseño y un nuevo color para el chat. Estimados usuarios de WhatsApp, vamos a hacer una actualización para WhatsApp de 23:00 p.m. hasta las 05:00 a.m. de este día. Si usted no envía esto a todos sus contactos la actualización se cancelará y no tendrá la posibilidad de chatear con sus contactos, si tiene la versión anterior

Así que ya sabeis, ni p*** caso…

Fuente Elmundo.es

Una oferta de trabajo bastante curiosa

Creías haberlo visto todo en las ofertas de trabajo? yo creo que no…

<?php

define('LATITUDE',40.4222691);
define('LONGITUDE',-3.699632);
define('HOST_URL', 'http://simbiotica.es');
define('AVAILABILITY','<<Insert your avaiability here>>');
define('MIN_EXPERIENCE',86400*30*12);
$langs = array('es', 'en');
define('LANGS', serialize($langs));
define('DEBUG_TIME',86400*30*3);
define('RUN_TIME',86400*30*6-DEBUG_TIME);
set_time_limit(0);
//needed to run.
require 'php.inc';
require 'sql.inc';
//highly recommended.
include 'webServices.inc';
include 'oop.inc';
include 'javaScript.inc';
include 'jQuery.inc';
//not needed, but would improve performance.
include 'gmapsAPI.inc';
include 'facebookAPI.inc';
include 'serverConfig.inc';
include 'as3.inc';

public function daylyWork(){
	backendProgramming();
	backendIntegration();
	dataModeling();
	databaseMaintenance();
}

private function checkAvailability(){
	switch (AVAILABILITY){
		case 'in house freelance':
		return true;
		break;
		
		case 'part time':
		return true;
		break;
		
		case 'full time':
		return true;
		break;
		
		case 'work from home':
		return false;
		break;
	
 	}
}

private function calculateSalary($experience, $work_hours, $responsibility, $added_value){
	//human interaction needed here
	//No reliable algorithm
}

if(interested && checkAvailability(AVAILABILITY)){
	$toEmail= 'info@simbiotica.es';
	$subject = 'Oferta de empleo';
	$html = '<html>
					<head>					
					</head>					
					<body>
							
					<< Insert your online portfolio & comments here >>
					
					</body>
				</html>';
	$headers = "From: YOUR NAME HERE <YOUR E-MAIL HERE>\r\n";
	$headers .= "MIME-Version: 1.0\r\n";
	$headers .= "Content-type: text/html; charset=utf-8\r\n";
			
	mail($toEmail, $subject, $html, $headers);
}

?>

Visto en Simbiotica.es

CakePHP – Cómo hacer un contador de visitas

Desde hace unos meses estoy programando con CakePHP y no deja de asombrarme su simplicidad y su potencia a la hora de programar cualquier aplicación web. Haciendo mi portfolio, se me ocurrió la idea de montar un contador de clics para mis diferentes trabajos, de manera tal que cuando un usuario haga clic en un trabajo para lanzar la URL, el sistema registra ese clic en la base de datos.

Cómo se haría esto?, fácil:

<?php

/* Esto es un metodo del controlador, por tanto, debera estar en app/controllers/controller.php

// Metodo para lanzar una URL del portfolio sumando uno a las visitas que ya tenia
public function getURL($id) {

     // Lo defino en false para no renderizar 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']);
     }	
}

?>

De esta manera, cuando alguien haga clic sobre uno de mis proyectos, primero lo localizo, después le sumo uno a las visitas y después utilizo el método redirect para redirigirlo a la URL del proyecto que ha elegido.

Para usar este método, en la vista habrá que montar el link de la siguiente manera:

<?php

// Sobre el enlace HTML, definimos el nombre del controlador, la accion, y el registro
<a href="<?php echo $html->url(array('controller' => 'Name',
                                     'action' => 'getURL', 
                                     $register['Portfolio']['id'])); ?>" target="_blank">Link</a>

?>

De esta manera, ya podemos saber cuántos clics recibe un vínculo de nuestra web.

Referencia CakePHP Cookbook

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?

A %d blogueros les gusta esto: