CSS adaptado al navegador con PHP

post - - 4 replies - share

Tener diferentes hojas de estilo dependiendo del navegador me parece algo horrible 🙁 .  Pero si por algún motivo es necesario, podemos emplear una forma bastante fácil y limpia mediante PHP (Ref. Andrew Martin).

Para ello, (1) pondremos un CSS base que sea compatible para todos los navegadores y a continuación (2) haremos uso del array $_SERVER y del campo donde se cargan las cabeceras con información del navegador del usuario “HTTP_USER_AGENT”.

1. Código CSS base:

<link rel="stylesheet" href="base.css" type="text/css">

2. Código PHP:

$browser = $_SERVER['HTTP_USER_AGENT'];	
if (preg_match('/MSIE.8/i', $browser)) { echo ''; } 
elseif (preg_match('/MSIE.7/i', $browser)) { echo ''; }
elseif (preg_match('/MSIE.6/i', $browser)) { echo ''; }
elseif (preg_match('/MSIE.9/i', $browser)) { echo ''; }
elseif (preg_match('/Firefox.2/i', $browser)) { echo ''; }
elseif (preg_match('/Firefox.3.5/i', $browser)) { echo ''; }
elseif (preg_match('/Firefox.3/i', $browser)) { echo ''; }
elseif (preg_match('/Chrome/i', $browser)) { echo ''; }
elseif (preg_match('/Safari/i', $browser)) { echo ''; }
elseif (preg_match('/Opera/i', $browser)) { echo ''; }
else { echo ''; }

El código escribirá el link con la hoja de estilo correspondiente al navegador empleado por el usuario basándose en la comparación de cadenas.

Si lo que queremos es únicamente discernir la versión de MSIE, podemos también recurrir a los comentarios condicionales de Internet Explorer.

Para hacer las pruebas necesarias con los diferentes navegadores, podemos descargarlos o emularlos.

Variables en CSS; Implementaciones

post - - 3 replies - share

Es seguro que en algún momento todos los que trabajamos con CSS echamos en falta las conocidas variables, elementos esenciales en cualquier lenguaje de programación. Para solventarlo se me ocurren varias formas:

  • Evitar las redundancias.
  • Usar mejor la descendencia en los selectores.
  • Definir las variables como meros comentarios.
  • Usar variables de PHP u otro lenguaje dinámico de servidor.
  • Decantarnos por CSS 3.

Es probable que existan más formas ¿conoces alguna?, bueno… de momento voy a intentar explicar las mencionadas.

Read more

Actualizar CSS evitando cache del usuario

post - - 5 replies - share

En un momento dado podemos detectar varias mejora consecutivas en nuestro CSS. Las editamos y las subimos, luego refrescamos el navegador con la página y ya esta todo correcto.

Pero puede pasar que el usuario tenga su navegador configurado de una forma determinada, no realice ese refresco de página, y tenga el CSS almacenado en la memoria cache, por tanto seguirá viendo la página exactamente igual.

Read more

Migrar de php4 a php5

post - - 4 replies - share

Días atrás me encontré ante la tediosa tarea de migrar una aplicación (bastante grande) programada en php4 a un servidor bajo php5. Voy a exponer en este post algunas de las diferencias encontradas y que pueden ahorrar algún dolor de cabeza 😉

Read more

Crear un plugin para wordpress

post - - 6 replies - share

Recientemente he programado un plugin para wordpress que permite una integración limpia y eficiente con paypal, también posibilita una amplia personalización desde el panel de opciones del propio wordpress.

Concluido el plugin voy a compartir lo aprendido 😉 pero en su versión resumida. Intentare explicar como crear un plugin, hacer uso de shortcode e integrar una página de opciones en el panel de administración de wordpress, aunque todo ello de forma sencilla y bastante esquematizada, a partir de ahí nuestra imaginación hará el resto.

Antes de comenzar, demos una vuelta por la wikipedia para conocer ¿que es un plugin? y recordar como son gestionados en wordpress.

1.- Crear el fichero contenedor del plugin (para wordpress)

Por ejemplo: “miplugin.php”, su contenido debe ajustarse al formato siguiente:

/*
Plugin Name: nombre de nuestro plugin
Plugin URI: web del plugin (descarga, soporte, etc.)
Description: descirpción detallada del plugin
Author: nombre y apellidos del autor
Version: 1.0
Author URI: web del autor
*/

/*
Licencia
*/

2.- Vamos a programar!

Las siguientes lineas ya deben contener el código de nuestro plugin.

Empiezo por escribir el esqueleto principal del programa, la clase con algunas variables y funciones.

class miplugin {
	var $opt;
	var $table_name;
	
	// inicializamos plugin
	function miplugin() { }
	// instalar cosas del plugin
	function install() { }
	// desinstalar
	function uninstall() { }
	// página de configuración
	function config_page() { }
	//opciones de configuración
	function options_plugin() { }
	//ejecuta resultado
	function init() { }
}

$mp = new miplugin();

Como se observa, el plugin se encuentra bajo POO pero por razones de compatibilidad no usa las características de PHP5, es por ello que se hace uso de “var” para declarar las variables y “__construct” ha sido remplazado por el nombre del plugin en la función de inicialización.

La línea 19 es la encargada de crear un objeto “mp” de la clase “miplugin”. A partir de aquí empieza la faena 😉

3.- Inicializamos el plugin

function miplugin() {
	global $wpdb;
	
	$this->table_name = $wpdb->prefix.'miplugin';
	
	register_activation_hook(__FILE__, array(&$this, 'install')); //gancho para instalar
	register_deactivation_hook(__FILE__, array(&$this, 'uninstall')); //gancho para desinstalar
	
	add_action('admin_menu', array(&$this, 'config_page'));
	add_shortcode('mundo', array(&$this, 'init'));
}

Esta función es ejecutada automáticamente cuando se crea un objeto de la clase, puesto que tiene el mismo nombre.

En la línea 2 tomamos el objeto $wpdb; que es el encargado de llevar la gestión de bases de datos para wordpress. Siempre que queramos interactuar con la base de datos de wordpress será necesaria esta llamada.

En la línea siguiente almacenamos en “$this->table_name” el nombre de la tabla para nuestro plugin.

Con register_activation_hook y register_deactivation_hook podemos indicar que funciones deben ejecutarse “installa/uninstall” cuando el plugin sea activado/desactivado desde el panel de administración de wordpress.

La línea 6 se encarga de implementar la función “config_page” que debe llamarse para que podamos tener un menú de opciones del plugin integrado en wordpress (solapa opciones). Para ello debe hacerse uso de la función de wordpress add_action.

La línea 7 hace que podamos usar las shortcodes (códigos rápidos) como llamadas al plugin. Esto hace que por ejemplo cuando se escribe “[mundo]” en el contenido de un post, el plugin llame a la función “init” puesto que ha sido implementado con add_shortcode.

4.- Instalar/desinstalar

Hacemos un alto en el proceso anterior para comentar las funciones install/uninstall.

function install() {
	global $wpdb;
	
	$sql = 'CREATE TABLE `'.$this->table_name.'` (
		`frase` varchar(100) NOT NULL default ""
	) ENGINE=MyISAM DEFAULT CHARSET=utf8';
	
	$wpdb->query($sql);
	$wpdb->query('INSERT INTO `'.$this->table_name.'` SET frase = "hola mundo!!!"');
}

Aquí va la creación de la tabla para el plugin en la base de datos de wordpress. A continuación inserté un registro donde uno de los campos contiene el valor “hola mundo!!!”.

function uninstall() {
	global $wpdb;
	
	$sql = 'drop table `'.$this->table_name.'`';
	$wpdb->query($sql);
}

Cuando desinstalamos el plugin se ejecuta la función “uninstall” y con ella procesamos el borrado de la tabla del plugin.

5.- Página de configuración del plugin

function config_page() {
	add_options_page('mi plugin', 'mi plugin', 8, 'miplugin_options', array(&$this, 'options_plugin'));
}

function options_plugin() {
	global $wpdb;
	
	if (isset($_POST['update'])) {
		//aquí podemos poner el sql update, basado en los datos de un formulario
	}

	//aquí va el formulario para las opciones de configuración
}

La ya mencionada función ” add_action(‘admin_menu’, array(&$this, ‘config_page’));” ejecutada en la inicialización del plugin, es la encargada de indicar que debe procesarse la función “config_page” que a su vez pide las opciones que debe contener el plugin a “options_plugin”.

6.- Resultado del shortcode

function init($atts) {
	global $wpdb;

	// options (config)
	$this->opt = $wpdb->get_row('SELECT * FROM '.$this->table_name.' LIMIT 1', ARRAY_A);
	
	// atributes (user)
	extract(shortcode_atts(array('frase' => $this->opt['frase']), $atts));
	include('fichero.php');
}

Volviendo al proceso del programa, cuando se escribe en un post el shortcode “[mundo]” se ejecuta la función “init” y se le pasa como parametro el shortcode con sus atributos “$atts“.

[mundo] //esto es un shortcode
[mundo frase="hola mundo 2!!!"] //esto es un shortcode con un atributo

Esta función “init($atts)” se encarga de hacer una consulta sql “select” a la tabla del plugin y obtener la frase “hola mundo!!!” que tenemos almacenada.

A continuación la función “extract(shortcode_atts(array(‘frase’ => $this->opt[‘frase’]), $atts));”, es crucial puesto que se encarga de “repartir” los pares de valores tomados de los atributos.

Es por esto que podamos contener en la variable $frase = “hola mundo!!!” (en caso de que se llamará al shortcode sin atributo) o “hola mundo 2!!!” si se ha llamado con el atributo.

Por último y para separar un poco el html del php, pongo un “include” que llama a un fichero.php (debe estar en el mismo directorio que el plugin) .

//fichero.php

El fichero muestra la frase.

Consejos

  • Creo que es importante emplear cierto tiempo en buscar nombres originales para nuestras funciones y variables (sobre todo si se programe de forma estructurada y no orientada a objetos), puesto que debemos tener en cuenta la compatibilidad con otros plugins y el propio código de wordpress.
  • Se puede aprender un montón de cosas viendo el código ordenado de algunos plugins 😉

Recursos

Optimizando PHP

post - - 7 replies - share

Aquí expongo algunas cuestiones que pueden ayudarnos a optimizar nuestros scripts en PHP. Sería bonito que hubiera comentarios aportando mas información acerca de este interesante tema.

Read more

PHP para un gran proyecto? SI!

post - - 2 replies - share

PHP es importante

Hoy en día todavía existen algunos desarrolladores que menosprecian este lenguaje, muchos de ellos son de esos que parecen tener cierta aberración a las tecnologías que facilitan las cosas.

Tanto PHP, como ASP, JSP, etc. Tienen su foco de mercado y todos son validos, pero si! soy de los que creen en el tremendo potencial de arquitectura LAMP (Linux, Apache, MySQL, PHP) para desarrollar proyectos importantes, reitero lo de proyectos importantes. Digo esto porque me he encontrado que algunos clientes/desarrolladores piensan “firmemente” que este lenguaje esta destinado únicamente a blogs y webs corporativas.

Read more