<?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>Demo31</title>
	<atom:link href="http://www.demo31.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.demo31.com</link>
	<description>Demos y Tutoriales Zend Framework, PHP, MySQL, SEO, GoogleAnalytics, WordPress, Blogspot</description>
	<lastBuildDate>Sat, 05 Feb 2011 23:13:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>Captcha o C&#243;digo Anti-Spam en Zend Framework</title>
		<link>http://www.demo31.com/php/zend-framework/captcha-codigo-anti-spam-zend-framework</link>
		<comments>http://www.demo31.com/php/zend-framework/captcha-codigo-anti-spam-zend-framework#comments</comments>
		<pubDate>Sat, 05 Feb 2011 21:59:03 +0000</pubDate>
		<dc:creator>José Carlos</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.demo31.com/?p=689</guid>
		<description><![CDATA[Para los que no sepan qu&#233; es el c&#243;digo Anti-Spam, comentar que es la imagen que aparece en algunos formularios y que contiene una serie de caracteres que debemos introducir antes de realizar el env&#237;o de datos de dicho formulario al servidor. Este c&#243;digo se utiliza para evitar que se monten robots contra nuestro formulario, [...]]]></description>
			<content:encoded><![CDATA[<div style = "padding-top: 5px; text-align: justify">
<p>Para los que no sepan qu&eacute; es el c&oacute;digo Anti-Spam, comentar que es la imagen que aparece en algunos formularios y que contiene una serie de caracteres que debemos introducir antes de realizar el env&iacute;o de datos de dicho formulario al servidor. Este c&oacute;digo se utiliza para evitar que se monten robots contra nuestro formulario, y lo utilice repetidamente de manera que nos llene nuestra BBDD o una cuenta de correo de información basura.
</p>
<p>
Dicho esto, vamos a ver los pasos qu&eacute; los pasos a seguir para implementar nuestro propio c&oacute;digo anti-span en nuestros formularios.
</p>
<p><span id="more-689"></span><br />
Lo primero que tenemos que hacer es decidir por qu&eacute; tipo de adaptador utilizar, ya que Zend Framework nos ofrece la posibilidad de utilizar varios de ellos. Tenemos la posibilidad de generar el c&oacute;digo anti-spam mediante c&oacute;digo ascii a trav&eacute;s de la librer&iacute;a Zend_Captcha_Figlet o la t&iacute;pica imagen donde est&aacute; el c&oacute;digo anti-spam , a trav&eacute;s de la librer&iacute;a Zend_Captcha_Image.</p>
<p>Ejemplo de lo que nos daría Zend_Captcha_Figlet</p>
<p><img src = "http://www.demo31.com/wp-content/uploads/captcha-figlet-zend-framework.png" title = "Captcha o c&oacute;digo anti-spam hecho con Zend_Captcha_Figlet" alt = "Captcha o c&oacute;digo anti-spam hecho con Zend_Captcha_Figlet" />
</p>
<p>Ejemplo de lo que nos daría Zend_Captcha_Image</p>
<p><img src = "http://www.demo31.com/wp-content/uploads/captcha-image-zend-framework.png" title = "Captcha o c&oacute;digo anti-spam hecho con Zend_Captcha_Image" alt = "Captcha o c&oacute;digo anti-spam hecho con Zend_Captcha_Image" />
</p>
<p>
A continuaci&oacute;n vamos a explicar las distintas partes del c&oacute;digo que pondremos despu&eacute;s de c&oacute;mo se har&iacute;a la inserci&oacute;n de dicho c&oacute;digo anti-spam en nuestra aplicaci&oacute;n y la validaci&oacute;n del mismo.</p>
<p>El objeto que vamos a utilizar, como hemos comentado anteriormente es Zend_Captcha_Image, y su inicializaci&oacute;n es de la siguiente manera:
</p>
<pre class="brush: php; title: ;">
&lt;?php
$captcha = new Zend_Captcha_Image(array(
'name' =&gt; 'foo',
	'wordLen' =&gt; 5,
	'font' =&gt; 'VeraMono.ttf',
	'height' =&gt; 50,
	'width' =&gt; 120,
	'imgDir' =&gt; './images/captcha',
	'imgUrl' =&gt; 'http://localhost:8080/test/images/captcha',
	'timeout' =&gt; 300
));
?&gt;
</pre>
<p>
Donde:</p>
<ul>
<li>name:  Es el nombre de la variable de la caja de texto donde vamos a introducir el código en el formulario</li>
<li>wordLen: Longitud de la palabra que se generará como código anti-spam</li>
<li>font: Fuente que se utilizará para generar el codógio anti-spam. Ojo, hay que indicar la ruta donde se encuentra la fuente. Esta fuente debe ser “ttf”</li>
<li>heigth: Altura de la imagen que contendrá el código anti-spam</li>
<li>width: Ancho de la imagen que contendrá el código anti-spam</li>
<li>imgDir: Ruta relativa donde se almacerán las imágenes generadas con el código anti-spam. </li>
<li>imgUrl: Ruta absoluta donde se encuentran las imágenes generadas con el código anti-spam.</li>
</ul>
<p>El código que utilizaremos para generar el código anti-spam y si posterior validación será el siguiente:
</p>
<pre class="brush: php; title: ;">
&lt;?php
&lt;?php
	require_once 'Zend/Captcha/Image.php';
	require_once 'Zend/View.php';

	//Creamos una instancia de Zend_View
	$view = new Zend_View();
//Instanciamos el objeto relacionado con la creación del código anti-spam
	$captcha = new Zend_Captcha_Image(array(
		'name' =&gt; 'foo',
		'wordLen' =&gt; 5,
		'font' =&gt; 'VeraMono.ttf',
		'height' =&gt; 50,
		'width' =&gt; 120,
		'imgDir' =&gt; './images/captcha',
		'imgUrl' =&gt; 'http://localhost:8080/test/images/captcha',
		'timeout' =&gt; 300
	));

	$id = $captcha-&gt;generate();
 	$captchaSession = new Zend_Session_Namespace('Zend_Form_Captcha_'.$id);	

//Para accede dentro de la sesión y recuperar el código, necesitamos un iterador para ello
	$captchaIterator = $captchaSession-&gt;getIterator();  			

//Validamos si es la primera vez que accedemos o no, para la inicialización de la variable en sesión que contendrá el código anti-spam
	if (!isset($_SESSION['codigo'])){//Primera vez
    	    $_SESSION['codigo'] =  $captchaIterator['word'];
	}

	//Visualizamos el código anti-spam en nuestra vista
	echo $captcha-&gt;render($view);

//Si se ha producido el envío de información al servidor, entramos a validar código anti-spam introducido con el que tenemos en sesión
	if (!empty($_POST)){
		if ($_SESSION['codigo'] == $_POST['foo']){
		    echo &quot;Validado el código!!!&lt;br /&gt;&quot;;
//Aquí sería el momento de redireccionar a otra funcionalidad al haber validado correctamente el código
		}else{
			echo &quot;Código NO validado&lt;br /&gt;&quot;;
//Actualizamos el código anti-spam en sesión para la posterior validación.
$_SESSION['codigo'] = $captchaIterator['word'];
		}
	}
?&gt;
&lt;form method=&quot;post&quot; action = &quot;test1.php&quot;&gt;
	&lt;input type = &quot;text&quot; id = &quot;foo&quot; name = &quot;foo&quot;&gt;&lt;/input&gt;
	&lt;input type = &quot;submit&quot; id = &quot;submit&quot;&gt;
&lt;/form&gt;
?&gt;
</pre>
<p>Si queremos que nuestro script anterior se pueda probar repetidas veces, bastaría con hacer una pequeña modificación en el momento en el que actualizamos el código anti-spam una vez que se ha detectado que el código introducido no es válido.<br />
Del script anterior modificaríamos…
</p>
<pre class="brush: php; title: ;">
&lt;?php
	if (!empty($_POST)){
		if ($_SESSION['codigo'] == $_POST['foo']){
		    echo &quot;Validado el código!!!&lt;br /&gt;&quot;;
//Aquí sería el momento de redireccionar a otra funcionalidad al haber validado correctamente el código
		}else{
			echo &quot;Código NO validado&lt;br /&gt;&quot;;
		}
//Actualizamos el código anti-spam en sesión para la posterior validación.
$_SESSION['codigo'] = $captchaIterator['word'];
	}
?&gt;
</pre>
<p>&iexcl;&iexcl;&iexcl;Y esto es todo por el momento!!!</p>
<p>&iexcl;&iexcl;&iexcl;Cualquier comentario, mejora, o ayuda sobre este tema siempre ser&aacute; bienvenido!!!</p>
<p>Por cierto, si alguien tiene o sabe donde hay fuentes libres para captcha o c&oacute;digos anti-spam, si quiere, que ponga la url en los comentarios a este art&iacute;culo, as&iacute; nos servir&aacute; de ayuda para todos. &iexcl;&iexcl;&iexcl;Gracias!!!</p>
<form class='donate' method='post' action='https://www.paypal.com/cgi-bin/webscr'>		<input type='hidden' value='' name='amount'/>		<input type='hidden' value='_xclick' name='cmd'/>		<input type='hidden' value='josecarlosbcn@gmail.com' name='business'/>		<input type='hidden' value='' name='item_name'/>		<input type='hidden' value='1' name='no_shipping'/>		<input type='hidden' value='http://www.demo31.com' name='return'/>		<input type='hidden' value='http://www.demo31.com' name='cancel_return'/>		<input type='hidden' value='EUR' name='currency_code'/>		<input type='hidden' value='' name='page_style'/>		<input type='hidden' value='0' name='tax'/>		<input type='image' alt='PayPal - The safer, easier way to pay online' name='submit' style='border: 0pt none ;' src='https://www.paypal.com/es_ES/i/btn/btn_donate_LG.gif'/></form></div>
]]></content:encoded>
			<wfw:commentRss>http://www.demo31.com/php/zend-framework/captcha-codigo-anti-spam-zend-framework/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Web Services con Zend Framework</title>
		<link>http://www.demo31.com/php/zend-framework/web-services-con-zend-framework</link>
		<comments>http://www.demo31.com/php/zend-framework/web-services-con-zend-framework#comments</comments>
		<pubDate>Wed, 08 Dec 2010 11:06:58 +0000</pubDate>
		<dc:creator>José Carlos</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Web Service]]></category>

		<guid isPermaLink="false">http://www.demo31.com/?p=683</guid>
		<description><![CDATA[A la hora de desarrollar web services, tenemos que tener en cuenta que habr&#225; una parte de c&#243;digo de servidor y otra parte de c&#243;digo de cliente, aunque si somos la parte que define el web service no nos deberemos preocupar en la definici&#243;n del c&#243;digo que se debe ejecutar en el cliente. Antes de [...]]]></description>
			<content:encoded><![CDATA[<div style = "padding-top: 5px; text-align: justify">
<p>A la hora de desarrollar web services, tenemos que tener en cuenta que habr&aacute; una parte de c&oacute;digo de servidor y otra parte de c&oacute;digo de cliente, aunque si somos la parte que define el web service no nos deberemos preocupar en la definici&oacute;n del c&oacute;digo que se debe ejecutar en el cliente.</p>
<p><span id="more-683"></span></p>
<p>Antes de nada, deberemos habilitar en nuestro php.ini la extensi&oacute;n &quot;php_soap&quot; y reiniciar el servidor.</p>
<p>Una vez habilitada la extensi&oacute;n, para poder ofrecer nuestro servicio, deberemos crear un controlador al que podamos llamar para obtene el archivo WSDL. Adem&aacute;s, aprovecharemos dicho controlador, para usarlo tambi&eacute;n como cliente a trav&eacute;s de su m&eacute;todo &ldquo;clientAction&rdquo;, teniendo en cuenta que este m&eacute;todo estar&aacute; integrado en cualquier desarrollo externo a nuestra aplicaci&oacute;n, ya que a trav&eacute;s de el, interrogar&aacute;n a nuestra aplicaci&oacute;n.</p>
<pre class="brush: php; title: ;">
&lt;?php

require_once 'Zend/Controller/Action.php';

class SoapController extends Zend_Controller_Action
{

	private $_WSDL_URI = 'http://localhost:8080/soap?wsdl';

    public function indexAction(){
    	$this-&gt;_helper-&gt;viewRenderer-&gt;setNoRender();

    	if(isset($_GET['wsdl'])) {
    		//Devuelve el XML con el WSDL
    		$this-&gt;hadleWSDL();
		} else {
			//Gestiona las peticiones a través de SOAP
    		$this-&gt;handleSOAP();
		}
    }

	private function hadleWSDL() {
		$autodiscover = new Zend_Soap_AutoDiscover();
    	$autodiscover-&gt;setClass('ZendExt_Application_Resource_Soaptest');
    	$autodiscover-&gt;handle();
    	exit;
	}

	private function handleSOAP() {
		$soap = new Zend_Soap_Server($this-&gt;_WSDL_URI);
    	$soap-&gt;setClass('ZendExt_Application_Resource_Soaptest');
    	$soap-&gt;handle();
    	exit;
	}

    public function clientAction() {
    	try{
	    	$client = new Zend_Soap_Client($this-&gt;_WSDL_URI);

	    	$this-&gt;view-&gt;add_result = $client-&gt;math_add(11, 55);
	    	$this-&gt;view-&gt;logical_not_result = $client-&gt;logical_not(true);
	    	$this-&gt;view-&gt;sort_result = $client-&gt;simple_sort( array(&quot;d&quot; =&gt; &quot;lemon&quot;, &quot;a&quot; =&gt; &quot;orange&quot;, &quot;b&quot; =&gt; &quot;banana&quot;, &quot;c&quot; =&gt; &quot;apple&quot;));
    	}catch(Exception $e){
			echo &quot;error:&quot; . $e-&gt;getMessage();
    	}
    }
}
?&gt;
</pre>
<p>El c&oacute;digo que nos implementar&aacute; la l&oacute;gica de negocio asociada a los m&eacute;todos definidos para nuestro web service la podemos tener definida en nuestra librer&iacute;a externa &quot;/library/ZendExt/Application/Resource/WSTest.php&quot;</p>
<pre class="brush: php; title: ;">
&lt;?php

class ZendExt_Application_Resource_WSTest {
	/**
	 * Metodo que realiza la suma de dos cifras enteras
	 *
	 * @param Int $param1
	 * @param Int $param2
	 * @return Int
	 */
	public function suma($param1, $param2) {
		return $param1+$param2;
	}

	/**
	 * Metodo de negacion logica
	 *
	 * @param boolean $param1
	 * @return boolean
	 */
	public function not($param1) {
		return !$param1;
	}

	/**
	 * Metodo que ordena un array
	 *
	 * @param Array $array
	 * @return Array
	 */
	public function ordena($array) {
		asort($array);
		return $array;
	}
}
?&gt;
</pre>
<p><strong>Importante:</strong>  Si cambi&aacute;is el nombre de alguno de los m&eacute;todos, despu&eacute;s de haber solicitado alguna vez el archivo WSDL lo m&aacute;s seguro es que os devuelva un error, por lo que deber&eacute;is eliminar los archivos creados en la cach&eacute; que comienzan por &quot;wsdl-*&quot;.</p>
<p>Si se prentende posteriormente tener el cliente y el servidor por separado, del c&oacute;digo anterior, bastar&iacute;a con tener el m&eacute;todo clienteAction definido en el cliente, y eliminarlo de la parte de servidor.</p>
<p>&iexcl;&iexcl;&iexcl;Y esto es todo por el momento!!!</p>
<p>&iexcl;&iexcl;&iexcl;Cualquier comentario, mejora, o ayuda sobre este tema siempre ser&aacute; bienvenido!!!</p>
<form class='donate' method='post' action='https://www.paypal.com/cgi-bin/webscr'>		<input type='hidden' value='' name='amount'/>		<input type='hidden' value='_xclick' name='cmd'/>		<input type='hidden' value='josecarlosbcn@gmail.com' name='business'/>		<input type='hidden' value='' name='item_name'/>		<input type='hidden' value='1' name='no_shipping'/>		<input type='hidden' value='http://www.demo31.com' name='return'/>		<input type='hidden' value='http://www.demo31.com' name='cancel_return'/>		<input type='hidden' value='EUR' name='currency_code'/>		<input type='hidden' value='' name='page_style'/>		<input type='hidden' value='0' name='tax'/>		<input type='image' alt='PayPal - The safer, easier way to pay online' name='submit' style='border: 0pt none ;' src='https://www.paypal.com/es_ES/i/btn/btn_donate_LG.gif'/></form><br />
[ad#Google Adsense]</div>
]]></content:encoded>
			<wfw:commentRss>http://www.demo31.com/php/zend-framework/web-services-con-zend-framework/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Migraci&#243;n de Zend Framework 1.9.x a 1.10.x</title>
		<link>http://www.demo31.com/php/zend-framework/migracion-de-zend-framework-1-9-x-a-1-10-x</link>
		<comments>http://www.demo31.com/php/zend-framework/migracion-de-zend-framework-1-9-x-a-1-10-x#comments</comments>
		<pubDate>Tue, 26 Oct 2010 23:09:11 +0000</pubDate>
		<dc:creator>José Carlos</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Zend Studio 7.0]]></category>

		<guid isPermaLink="false">http://www.demo31.com/?p=673</guid>
		<description><![CDATA[Vamos a ver los pasos que tenemos que realizar para poder migrar nuestra aplicación demo realizada con Zend Framework 1.9.3 a 1.10.8. Los pasos son los siguientes: Descargamos la &#250;ltima versi&#243;n de Zend Framework(full) Descomprimir e instalar los directorios “bin” y “library”, en la siguiente ruta: C:\ZF1108, por ejemplo. Tambi&#233;n podemos hacerlo en un directorio [...]]]></description>
			<content:encoded><![CDATA[<div style = "padding-top: 5px; text-align: justify">
Vamos a ver los pasos que tenemos que realizar para poder migrar nuestra aplicación demo realizada con Zend Framework 1.9.3 a 1.10.8.<br />
<span id="more-673"></span><br />
<br />
Los pasos son los siguientes:</p>
<ol>
<li><a href = "http://framework.zend.com/download/latest/" title = "Descarga de Zend Framework">Descargamos la &uacute;ltima versi&oacute;n de Zend Framework(full)</a>
     </li>
<p></p>
<li>Descomprimir e instalar los directorios “bin” y “library”, en la siguiente ruta: C:\ZF1108, por ejemplo. Tambi&eacute;n podemos hacerlo en un directorio con nombre “neutral” como por ejemplo, C:\ZF, de manera que las siguientes instalaciones nos permitan evitarnos los pasos 3 y 4.
     </li>
<p></p>
<li>A&ntilde;adimos la ruta completa donde se encuentra el directorio "bin" en nuestras variables de entorno de Windows. Para ello vamos a las variables de entorno de Windows y en Variables de sistema, buscamos la variable Path. Editamos la variable y al final a&ntilde;adimos la ruta completa (C:\ZF1108\bin), separ&aacute;ndola de la anterior a trav&eacute;s de ";". Pulsamos "Aceptar" y reiniciamos nuestro ordenador.
     </li>
<p></p>
<li>Modificaciones en el archivo php.ini de configuración de PHP:
<ul></p>
<li>Configurar Php para que tenga acceso a Zend Framework, para ello abrimos el archivo php.ini y modificamos el include_path a&ntilde;adiendo la ruta donde se encuentran la librer&iacute;a del Zend Framework: include_path = 'C:/ZF1108/library/', en caso de que tuvi&eacute;ramos ya alguna ruta en nuestra variable include_path, separaremos esta de la nueva con ";" como en el siguiente ejemplo: ".; C:/ ZF1108/library/"
               </li>
<p></p>
<li>Definimos el mismo doc_root en PHP que el que tenemos en Apache</li>
<p>
          </ul>
</li>
<p></p>
<li>Ahora podemos validar si la instalaci&oacute;n y las variables de entorno son correctas, para lo que abrimos un terminal y tecleamos zf show versi&oacute;n y como resultado obtenemos la respuesta de la versi&oacute;n que hemos descargado en el paso 1: <strong>Zend Framework Version: 1.10.8</strong>
     </li>
</ol>
<p>
Validamos los desarrollos que tenemos, por ejemplo, la demo de la biblioteca, y comprobamos que siguen funcionando correctamente.
</p>
<p>
Para que nuestras aplicaciones futuras que desarrollemos utilicen el nuevo Zend Framework, lo que debemos hacer es actualizar el framework que utiliza nuestro Zend Studio, para ello, vamos al men&uacute; "Help / Check for updates" y se validar&aacute; cuantas actualizaciones tenemos pendientes de realizar en nuestro Zend Studio.  Aceptamos la actualizaci&oacute;n de todas ellas, entre las que se encontrar&aacute; el framework, si es que estamos trabajando con una versi&oacute;n inferior a la 1.10 y al final del proceso nos solicitará que ser reinicie la aplicaci&oacute;n. Reiniciamos la aplicación, y para validar que tenemos la ultima versi&oacute;n de Zend Framework, intentamos crear un nuevo proyecto, y en el primer paso, podemos comprobar que tenemos seleccionada por defecto la &uacute;ltima versi&oacute;n de Zend Framework.
</p>
<p><img src = "http://www.demo31.com/wp-content/uploads/zend-framework-project.png" title = "Zend Studio con Zend Framework 1.10" /></p>
<p>&iexcl;&iexcl;&iexcl;Y esto es todo por el momento!!!</p>
<p>&iexcl;&iexcl;&iexcl;Cualquier comentario, mejora, o ayuda sobre este tema siempre ser&aacute; bienvenido!!!</p>
<form class='donate' method='post' action='https://www.paypal.com/cgi-bin/webscr'>		<input type='hidden' value='' name='amount'/>		<input type='hidden' value='_xclick' name='cmd'/>		<input type='hidden' value='josecarlosbcn@gmail.com' name='business'/>		<input type='hidden' value='' name='item_name'/>		<input type='hidden' value='1' name='no_shipping'/>		<input type='hidden' value='http://www.demo31.com' name='return'/>		<input type='hidden' value='http://www.demo31.com' name='cancel_return'/>		<input type='hidden' value='EUR' name='currency_code'/>		<input type='hidden' value='' name='page_style'/>		<input type='hidden' value='0' name='tax'/>		<input type='image' alt='PayPal - The safer, easier way to pay online' name='submit' style='border: 0pt none ;' src='https://www.paypal.com/es_ES/i/btn/btn_donate_LG.gif'/></form><br />
[ad#Google Adsense]</div>
]]></content:encoded>
			<wfw:commentRss>http://www.demo31.com/php/zend-framework/migracion-de-zend-framework-1-9-x-a-1-10-x/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalación del proyecto en la ra&#237;z de nuestro servidor</title>
		<link>http://www.demo31.com/php/zend-framework/instalacion-del-proyecto-en-la-raiz-de-nuestro-servidor</link>
		<comments>http://www.demo31.com/php/zend-framework/instalacion-del-proyecto-en-la-raiz-de-nuestro-servidor#comments</comments>
		<pubDate>Tue, 21 Sep 2010 18:11:56 +0000</pubDate>
		<dc:creator>José Carlos</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.demo31.com/?p=666</guid>
		<description><![CDATA[Una vez realizado el proyecto, con su estructura de directorios por defecto, nos vemos obligados a que nuestras url's contengan el directorio /public cuando hacemos la instalaci&#243;n en un hosting compartido, por ejemplo. Para evitar esto, y que no aparezca dicho directorio entre las url's de nuestra aplicación web, tenemos que realizar los siguientes pasos: [...]]]></description>
			<content:encoded><![CDATA[<div style = "padding-top: 5px; text-align: justify">
Una vez realizado el proyecto, con su estructura de directorios por defecto, nos vemos obligados a que nuestras url's contengan el directorio /public cuando hacemos la instalaci&oacute;n en un hosting compartido, por ejemplo. Para evitar esto, y que no aparezca dicho directorio entre las url's de nuestra aplicación web, tenemos que realizar los siguientes pasos:<br />
<span id="more-666"></span><br />
</p>
<ol>
<li>Modificar el fichero "httpd-vhosts.conf" de nuestro apache</li>
<li>Mover todo el contenido del directorio /public a la ra&iacute;z del proyecto</li>
<li>Modificar el fichero "index.php" que ahora se encontrar&aacute; en la ra&iacute;z de nuestro proyecto.</li>
<ol>
<p>
<h3><strong>Modificaci&oacute;n del fichero "http-vhosts.conf"</strong></h3>
</p>
<p>Ahora mismo lo que tendríamos en nuestro archivo http-vhosts.conf ser&iacute;a lo siguiente:</p>
<pre class="brush: plain; title: ;">
&lt;VirtualHost *:8080&gt;
	DocumentRoot &quot;G:/Apache/htdocs/biblioteca/public&quot;
	ServerName http://biblioteca.localhost:8080
	&lt;Directory &quot;G:/Apache/htdocs/biblioteca/public&quot;&gt;
		AllowOverride All
	&lt;/Directory&gt;
	ErrorLog &quot;logs/biblioteca.local-error.log&quot;
  CustomLog &quot;logs/biblioteca.local-access.log&quot; common
&lt;/VirtualHost&gt;
[/source]

Y la actualizar&amp;iacute;amos por la siguiente:

[sourcecode]
&lt;VirtualHost *:8080&gt;
	DocumentRoot &quot;G:/Apache/htdocs/biblioteca/&quot;
	ServerName http://biblioteca.localhost:8080
	&lt;Directory &quot;G:/Apache/htdocs/biblioteca/&quot;&gt;
		AllowOverride All
	&lt;/Directory&gt;
	ErrorLog &quot;logs/biblioteca.local-error.log&quot;
  CustomLog &quot;logs/biblioteca.local-access.log&quot; common
&lt;/VirtualHost&gt;
</pre>
<p>Donde podemos ver que ya no est&aacute; el directorio "public".</p>
<p>
<h3><strong>Mover todo el contenido del directorio /public a la ra&iacute;z del proyecto</strong></h3>
</p>
<p>Movemos los directorios /css, /js y los archivos "index.php" y ".htaccess" a la ra&iacute;z del proyecto. Quedando la estructura de directorios de nuestro proyecto de la siguiente manera:</p>
<p><img src = "http://www.demo31.com/wp-content/uploads/biblioteca-estructura-directorios.png" title = "Estructura de directorios de proyecto Zend Framework instalados en la raíz" alt = "Estructura de directorios de proyecto Zend Framework instalados en la raíz" /></p>
<p>
<h3><strong>Modificaci&oacute;n del fichero "index.php"</strong></h3>
</p>
<p>Modificamos la siguiente línea de c&oacute;digo:</p>
<pre class="brush: php; title: ;">
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
</pre>
<p>Por esta otra:</p>
<pre class="brush: php; title: ;">
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . './application'));
</pre>
<p>Y esta:</p>
<pre class="brush: php; title: ;">
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));
</pre>
<p>Por esta otra:</p>
<pre class="brush: php; title: ;">
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . './library'),
    get_include_path(),
)));
</pre>
<p>Ahora, si llamamos a nuestra aplicaci&oacute;n en local, seguir&aacute; funcionando, y si la instalamos en un hosting compartido, donde tengamos instalado Zend Framework, seguir&aacute; funcionando.</p>
<p>&iexcl;&iexcl;&iexcl;Y esto es todo por el momento!!!</p>
<p>&iexcl;&iexcl;&iexcl;Cualquier comentario, mejora, o ayuda sobre este tema siempre ser&aacute; bienvenido!!!</p>
<form class='donate' method='post' action='https://www.paypal.com/cgi-bin/webscr'>		<input type='hidden' value='' name='amount'/>		<input type='hidden' value='_xclick' name='cmd'/>		<input type='hidden' value='josecarlosbcn@gmail.com' name='business'/>		<input type='hidden' value='' name='item_name'/>		<input type='hidden' value='1' name='no_shipping'/>		<input type='hidden' value='http://www.demo31.com' name='return'/>		<input type='hidden' value='http://www.demo31.com' name='cancel_return'/>		<input type='hidden' value='EUR' name='currency_code'/>		<input type='hidden' value='' name='page_style'/>		<input type='hidden' value='0' name='tax'/>		<input type='image' alt='PayPal - The safer, easier way to pay online' name='submit' style='border: 0pt none ;' src='https://www.paypal.com/es_ES/i/btn/btn_donate_LG.gif'/></form><br />
[ad#Google Adsense]</div>
]]></content:encoded>
			<wfw:commentRss>http://www.demo31.com/php/zend-framework/instalacion-del-proyecto-en-la-raiz-de-nuestro-servidor/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C&#243;mo leer el archivo application.ini de Zend Framework</title>
		<link>http://www.demo31.com/php/zend-framework/como-leer-el-archivo-application-ini-de-zend-framework</link>
		<comments>http://www.demo31.com/php/zend-framework/como-leer-el-archivo-application-ini-de-zend-framework#comments</comments>
		<pubDate>Sat, 28 Aug 2010 11:32:38 +0000</pubDate>
		<dc:creator>José Carlos</dc:creator>
				<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.demo31.com/?p=649</guid>
		<description><![CDATA[Puede ser que para nuestros desarrollo nos interese tener valores que sean configurables a trav&#233;s de un archivo de propiedades. Para ello, podemos definir uno propio, e implementar alg&#250;n objeto que lo lea, o reaprovechar el archivo application.ini que nos facilita el Zend Framework y guardar propiedades en el, para recuperarlas posteriormente. Lo primero que [...]]]></description>
			<content:encoded><![CDATA[<div style = "padding-top: 5px; text-align: justify">
Puede ser que para nuestros desarrollo nos interese tener valores que sean configurables a trav&eacute;s de un archivo de propiedades. Para ello, podemos definir uno propio, e implementar alg&uacute;n objeto que lo lea, o reaprovechar el archivo <strong>application.ini</strong> que nos facilita el <strong>Zend Framework</strong> y guardar propiedades en el, para recuperarlas posteriormente.<br />
<span id="more-649"></span><br />
<br />
Lo primero que haremos ser&aacute; crear la propiedad en el fichero application.ini, lo cual es tan sencillo como editarlo, y a&ntilde;adir dicha propiedad. En nuestro ejemplo, guardaremos la propiedad que contiene la ruta al archivo log que hemos utilizado en el punto <strong><a href = "http://www.demo31.com/php/zend-framework/como-crear-un-fichero-de-log-en-zend-framework" title = "Crear archivo log en Zend Framework"">&iquest;C&oacute;mo crear un fichero de log en Zend Framework?</a></strong>.<br />
<br />
Entrada en nuestro application.ini:</p>
<pre class="brush: php; title: ;">
log.route = /logs/salida.log
</pre>
<p>
A continuaci&oacute;n, lo que haremos ser&aacute; recuperar la informaci&oacute;n de la propiedad, y hacerla visible a toda la aplicaci&oacute;n. Para ello, a&ntilde;adiremos c&oacute;digo en el m&eacute;todo _initAutoload() de nuestro Bootstrap.php, de la siguiente manera:<br />
</p>
<pre class="brush: php; title: ;">
	protected function _initAutoload(){
        //Cargamos en $property todas las propiedades del archivo
        //application.ini
		$property = $this-&gt;getOptions();
        //Obtenemos la propiedad log.route
		$routeLogFile = APPLICATION_PATH . $property['log']['route'];
        //Registramos el valor de la variable, la ruta al archivo log,
        //en este caso, para hacerla accesible desde toda la
        //aplicaci&amp;oacute;n
		Zend_Registry::set('routeLogFile', $routeLogFile); //Ruta del archivo de log

		$moduleLoader = new Zend_Application_Module_Autoloader(array('namespace' =&gt; '', 'basePath' =&gt; APPLICATION_PATH));		

		return $moduleLoader;
	}
</pre>
<p>
Aqu&iacute; podemos ver, que una vez tenemos la ruta donde se encuentra el archivo la &quot;registramos&quot; para que sea accesible desde cualquier parte de nuestro c&oacute;digo.<br />
<br />
Y para finalizar, recuperamos el valor de la ruta de nuestro archivo log, de la siguiente manera:<br />
</p>
<pre class="brush: php; title: ;">
//Recuperamos el valor &amp;quot;registrado&amp;quot; con anterioridad
$ruta_del_archivo_log  = Zend_Registry::get(&quot;routeLogFile&quot;);
</pre>
<p>&iexcl;&iexcl;&iexcl;Y esto es todo por el momento!!!</p>
<p>&iexcl;&iexcl;&iexcl;Cualquier comentario, mejora, o ayuda sobre este tema siempre ser&aacute; bienvenido!!!</p>
<form class='donate' method='post' action='https://www.paypal.com/cgi-bin/webscr'>		<input type='hidden' value='' name='amount'/>		<input type='hidden' value='_xclick' name='cmd'/>		<input type='hidden' value='josecarlosbcn@gmail.com' name='business'/>		<input type='hidden' value='' name='item_name'/>		<input type='hidden' value='1' name='no_shipping'/>		<input type='hidden' value='http://www.demo31.com' name='return'/>		<input type='hidden' value='http://www.demo31.com' name='cancel_return'/>		<input type='hidden' value='EUR' name='currency_code'/>		<input type='hidden' value='' name='page_style'/>		<input type='hidden' value='0' name='tax'/>		<input type='image' alt='PayPal - The safer, easier way to pay online' name='submit' style='border: 0pt none ;' src='https://www.paypal.com/es_ES/i/btn/btn_donate_LG.gif'/></form><br />
[ad#Google Adsense]</div>
]]></content:encoded>
			<wfw:commentRss>http://www.demo31.com/php/zend-framework/como-leer-el-archivo-application-ini-de-zend-framework/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>&#191;C&#243;mo crear un fichero de log en Zend Framework?</title>
		<link>http://www.demo31.com/php/zend-framework/como-crear-un-fichero-de-log-en-zend-framework</link>
		<comments>http://www.demo31.com/php/zend-framework/como-crear-un-fichero-de-log-en-zend-framework#comments</comments>
		<pubDate>Thu, 26 Aug 2010 05:59:27 +0000</pubDate>
		<dc:creator>José Carlos</dc:creator>
				<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.demo31.com/?p=624</guid>
		<description><![CDATA[Para crear un fichero de log en Zend Framework nos basaremos en las clases: Zend_Log Zend_Log_Writer_Stream() Crear el objeto de Log en Zend Framework Para crear en nuestro c&#243;digo el objeto que gestione el blog, as&#237; como definir la ruta donde se encuentra el archivo lo haremos de la siguiente manera: $logger = new Zend_Log(); [...]]]></description>
			<content:encoded><![CDATA[<div style = "padding-top: 5px; text-align: justify">
Para crear un fichero de log en Zend Framework nos basaremos en las clases:</p>
<ul>
<li>Zend_Log</li>
<li>Zend_Log_Writer_Stream()</li>
</ul>
<p><span id="more-624"></span><br />
</p>
<h3><strong>Crear el objeto de Log en Zend Framework</strong></h3>
</p>
<p>Para crear en nuestro c&oacute;digo el objeto que gestione el blog, as&iacute; como definir la ruta donde se encuentra el archivo lo haremos de la siguiente manera:<br />
</p>
<pre class="brush: php; title: ;">
$logger = new Zend_Log();
$writer = new Zend_Log_Writer_Stream($ruta_del_archivo_log);
$logger-&gt;addWriter($writer);
</pre>
<p>
La ruta del archivo que har&aacute; de log para nuestra aplicaci&oacute;n la definiremos en funci&oacute;n de la constante <strong>APPLICATION_PATH</strong>. De manera que a esta ruta, que nos da la ra&iacute;z de la aplicaci&oacute;n, definiremos d&oacute;nde se encuentra nuestro archivo de log.<br />
<br />
Por ejemplo, si queremos que nuestro directorio donde guardemos el log est&eacute; dentro de /application, la ruta al archivo ser&iacute;a:<br />
</p>
<pre class="brush: php; title: ;">
$ruta_del_archivo_log  = APPLICATION_PATH . &quot;/logs/salida.log&quot;;
</pre>
<p>
Para poder definir la ruta anterior en nuestro proyecto, crearemos el directorio "logs". No es necesario crear el fichero, porque el archivo se abrir&aacute; en modo "a", es decir, se abrir&aacute;  en modo escritura s&oacute;lo. El puntero del fichero siempre apuntar&aacute; al final del mismo. En caso de no existir el fichero, este se crear&aacute;.<br />
</p>
<h3><strong>&iquest;C&oacute;mo se escriben los mensajes en los ficheros de log?</strong></h3>
</p>
<p>Tenemos dos posibilidades a la hora de crear el mensaje:</p>
<ul>
<li>Informando de la prioridad como par&aacute;metro del m&eacute;todo de escritura del log:
<pre class="brush: php; title: ;">
$logger-&gt;log('Mensaje informativo', Zend_Log::INFO);
$logger-&gt;log('Valor variable: ' . $variable, Zend_Log::INFO);
</pre>
</li>
<li>Informando de la prioridad en el propio nombre del m&eacute;todo:
<pre class="brush: php; title: ;">
$logger-&gt;info('Mensaje informativo');
$logger-&gt;info('Valor variable' . $variable);
</pre>
</li>
</ul>
<p>
Los mensajes, pueden tener distintas prioridades, en el ejemplo, hemos utilizado la prioridad INFO. A continuaci&oacute;n tenemos un listado de todas las prioridades que podemos utilizar, y el sentido que se le puede dar a cada uno:</p>
<ul>
<li>EMERG   = 0;  // Emergency: Sistema no utilizable</li>
<li>ALERT   = 1;  // Alert: Se debe realizar una acción</li>
<li>CRIT    = 2;  // Critical: Errores críticos</li>
<li>ERR     = 3;  // Error: Se ha producido un error</li>
<li>WARN    = 4;  // Warning: Se ha producido una aviso</li>
<li>NOTICE  = 5;  // Notice: Aviso significativo</li>
<li>INFO    = 6;  // Informational: Mensaje informativo</li>
<li>DEBUG   = 7;  // Debug: Mensaje de debug</li>
</ul>
<p></p>
<h3><strong>Formateo de los mensajes en nuestro archivo de log en Zend Framework</strong></h3>
</p>
<p>Por defecto, los mensajes tiene el siguiente formato:</p>
<pre class="brush: php; title: ;">
'%timestamp% %priorityName% (%priority%): %message%' . PHP_EOL;
</pre>
<p>
Si queremos cambiar el formato del mensaje,  por ejemplo a '%timestamp% %priorityName%: %message%' . PHP_EOL; usar&iacute;amos la clase Zend_Log_Formatter_Simple de la siguiente manera:<br />
</p>
<pre class="brush: php; title: ;">
$writer = new Zend_Log_Writer_Stream($ruta_del_archivo_log);
$format = '%timestamp% %priorityName%: %message%' . PHP_EOL;
$formatter = new Zend_Log_Formatter_Simple($format);
$writer-&gt;setFormatter($formatter);
$logger = new Zend_Log();
$logger-&gt;addWriter($writer);
$logger-&gt;info('Esto es una prueba');
</pre>
<p>
Si por el contrario, queremos que el formato sea el de un XML, la clase a utilizar es Zend_Log_Formatter_Xml, de manera que quedar&iacute;a de la siguiente manera:<br />
</p>
<pre class="brush: php; title: ;">
$writer = new Zend_Log_Writer_Stream($ruta_del_log);
$formatter = new Zend_Log_Formatter_Xml();
$writer-&gt;setFormatter($formatter);
$logger = new Zend_Log();
$logger-&gt;addWriter($writer);
$logger-&gt;info('Mensaje informativo');
</pre>
<p>
Siendo su salida, la siguiente:<br />
</p>
<pre class="brush: xml; title: ;">
&lt;logEntry&gt;
	  &lt;timestamp&gt;2007-04-06T07:24:37-07:00&lt;/timestamp&gt;
	  &lt;message&gt;Mensaje informativo&lt;/message&gt;
	  &lt;priority&gt;6&lt;/priority&gt;
	  &lt;priorityName&gt;INFO&lt;/priorityName&gt;
&lt;/logEntry&gt;
</pre>
<p></p>
</div>
<p>&iexcl;&iexcl;&iexcl;Y esto es todo por el momento!!!</p>
<p>&iexcl;&iexcl;&iexcl;Cualquier comentario, mejora, o ayuda sobre este tema siempre ser&aacute; bienvenido!!!</p>
<form class='donate' method='post' action='https://www.paypal.com/cgi-bin/webscr'>		<input type='hidden' value='' name='amount'/>		<input type='hidden' value='_xclick' name='cmd'/>		<input type='hidden' value='josecarlosbcn@gmail.com' name='business'/>		<input type='hidden' value='Crear un fichero de log en Zend Framework' name='item_name'/>		<input type='hidden' value='1' name='no_shipping'/>		<input type='hidden' value='http://www.demo31.com' name='return'/>		<input type='hidden' value='http://www.demo31.com' name='cancel_return'/>		<input type='hidden' value='EUR' name='currency_code'/>		<input type='hidden' value='' name='page_style'/>		<input type='hidden' value='0' name='tax'/>		<input type='image' alt='PayPal - The safer, easier way to pay online' name='submit' style='border: 0pt none ;' src='https://www.paypal.com/es_ES/i/btn/btn_donate_LG.gif'/></form><br />
[ad#Google Adsense]
]]></content:encoded>
			<wfw:commentRss>http://www.demo31.com/php/zend-framework/como-crear-un-fichero-de-log-en-zend-framework/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Framework + jQuery</title>
		<link>http://www.demo31.com/php/zend-framework/zend-framework-y-jquery</link>
		<comments>http://www.demo31.com/php/zend-framework/zend-framework-y-jquery#comments</comments>
		<pubDate>Sun, 15 Aug 2010 22:35:31 +0000</pubDate>
		<dc:creator>José Carlos</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.demo31.com/?p=565</guid>
		<description><![CDATA[&#191;Qu&#233; es jQuery? jQuery es una librer&#237;a de javascript que facilita el desarrollo de c&#243;digo javascript para distintos tipos de navegador (desarrollo transversal), as&#237; como facilitar las animaciones, gestiones de eventos y las interacciones a través de ajax del desarrollo web. Es decir, nos encontramos frente a un framework de javascript, que vamos a ver [...]]]></description>
			<content:encoded><![CDATA[<div style = "padding-top: 5px; text-align: justify">
<h3><strong>&iquest;Qu&eacute; es jQuery?</strong></h3>
<p />
<p>jQuery es una librer&iacute;a de javascript que facilita el desarrollo de c&oacute;digo javascript para distintos tipos de navegador (desarrollo transversal), as&iacute; como facilitar las animaciones, gestiones de eventos y las interacciones a través de ajax del desarrollo web.</p>
<p>Es decir, nos encontramos frente a un framework de javascript, que vamos a ver c&oacute;mo interact&uacute;a y se integra con Zend Framework.</p>
<p>En el presente artículo nos centraremos en hacer una pequeña demo sobre las interacciones a través de ajax que nos facilitará el desarrollo futuro de nuestros portales. </p>
<p><span id="more-565"></span></p>
<h3><strong>Instalaci&oacute;n de jQuery</strong></h3>
<p />
<p>Su instalación es muy sencilla, pero antes de instalar, como es lógico, debemos descargarnos la última versión de jQuery que podemos hacer desde <a href  = "http://jquery.com/" title = "Descarga de &uacute;ltima versi&oacute;n de jQuery">aqu&iacute;</a>.</p>
<p>Una vez descargado lo instalaremos en el directorio "js" de nuestro proyecto que se encuentra en /biblioteca/public/js/ como podemos ver en la siguiente imagen:</p>
<p><img src = "http://www.demo31.com/wp-content/uploads/instalacion-jquery-zend-framework.png" title = "Instalaci&oacute;n de jQuery en Zend Framework" alt = "Instalaci&oacute;n de jQuery en Zend Framework" /></p>
<h3><strong>Llamar a jQuery desde Zend Framework</strong></h3>
<p />
<p>Una vez ya instalado, nos queda incluirlo en nuestro c&oacute;digo para poder luego utilizar todas sus funcionalidades, para ello, la inclusión de archivos javascript, si record&aacute;is se hace desde el controlador. Para nuestro ejemplo, haremos la llamada desde el controlador que inicia la aplicación "IndexController", quedando el código de la siguiente manera:</p>
<pre class="brush: php; title: ;">
&lt;?php

class IndexController extends Zend_Controller_Action
{

    public function init(){

        /* Initialize action controller here */
    }

    public function indexAction(){
    	//Título de la vista
    	$this-&gt;view-&gt;title = &quot;Mis Libros&quot;;
    	//Añadimos el título a la vista
		$this-&gt;view-&gt;headTitle($this-&gt;view-&gt;title, 'PREPEND');
		//Añadimos la llamada a la librería jQuery
		$this-&gt;view-&gt;headScript()-&gt;appendFile($this-&gt;view-&gt;baseUrl() . &quot;/js/jquery-1.4.2.min.js&quot;);
		//Creamos el modelo, para la consulta de libros
		$libros = new Model_DbTable_Libros();
		//Devolvemos a la vista todos los libros
		$this-&gt;view-&gt;libros = $libros-&gt;fetchAll();
    }
}
?&gt;
</pre>
<p>Una vez instalado, si nos vamos al c&oacute;digo fuente podemos ver c&oacute;mo está la llamada a jQuery.</p>
<pre class="brush: xml; title: ;">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;es&quot; lang=&quot;es&quot;&gt;
	&lt;head&gt;
		&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html;charset=utf-8&quot; &gt;
&lt;meta http-equiv=&quot;Cache-Control&quot; content=&quot;no-cache&quot; &gt;
		&lt;title&gt;Mis Libros - Biblioteca&lt;/title&gt; 

		&lt;script type=&quot;text/javascript&quot; src=&quot;http://biblioteca.localhost:8080/js/jquery-1.4.2.min.js&quot;&gt;&lt;/script&gt;
		&lt;link href=&quot;http://biblioteca.localhost:8080/css/biblioteca.css&quot; media=&quot;screen&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; &gt;
	&lt;/head&gt;
..................
..................
..................
</pre>
<h3><strong>Ejemplo de env&iacute;o de votaciones</strong></h3>
<p />
<p>Vamos a hacer una peque&ntilde;a demo del uso de la librer&iacute;a jQuery en el que vamos a enviar la votaci&oacute;n dada a un libro de nuestra biblioteca y para la que devolveremos un mensaje de gracias. Est&aacute; claro que una vez recibida la votaci&oacute;n luego se podría insertar en una tabla de nuestra BBDD la votaci&oacute;n recibida, hacer alguna estimaci&oacute;n, como la media de la votaci&oacute;n y devolverla a la p&aacute;gina origen.  Pero lo más importante, es la de demostrar la comunicación entre el cliente y el servidor a través de la librer&iacute;a jQuery.</p>
<p>Para ello, en nuestra demo, modififcaremos el arhcivo "index.phtml" del controlador "IndexController" de la siguiente manera:</p>
<pre class="brush: plain; title: ;">
&lt;p&gt;&lt;a href=&quot;&lt;?php echo $this-&gt;url(array('controller'=&gt;'libro','action'=&gt;'anyadir'));?&gt;&quot;&gt;A&amp;ntilde;adir nuevo libro&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
	&lt;tr&gt;
		&lt;th&gt;T&amp;iacute;tulo&lt;/th&gt;
		&lt;th&gt;Autor&lt;/th&gt;
		&lt;th&gt;Favorito&lt;/th&gt;
		&lt;th&gt;&amp;nbsp;&lt;/th&gt;
	&lt;/tr&gt;
	&lt;?php foreach($this-&gt;libros as $libro) : ?&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;?php echo htmlentities($this-&gt;escape($libro-&gt;titulo)) ;?&gt;&lt;/td&gt;
		&lt;td&gt;&lt;?php echo htmlentities($this-&gt;escape($libro-&gt;autor)); ?&gt;&lt;/td&gt;
		&lt;td  id = &quot;&lt;?php echo 'rating' . $libro-&gt;id ?&gt;&quot;&gt;&lt;a id = &quot;&lt;?php echo $libro-&gt;id .'_1' ?&gt;&quot; href = &quot;#&quot;&gt;1&lt;/a&gt; &lt;a id = &quot;&lt;?php echo $libro-&gt;id.'_2' ?&gt;&quot; href = &quot;#&quot;&gt;2&lt;/a&gt; &lt;a id = &quot;&lt;?php echo $libro-&gt;id.'_3' ?&gt;&quot; href = &quot;#&quot;&gt;3&lt;/a&gt; &lt;a id = &quot;&lt;?php echo $libro-&gt;id.'_4' ?&gt;&quot; href = &quot;#&quot;&gt;4&lt;/a&gt; &lt;a id = &quot;&lt;?php echo $libro-&gt;id.'_5' ?&gt;&quot; href = &quot;#&quot;&gt;5&lt;/a&gt;&lt;/td&gt;
		&lt;td&gt;
			&lt;a href=&quot;&lt;?php echo $this-&gt;url(array('controller'=&gt;'libro', 'action'=&gt;'editar', 'id'=&gt;$libro-&gt;id));?&gt;&quot;&gt;Editar&lt;/a&gt;
			&lt;a href=&quot;&lt;?php echo $this-&gt;url(array('controller'=&gt;'libro',	'action'=&gt;'borrar', 'id'=&gt;$libro-&gt;id));?&gt;&quot;&gt;Borrar&lt;/a&gt;
		&lt;/td&gt;
	&lt;/tr&gt;
	&lt;?php endforeach; ?&gt;
&lt;/table&gt;
&lt;script language = &quot;javascript&quot;&gt;
	$(&quot;a&quot;).click(function(){
		var libro = this.id.substring(0, this.id.indexOf(&quot;_&quot;));
		var voto = this.id.substring(this.id.indexOf(&quot;_&quot;) + 1, this.id.length);
		alert(&quot;libro: &quot; + libro + &quot; voto: &quot; + voto);

		//Tratamos la devolución a través de json
		$.post(&quot;&lt;?php echo $this-&gt;url(array('controller'=&gt;'index', 'action'=&gt;'votacion'));?&gt;&quot;, {libro: libro, voto: voto}, function(data){
			document.getElementById(&quot;rating&quot; + libro).innerHTML = &quot;Media: &quot; + data.media + &quot; Total: &quot; +  data.total;
			console.log(data);
		}, &quot;json&quot;);

		//Tratamos el resultado a través de la devolución de un XML
		$.post(&quot;&lt;?php echo $this-&gt;url(array('controller'=&gt;'index', 'action'=&gt;'votacion'));?&gt;&quot;, {libro: libro, voto: voto}, function(data){
			//alert(data);
			var media = data.substring(data.indexOf(&quot;&lt;average&gt;&quot;) + 9, data.indexOf(&quot;&lt;/average&gt;&quot;));
			var total = data.substring(data.indexOf(&quot;&lt;count&gt;&quot;) + 7, data.indexOf(&quot;&lt;/count&gt;&quot;));
			//document.getElementById(&quot;rating&quot; + libro).innerHTML = &quot;Media: &quot; + media + &quot; Total: &quot; +  total;
			console.log(data);
		}, &quot;text&quot;);
	});
&lt;/script&gt;
</pre>
<p>De manera que visualmente tenemos la siguiente vista, a partir del c&oacute;digo anterior:</p>
<p><img src = "http://www.demo31.com/wp-content/uploads/home-jquery-zend-framework.png" title = "P&aacute;gina Principal de la biblioteca" alt = "P&aacute;gina Principal de la biblioteca" /></p>
<p>Para aquellos libros para los que no se ha producido ninguna votación, tenemos la posibilidad de votar de 1 a 5. </p>
<p>Nuestra idea es la siguiente, hacer clic sobre un número de la votación, que este dato junto con el identificador del libro viaje al servidor, se hagan las operaciones que se hayan definido, y se responda. Esa respuesta, es tratada por la vista, y nos muestra la información obtenida.</p>
<h3><strong>Env&iacute;o de informaci&oacute;n y tratamiento de respuesta (Browser)</strong></h3>
<p />
<p>El env&iacute;o de informaci&oacute;n lo haremos por POST, y lo haremos a partir del clic sobre una de las votaciones, para lo que tenemos:</p>
<pre class="brush: jscript; title: ;">
$(&quot;a&quot;).click(function(){
//Realizamos las operaciones oportunas una vez capturado el clic sobre el enlace
}
</pre>
<p>Una vez capturado el clic sobre el enlace, haremos el env&iacute;o por POST a trav&eacute;s de la siguiente sentencia:</p>
<pre class="brush: jscript; title: ;">
$.post(url donde enviamos la información, {variable1: valor1, variable2: valor2, …, variableN: valorN}, function(data){
   //Tratamos el valor recibido a trav&amp;eacute;s de “data” para poder realizar as operaciones que queramos en ese momento.
}, &quot;text&quot;);
</pre>
<p>Con “text” le indicamos el tipo de dato que vamos a recibir. Con “text” podemos tratar texto, y por tanto, recibir un XML. En teor&iacute;a, si pusi&eacute;ramos “xml” ser&iacute;a equivalente, el problema es que no he conseguido recibir la informaci&oacute;n en formato XML.</p>
<p>Si en lugar de “text”, ponemos “json” la respuesta ser&aacute; recibida en formato json, por lo que su extracci&oacute;n ser&aacute; de manera distinta a si fuera texto o un XML. Esto se puede ver en el c&oacute;digo a&ntilde;adido con anterioridad.</p>
<pre class="brush: jscript; title: ;">
$.post(url donde enviamos la información, {variable1: valor1, variable2: valor2, …, variableN: valorN}, function(data){
   //Tratamos el valor recibido a trav&amp;eacute;s de “data” para poder realizar as operaciones que queramos en ese momento.
}, &quot;json&quot;);
</pre>
<p>Si en lugar de “text”, ponemos “json” la respuesta ser&aacute; recibida en formato json, por lo que su extracci&oacute;n ser&aacute; de manera distinta a si fuera texto o un XML. Esto se puede ver en el c&oacute;digo a&ntilde;adido con anterioridad.</p>
<h3><strong>Recepci&oacute;n de informaci&oacute;n, tratamiento de la misma y env&iacute;o de respuesta (Servidor)</strong></h3>
<p />
<p>A nivel de servidor, deberemos realizar varias tareas. Primero, vamos a crear una clase propia, tratada en el art&iacute;culo <a href = "http://www.demo31.com/php/zend-framework/anadir-librerias-propias-a-zend-framework" title = "Incorporar librer&iacute;a propia a proyecto en Zend Framework">Añadir librería propia a Zend Framework</a>. Y en dicha librer&iacute;a, vamos a tratar en el m&eacute;todo write, por ejemplo, el voto recibido, y el resultado generado.</p>
<pre class="brush: php; title: ;">
Class ZendExt_Application_Resource_Votacion {
	//TODO - Insert your code here
	private $libro;
	private $voto;

	function __construct($libro, $voto) {
		$this-&gt;libro = $libro;
		$this-&gt;voto = $voto;
		//Zend_Debug::dump(&quot;ZendExt_Application_Resource_Prueba CONSTRUIDO &quot; . APPLICATION_PATH, date('D, d M Y H:i:s'), $echo = true);
	}

	/**
	 *
	 */
	function __destruct() {
		//Zend_Debug::dump(&quot;ZendExt_Application_Resource_Prueba DESTRUIDO &quot; . APPLICATION_PATH, date('D, d M Y H:i:s'), $echo = true);
	}

	public function write(){
		//Procesamos voto, realizamos operaciones, consultamos BBDD, actualizamos, etc.
		$div = rand(0, $this-&gt;voto);
		if ($div == 0)
			$div = 1;
		$average = round($this-&gt;voto / $div, 2);
		$count = rand(intval($average), 100);		

		//Devolvemos le resultado en formato como json en formato array. Debemos quitar estas l&amp;iacute;neas de  c&amp;oacute;digo si queremos devolver por text o xml.
		$json = array(&quot;libro&quot;=&gt;$this-&gt;libro, &quot;media&quot;=&gt;$average, &quot;total&quot;=&gt;$count);
		return json_encode($json);

		//Devolvemos el resultado a la página desde la que se ha recibido la votación, una vez realizados los cálculos anteriores. Debemos quitar estas l&amp;iacute;neas de c&amp;oacute;digo si queremos devolver por json
		$xml = &quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot; standalone=\&quot;yes\&quot;?&gt;&quot;;
		$xml .= &quot;&lt;rating&gt;&lt;average&gt;&quot;.$average.&quot;&lt;/average&gt;&lt;count&gt;&quot;.$count.&quot;&lt;/count&gt;&lt;/rating&gt;&quot;;
		return $xml;
	}
}
?&gt;
</pre>
<p>Se han definido dos tipos de salida, una con la variable $json, para enviar el resultado en formato json, y otra con la variable $xml, para tratar el resultado en formato texto o xml.</p>
<p>Adem&aacute;s, nos har&iacute;a falta, a&ntilde;adir unas l&iacute;neas de c&oacute;digo en nuestro IndexController, ya que vamos a a&ntilde;adir un action que ser&aacute; “votacionAction” si lo que devolvemos es a trav&eacute;s de json.</p>
<pre class="brush: php; title: ;">
public function votacionAction(){
    	if ($this-&gt;getRequest()-&gt;isPost()){	//POST
    		//Añadimos las siguientes dos líneas para que al devolver el resultado, no nos devuelva
    		//todo el código de la página que lo contiene más el resultado
    		$this-&gt;_helper-&gt;layout-&gt;disableLayout();
			$this-&gt;_helper-&gt;viewRenderer-&gt;setNoRender();

	    	//Recuperación de los valores
	    	$libro = $_POST[&quot;libro&quot;];
	    	$voto = $_POST[&quot;voto&quot;];
	    	//Definimos cómo será la cabecera de la información que vamos a enviar al servidor en este momento
		header('Content-Type: text/json; charset=UTF-8');
		header(&quot;Cache-Control: no-cache, must-revalidate&quot;);		

	    	$gestVoto = new ZendExt_Application_Resource_Votacion($libro, $voto);
	    	//Procesamos voto
	    	echo $gestVoto-&gt;write();		

	 }else{	//GET
		//No hacemos nada
    	}

    }
</pre>
<p>Pero si devolvi&eacute;ramos en formato texto o xml, ser&iacute;a de la siguiente manera:</p>
<pre class="brush: php; title: ;">
public function votacionAction(){
    	if ($this-&gt;getRequest()-&gt;isPost()){	//POST
    		//Añadimos las siguientes dos líneas para que al devolver el resultado, no nos devuelva
    		//todo el código de la página que lo contiene más el resultado
    		$this-&gt;_helper-&gt;layout-&gt;disableLayout();
			$this-&gt;_helper-&gt;viewRenderer-&gt;setNoRender();

	    	//Recuperación de los valores
	    	$libro = $_POST[&quot;libro&quot;];
	    	$voto = $_POST[&quot;voto&quot;];
	    	//Definimos cómo será la cabecera de la información que vamos a enviar al servidor en este momento
		header('Content-Type: text/xml; charset=UTF-8');
		header(&quot;Cache-Control: no-cache, must-revalidate&quot;);		

	    	$gestVoto = new ZendExt_Application_Resource_Votacion($libro, $voto);
	    	//Procesamos voto
	    	echo $gestVoto-&gt;write();		

	 }else{	//GET
		//No hacemos nada
    	}

    }
</pre>
<p>Una vez hecho clic sobre un voto y tratado este en el servidor, seg&uacute;n se ha desarrollado, se devuelve el total y la media, para escribirlas en pantalla en lugar de la posibilidad de votar. De manera que quedaría de as&iacute;:</p>
<p><img src = "http://www.demo31.com/wp-content/uploads/resultado-jquery-zend-framework.png" title = "Visualizaci&oacute;n de resultado a trav&eacute;s de jQuery" alt = "Visualizaci&oacute;n de resultado a trav&eacute;s de jQuery" /></p>
<p>Antes de finalizar, dejar claro que no es objetivo de esta demo, tanto el tratamiento del voto, como el impedir que se vote m&aacute;s de una vez por parte de un mismo usuario. Lo que se ha tratado de demostrar es:</p>
<p>•	Env&iacute;o de informaci&oacute;n al servidor<br />
•	Tratamiento de la informaci&oacute;n y respuesta<br />
•	Recepci&oacute;n de la informaci&oacute;n y tratamiento de la misma en funci&oacute;n de la respuesta obtenida.</p>
<p>&iexcl;&iexcl;&iexcl;Pues esto es todo por el momento!!! </p>
<p>&iexcl;&iexcl;&iexcl;Cualquier duda o consulta, me la pod&eacute;is hacer llegar en cualquier momento!!!</p>
<form class='donate' method='post' action='https://www.paypal.com/cgi-bin/webscr'>		<input type='hidden' value='' name='amount'/>		<input type='hidden' value='_xclick' name='cmd'/>		<input type='hidden' value='josecarlosbcn@gmail.com' name='business'/>		<input type='hidden' value='Añadir librería propia a Zend Framework' name='item_name'/>		<input type='hidden' value='1' name='no_shipping'/>		<input type='hidden' value='http://www.demo31.com' name='return'/>		<input type='hidden' value='http://www.demo31.com' name='cancel_return'/>		<input type='hidden' value='EUR' name='currency_code'/>		<input type='hidden' value='' name='page_style'/>		<input type='hidden' value='0' name='tax'/>		<input type='image' alt='PayPal - The safer, easier way to pay online' name='submit' style='border: 0pt none ;' src='https://www.paypal.com/es_ES/i/btn/btn_donate_LG.gif'/></form><br />
[ad#Google Adsense]
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.demo31.com/php/zend-framework/zend-framework-y-jquery/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A&#241;adir librer&#237;a propia a Zend Framework</title>
		<link>http://www.demo31.com/php/zend-framework/anadir-librerias-propias-a-zend-framework</link>
		<comments>http://www.demo31.com/php/zend-framework/anadir-librerias-propias-a-zend-framework#comments</comments>
		<pubDate>Fri, 11 Jun 2010 18:05:53 +0000</pubDate>
		<dc:creator>José Carlos</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Libreria Propia]]></category>

		<guid isPermaLink="false">http://www.demo31.com/?p=582</guid>
		<description><![CDATA[Existe la posibilidad que cuando estemos realizando el desarrollo de nuestra aplicaci&#243;n, necesitemos tener acceso a funcionalidades que puedan ser utilizadas en m&#225;s de un punto. Por lo que podemos optar a sacar esa funcionalidad a una librer&#237;a externa que pueda ser reutilizada. Para ello, seguiremos los siguientes pasos: A&#241;adimos las siguientes entradas a nuestro [...]]]></description>
			<content:encoded><![CDATA[<div style = "padding-top: 5px; text-align: justify">
Existe la posibilidad que cuando estemos realizando el desarrollo de nuestra aplicaci&oacute;n, necesitemos tener acceso a funcionalidades que puedan ser utilizadas en m&aacute;s de un punto. Por lo que podemos optar a sacar esa funcionalidad a una librer&iacute;a externa que pueda ser reutilizada.
<p />
<p>Para ello, seguiremos los siguientes pasos:
<p />
<span id="more-582"></span></p>
<ol>
<li>A&ntilde;adimos las siguientes entradas a nuestro archivo application.ini</li>
<div style = "padding-left: 40px">
<pre class="brush: php; title: ;">
includePaths.library = APPLICATION_PATH &quot;/../library&quot;
autoloaderNamespaces[] = ZendExt_
pluginPaths.ZendExt_Application_Resource = &quot;ZendExt/Application/Resource&quot;
</pre>
<p>Donde en la l&iacute;nea 1 indicamos la ruta desde la aplicaci&oacute;n hasta el directorio donde est&aacute; nuestra librer&iacute;a. En la l&iacute;nea 2 indicamos el namespace donde se econtrar&aacute; nuestra librer&iacute;a, y en la l&iacute;nea 3 se indica la ruta completa donde est&aacute;n los archivos que constituyen nuesrta nueva librer&iacute;a
</p></div>
<li>Creamos la estructura de directorios en funci&oacute;n de lo indicado en la l&iacute;nea 3 del paso anterior y creamos dentro el archivo que contendr&aacute; nuestra clase de la librer&iacute;a privada</li>
<div style = "padding-left: 40px; padding-top:10px"><img src = "http://www.demo31.com/wp-content/uploads/add-libreria-estructura-directorios.png" title = "Estructura de directorios para a&ntilde;adir nuestra librer&iacute;a privada" alt = "Estructura de directorios para a&ntilde;adir nuestra librer&iacute;a privada" />
</div>
<li>Creamos una clase sencilla, que escriba en pantalla algún mensaje, cuando sea llamada desde nuestra aplicaci&oacute;n. A destacar el nombre de la clase, la cual contiene la ruta de directorios hasta ella.</li>
<div style = "padding-left: 40px">
<pre class="brush: php; title: ;">
class ZendExt_Application_Resource_Prueba {
	function __construct() {
		Zend_Debug::dump(&quot;ZendExt_Application_Resource_Prueba CONSTRUIDO &quot; . APPLICATION_PATH, date('D, d M Y H:i:s'), $echo = true);
	}

	function __destruct() {
		Zend_Debug::dump(&quot;ZendExt_Application_Resource_Prueba DESTRUIDO &quot; . APPLICATION_PATH, date('D, d M Y H:i:s'), $echo = true);
	}

	public function write(){
		Zend_Debug::dump(&quot;Prueba_Clase de escritura&quot;, $label = 'Mensaje', $echo = true);
	}
}
</pre>
</div>
<li>Para finalizar, incluimos una llamada a la clase que se ha creado dentro de nuestra librer&iacute;a privada en IndexController.php, al final del todo, por ejemplo</li>
<div style = "padding-left: 40px">
<pre class="brush: php; title: ;">
class IndexController extends Zend_Controller_Action
{

    public function init(){

        /* Initialize action controller here */
    }

    public function indexAction(){
    	//Título de la vista
    	$this-&gt;view-&gt;title = &quot;Mis Libros&quot;;
    	//Añadimos el título a la vista
		$this-&gt;view-&gt;headTitle($this-&gt;view-&gt;title, 'PREPEND');
		//Añadimos la llamada a la librería jQuery
		$this-&gt;view-&gt;headScript()-&gt;appendFile($this-&gt;view-&gt;baseUrl() . &quot;/js/jquery-1.4.2.min.js&quot;);
		//Creamos el modelo, para la consulta de libros
		$libros = new Model_DbTable_Libros();
		//Devolvemos a la vista todos los libros
		$this-&gt;view-&gt;libros = $libros-&gt;fetchAll();
		$prueba = new ZendExt_Application_Resource_Prueba();
    }
}
</pre>
</div>
<li>Accedemos a la home de nuestra aplicaci&oacute;n y vemos c&oacute;mo se realiza correctamente la llamada a nuestra clase que se encuentra en nuestra librer&iacute;a privada</li>
<div style = "padding-left: 40px">
<img src = "http://www.demo31.com/wp-content/uploads/add-libreria-llamada-correcta.png" title = "Llamada correcta a librer&iaucte;a privada" alt = "Llamada correcta a librer&iaucte;a privada" />
</div>
</ol>
</div>
<p>&iexcl;&iexcl;&iexcl;Y esto es todo por el momento!!!</p>
<p>&iexcl;&iexcl;&iexcl;Cualquier comentario, mejora, o ayuda sobre este tema siempre ser&aacute; bienvenido!!!</p>
<form class='donate' method='post' action='https://www.paypal.com/cgi-bin/webscr'>		<input type='hidden' value='' name='amount'/>		<input type='hidden' value='_xclick' name='cmd'/>		<input type='hidden' value='josecarlosbcn@gmail.com' name='business'/>		<input type='hidden' value='Añadir librería propia a Zend Framework' name='item_name'/>		<input type='hidden' value='1' name='no_shipping'/>		<input type='hidden' value='http://www.demo31.com' name='return'/>		<input type='hidden' value='http://www.demo31.com' name='cancel_return'/>		<input type='hidden' value='EUR' name='currency_code'/>		<input type='hidden' value='' name='page_style'/>		<input type='hidden' value='0' name='tax'/>		<input type='image' alt='PayPal - The safer, easier way to pay online' name='submit' style='border: 0pt none ;' src='https://www.paypal.com/es_ES/i/btn/btn_donate_LG.gif'/></form><br />
[ad#Google Adsense]
]]></content:encoded>
			<wfw:commentRss>http://www.demo31.com/php/zend-framework/anadir-librerias-propias-a-zend-framework/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Formularios en Zend Framework (y IV)</title>
		<link>http://www.demo31.com/php/zend-framework/formularios-en-zend-framework-y-iv</link>
		<comments>http://www.demo31.com/php/zend-framework/formularios-en-zend-framework-y-iv#comments</comments>
		<pubDate>Sat, 17 Apr 2010 23:59:04 +0000</pubDate>
		<dc:creator>José Carlos</dc:creator>
				<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.demo31.com/?p=554</guid>
		<description><![CDATA[Para finalizar la serie que hemos dedicado a c&#243;mo adaptar los formularios a nuestro gusto, debido a que en los objetos se suele meter código que debería estar en los archivos .css o .phtml, y eso es algo de lo que siempre hay que tratar huir, nos quedaba resolver el tema de c&#243;mo rellenar un [...]]]></description>
			<content:encoded><![CDATA[<div style = "padding-top: 5px; text-align: justify">
Para finalizar la serie que hemos dedicado a c&oacute;mo adaptar los formularios a nuestro gusto, debido a que en los objetos se suele meter código que debería estar en los archivos .css o .phtml, y eso es algo de lo que siempre hay que tratar huir, nos quedaba resolver el tema de c&oacute;mo rellenar un select con distintas opciones, y que estas pudieran salir de una BBDD, es decir, que vinieran desde el servidor y no una lista de datos enorme en la parte de diseño de la vista.
<p />
<p>Y es algo que finalmente se puede resolver de manera muy sencilla, y que vamos a ver ahora mismo ...</p>
<p><span id="more-554"></span></p>
<p>Bien, lo que debemos hacer es crear una variable pública, podríamos definirla privada y luego su correspondiente set and get, que nos devuelva un array con las distintas opciones en la clase Form_Libro, tal y como podemos ver a continuaci&oacute;n:</p>
<pre class="brush: php; title: ;">
class Form_Libro extends Zend_Form{
	public $opciones;

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

		$this-&gt;setName('libro');
		$id = new Zend_Form_Element_Hidden('id');

		$autor = new Zend_Form_Element_Text('autor');
		$autor-&gt;setLabel('Autor')
		-&gt;setRequired(true)
		-&gt;addFilter('StripTags')
		-&gt;addFilter('StringTrim');		

		$titulo = new Zend_Form_Element_Text('titulo');
		$titulo-&gt;setLabel('Titulo')
		-&gt;setRequired(true)
		-&gt;addFilter('StripTags')
		-&gt;addFilter('StringTrim');	

		//Definimos las opciones y el valor de cada opción que tendrá nuestro select
		$this-&gt;opciones = array ('0'=&gt;'', '1'=&gt;'terror', '2'=&gt;'comedia', '3'=&gt;'policiaca'); 

		$this-&gt;addElements(array($id, $autor, $titulo));
	}
}
</pre>
<p>Hemos definido una opción en blanco, como primera, pero perfectamente podríamos haber elegido cualquier otra o haber puesto el literal "selecciona una opci&oacute;n" de manera que llame la atención de quien rellena el formulario y seleccione una opción.</p>
<p>Para cada opción, se le dará posteriormente, como valor la posici&oacute;n en el array. </p>
<p>Una vez hecho esto, tenemos que capturarlo en el formulario, y construir el cuerpo del select. Para ello, editamos nuestro archivo anyadir.phtml que construye la vista de a&ntilde;adir un nuevo libro, y le a&ntilde;adimos el c&oacute;digo necesario para construir el select, el cual, como veréis es muy poco, y se nos queda muy limpio.</p>
<pre class="brush: xml; title: ;">
&lt;H1&gt;A&amp;ntilde;adir nuevo libro&lt;/H1&gt;
&lt;div id = &quot;errores&quot;&gt;&lt;/div&gt;
&lt;form name = &quot;libro&quot; id = &quot;libro&quot; method = &quot;post&quot;&gt;
	&lt;fieldset&gt;
			&lt;legend&gt;Introduce los datos del libro&lt;/legend&gt;
			&lt;label for = &quot;Autor&quot; class=&quot;required&quot;&gt;* Autor: &lt;/label&gt;
			&lt;input name = &quot;autor&quot; id = &quot;autor&quot; type = &quot;text&quot; /&gt;
			&lt;label for = &quot;Titulo&quot; class=&quot;required&quot;&gt;* T&amp;iacute;tulo&lt;/label&gt;
			&lt;input type = &quot;text&quot; name = &quot;titulo&quot; id = &quot;titulo&quot; /&gt;
			&lt;label for = &quot;Estilo&quot; class=&quot;required&quot;&gt;* Estilo&lt;/label&gt;
			&lt;select name = &quot;estilo&quot; id = &quot;estilo&quot;&gt;
				&lt;?php
					$total = count($this-&gt;form-&gt;opciones);
					for ($i = 0; $i &lt; $total; $i++){
						echo &quot;&lt;option value = &quot; . $i . &quot;&gt;&quot; . $this-&gt;form-&gt;opciones[$i] . &quot;&lt;/option&gt;&quot;.&quot;\n&quot;;
						echo &quot;\t\t\t\t&quot;;
					}
				?&gt;
			&lt;/select&gt;
			&lt;a href = &quot;#&quot; name = &quot;añadir&quot; id = &quot;añadir&quot; onClick = &quot;javascript: sendForm();&quot;&gt;A&amp;ntilde;adir&lt;/a&gt;
	&lt;/fieldset&gt;
&lt;/form&gt;
</pre>
<p>Esto har&aacute; que nuestro formulario ahora se pueda visualizar de la siguiente manera:</p>
<p><img src = "http://www.demo31.com/wp-content/uploads/form-zend-framework-anyadir-select.png" title = "Formulario a&ntilde;adir libro con select" alt = "Formulario a&ntilde;adir libro con select" /></p>
<p>Si miramos el c&oacute;digo fuente de nuestra página HTML, podemos ver c&oacute;digo se ha creado correctamente nuestra p&aacute;gina internamente.</p>
<pre class="brush: xml; title: ;">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns = &quot;http://www.w3.org/1999/xhtml&quot; xml:lang = &quot;es&quot; lang = &quot;es&quot;&gt;
	&lt;head&gt;
		&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html;charset=utf-8&quot; /&gt;
&lt;meta http-equiv=&quot;Cache-Control&quot; content=&quot;no-cache&quot; /&gt;
		&lt;title&gt;A&amp;amp;ntilde;adir nuevo libro - Biblioteca&lt;/title&gt; 

		&lt;script type=&quot;text/javascript&quot; src=&quot;http://biblioteca.localhost:8080/js/anyadir-libro.js&quot;&gt;&lt;/script&gt; 

		&lt;link href=&quot;http://biblioteca.localhost:8080/css/biblioteca.css&quot; media=&quot;screen&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;div id=&quot;content&quot;&gt;
			&lt;h1&gt;&lt;/h1&gt;
			&lt;H1&gt;A&amp;ntilde;adir nuevo libro&lt;/H1&gt;
&lt;div id = &quot;errores&quot;&gt;&lt;/div&gt;
&lt;form name = &quot;libro&quot; id = &quot;libro&quot; method = &quot;post&quot;&gt;
	&lt;fieldset&gt;
			&lt;legend&gt;Introduce los datos del libro&lt;/legend&gt;
			&lt;label for = &quot;Autor&quot; class=&quot;required&quot;&gt;* Autor: &lt;/label&gt;
			&lt;input name = &quot;autor&quot; id = &quot;autor&quot; type = &quot;text&quot; /&gt;
			&lt;label for = &quot;Titulo&quot; class=&quot;required&quot;&gt;* T&amp;iacute;tulo&lt;/label&gt;
			&lt;input type = &quot;text&quot; name = &quot;titulo&quot; id = &quot;titulo&quot; /&gt;
			&lt;label for = &quot;Estilo&quot; class=&quot;required&quot;&gt;* Estilo&lt;/label&gt;
			&lt;select name = &quot;estilo&quot; id = &quot;estilo&quot;&gt;
				&lt;option value = 0&gt;&lt;/option&gt;
				&lt;option value = 1&gt;terror&lt;/option&gt;
				&lt;option value = 2&gt;comedia&lt;/option&gt;
				&lt;option value = 3&gt;policiaca&lt;/option&gt; 

			&lt;/select&gt;
			&lt;a href = &quot;#&quot; name = &quot;a&amp;ntilde;adir&quot; id = &quot;a&amp;ntilde;adir&quot; onClick = &quot;javascript: sendForm();&quot;&gt;A&amp;ntilde;adir&lt;/a&gt;
	&lt;/fieldset&gt;
&lt;/form&gt;		&lt;/div&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Con esto, damos por finalizada nuestra adaptación de los formularios en Zend Framework, para que se ajuste a nuestras necesidades, adem&aacute;s de evitar introducir c&oacute;digo HTML o CSS en nuestro c&oacute;digo de servidor. </p>
<p>&iexcl;&iexcl;&iexcl;Y esto es todo por el momento!!!</p>
<p>&iexcl;&iexcl;&iexcl;Cualquier comentario, mejora, o ayuda sobre este tema siempre ser&aacute; bienvenido!!!</p>
</div>
<p />
<form class='donate' method='post' action='https://www.paypal.com/cgi-bin/webscr'>		<input type='hidden' value='' name='amount'/>		<input type='hidden' value='_xclick' name='cmd'/>		<input type='hidden' value='josecarlosbcn@gmail.com' name='business'/>		<input type='hidden' value='Donacion por articulo: Formularios en Zend Framework (III)' name='item_name'/>		<input type='hidden' value='1' name='no_shipping'/>		<input type='hidden' value='http://www.demo31.com' name='return'/>		<input type='hidden' value='http://www.demo31.com' name='cancel_return'/>		<input type='hidden' value='EUR' name='currency_code'/>		<input type='hidden' value='' name='page_style'/>		<input type='hidden' value='0' name='tax'/>		<input type='image' alt='PayPal - The safer, easier way to pay online' name='submit' style='border: 0pt none ;' src='https://www.paypal.com/es_ES/i/btn/btn_donate_LG.gif'/></form><br />
[ad#Google Adsense]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.demo31.com/php/zend-framework/formularios-en-zend-framework-y-iv/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Formularios en Zend Framework (III)</title>
		<link>http://www.demo31.com/php/zend-framework/formularios-en-zend-framework-iii</link>
		<comments>http://www.demo31.com/php/zend-framework/formularios-en-zend-framework-iii#comments</comments>
		<pubDate>Sat, 20 Mar 2010 22:34:18 +0000</pubDate>
		<dc:creator>José Carlos</dc:creator>
				<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.demo31.com/?p=541</guid>
		<description><![CDATA[Continuamos con nuestra "versi&#243;n" sobre la construcción de formularios en Zend Framework, teniendo siempre como premisas: No tener código HTML o CSS en c&#243;digo que se ejecute en el servidor Disminuir la carga del servidor al realizar ciertas validaciones a nivel de cliente Crear formularios donde la distribuc&#243;n de campos sea como nosotros queramos, y [...]]]></description>
			<content:encoded><![CDATA[<div style = "padding-top: 5px; text-align: justify">
Continuamos con nuestra "versi&oacute;n" sobre la construcción de formularios en Zend Framework, teniendo siempre como premisas:</p>
<ul>
<li>No tener código HTML o CSS en c&oacute;digo que se ejecute en el servidor</li>
<li>Disminuir la carga del servidor al realizar ciertas validaciones a nivel de cliente</li>
<li>Crear formularios donde la distribuc&oacute;n de campos sea como nosotros queramos, y no secuencial, de arriba hacia abajo, como hace Zend Framework</li>
</ul>
<p>En este tercer cap&iacute;tulo vamos a tratar los resultados que se generan en el servidor, ya sea por validaciones internas o por ejecuci&ooacute;n de un proceso.</p>
<p>Para ello, definiremos un controlador, una vista y un modelo encargado de representar cualquier resultado, y de ofrecer distintas alternativas, una vez finalizado el proceso.</p>
<p><span id="more-541"></span></p>
<p>Antes de comenzar a implementar cada uno de los componentes, decir, que para nuestra demo, no va a ser necesario crear un modelo, que en una aplicación real, s&iacute; ser&iacute;a necesario hacer, pero que para mostrar el mensaje que sale en caso de obtener un resultado positivo o negativo de un determinado proceso, no nos va a ser necesario.</p>
<p>Previo a la creaci&oacute;n del nuevo controlador, vamos a preparar nuestra aplicaci&oacute;n para poder guardar valores en sesi&oacute;n. Aclarar, que no es necesario tener la variable del archivo php.ini register_globals a "yes". Para ello,  en el archivo Bootstraps.php en al funci&oacute;n _initViewHelpers() se debe a&ntilde;adir la instrucci&oacute;n Zend_Session::start();</p>
<pre class="brush: php; title: ;">
protected function _initViewHelpers(){
		$this-&gt;bootstrap('layout');
		$layout = $this-&gt;getResource('layout');
		$view = $layout-&gt;getView();
		$view-&gt;doctype('XHTML1_STRICT');
		$view-&gt;headMeta()-&gt;appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
		$view-&gt;headMeta()-&gt;appendHttpEquiv('Cache-Control', 'no-cache');
		$view-&gt;headTitle()-&gt;setSeparator(' - ');
		$view-&gt;headTitle('Biblioteca');
		Zend_Session::start();
	}
</pre>
<p>Adem&aacute;s debemos preparar el actual controlador Libro (LibroController.php) para que devuelva un error siempre que se produzca para darle una interpretaci&oacute;n a trav&eacute;s de un texto que mostremos al usuario de nuestra web, para ello, negamos el resultado correcto if (!$form->isValid($formData)) para poder hacer la prueba, por lo que nos llevar&aacute; siempre al else, de dicho if, y ah&iacute;, meteremos en sesi&oacute;n la informaci&oacute;n que vamos a mostrar en la vista de resultado. Los datos que guardaremos ser&aacute;n:</p>
<ul>
<li>T&iacute;tulo</li>
<li>Mensaje</li>
<li>Opciones</li>
</ul>
<pre class="brush: php; title: ;">
public function anyadirAction(){
		$this-&gt;view-&gt;setEncoding('UTF-8');
		$this-&gt;view-&gt;headTitle(&quot;A&amp;ntilde;adir nuevo libro&quot;, 'PREPEND');
		//Añadimos el archivo de javascript que valide los campos de la página
		$this-&gt;view-&gt;headScript()-&gt;appendFile($this-&gt;view-&gt;baseUrl() . &quot;/js/anyadir-libro.js&quot;);
		//Instanciamos el formulario
		$form = new Form_Libro();
		//Asignamos a la vista el formulario
		$this-&gt;view-&gt;form = $form;

		if ($this-&gt;getRequest()-&gt;isPost()){ //Si se envían los datos, los recuperamos del formulario
			$formData = $this-&gt;getRequest()-&gt;getPost();
			if (!$form-&gt;isValid($formData)){ //Validamos que los datos recibidos sean correctos
				//Asignamos los valores recuperados a variables
				$autor = $form-&gt;getValue('autor');
				$titulo = $form-&gt;getValue('titulo');
				//Creamos el modelo
				$libros = new Model_DbTable_Libros();
				//Insertamos el nuevo libro en nuestra BBDD
				$libros-&gt;addLibro($titulo, $autor);
				//Redireccionamos a la home, donde podremos ver el nuevo libro introducido.
				$this-&gt;_redirect('/');
			}else{ //Si los datos del formulario, no son válidos, se muestra el formulario con los datos de nuevo.
				//Creamos un namespace donde almacenar las variables en sesión
				$app = new Zend_Session_Namespace(&quot;app&quot;);
				$app-&gt;titulo = &quot;Añadir libro&quot;;
				$app-&gt;texto = &quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse ut ante ac nulla tincidunt cursus tincidunt non elit. Ut rhoncus ullamcorper lorem ac ultrices. Pellentesque viverra porta dui, at feugiat enim iaculis lobortis. Donec justo turpis, convallis sit amet convallis at, molestie vitae metus. Mauris et turpis at lacus varius ultrices. Etiam vel lobortis justo. Proin euismod augue in metus blandit porttitor bibendum lorem venenatis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut sed tincidunt ante. Duis rhoncus consequat odio. Aliquam vitae dui ipsum. Nam consectetur ultrices nunc eu dapibus. Donec sit amet nulla. &quot;;
				$opciones = array(0 =&gt; array(0 =&gt; &quot;index&quot;, 1 =&gt; &quot;index&quot;, 2 =&gt; &quot;Ir a la home de la biblioteca&quot;),
								  1 =&gt; array(0 =&gt; &quot;http://www.google.com&quot;, 1 =&gt; &quot;&quot;, 2 =&gt; &quot;Ir a Google&quot;)
								 );
				$app-&gt;opc = $opciones;
				$_SESSION['opciones'] = $opciones;							//redirigimos a la nueva vista de resultado
				$this-&gt;_redirect('/resultado');
			}
		}
	}
</pre>
<p>Una vez hechos estos pasos, pasamos a construir nuestro controlador,  la vista que dar&aacute; soporte a dicho controlador. El modelo, en este caso, no lo vamos a construir, no nos ser&iacute;a necesario para hacer nuestra demo, pero ser&iacute;a necesario en una aplicaci&oacute;n para que a partir del idioma y el resultado obtenido recuperar el t&iacute;tulo, el mensaje y las opciones oportunas.</p>
<p>Creamos el controlador (ResultadoController.phtml) con el siguiente c&oacute;digo:</p>
<pre class="brush: php; title: ;">
&lt;?php

require_once 'Zend/Controller/Action.php';

class ResultadoController extends Zend_Controller_Action {
	/**
	 * The default action - show the home page
	 */
	public function indexAction() {
		$this-&gt;view-&gt;setEncoding('UTF-8');
		//Recuperamos los valores de sesion
		$app = new Zend_Session_Namespace(&quot;app&quot;);
		$this-&gt;view-&gt;titulo = htmlentities($app-&gt;titulo);;
		$this-&gt;view-&gt;texto = $$app-&gt;texto;
		$this-&gt;view-&gt;opc = $app-&gt;opc;
	}

}
?&gt;
</pre>
<p>Y creamos la vista que nos dar&aacute; el controlador definido anteriormente (index.phtml):</p>
<pre class="brush: php; title: ;">
&lt;h1&gt;&lt;?php echo $this-&gt;titulo;?&gt;&lt;/h1&gt;&lt;p /&gt;
&lt;?php echo $this-&gt;texto;?&gt;&lt;br /&gt;
&lt;h5&gt;&amp;iquest;Qu&amp;eacute; deseas hacer?&lt;/h5&gt;
&lt;?php
foreach ($this-&gt;opc as $option =&gt; $value){
	$controlador = $value[0];
	$pos1 = stripos($controlador, &quot;http://&quot;);
	if ($pos1 != false)
		echo &quot;&lt;a href = '&quot; . $this-&gt;url(array('controller'=&gt;$value[0], 'action'=&gt;$value[1])) . &quot;'&gt;&quot; . $value[2] . &quot;&lt;/a&gt;&lt;br /&gt;&quot;;
	else
		echo &quot;&lt;a href = '&quot; . $value[0] . &quot;'&gt;&quot; . $value[2] . &quot;&lt;/a&gt;&lt;br /&gt;&quot;;
}
?&gt;
</pre>
<p>Una vez realizados estos pasos, si ejecutamos la aplicaci&oacute;n e intentamos a&ntilde;adir un libro, cualquiera, por c&oacute;digo, forzaremos el error, y nos redirigirá a la vista de resultado final.</p>
<p><strong>url:</strong> http://biblioteca.localhost:8080/libro/anyadir<br />
<img src = "http://www.demo31.com/wp-content/uploads/formulario-anyadir-libro.png" title = "Formulario a&ntilde;adir libro" alt = "Formulario a&ntilde;adir libro" /></p>
<p><strong>url:</strong> http://biblioteca.localhost:8080/resultado<br />
<img src = "http://www.demo31.com/wp-content/uploads/resultado-proceso-anyadir-libro.png" title = "Resultado alta nuevo libro" alt = "Resultado alta nuevo libro" /></p>
<p>Una vez visto c&oacute;mo ser&iacute;a el tratamiento de los errores, decir, que este tratamiento se puede extender a cualquier tipo de resultado de manera que tendr&iacute;amos un controlador, con su modelo, y su vista, encargados en presentar cualquier tipo de resultado de proceso. Algo que puede ser bastante interesante a la hora de tener en cuenta nuestro dise&ntilde;o de clases.</p>
<p>Quedar&iacute;a ver c&oacute;mo podemos crear componentes cuyo contenido puede obtenerse de una base de datos, como por ejemplo, un comboBox. Si el contenido de este fuera limitado, y s&oacute;lo trat&aacute;remos un idioma, se podr&iacute;a poner en la propia vista, sin ning&uacute;n problema. Pero tendr&iacute;amos que analizar el c&oacute;mo hacerlo cuando el volumen de datos de este comboBox sea elevado o dependa del idioma, o cuando cuyo contenido sea en funci&oacute;n de los datos seleccionados. En el caso de que los datos del comboBox sea en funci&oacute;n de los datos introducidos en el formulario, todo apunta que a una soluci&oacute;n por ajax, ser&iacute;a factible, pero para el caso en el que el volumen de datos de este comboBox sea elevado, o estos datos dependan del idioma, tendremos que analizar qu&eacute; alternativa tenemos a la que nos ofrece en la actualidad Zend Framework.</p>
<p>&iexcl;&iexcl;&iexcl;Y esto es todo por el momento!!!</p>
<p>&iexcl;&iexcl;&iexcl;Cualquier comentario, mejora, o ayuda sobre este tema siempre ser&aacute; bienvenido!!!</p>
</div>
<p />
<form class='donate' method='post' action='https://www.paypal.com/cgi-bin/webscr'>		<input type='hidden' value='' name='amount'/>		<input type='hidden' value='_xclick' name='cmd'/>		<input type='hidden' value='josecarlosbcn@gmail.com' name='business'/>		<input type='hidden' value='Donacion por articulo: Formularios en Zend Framework (III)' name='item_name'/>		<input type='hidden' value='1' name='no_shipping'/>		<input type='hidden' value='http://www.demo31.com' name='return'/>		<input type='hidden' value='http://www.demo31.com' name='cancel_return'/>		<input type='hidden' value='EUR' name='currency_code'/>		<input type='hidden' value='' name='page_style'/>		<input type='hidden' value='0' name='tax'/>		<input type='image' alt='PayPal - The safer, easier way to pay online' name='submit' style='border: 0pt none ;' src='https://www.paypal.com/es_ES/i/btn/btn_donate_LG.gif'/></form><br />
[ad#Google Adsense]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.demo31.com/php/zend-framework/formularios-en-zend-framework-iii/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

