<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Backtheweb</title>
	<atom:link href="http://www.backtheweb.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.backtheweb.com</link>
	<description>Notas y recursos de un desarrollador web</description>
	<lastBuildDate>Fri, 06 Jan 2012 01:58:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Instalar uploadprogress en OS X Lion con Zend Server CE</title>
		<link>http://www.backtheweb.com/zend-framework/instalar-uploadprogress-en-os-x-lion-con-zend-server-ce.html</link>
		<comments>http://www.backtheweb.com/zend-framework/instalar-uploadprogress-en-os-x-lion-con-zend-server-ce.html#comments</comments>
		<pubDate>Fri, 06 Jan 2012 01:45:22 +0000</pubDate>
		<dc:creator>Jordi Touza Bonnin</dc:creator>
				<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.backtheweb.com/?p=468</guid>
		<description><![CDATA[Pequeño tutorial para instalar la extensión uploadprogress en OS X Lion con Zend Server CE]]></description>
			<content:encoded><![CDATA[<p>En <strong>Mac OS X Leopard</strong> es muy fácil instalar la extensión <strong>uploadprogress</strong>. Basta con ejecutar en la terminal el comando:</p>
<p><code>sudo pecl install uploadprogress</code></p>
<p>El problema surge cuando se trata de <strong>OS X Lion</strong>. Todo parece ir bien hasta que reincidas el <strong>apache</strong> y el <strong>PHP</strong> salta con el siguiente error:</p>
<pre class="prettyprint"><code class="language-bash">PHP Startup: Unable to load dynamic library '/usr/local/zend/lib/php_extensions/uploadprogress.so' - dlopen(/usr/local/zend/lib/php_extensions/uploadprogress.so, 9): no suitable image found.  Did find:
	/usr/local/zend/lib/php_extensions/uploadprogress.so: mach-o, but wrong architecture in Unknown on line 0</code></pre>
<p>Si no has configurado la ruta del <code>php.ini</code> en el <strong>pcel</strong> es buen momento para hacerlo con el comando:</p>
<p><code>sudo pecl config-set php_ini usr/local/zend/etc/php.ini</code></p>
<p>Si ya hemos instalado el <strong>uploadprogress</strong> lo primero que haremos será desinstalarlo con:</p>
<p><code>sudo pecl uninstall uploadprogress</code></p>
<p>Ahora descargamos la última versión de <strong></strong> desde <a href="http://pecl.php.net/package/uploadprogress" rel="external">http://pecl.php.net/package/uploadprogress</a> (en el momento de escribir este post la versión actual es la 1.0.3.1) y lo descomprimimos.</p>
<p>A continuación desde la terminal nos movemos hasta la carpeta de la extensión:</p>
<p><code>cd /Users/jordi/Downloads/uploadprogress-1.0.3.1/uploadprogress-1.0.3.1/</code></p>
<p>Y empezamos tecleando:</p>
<p><code>phpize</code></p>
<p>Que nos responderá con algo como:</p>
<pre class="prettyprint"><code class="language-bash">Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626</code></pre>
<p>Ahora ejecutamos el comando <code>configure</code> tal como muestro a continuación:</p>
<p><code>MACOSX_DEPLOYMENT_TARGET=10.7 CFLAGS='-O3 -fno-common -arch i386 -arch x86_64' LDFLAGS='-O3 -arch i386 -arch x86_64' CXXFLAGS='-O3 -fno-common -arch i386 -arch x86_64' ./configure --with-php-config=/Developer/SDKs/MacOSX10.7.sdk/usr/bin/php-config</code></p>
<p>Luego:</p>
<p><code>make</code></p>
<p>Y luego:</p>
<p><code>make install</code></p>
<p>Si no hemos configurado la ruta del php.ini en <strong>pecl</strong> nos pedirá que agreguemos la extensión a nuestro php.ini añadiendo la siguiente linea:</p>
<p><code>extension=/usr/lib/php/extensions/no-debug-non-zts-20090626/uploadprogress.so</code></p>
<p>Reiniciamos el <strong>apache</strong> y ya tenemos la extensión <strong>uploadprogress</strong> funcionando.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.backtheweb.com/zend-framework/instalar-uploadprogress-en-os-x-lion-con-zend-server-ce.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maquetador HTML &#8211; Barcelona ¿9mil euros brutos anuales?</title>
		<link>http://www.backtheweb.com/empleo/maquetador-html-barcelona-9mil-euros-brutos-anuales.html</link>
		<comments>http://www.backtheweb.com/empleo/maquetador-html-barcelona-9mil-euros-brutos-anuales.html#comments</comments>
		<pubDate>Fri, 30 Dec 2011 00:17:09 +0000</pubDate>
		<dc:creator>Jordi Touza Bonnin</dc:creator>
				<category><![CDATA[empleo]]></category>

		<guid isPermaLink="false">http://www.backtheweb.com/?p=449</guid>
		<description><![CDATA[Me gusta cotillear como esta el mercado y como se paga mi trabajo y cuando veo estas cosas&#8230; (dejo el link y copio el texto, para cuando caduque la oferta) http://www.tecnoempleo.com/oferta-de-trabajo.php?goog_pr=2&#038;goog=1&#038;refer=844226866eec3ld65al7&#038;sl= Empresa perfect alibi event Oferta Maquetador HTML - Barcelona Provincia Barcelona - España Perfil Se precisa: Persona para desarrollar una web. Su objetivo: Será [...]]]></description>
			<content:encoded><![CDATA[<p>Me gusta cotillear como esta el mercado y como se paga mi trabajo y cuando veo estas cosas&#8230;</p>
<p>(dejo el link y copio el texto, para cuando caduque la oferta)</p>
<p>http://www.tecnoempleo.com/oferta-de-trabajo.php?goog_pr=2&#038;goog=1&#038;refer=844226866eec3ld65al7&#038;sl=</p>
<pre>Empresa 	perfect alibi event
Oferta 	 	Maquetador HTML - Barcelona</pre>
<pre>Provincia 	Barcelona - España
Perfil
Se precisa: Persona para desarrollar una web.

Su objetivo: Será desarrollar código HTML, PHP, JSP, JQUERY y AJAX según indicaciones de un Analista Programador y Analista de Bases de Datos.

Se requiere: Dominio de HTML, PHP, JSP, JQUERY, AJAX, MySQL a nivel de consultas.

Se valorará: Experiencia demostrable en proyectos similares. Dominio de alguno de los siguientes entornos de programación o similares : NuSphere, Eclipse, Eclipse PDT, Firebug.

Estudios: Preferiblemente ingeniero/a informático/a aunque no es imprescindible si se cumple el punto anterior.
Experiencia 	3-5 años
Puesto 	Se precisa: Persona para desarrollar una web: código HTML, PHP, JSP, JQUERY y AJAX
Jornada 	Jornada completa
Honorarios 	9000 € - 9000 € Bruto/año
Tipo contrato 	A determinar
Funciones  	Desarrollador Web
Tecnología  	HTML PHP JSP JQUERY AJAX MySQL .</pre>
<ol>
<li>Tu no quieres un maquetador, quieres un programador que sepa maquetar</li>
<li>De 3 a 5 años de experiencia. Bueno todos queremos gente valida</li>
<li> Jornada completa. Ok&#8230;</li>
<li>&#8220;Preferiblemente ingeniero/a&#8221;, bueno es preferible&#8230; ok</li>
<li>Con 3 a 5 años de experiencia, si se puede tener experiencia en muchas cosas. ok</li>
<li><strong>9000 euros bruto/año!</strong>!!!  Espero que se trate de un error porque si alguien esta dispuesto a cobrar semejante miseria es que el mundo esta peor de lo que nos cuentan&#8230; vaya haciendo bocadillos en un fast-food cobraba mucho más que esto. Y para más inri 5 años de experiencia e ingeniero. Es una falta de respeto, espero que sea un error.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.backtheweb.com/empleo/maquetador-html-barcelona-9mil-euros-brutos-anuales.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Service Amazon response status code 400</title>
		<link>http://www.backtheweb.com/zend-framework/zend-service-amazon-response-status-code-400.html</link>
		<comments>http://www.backtheweb.com/zend-framework/zend-service-amazon-response-status-code-400.html#comments</comments>
		<pubDate>Sun, 11 Dec 2011 23:16:38 +0000</pubDate>
		<dc:creator>Jordi Touza Bonnin</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Amazon]]></category>

		<guid isPermaLink="false">http://www.backtheweb.com/?p=437</guid>
		<description><![CDATA[Hoy, al hacer pruebas con Zend_Service_Amazon me he encontrado con esto&#8230; Message: An error occurred sending request. Status code: 400 Y por mucho que googleara no encontraba el error&#8230; entre debugando y metiendo mano al código, miro la hora y veo que son las 2:00 de la madrugada&#8230; mmm&#8230; ups no, no puden ser las [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy, al hacer pruebas con <strong>Zend_Service_Amazon</strong> me he encontrado con esto&#8230;<br />
<code>Message: An error occurred sending request. Status code: 400</code><br />
Y por mucho que googleara no encontraba el error&#8230; entre debugando y metiendo mano al código, miro la hora y veo que son las 2:00 de la madrugada&#8230; mmm&#8230; ups no, no puden ser las 2:00&#8230; el reloj de la maquina virtual está mal. Voilà! </p>
<p>Solución: ¡ajustar la hora del servidor!</p>
<p>Por otra parte&#8230; y no tiene nada que ver, parece ser que lleva unos días caido pear.phpunit.de, por lo que instalar phpunit desde pear es imposible</p>
]]></content:encoded>
			<wfw:commentRss>http://www.backtheweb.com/zend-framework/zend-service-amazon-response-status-code-400.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solución a &#8220;Image corrupt or truncated&#8221;</title>
		<link>http://www.backtheweb.com/general/solucion-a-image-corrupt-or-truncated.html</link>
		<comments>http://www.backtheweb.com/general/solucion-a-image-corrupt-or-truncated.html#comments</comments>
		<pubDate>Wed, 10 Aug 2011 11:56:53 +0000</pubDate>
		<dc:creator>Jordi Touza Bonnin</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.backtheweb.com/?p=433</guid>
		<description><![CDATA[Hoy, al crear la maquina virtual y descargar el reposiorio en ella he comprobado que al cargar la web no se veia ninguna imagen. Firbug saltaba por cada imagen con el mensaje: Image corrupt or truncated. El problema viene dado por usar el sistema de comparición de carpetas de virtualbox, por algun motivo le esta [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy, al crear la maquina virtual y descargar el reposiorio en ella he comprobado que al cargar la web no se veia ninguna imagen. Firbug saltaba por cada imagen con el mensaje: <strong>Image corrupt or truncated</strong>.</p>
<p>El problema viene dado por usar el sistema de comparición de carpetas de virtualbox, por algun motivo le esta añadiendo bites a las imagenes, lo cual hace que los ficheros sean enviados al cliente con errores.</p>
<p>Solución: añadir en la configuración de apache:</p>
<p><code>EnableMMAP off<br />
EnableSendfile off</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.backtheweb.com/general/solucion-a-image-corrupt-or-truncated.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Evento oninput en input type number</title>
		<link>http://www.backtheweb.com/jquery/evento-oninput-en-input-type-number.html</link>
		<comments>http://www.backtheweb.com/jquery/evento-oninput-en-input-type-number.html#comments</comments>
		<pubDate>Tue, 14 Dec 2010 23:00:37 +0000</pubDate>
		<dc:creator>Jordi Touza Bonnin</dc:creator>
				<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.backtheweb.com/?p=410</guid>
		<description><![CDATA[Una de las cosas bonitas del HTML5 son los nuevos elementos de formularios. Haciendo pruebas con los nuevos elementos vi que el elemento de tipo number en Safari no responden a los eventos cuando haces click en los controles (las flechecitas de arriba y abajo), solo cambia el valor, pero no se disparan los eventos [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las cosas bonitas del <strong>HTML5</strong> son los nuevos elementos de formularios.</p>
<p>Haciendo pruebas con los nuevos elementos vi que el elemento de tipo <code>number</code> en Safari no responden a los eventos cuando haces click en los controles (las flechecitas de arriba y abajo), solo cambia el valor, pero no se disparan los eventos atachados via <strong>JavaScript</strong>.</p>
<p>La solución más facil es usar el evento <strong>click</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.backtheweb.com/jquery/evento-oninput-en-input-type-number.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Form Decorator, parte II</title>
		<link>http://www.backtheweb.com/zend-framework/zend-form-decorator-parte-ii.html</link>
		<comments>http://www.backtheweb.com/zend-framework/zend-form-decorator-parte-ii.html#comments</comments>
		<pubDate>Mon, 18 Oct 2010 22:34:10 +0000</pubDate>
		<dc:creator>Jordi Touza Bonnin</dc:creator>
				<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.backtheweb.com/?p=402</guid>
		<description><![CDATA[Anteriormente en la primera parte de Zend Form Decorators vimos como cambiar los Decorators directamente sobre el Zend Form. Ahora vamos a ver como aplicar nuestros propios decorators en todos los formularios de una estacada. class ZendY_Form extends Zend_Form{ protected static $_standardElementDecorator = array( array('ViewHelper'), array('Label', array('separator' =&#62; ' ', )), array('Description', array('tag' =&#62; 'span', [...]]]></description>
			<content:encoded><![CDATA[<p>Anteriormente en la <a href="http://www.backtheweb.com/php/zend-form-decorator-parte-i.html">primera parte de Zend Form Decorators</a> vimos como cambiar los <strong>Decorators</strong> directamente sobre el <code class="class">Zend Form</code>.<br />
Ahora vamos a ver como aplicar nuestros propios decorators en todos los formularios de una estacada.</p>
<p><span id="more-402"></span></p>
<p><code> </code></p>
<pre>class ZendY_Form extends Zend_Form{

    protected static $_standardElementDecorator   = array(
        array('ViewHelper'),
        array('Label',         array('separator' =&gt; ' ', )),
        array('Description',    array('tag' =&gt; 'span', 'class' =&gt; 'element-description-append', 'placement' =&gt; 'append' )),
        array('Errors'),
        array('HtmlTag',     array('tag' =&gt; 'div')),
    );  

    protected static $_standardElementDecoratorAppendDescription = array(
        array('Description',    array('tag' =&gt; 'span', 'class' =&gt; 'element-description-prepend', 'placement' =&gt; 'prepend' )),
        array('ViewHelper'),
        array('Label',         array('separator' =&gt; ' ', )),
        array('Errors'),
        array('HtmlTag',     array('tag' =&gt; 'div')),
    );

    protected static $_standardElementDecoratorClearRight   = array(
        array('ViewHelper'),
        array('Label',         array('separator' =&gt; ' ', )),
        array('Description',    array('tag' =&gt; 'span', 'class' =&gt; 'element-description-append', 'placement' =&gt; 'append' )),
        array('Errors'),
        array('HtmlTag',     array('tag' =&gt; 'div', 'class' =&gt; 'clearRight')),
    ); 

    protected static $_standardElementDecoratorClearLeft   = array(
        array('ViewHelper'),
        array('Label',         array('separator' =&gt; ' ', )),
        array('Description',    array('tag' =&gt; 'span', 'class' =&gt; 'element-description-append', 'placement' =&gt; 'append' )),
        array('Errors'),
        array('HtmlTag',     array('tag' =&gt; 'div', 'class' =&gt; 'clearLeft')),
    ); 

    /**
     *
     * Remeber to set 'separator' =&gt; '' into the element
     * @var array
     */
    protected static $_multiCheckboxElementDecorator = array(

        array('ViewHelper'),
        array('Label',         array('separator' =&gt; ' ', 'tag' =&gt; 'span')),
        array('Description',    array('tag' =&gt; 'span', 'class' =&gt; 'element-description-append', 'placement' =&gt; 'append' )),
        array('Errors'),
        array('HtmlTag',     array('tag' =&gt; 'div', 'class' =&gt; 'multiCheckbox')),

    );

    protected static $_hiddenElementDecorator = array(
        array('ViewHelper')
    );

    protected static $_submitElementDecorator = array(
        array('ViewHelper'),
        array('HtmlTag',         array('tag' =&gt; 'p', 'class' =&gt; 'element-submit')),
    );

    public function __construct($options = null)
    {
        parent::__construct($options);

    //$this-&gt;addElementPrefixPath('ZendY_Form_Decorator','ZendY/Form/Decorator','decorator');
    }

    /**
     * Load the default decorators
     *
     * @return void
     */
    public function loadDefaultDecorators(){

        if (!$this-&gt;loadDefaultDecoratorsIsDisabled()) {

            //$this-&gt;removeDecorator('DtDdWrapper');
            //$this-&gt;removeDecorator('DlWrapper'); 

            $this-&gt;clearDecorators()
                -&gt;setAttrib('accept-charset', 'UTF-8')
                -&gt;addDecorator('FormElements')
                -&gt;addDecorator('HtmlTag', array('tag' =&gt; '
<div>', 'class' =&gt; 'zendy_formContent'))
                -&gt;addDecorator('Form')
                -&gt;setAttrib('class', 'zendy_form')
            ;
        } 

        foreach ($this-&gt;getDisplayGroups() as $group){

            if($group-&gt;loadDefaultDecoratorsIsDisabled()) continue;

            $group-&gt;clearDecorators();

            $group-&gt;addDecorators(
                array(
                    array('FormElements'),
                    array('Description', array('tag' =&gt; 'p', 'class' =&gt; 'group-description', 'placement' =&gt; 'prepend' )),
                    new Zend_Form_Decorator_Fieldset(),
                )
            );
        }

        foreach ($this-&gt;getElements() as $element) {

            if($element-&gt;loadDefaultDecoratorsIsDisabled()) continue;

            switch ($element-&gt;getType()){

                case 'Zend_Form_Element_Hidden':      $element-&gt;setDecorators(self::$_hiddenElementDecorator);        break;
                case 'Zend_Form_Element_Submit':      $element-&gt;setDecorators(self::$_submitElementDecorator);        break;
                case 'Zend_Form_Element_Radio':
                case 'Zend_Form_Element_MultiCheckbox': $element-&gt;setDecorators(self::$_multiCheckboxElementDecorator); break;
                case 'Zend_Form_Element_Select':
                case 'Zend_Form_Element_Text':
                default:                                $element-&gt;setDecorators(self::$_standardElementDecorator);
            }
        }

        return $this;
    }
}</div>
</pre>
<p>Se trata de crear una clase que extienda <code>Zend Form</code> en la que definimos nuestros <strong>Decorators</strong>, tambien se podria crear una clase para cada decorator, pero eso lo dejo para otra entrada.</p>
<p>Una vez definidos los <strong>Decorators</strong> para <em>Elementos</em> y <em>DisplayGroups</em> los llamamos en el metodo <code>loadDefaultDecorators</code>.</p>
<p>Ahora cuando creamos un formulario extenderemos de <code>ZendY_Form</code> y se aplicaran los <strong>Decorators</strong> que hemos definido.</p>
<p>A de más si queremos que algun elemento tenga un <strong>decorator</strong> diferente podemos ahcer lo siguiente:</p>
<p><code> </code></p>
<pre>$this-&gt;addElement('text', 'validAtTo', array(
            'label'     =&gt; 'To',
            'required'  =&gt; false,
            'class'     =&gt; 'date',
            'value'     =&gt; '',
            'disableLoadDefaultDecorators' =&gt; true,
            'decorators' =&gt; parent::$_standardElementDecoratorClearLeft
        ));</pre>
<p>De esta forma, desactivamos los <strong>Decorators</strong> por defecto y cargamos otros que previamente hemos definido en nuestro clase <code>ZendY_Form</code></p>
<p>Espero que os sea útil</p>
]]></content:encoded>
			<wfw:commentRss>http://www.backtheweb.com/zend-framework/zend-form-decorator-parte-ii.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sobre maquetadores y frontends, reflexión</title>
		<link>http://www.backtheweb.com/general/sobre-maquetadores-y-frontends-reflexion.html</link>
		<comments>http://www.backtheweb.com/general/sobre-maquetadores-y-frontends-reflexion.html#comments</comments>
		<pubDate>Thu, 19 Aug 2010 22:19:30 +0000</pubDate>
		<dc:creator>Jordi Touza Bonnin</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.backtheweb.com/?p=397</guid>
		<description><![CDATA[El perfil del maquetador web siempre ha quedao relegado a un programador o a un diseñador; pero cada vez se hace más obia la necesidad de un perfil más experto en esta area. Para nada cosideraria que un maquetador no sabe de semántica ni de accesibilidad, eso depende de los conocimientos de la persona. Pero [...]]]></description>
			<content:encoded><![CDATA[<p>El perfil del <strong>maquetador</strong> web siempre ha quedao relegado a un <strong>programador</strong> o a un <strong>diseñador</strong>; pero cada vez se hace más obia la necesidad de un perfil más experto en esta area.</p>
<p>Para nada cosideraria que un maquetador no sabe de semántica ni de accesibilidad, eso depende de los conocimientos de la persona. Pero e aquí cunado un maquetador deja de ser maquetador para convertirse en <strong>frontend</strong> que deberia conocer y dominar toda una serie de aptitudes:</p>
<ol>
<li>XHTML semántico</li>
<li>Tablas solo para datos tabulares</li>
<li>Recomendaciones W3C</li>
<li>Reconocer IE6 como <span style="text-decoration: line-through;">hijo</span> navegador pese a que de muchos disgustos</li>
<li>Separar el contenido de la presentación y de la interactividad</li>
<li>Accesibilidad</li>
<li>Optimización web (imagenes, cargas, etc.)</li>
</ol>
<p>Es un perfil relativamente nuevo que muchas empresas aun no tienen y muchas que no saben que lo necesitan.</p>
<p>Yo personlamente me considero frontend, pues creo sinceramente que hago algo más que maquetar una web.</p>
<p>Lo malo de este perfil es que cuesta mucho encontrar ha alguien que reuna todas estas caracteristicas (y que quiera cobrar lo que se esta pagando &#8211;depende claro, de la empresa&#8211;)</p>
<p>A mi jucio, lo peor de ser frontend es que me veo obligado a pelearme con diseñadores y progrmadores. Unos porque hacen diseños imposibles o muy costosos (para nada les importa el crossbrowsing, y a veces parece que ni la semántica &#8211;la usabilidad si, les encanta&#8211;) . Con otros porque te tocan el código y rompen la accesibilidad y la semantica con javascript obstrusivo o agrupando elementos con spans donde les interesa.</p>
<p>Con todo estos lo que queiro decir es que cada uno es lo que sabe y hace lo que puede. No importa demasiado el nombre o la etiqueta que le pongas. Las empresas miran por el dinero y no saben ni quieren saber (ni entender) que el maquetador/frontend es como la cola que engancha el diseño con la programación y que como professional que es tiene unas necesidades y unos valores.</p>
<p>No hace mucho las web eran como casas de paja. Pensad que las empresas que tienen todo su negocio enfocado en internet (en españa) la mayoria no tienen mucho más de 10 años y que muchas de estas no han podido afrontar los cambios que han surgido en internet.</p>
<p>Hace diez años no existian ni las capacidades técnicas ni los frameworks con los que hoy podemos trabajar.</p>
<p>Aunque Tim Berners-Lee concebiera la web como algo semántico y accesible es precisamente lo contrario, el uso del no-estandar, lo que permitió la rápida expansión de la web.</p>
<p>Afortunadamente desde hace unos pocos años la cosa esta cambiando, pero antes han de madurar las empresas y entender que al lobo no le costó tirar al suelo la casa de madera.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.backtheweb.com/general/sobre-maquetadores-y-frontends-reflexion.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Zend Navigation especifico por módulo</title>
		<link>http://www.backtheweb.com/zend-framework/zend-navigation-especifico-por-modulo.html</link>
		<comments>http://www.backtheweb.com/zend-framework/zend-navigation-especifico-por-modulo.html#comments</comments>
		<pubDate>Sun, 08 Aug 2010 00:28:27 +0000</pubDate>
		<dc:creator>Jordi Touza Bonnin</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend Navigation]]></category>

		<guid isPermaLink="false">http://www.backtheweb.com/?p=379</guid>
		<description><![CDATA[Retomando el tema de un Layout especifico por cada módulo en Zend framework toca ahora ver como hacer una navegación especifica para cada módulo. Zend Framework nos permite configurar la nevegación de tres formas distintas: Directamente en PHP En un fichero XML En un fichero .INI Al principio usaba un fichero XML para conigurar Zend_Navigarion [...]]]></description>
			<content:encoded><![CDATA[<p>Retomando el tema de un <a title="Layout especifico para cada módulo en Zend Framework" href="http://www.backtheweb.com/php/zend-framework-como-hacer-un-layout-para-cada-modulo.html">Layout especifico por cada módulo en Zend framework</a> toca ahora ver como hacer una navegación especifica para cada módulo.</p>
<p><strong>Zend Framework</strong> nos permite configurar la nevegación de tres formas distintas:</p>
<ul>
<li>Directamente en <strong>PHP</strong></li>
<li>En un fichero <strong>XML</strong></li>
<li>En un fichero <strong>.INI</strong></li>
</ul>
<p>Al principio usaba un fichero <strong>XML</strong> para conigurar <strong>Zend_Navigarion</strong> y en el <code>boostrap</code> una función que carga dicho fichero:<br />
<span id="more-379"></span></p>
<pre><code>
protected function _initNavigation(){	

	$this-&gt;bootstrap('layout');
	$layout 	= $this-&gt;getResource('layout');
	$view 	= $layout-&gt;getView();

	$config 	= new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'navigation');
	$navigation = new Zend_Navigation($config);

	Zend_Registry::set('Zend_Navigation', $navigation);
}
</code></pre>
<p>Dado que estoy usando<strong> Zend_Application</strong> para manejar el proyecto tan solo necesito cargar el fichero <strong>XML</strong>, crear una instanca de <strong>Zend_Navigation</strong> y luego registrarla con <strong>Zend_Registry</strong> para que automaticamente la asuma la aplicación y poder usarla desde la vista.</p>
<p>Si tu navegación no es muy larga, tal vez te resulte más práctico usar el ficchero <code>application.ini</code>, pues no tendrás que hacer nada en el <code>bootstrap</code>.</p>
<p>Pero el problema surge, como en todos los otros recursos (Zend_Application_Resource_*), cuando quiero que cada módulo disponga de su propia navegación. Al intentarlo, <strong>Zend_Registry</strong> siempre se quedará con la última instancia, por lo que todos los módulos tendrán siempre la misma navegación. Esto es por  que <strong>Zend_Application</strong> carga todos los ficheros <code>bootstrap</code> de  cada módulo.</p>
<p>Esto es así y seguirá siendo así por que el <code>bootstrap</code> no es el lugar para configurar estos recursos (no lo digo yo). Por esta razón hemos de inicializar todas estas acciones mediante plugins.</p>
<p>Para empezar crearemos la estructura de la naevación en el fichero <code>application.ini</code>:</p>
<pre><code>;Navegación principal
resources.navigation.storage.registry           = true
resources.navigation.pages.page001.label        = "Home"
resources.navigation.pages.page001.uri          = "/"
resources.navigation.pages.page001.controller   = "index"<code>

;Navegación Admin
admin.resources.navigation.pages.clients.label 			= "Clients"
admin.resources.navigation.pages.clients.controller		= "clients"
admin.resources.navigation.pages.clients.module			= "admin"

admin.resources.navigation.pages.clients.pages.pageA.label		= "List"
admin.resources.navigation.pages.clients.pages.pageA.controller  = "clients"
admin.resources.navigation.pages.clients.pages.pageA.action		= "index"
admin.resources.navigation.pages.clients.pages.pageA.module		= "admin"

</code></code></pre>
<p>Es muy importante la primera linea <code>resources.navigation.storage.registry</code> en cada bloque de navegación, sin esto no funcionará. Lo que hace es que nos registra la navegación automáticamente.</p>
<p>Entonces, para inicializar una navegación especifica para cada módulo crearemos un plugin practicamente igual al que comente en el otro post <a title="Layout especifico para cada módulo en Zend Framework" href="http://www.backtheweb.com/php/zend-framework-como-hacer-un-layout-para-cada-modulo.html">Como hacer un Layout para cada módulo</a>. En mi caso tan solo he de añadir unas lineas:</p>
<pre><code>if(isset($config[$module]['resources']['navigation']['pages'])){
	$navigation = new Zend_Navigation($config[$module]['resources']['navigation']['pages']);
	Zend_Layout::getMvcInstance()-&gt;getView()-&gt;navigation($navigation);
}
</code></pre>
<p>Si prefieres o ya has creado un fichero XML (mucho más manejable) puedes hacer lo siguiente en lugar de lo anterior:</p>
<pre><code>
if(isset($config[$module]['resources']['navigation']['storage']['registry'])){
	$configIni = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.' . $module . '.xml', 'navigation');
	$navigation = new Zend_Navigation($configIni);
	Zend_Layout::getMvcInstance()->getView()->navigation($navigation);
}
</code></pre>
<p>De esta forma mi plugin queda de la siguiente manera:</p>
<pre><code>
class ZendY_Controller_Plugin_Layout extends Zend_Controller_plugin_Abstract {

	public function preDispatch(Zend_Controller_Request_Abstract $request) {

		$config = Zend_Controller_Front::getInstance ()-&gt;getParam ( 'bootstrap' )-&gt;getOptions ();
		$module = $request-&gt;getModuleName();

		if($module === "default") return;

		// Helpers Path
		Zend_Controller_Action_HelperBroker::addPath ( APPLICATION_PATH . '/modules/' . $module . '/helpers' );

		//basePath
		if (isset ( $config [$module] ['resources'] ['view'] ['basePath'] )) {
			$viewBasePath = $config [$module] ['resources'] ['view'] ['basePath'];
			Zend_Layout::getMvcInstance ()-&gt;setViewScriptPath ( $viewBasePath );
		}

		//Layout path
		if (isset ( $config [$module] ['resources'] ['layout'] ['layoutPath'] )) {
			$layoutPath = $config [$module] ['resources'] ['layout'] ['layoutPath'];
			Zend_Layout::getMvcInstance ()-&gt;setLayoutPath ( $layoutPath );
		}

		//LayoutScripts path
		if (isset ( $config [$module] ['resources'] ['layout'] ['layout'] )) {
			$layoutScript = $config [$module] ['resources'] ['layout'] ['layout'];
			Zend_Layout::getMvcInstance ()-&gt;setLayout ( $layoutScript );
		}

		//Navigation
		f(isset($config[$module]['resources']['navigation']['storage']['registry'])){
			$configIni = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.' . $module . '.xml', 'navigation');
			$navigation = new Zend_Navigation($configIni);
			Zend_Layout::getMvcInstance()->getView()->navigation($navigation);
		}
	}
}
</code></pre>
<p>Y recordar que para que el plugin funcione debeis regitrar su llamada en el <code>boostrap</code></p>
<pre><code>
protected function _initPlugins(){

	$bootstrap = $this-&gt;getApplication();
        $bootstrap-&gt;bootstrap('frontcontroller');
        $front = $bootstrap-&gt;getResource('frontcontroller');
	$front-&gt;registerPlugin(new ZendY_Controller_Plugin_Layout());
}
</code></pre>
<p>o en el mismo <code>application.ini</code></p>
<pre><code>
resources.frontController.plugins.layout 			= ZendY_Controller_Plugin_Layout
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.backtheweb.com/zend-framework/zend-navigation-especifico-por-modulo.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalar APC en Snow Leopard</title>
		<link>http://www.backtheweb.com/php/instalar-apc-en-snow-leopard.html</link>
		<comments>http://www.backtheweb.com/php/instalar-apc-en-snow-leopard.html#comments</comments>
		<pubDate>Wed, 21 Jul 2010 00:25:49 +0000</pubDate>
		<dc:creator>Jordi Touza Bonnin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[APC]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[Snow Leopa]]></category>

		<guid isPermaLink="false">http://www.backtheweb.com/?p=368</guid>
		<description><![CDATA[Actualmente estoy integrando Doctrine 2 con Zend Framework. A la hora de executar en la terminal doctrine orm:validate-schema me encontraba con el siguiente error: PHP Fatal error: Call to undefined function Doctrine\Common\Cache\apc_fetch() in /vhosts/doctrine/library/Doctrine/Common/Cache/ApcCache.php on line 59 Esto sucede porque no tengo instalado el APC. Para instalar correctamente el APC se han de indicar en [...]]]></description>
			<content:encoded><![CDATA[<p>Actualmente estoy integrando <strong>Doctrine 2</strong> con<strong> Zend Framework</strong>.</p>
<p>A la hora de executar en la terminal <code>doctrine orm:validate-schema</code> me encontraba con el siguiente error:</p>
<p><code>PHP Fatal error:  Call to undefined function Doctrine\Common\Cache\apc_fetch() in /vhosts/doctrine/library/Doctrine/Common/Cache/ApcCache.php on line 59</code></p>
<p>Esto sucede porque no tengo instalado el <strong>APC</strong>.</p>
<p>Para instalar correctamente el <strong>APC</strong> se han de indicar en <strong>Snow Leopard</strong> unos flags para que el <strong>APC</strong> se compile con la arquitectura adecuada</p>
<pre><code>wget http://pecl.php.net/get/APC-3.1.3p1.tgz
tar -xvf APC-3.1.3p1.tgz
cd APC-3.1.3p1
/usr/local/zend/bin/phpize

MACOSX_DEPLOYMENT_TARGET=10.6
CFLAGS="-arch i386 -arch x86_64 -g -Os -pipe -no-cpp-precomp"
CCFLAGS="-arch i386 -arch x86_64 -g -Os -pipe"
CXXFLAGS="-arch i386 -arch x86_64 -g -Os -pipe"
LDFLAGS="-arch i386 -arch x86_64 -bind_at_load"
export CFLAGS CXXFLAGS LDFLAGS CCFLAGS MACOSX_DEPLOYMENT_TARGET

./configure --enable-apc-mmap --with-apxs=/usr/sbin/apxs --with-php-config=/usr/local/zend/bin/php-config

make
sudo make install
</code></pre>
<p>Luego insertamos en el <em>php.ini</em></p>
<pre><code>extension=apc.so

apc.enabled=1
apc.shm_segments=1
apc.shm_size=128
apc.ttl=7200
apc.user_ttl=7200
apc.num_files_hint=1024
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.enable_cli=1</code></pre>
<p>Reinicia el <em>apache</em> y revisa la configuración del <strong>APC</strong> con <code>phpinfo()</code>, verás que se ha compilado correctamente.</p>
<p><strong>Actualización</strong>: Si al recargar las paginas web se os queda la página en blanco mirar los logs de php. Si os aparece:<br />
<code> Module 'apc' already loaded in Unknown on line 0</code> comentar la linea <code>extension=apc.so</code> poniendo un &#8220;;&#8221; (punto y comoa) delante.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.backtheweb.com/php/instalar-apc-en-snow-leopard.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Firefox 3.6 falla más que una escopeta de feria</title>
		<link>http://www.backtheweb.com/general/firefox-3-6-falla-mas-que-una-escopeta-de-feria.html</link>
		<comments>http://www.backtheweb.com/general/firefox-3-6-falla-mas-que-una-escopeta-de-feria.html#comments</comments>
		<pubDate>Tue, 09 Feb 2010 20:48:20 +0000</pubDate>
		<dc:creator>Jordi Touza Bonnin</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.backtheweb.com/?p=359</guid>
		<description><![CDATA[Lo cierto es que no se si se trata de Firefox 3.6 o de firebug 1.5.0 o de algun otro plugin como el HTML Validator 0.8.6.1 pero la cosa cada día va a peor. Con Firefox 3.5 tampoco iba demasiado fino el tema. Me recomendaron hacer un downgrade a Firebug 1.4.0. y tampoco ha solucionado [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-366" title="Firefox falla más que una escopeta de feria" src="http://www.backtheweb.com/wp-content/uploads/2010/02/firefox_falla_mas_que_una_escopeta_de_feria.jpg" alt="Firefox falla más que una escopeta de feria" width="480" height="242" /></p>
<p>Lo cierto es que no se si se trata de <strong>Firefox 3.6</strong> o de <strong>firebug 1.5.0</strong> o de algun otro plugin como el <strong>HTML Validator 0.8.6.1</strong> pero la cosa cada día va a peor. Con <strong>Firefox 3.5</strong> tampoco iba demasiado fino el tema. Me recomendaron hacer un <em>downgrade</em> a <strong>Firebug 1.4.0</strong>. y tampoco ha solucionado nada.</p>
<p>Los principales problemas que tengo són:</p>
<ul>
<li><strong>Firefox</strong> se cuelga más de lo habitual, especialemente cuando me levanto y vuelvo al cabo de un rato, es decir en periodos de inactividad.</li>
<li><strong>Firebug</strong> no es capaz de desplegarme el inspector, se queda en el <em>body</em> o en algun <em>div</em>. Por lo que he de reinicar <strong>Firefox</strong>.</li>
</ul>
<p>Psansaba que podría ser algo de mi Mac, pero me pasa en varios Mac&#8217;s (los de casa y el del trabajo). Pensaba que seria algo de los Mac&#8217;s, pero colegas del trabjo que usan windows estan igual.</p>
<p>A todo esto&#8230; pues le estoy dando una oportunidad a <strong>Opera</strong> que trae por defecto herramientas de debug muy buenas&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.backtheweb.com/general/firefox-3-6-falla-mas-que-una-escopeta-de-feria.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

