dompdf + CodeIgniter bug. No se genera pdf con imágenes

Quizá tengas este problema que me ha traído de cabeza:
Usando CodeIgniter con dompdf para generar pdfs, si tienes imágenes en la vista que debe imprimir el pdf, este no se genera.
Mi problema era aún mas desesperante porque en local me funcionaba pero no en producción. Gracias a Manuel Recena de Klicap, hemos encontrado la solución:
1. Debes tener habilitado: allow_url_fopen (haz un phpinfo.php y comprueba que el valor está on)
2. Si con esto no funciona, te pasará lo que me pasaba a mí. Si hechas un vistazo a los logs verás que te pide un archivo que no existe: ‘…ci_exceptions.cls.php’ Tendrás que poner un parche en tu dompdf_config.inc.php
Busca esto:
function DOMPDF_autoload($class) {
$filename = mb_strtolower($class) . ".cls.php";
require_once(DOMPDF_INC_DIR . "/$filename");
}

Y sustitúyelo por:
function DOMPDF_autoload($class) {
$filename = mb_strtolower($class) . ".cls.php";
if($filename != "ci_exceptions.cls.php"){
require_once(DOMPDF_INC_DIR . "/$filename");
// require_once(DOMPDF_INC_DIR . "/dompdf.cls.php");
}
}

Con este parche seguramente ya te funcionará. Si no es el caso a googlear, porque las dompdf y las imágenes suelen dar bastantes problemillas.

Y todo esto no hubiera sido posible sin la ayuda de Manuel Recena de Mivecindad y Clinker

Adiós ie7

Como regalo de Navidad Microsoft va a realizar actualizaciones obligatorias de Explorer. Lamentablemente no es un regalo total ya q XP no soporta ie9 por lo que a partir de poco solo tendremos q preocuparnos de ie8 e ie9, y afortunadamente ie9 es un buen navegador.
Adiós a así todos los hacks y  javascript  para emular CSS no soportados en Internet Explorer. Quien quiera sombras o bordes redondeados en Windows XP que se instale otro navegador.

http://windowsteamblog.com/ie/b/ie/archive/2011/12/15/ie-to-start-automatic-upgrades-across-windows-xp-windows-vista-and-windows-7.aspx

http://www.netmagazine.com/news/internet-explorer-auto-update-111646

Cómo crear un meta_box con multiples valores (WordPress 3)

Recientemente he rediseñador Piscolabis y para ello he hecho un tema en WordPress 3.2.1 a medida. Entre las mejoras de este nuevo theme a medida está el uso de custom post types para todos los tipos de contenido diferentes del site, lo que convierte a WordPress 3 en un verdadero CMS en el cual cada tipo especial de contenido, con sus tipos especiales de campos, pueden materializarse sin necesidad de plugins, sólo programando sencillas funciones en el theme.

Tengo el objetivo, si el tiempo me lo permite, de crear una serie de post acerca de cómo crear un portfolio a medida con WordPress 3, y en ellos describir paso a paso cómo programé el theme de Piscolabis. No obstante, mientras lo hago o no, uno de los puntos en los que más dificultad encontré, por la falta de tutoriales que realmente funcionaran, fue el hecho de poder crear un campo múltiple en el que guardar las fotos de un proyecto.

El escenario es el siguiente. Tenemos un tipo personalizado de contenido (custom_post_type) creado con register_post_type por ejemplo Portfolio, y dicho tipo de contenido además del título y el editor de WordPress, tiene una serie de campos creados ad hoc para este nuevo tipo de contenido (meta boxes) con la función add_meta_box, como pueden ser, la fecha de publicación del proyecto, la url, el o los clientes (esto se hará con taxonomías relacionadas con este nuevo tpo de contenido), la imagen destacada y por supuesto las imágenes de muestra del trabajo.

Todos los campos que hemos enumerado (título, descripción, fecha, url,  imagen destacado) salvo cliente e imágenes del proyecto son de tipo único, no son múltiples ya que sólo soportan un valor. Como he mencionado los clientes se gestionarían mediante la creación de una taxonomía (ya se vería en otro post), por lo tanto el problema que ocupa este artículo es cómo crear un campo múltiple que soporte un o varios valores.

No es tema dificil, pero tampoco sencillo ya que se va a necesitar una buena combinación de PHP, Codex de WordPres, html y jQuery, y además los tutoriales que encontré por internet fallan bastante. Así pues, como paso previo a cómo crear un campo múltiple de imágenes en WordPress, tenemos el problema más básico de cómo crear simplemente un campo múltiple que guarde los distintos valores en la misma meta_key.

Para mostrar la teoría de la forma más sencilla posible, reduciremos el problema a lo más básico. Vamos a crear un tipo de contenido nuevo llamado test, cuyo contenido consista únicamente en un título y en un campo múltiple llamado campo test (imagen).

 

1. Creamos el tipo de contenido.

En primer lugar creamos en el functions.php

add_action('init', 'test_register', 10, 2);

function test_register() {

    $labels = array(
        'name' => _x('Test', 'post type general name')
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'supports' => array('title')
      );

    register_post_type( 'test' , $args );
}

Lo que hemos hecho es simplemente crear el tipo de contenido test de la forma más básica posible. Con esto ya nos debe aparecer en el menú lateral del panel de administración un nuevo tipo de contenido llamado Test. Si entramso veremso que unicamente tiene el campo título. Vamos ahora a crear el campo múltiple.

2. Creamos las llamadas para crear los nuevos campos (meta boxes).

Para ser ordenados, en una única función que llamamos al iniciar el panel de admistración, haremso todas las llamadas para crear todos los nuevos campos personalizados que tendrá el nuevo tipo de contenido Test.

function test_print() {
      global $post;
      $values = get_post_custom_values('ns_test', $post->ID);
  	  $c = count($values);
  	  if ($c==0)
  	  {
  	  	?>


 borrar campo

	    


  borrar campo

	    	
      
Añadir otro campo más

La primera parte pregunta a la base de datos si tenemso ya valores almacenados en la base de datos y si lso hay los pinta como vales de la caja de texto. ES importante fijarse aquí en dos cosas:

  1. Las cajas de textos al tener la misma meta_key  ser valroes múltiples se deben guardar como array, por tanto el name de dicha caja de texto no será 'ns_test' sino 'ns_test[n]'
  2. Si no hay nada almacenado en la base de datos, al menso me debe pintar una caja (si $c == 0 no el array está vacío), en caso contrario me pinta todos los valores

La segunda parte del código es el javascript que nos va a añadir más cajas de texto cuando queremso añadir más valores al campo test  nos va a eliminar cajas de texto cuando queremos eliminar dichos valores. No tiene más complicación.

4. Guardamos en la base de datos los valores

Y aquí es donde he tenido más dificultad y donde los tutoriales que he visto fallaban y simplemente esquivaban este paso o no funcionaban.
La razón es que la función que se suele usar para guardar datos es update_post_meta, que lo mismo te vale para actualizar valores ya existentes que para crearlos si no existen. Pero cuando llegamos al tema de los campos múltiples, o no van fina o simplemente no funciona. Por tanto debemos usar la función add_post_meta Con la complejidad de que esta función añade valores pero no reemplaza.
Así pues debemos hacer antes un script que borre todos los valores de nuestra meta_key (en este caso ns_test) asociados a este post, y una vez borrados todos, guardamos los valores de nuevo. Y con este rodeo esto funciona a las mil maravillas.
En código esto se traduce en:

add_action('save_post', 'save_detailsi');

function save_detailsi($post_id){
  global $post;
  if ($post->post_type == 'test')
  {
  	if ($parent_id = wp_is_post_revision($post_id)) $post_id = $parent_id;
  	if (!empty($_POST['ns_test']) && is_array($_POST['ns_test']))
  	{
  	 	delete_post_meta($post_id, 'ns_test');
  	 	foreach ($_POST["ns_test"] as $value)
  	 	{
  	 		add_post_meta($post->ID, "ns_test", $value);
  	 	}
  	} else {
  		delete_post_meta($post_id, 'ns_test');
  	}
  }
}

Con esto terminamos el código que nos permite guardar multiples valores de un mismo campo en un custom post type.

El código en su conjunto queda así:

 _x('Test', 'post type general name')
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'supports' => array('title')
      );

    register_post_type( 'test' , $args );
    // Eliminando problemas con los permalinks. Es bastante común que al crear custom posts una vez ya activados los permalinks en WordPress los mismos de errores al intentar visualizarlos.
    add_action('init', 'test_register');
	flush_rewrite_rules();
}

add_action("admin_init", "admin_initi");

function admin_initi(){
      add_meta_box("ns_test", "campo test", "test_print", "test", "normal", "low");
}

function test_print() {
      global $post;
      $values = get_post_custom_values('ns_test', $post->ID);
  	  $c = count($values);
  	  if ($c==0)
  	  {
  	  	?>


 borrar campo

	    


  borrar campo

	    	
      
Añadir otro campo más post_type == 'test') { if ($parent_id = wp_is_post_revision($post_id)) $post_id = $parent_id; if (!empty($_POST['ns_test']) && is_array($_POST['ns_test'])) { delete_post_meta($post_id, 'ns_test'); foreach ($_POST["ns_test"] as $value) { add_post_meta($post->ID, "ns_test", $value); } } else { delete_post_meta($post_id, 'ns_test'); } } }

Y es el que funciona en Piscolabis diseño web. Queda pendiente esa serie de post tutoriales de cómo crear un portfolio en WordPress 3.

WordCamp Sevilla 2011

WordCamp Sevilla

Nos vemos allí!

Widget de wordpress para Twitter Search (widget de busqueda)

Twitter nos ofrece un recurso para colocar un widget de búsqueda en tu sitio web.

Le he dado una pequeña vuelta y lo he covertido en un widget de WordPress que ya forma parte de la familia oficial de widgets de WordPress, de manera que si tu sitio web usa widgets en el sidebar, puedes usarlo: Twitter widget conversación

Una vez instalado como plugin (ya sabes lo subes por ftp a tu carpeta plugins y en el panel de administración lo activas) sólo tienes que arrastrarlo al sitio deseado de tu barra lateral y editarlo.

Tienes que introducir tu nombre de usuario de Twitter y puedes editar desde el color del texto o de fondo de la cabecera y cuerpo, hasta las dimensiones, si quieres que se vean o no los avatares, o los titulares del widget, etc.

De esta manera se adapta perfectamente a tu sitio WordPress.

Puedes verlo funcionando aquí.

Descárgatelo desdeel directorio oficial de plugins de WordPress y modificalo, mejoralo o haz lo que quieras con él: aquí.

 

La cuenta atrás para la desaparición definitiva de Internet Explorer 6

Microsoft lanzó Ie6 Countdown para intentar acabar de una vez por todas con ie6. Y es que ni siquiera ellos pueden exterminar a este browsaurio. Como ellos mismo dicen, ie6 nació hace ya 10 años, y es hora de decirle adios y darle la bienvenida a un explorardor moderno.

ie6 es una caca

Personalmente te aconsejo que te instales Firefox o Chrome, nunca un Explorer, ya que por muy bien que hagan las cosas, siemrpe las harán peor que los demás, o al menos esa es la historia escrita de Microsoft.

Vota por Pooplitics, la camiseta para lucir el próximo 22 de mayo

Ayer se me ocurrió que en las próximas elecciones iba a ir a votar  con una camiseta que expresara lo que siento de el 99% de los políticos y sus partidos, así que cree este diseño: Pooplitics (política = caca). Lo he presentado en mangacorta.com , y me lo han aceptado a concurso, y la verdad es que me haría mucha ilusión que pasara la fase de votación y lo pasaran a la tienda.

Así que si te mola, me puedes dar un voto y así, si tiene suficientes, pasaría a la tienda online :)

pooplitics

Vótala aquí.

Mi hijo vale mucho

Hoy he descubierto “mi hijo vale mucho” una web viral interactiva muy divertida y con acento malagueño, que desde el exilio se agradece. Detrás de esta está la empresa malagueña Doctor Jeckyll, y sin duda me parece una forma muy divertida de autopromocionarse. Además han ganado el III premio Sur a la mejor campaña publicitaria, bastante merecido en mi opinión.

mininovalemucho

Me ha recordado a “La vin que piso más bonico

En el 2011 dejo de dar soporte para Internet Explorer 6

ie6-no-more2-k-219116-3

Aunque ya en los últimos meses de 2010 he dejado de dar soporte en algunos proyectos para ie6, hago ya oficial que a partir de 2011 no voy a dar más soporte para ie6.

La razón es la caída del uso de este navegador en favor de ie7 y otros. Sólo en casos excepcionales daré soporte para este, y conllevará un considerable aumento del presupuesto de maquetación web.

Con todo, nada más que desearle una definitiva, aunque ya tardía, muerte a Explorer 6.

Inocentadas

Hoy es el día de los Inocentes, y si no estás al loro te piensas que a más de uno se le ha ido la pinza. Esta es la oportunidad del día en Me quedo uno:

imagen-1

Y la verdad es que, al menos para los nostálgicos un poquito freaks como yo, es un pena que sea una coña :)