De mudanza

Estos días estoy de mudanza de datos a un nuevo servidor, así que siento que no haya podido actualizar el blog con nuevos contenidos.

A partir de ahora dejaré de postear en este espacio para hacerlo en http://blog.dejandomarcas.com

Por tanto, este blog queda cerrado. Gracias por el seguimiento, espero veros por la nueva URL.

Saludos!

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!

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

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

A %d blogueros les gusta esto: