Autor Tema: [Aporte] Prepara tu Web para dispositivos móviles  (Leído 986 veces)

Desconectado Mixvice

  • PHPero Experto
  • *****
  • Mensajes: 687
  • Karma: 32
  • Sexo: Masculino
  • ¡Y Tu Papá Tambien!
    • Ver Perfil
    • Tuhabbo
[Aporte] Prepara tu Web para dispositivos móviles
« en: 18 de Mayo de 2012, 07:51:04 am »
Antes de comenzar, ya sé que hay una forma de detectar un móvil con PHP en el foro, aunque la forma que indica no está optimizada para nada, es un chorro enorme de código además de que usa una función que está obsoleta en PHP.

Sin duda la forma más fácil (para mi) de implementar es con PHP, pues si queremos manejar varias opciones, por ejemplo darle a escoger al usuario si quiere ver la versión móvil o la completa, incluso, en un iPad, Tablet o smartphone podemos mostrar HTML 5 en vez del flash, con un poco más de código según el flash / html 5 aunque vale la pena.

Por lo tanto comenzamos con PHP:


function esMovil(){

$useragent=$_SERVER['HTTP_USER_AGENT'];
// Creado por mixvice
if(preg_match('/android.+mobile|ip(hone|od|ad)|windows (ce|phone)|blackberry|opera m(ob|in)i|palm( os)?|phone|symbian|wap\.(browser|link)|vodafone|xda|xiino/i',$useragent)){
return true;
}else{
	
return 
false;
}
}



if(esMovil()){
	
echo
"Es movil";
}else{
	
echo
"no es movil";



Según yo, esta función tiene los moviles más usados ahora, aunque puedes borrar los que tu gustes y dejar solo android e iOS o que se yo, es tu decisión.

También podremos lograr casi lo mismo con .htaccess, aunque aquí nos rediccionará a otro sitio (tal cual el ejemplo de abajo funciona solamente con iPhone):

Código: [Seleccionar]
RewriteEngine on
RewriteCond ${HTTP_USER_AGENT} iPhone
RewriteRule .* http://movil.phperos.net

Si no te sirve, o no quieres/puedes usar PHP o .htaccess , hay un sitio web el cual permite crear código en diferentes lenguajes como ASP, C#, JSP, JS, jQuery, Python, etc.

Citar
http://detectmobilebrowsers.com/

Si tienes uno de esos sitios que se adaptan a la resolución (olvide como se les dice xD) o crees que puedes adaptar tu sitio con tan solo crear un CSS nuevo, puedes usar los Media Queries.

Código: [Seleccionar]
<link rel="stylesheet" type="text/css" href="mobile.css"  />
<style type="text/css" media="screen and (min-width: 481px)">
<!--
@import url("screen.css");
-->
</style>
<!--[if IE]><link rel="stylesheet" type="text/css" href="screen.css"  media="screen" /><![endif]-->
<link href="mobile.css" rel="stylesheet" type="text/css" media="handheld, only screen and (max-device-width: 480px)" />

Lo que esto hace es mostrar el archive css según la resolución que tenga, y claro para dar soporte a la …. De IE  se usa una condicional para que cargue su propio archivo y no se joda.

Si buscas como detectar la posición del dispositivo te servirá esto, por ahora no se me ocurre nada útil para esto pero puede llegar a servir.

Código: [Seleccionar]
window.onload = function initialLoad() {
updateOrientation();
}
function updateOrientation(){
var contentType = "show_";
switch(window.orientation){
case 0:
contentType += "normal";
break;
case -90:
contentType += "right";
break;
case 90:
contentType += "left";
break;
case 180:
contentType += "flipped";
break;
}
document.getElementById("id_div").setAttribute("class", contentType);
}

Bueno, por ahora esto es todo, si tienen algo que quieran compartir, se les agradecería que lo comentaran y yo lo agrego al post principal.

Fuentes: Google :P
« Última modificación: 18 de Mayo de 2012, 07:57:55 am por Mixvice »

Comunidad PHPeros

[Aporte] Prepara tu Web para dispositivos móviles
« en: 18 de Mayo de 2012, 07:51:04 am »

Desconectado Warlox

  • Moderadores PHP
  • PHPero Master
  • ****
  • Mensajes: 1.278
  • Karma: 77
  • Sexo: Masculino
  • A veces hay que aprender a correr antes de caminar
    • Ver Perfil
    • Página personal
Re:[Aporte] Prepara tu Web para dispositivos móviles
« Respuesta #1 en: 18 de Mayo de 2012, 18:55:04 pm »
Totalmente inútil. Nada que no se pueda hacer con Metatags o mediaqueris.
- Moderador de PHP


Desconectado Mixvice

  • PHPero Experto
  • *****
  • Mensajes: 687
  • Karma: 32
  • Sexo: Masculino
  • ¡Y Tu Papá Tambien!
    • Ver Perfil
    • Tuhabbo
Re:[Aporte] Prepara tu Web para dispositivos móviles
« Respuesta #2 en: 19 de Mayo de 2012, 01:06:38 am »
Totalmente inútil. Nada que no se pueda hacer con Metatags o mediaqueris.

En el post están unos media queries además de que a alguien que no sabe le puede servir esto, total, puedes hablar un poco sobre los metatags?

Desconectado Rastrillox

  • PHPero Experto
  • *****
  • Mensajes: 592
  • Karma: 25
  • Sexo: Masculino
    • Ver Perfil
    • Forhabbo.es
Re:[Aporte] Prepara tu Web para dispositivos móviles
« Respuesta #3 en: 19 de Mayo de 2012, 05:28:31 am »
Creo, que de esta manera es mas complicado. con css es mas simple. solo ha que cambiar el media="Screem" por media="handheld".

Un ejemplo.

/* Hoja de estilos para PC */
<link href="css/lol.css" media="screem"  type="text/css" />

/* Hoja de estilo para moviles. */
<link href="css/lolmovil.css" media="handheld" type="text/css" />

Esto lo que hace es que automaticamente, cuando detecta que estas en un dispositivo movil se cargue la hoja de estilo. lolmovil.css

Saludos.

Desconectado Dev_NIX

  • PHPerit@
  • *
  • Mensajes: 4
  • Karma: 0
  • Sexo: Masculino
  • Nuev@ PHPer@
    • Ver Perfil
Re:[Aporte] Prepara tu Web para dispositivos móviles
« Respuesta #4 en: 03 de Junio de 2012, 20:00:55 pm »
Yo creo que la solución más fácil (y la más eficaz) es la de hacer responsive design con media queries.

Sin usar @import, ya que cada navegador lo carga a su manera, y en algunos casos no hace la carga asíncrona, bloqueando todas las demás.

Como a mí me gusta trabajar es con una única hoja de estilos
Código: [Seleccionar]
<link href="css/fap.css" media="screen"  type="text/css" />
Y en la hoja de estilos, debajo de todas las secciones que definen todos los estilos, colocar las diferentes queries para cada resolución, sobre-escribiendo los estilos anteriores que queramos cambiar. De todos modos, yo lo uso para casos concretos, dejando el resto del diseño lo más fluido posible, usando anchos relativos, etc.

A mí me gusta que la versión de tablet sea igual a la de escritorio, pero adaptada con su media query, y que los móviles carguen un CSS más adaptado, y no fap.css. Así, se separan bien los estilos, no pesa tanto la página para móviles (muchos se conectarán por 3G), y además se puede cargar jQuery Mobile, para que esté adaptada del todo :D

Aquí hay una clase genial para detectar si el navegador es móvil, os dejo el código, aunque si queréis algo más ligero el de Mixvice vale para tirar de carros y carretas. Lo único, que para detectar si está en vertical o en horizontal un navegador, yo utilizaría sólo una Query CSS, a menos que haya una necesidad muy especial...

Código: [Seleccionar]
<?php

/*
*  Mobile Detection RegEx (2/3) Supplied By http://detectmobilebrowsers.com/
*  Regex updated: 22 August 2011
*
*  Before Using You Must Include The Class Script In Your Page:
*  require_once(&#39;class.DetectMobileDevice.php&#39;);
*
  Usage:
  
  Static Approach
    DetectMobileDevice::Redirect(string $redirectPath [, bool $includeRequestURI=false]); 
        Returns: Nothing, redirects request on detection of mobile device.
    DetectMobileDevice::Mobile(); 
        Returns: (bool) True/False. True ~ if mobile device detected.
  
  Object Approach
  - Detect if mobile
    $obj = new DetectMobileDevice(string $redirectPath [, bool $includeRequestURI=false]);
    if($obj->isMobile()){
      // User is on Mobile Device - Do Something
    }else{
      // User is NOT on Mobile Device - Do Something Else or Nothing
    }
  
  - Detect and Redirect
    $obj = new DetectMobileDevice(string $redirectPath [, bool $includeRequestURI=false]);
    $obj->fullRedirect(true); // Include Request URI
    $obj->detectAndRedirect();
    
  Example #1: Redirect Mobile Users to &#39;mobile&#39; directory, without the Requested URI
    DetectMobileDevice::Redirect(&#39;mobile&#39;);
    -=OR=-
    $obj = new DetectMobileDevice(&#39;mobile&#39;);
    $obj->detectAndRedirect();
    
    The user requested http://yoursite.com/Some/Page/ and was redirected to http://yoursite.com/mobile/
    
  Example #2: Redirect User To Subdomain, with requested URI
    DetectMobileDevice::Redirect(&#39;http://mobile.yoursite.com&#39;, true);
    -=OR=-
    $obj = new DetectMobileDevice(&#39;http://mobile.yoursite.com&#39;, true);
    $obj->detectAndRedirect();

    The user requested http://yoursite.com/Some/Page/ and was redirected to http://mobile.yoursite.com/Some/Page

*  ** NOTE **
*  After the first call to DetectMobileDevice::Mobile(), wether or not the UA is a mobile device&#39;s,
*  is stored in a static variable, so multiple calls to DetectMobileDevice::Mobile() will not cause
*  multiple checks. The original check will be returned. (System Resources will not be taxed with
*  multiple RegEx checks) 
*/

class DetectMobileDevice {
  protected  
$_useragent;
  protected  
$_redirect;
  protected  
$_full_redirect;
  
  public static 
$dmd;
  
  
/**  Magic Methods  **/
  
public function __construct($redirect$fullRedirect false){
    
$this->_redirect $redirect;
    
$this->_useragent strtolower($_SERVER[&#39;HTTP_USER_AGENT&#39;]);
    
$this->_full_redirect $fullRedirect;
  }
  
  
/**  Protected Methods  **/
  
protected function _is_mobile($useragent){
    if(
strpos($useragent, &#39;mobile&#39;) !== false || strpos($useragent, &#39;android&#39;) !== false){
      
return true;
    }else if(
preg_match(&#39;/android.+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/&#39;,$useragent)){
      
return true;
    }else if(
preg_match(&#39;/(bolt\/[0-9]{1}\.[0-9]{3})|nexian(\s|\-)?nx|(e|k)touch|micromax|obigo|kddi\-|;foma;|netfront/&#39;,$useragent)){
      
return true;
    }else if(
preg_match(&#39;/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-/&#39;,substr($useragent,0,4))){
      
return true;
    }
    return 
false;
  }
  protected function 
_additional(){
    if(
$this->_full_redirect){
      
$uri trim($_SERVER[&#39;REQUEST_URI&#39;], &#39;/&#39;);
      
return (isset($uri{0}))? ((substr($this->_redirect, -11) === &#39;/&#39;)? &#39;&#39; : &#39;/&#39;) . $uri : &#39;&#39;;
    
}else{
      return 
NULL;
    }
  }
  
  
/**  Public Methods  **/
  
public function detectAndRedirect(){
    if(
$this->_is_mobile($this->_useragent) && strlen(trim($this->_redirect,&#39;/&#39;)) > 0){
      
if(headers_sent()){
        echo &
#39;<meta http-equiv="refresh" content="0; url=&#39; . $this->_redirect . $this->_additional() . &#39;">&#39;;
      
}else{
        
header(&#39;Location: &#39; . $this->_redirect . $this->_additional());
      
}
      exit;
    }
  }
  public function 
isMobile(){
    return 
$this->_is_mobile($this->_useragent);
  }
  public function 
testAgent($ua){
    return 
$this->_is_mobile(strtolower($ua));
  }
  public function 
fullRedirect($b true){
    
$this->_full_redirect $b;
  }
  public function 
getAgent(){
    return 
$this->_useragent;
  }
  
  
/**  Public Static Methods  **/
  
public static function Redirect($redirect,$fullRedirect=false){
    
$o = new self($redirect$fullRedirect);
    
$o->detectAndRedirect();
  }
  public static function 
Mobile(){
    if(
is_null(self::$dmd)){
      
$o = new self(&#39;&#39;);
      
self::$dmd $o->isMobile();
      unset(
$o);
      return 
self::$dmd;
    }else{
      return 
self::$dmd;
    }
  }
}

Esta es una solución, pero seguro que hay muchas más. Yo os comparto la combinación que más me gusta, y que utilizo en todos los proyectos en los que participo ^_^
« Última modificación: 03 de Junio de 2012, 20:04:30 pm por Dev_NIX »