<?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>Nuevascreaciones &#187; makensi</title>
	<atom:link href="http://nuevascreaciones.com/archives/author/makensi/feed" rel="self" type="application/rss+xml" />
	<link>http://nuevascreaciones.com</link>
	<description>De todo un poco</description>
	<lastBuildDate>Tue, 28 Apr 2009 09:01:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Joomla! + JQuery + PHP Gd</title>
		<link>http://nuevascreaciones.com/archives/153</link>
		<comments>http://nuevascreaciones.com/archives/153#comments</comments>
		<pubDate>Tue, 28 Apr 2009 07:12:36 +0000</pubDate>
		<dc:creator>makensi</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Joomla!]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://nuevascreaciones.com/?p=153</guid>
		<description><![CDATA[Hace unas de semanas cree un plugin de Joomla! pensando en las necesidades de un cliente(ya que no encontre ningun plugin que lo hiciera) y gracias al comentario de un compañero que buscaba algo similar. El plugin no aporta nada nuevo, solamente me pertimite cambiar los textos de ciertas etiquetas(determinadas por mi) de mi sitio [...]]]></description>
			<content:encoded><![CDATA[<p>Hace unas de semanas cree un plugin de Joomla! pensando en las necesidades de un cliente(ya que no encontre ningun plugin que lo hiciera) y gracias al comentario de un compañero que buscaba algo similar. El plugin no aporta nada nuevo, solamente me pertimite cambiar los textos de ciertas etiquetas(determinadas por mi) de mi sitio por imágenes evitando los típicos problemas de &copy; de la fuente y de perdida de accesibilidad.<br />
<span id="more-153"></span></p>
<p>Además llevaba tiempo queriendo hacer algo con JQuery ya que en el pasado me había dado muy buenos resultados y es por eso que voy a describir un poco el proceso de creación de este Plugin de Joomla! 1.5.</p>
<p>En primer lugar tenemos que tener claro la diferencia entre los distintos tipos de plugins que podemos crear en Joomla! para decidirnos por uno y nada mejor que visitar la <a href="http://docs.joomla.org/Tutorial:Plugins">documentación oficial</a> y elegir el que más nos convenga. </p>
<p>En mi caso me decante por el uso del <code>onAfterInitialise</code> ya que este me permite agregar script a la cabecera de nuestro sitio web haciendo uso del framework de desarrollo de Joomla! de una forma muy sencilla:</p>
<pre> function onAfterInitialise(){
        global $mainframe;
        $document	=&amp; JFactory::getDocument();
        $base = JURI::root(true);</pre>
<p>¿Para que sirve todo esto?:</p>
<ul>
<li><code>global $mainframe;</code>: me proporciona acceso a las variables ya inicializadas de Joomla!</li>
<li><code>$document	=&amp; JFactory::getDocument()</code>: obtenemos la instancia de la template sobre la que trabajaremos.</li>
<li><code>$base = JURI::root(true)</code>: con esto obtendremos la ubicación de nuestro sitio web(para evitar problemas de ubicación del sitio).</li>
</ul>
<p>Además el framework de Joomla! ofrece la posibilidad de almacenar y recuperar parámetros predefinidos o definidos por el usuario, podemos hacer uso de:</p>
<pre>
$plugin =&#038; JPluginHelper::getPlugin('system', 'fontstylize');
$params = new JParameter( $plugin->params );
</pre>
<p>Con esto tenemos acceso a los parámetros serán usados para almacenar las etiquetas que serán sustituidas. </p>
<p>Otro aspecto importante que debemos cubrir es el de hacer que nuestro plugin actue solo en el frontend de Joomla!, que es donde queremos alterar el aspecto visual, para eso usamos:</p>
<pre>if(!$mainframe-&gt;isAdmin()){</pre>
<p>Esto nos permite verificar que el cliente usado es Administrador (Véase <a href="http://docs.joomla.org/JFactory/getApplication">JFactory/getApplication</a>). Cargamos los scripts y código Javascript necesarios haciendo uso de dos tipos de llamadas:</p>
<pre>$document-&gt;addScript($base."/plugins/system/fontstylize/js/jquery.ifixpng.js");
//add the pixel fix
$document-&gt;addScriptDeclaration("jQuery.noConflict();".
"jQuery(function($){".
"   $.ifixpng(\"".$base."/plugins/system/fontstylize/img/pixel.gif\");".
"});");</pre>
<p>¿Como funcionan?</p>
<ul>
<li><code>$document-&gt;addScript</code>: La declaración addScript nos permite incorporar nuestros ficheros JS al head de nuestra pagina y además haciendo uso de la variable $base que definimos anteriormente nos aseguramos de que su ubicación sea correcta.</li>
<li><code>$document-&gt;addScriptDeclaration</code>: La declaración addScriptDeclaration nos permite agregar nuestro código Javascript en el mismo head. Esto es muy útil para configurar/inicializar nuestro Javascript haciendo uso de los parámetros almacenados en el plugin.</li>
</ul>
<p>Ya disponemos de las herramientas en Joomla! necesarias para crear nuestro plugin por lo que ahora vamos a pasar a la base de nuestro plugin. Necesitamos crear un script PHP que nos permita generar Imagenes a partir de un texto haciendo uso de una fuente. El proceso es un poco largo y existe muchísima documentación que nos enseña a crear imágenes a partir de un texto(el ejemplo más básico es el de un captcha) así que no entrare en muchos detalles. La idea es que nuestro script reciba como parametros:</p>
<ul>
<li>Texto que sera creado(q)</li>
<li>Color usado por la fuente(c)</li>
<li>Tamaño de la fuente(s)</li>
<li>Fuente usada(f)</li>
</ul>
<p>Con estos parámetros tomaríamos la fuente de una ubicación de nuestro disco, crearíamos una imagen true color con algo de transparencia y le daríamos el tamaño a esta imagen haciendo uso de las funciones ttf de PHP. Aquí podéis ver un poco del código responsable de esta acción:</p>
<pre>...
$font = $fonts_folder.DIRECTORY_SEPARATOR.$font.TTF_EXTENSION;

$h_box = imagettfbbox ($font_size,0,$font,ALPHABET);

$w_box = imagettfbbox ($font_size+2,0,$font,$query);

$width=abs( $w_box[2] - $w_box[0] );
$height=abs( $h_box[3] - $h_box[5] );

$image = imagecreatetruecolor($width,$height);
imagesavealpha($image, true);
...</pre>
<p>Una vez creamos la imagen lo ideal seria grabarla en disco para realizar cache con algún sistema que nos permita localizarla ya que el proceso de creación de una imagen requiere cierta cantidad de recursos. Un ejemplo seria:</p>
<pre>$file_name = md5($query.NAME_SEPARATOR.$font.NAME_SEPARATOR.$font_color.NAME_SEPARATOR.$font_size).PNG_EXTENSION;</pre>
<p>En mi caso uso los parámetros de entrada y genero un resumen MD5 de los mismo para generar el nombre de fichero en caso de existir la imagen realizo una redirección haciendo uso de cabeceras HTTP a la imagen y en caso contrario creo una nueva imagen.</p>
<p>Como detalle final si eres de los que te gustan los detalles puedes hacer uso de mod_rewrite para que nuestro script parezca una imagen. Para realizar esta operación creamos un fichero <code>.htaccess</code><br />
y agregamos este código:</p>
<pre>RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule image.png image.php
# Esto nos permitirá hacer que todas las peticiones a imagen.png sean procesadas por imagen.php.</pre>
<p>Ya tenemos el tipo de plugin que usaremos para cargar nuestros Javascript y el script usado para generar la imagen, solo nos falta generar el código Javascript que realizara la sustitución del texto. </p>
<p>La idea central es tomar la información del texto a sustituir de la hoja de estilos en CSS de nuestro sitioweb usando JQuery ocultar el texto y en su lugar mostrar como imagen de fondo con CSS la nueva imagen creada con PHP. Voy a pegar y describir la sección en la que se realiza todo este proceso y que podeis encontrar en el fichero <code>fonstylize.js</code>:</p>
<pre>
var text = jQuery.trim($(this).text()).replace(/ /gi,"%20");
var font = $(this).css("font-family").replace(/ /gi,"%20").split(",");
var font_size = $(this).css("font-size").replace(/px/gi,"");
var font_color = hexColor($(this).css("color"));
var background_color = hexColor($(this).css("background-color"));

var image_url = url_base + "plugins/system/fontstylize/img/image.png?";

image_url += new Array(
    new Array("q", text).join("="),
    new Array("f", font[0]).join("="),
    new Array("c", font_color).join("="),
    new Array("s", font_size).join("=")
).join("&#038;");

$(this).html("<span style=\"visibility:hidden;\">" + text + "</span>");

// background
$(this).css("background-image", "url(" + image_url + ")");
$(this).css("background-repeat", "no-repeat");
$(this).css("background-position", "left top");
$(this).css("background-color", background_color);
 $(this).css("height",font_size+"px");
</pre>
<p>En primer lugar preparo los parámetros de la url que serán usados para la propiedad ccs <code>background-color</code>, luego sustituyo el texto de la etiqueta por un <code>span</code> sin visibilidad y finalmente cargo la imagen de fondo con css.</p>
<p>Hasta aquí todo lo importante, relacionado con el plugin de Joomla! fonstylize si tienes interés en ver el código puedes descargartelo aquí:</p>
<p><a href='http://nuevascreaciones.com/plugin-fontstylize-v10-para-joomla-15/plg_system_fonstylize_nc_v001'>Plugin Fontstylize Joomla! 1.5</a></p>
<p>Espero que os sirva de algo <img src='http://nuevascreaciones.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://nuevascreaciones.com/archives/153/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aplicación JSF + Spring</title>
		<link>http://nuevascreaciones.com/archives/91</link>
		<comments>http://nuevascreaciones.com/archives/91#comments</comments>
		<pubDate>Thu, 22 Jan 2009 22:34:32 +0000</pubDate>
		<dc:creator>makensi</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Java Server]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://nuevascreaciones.com/?p=91</guid>
		<description><![CDATA[Bueno parece que este mes estoy un poco más activo y puedo escribir un poco más. Hoy me han pedido un pequeño esqueleto de aplicación JSF y Spring 2.5.6 por lo que he aprovechado para escribir este post y para enseñar que realmente crear un proyecto con Spring no es algo muy complejo.Por norma general [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno parece que este mes estoy un poco más activo y puedo escribir un poco más. Hoy me han pedido un pequeño esqueleto de aplicación <a href="http://www.google.es/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fjava.sun.com%2Fjavaee%2Fjavaserverfaces%2F&amp;ei=2fF4ScOHK4b00AXIrtks&amp;usg=AFQjCNHClyI0BTzrydM9xT-ETzCKczKJ-A&amp;sig2=NjD2TQVVyqiOumFR-8UCLw">JSF</a> y <a href="http://www.springsource.org/">Spring</a> 2.5.6 por lo que he aprovechado para escribir este post y para enseñar que realmente crear un proyecto con <a href="http://www.springsource.org/">Spring</a> no es algo muy complejo.<span id="more-91"></span>Por norma general a parte de disponer del jar de <a href="http://www.springsource.org/">Spring</a> solo necesitamos incluir en nuestro <strong>web.xml</strong> las siguientes lineas:</p>
<p>El parametro de la ubicación del fichero de configuración.</p>
<p><code>&lt;context-param&gt;<br />
&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
&lt;param-value&gt;/WEB-INF/applicationContext.xml&lt;/param-value&gt;<br />
&lt;/context-param&gt;</code></p>
<p>El listener propio de <a href="http://www.springsource.org/">Spring</a>.</p>
<p><code>&lt;listener&gt;<br />
&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br />
&lt;/listener&gt;</code></p>
<p>Creamos el fichero de configuración de <a href="http://www.springsource.org/">Spring</a> en <strong>WEB-INF/</strong> con el nombre de <strong>applicationContext.xml</strong> como ya hemos visto en el parametro que definimos anteriormente en nuestro <strong>web.xml</strong>. No os pegare la definición del fichero por que realmente es muy grande.</p>
<p>Una vez visto como se configura <a href="http://www.springsource.org/">Spring</a> basta con configurar en nuestro <strong>web.xml</strong> la parte correspondiente a <a href="http://www.google.es/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fjava.sun.com%2Fjavaee%2Fjavaserverfaces%2F&amp;ei=2fF4ScOHK4b00AXIrtks&amp;usg=AFQjCNHClyI0BTzrydM9xT-ETzCKczKJ-A&amp;sig2=NjD2TQVVyqiOumFR-8UCLw">JSF</a>. Esto ya es todo un clásico así que voy a obviar las explicaciones:</p>
<p><code>&lt;context-param&gt;<br />
&lt;param-name&gt;com.sun.faces.verifyObjects&lt;/param-name&gt;<br />
&lt;param-value&gt;false&lt;/param-value&gt;<br />
&lt;/context-param&gt;<br />
&lt;context-param&gt;<br />
&lt;param-name&gt;com.sun.faces.validateXml&lt;/param-name&gt;<br />
&lt;param-value&gt;true&lt;/param-value&gt;<br />
&lt;/context-param&gt;<br />
&lt;context-param&gt;<br />
&lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt;<br />
&lt;param-value&gt;client&lt;/param-value&gt;<br />
&lt;/context-param&gt;<br />
&lt;servlet&gt;<br />
&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;<br />
&lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;<br />
&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;<br />
&lt;servlet-mapping&gt;<br />
&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;<br />
&lt;url-pattern&gt;/faces/*&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;</code></p>
<p>Bueno ya tenemos la configuración ahora viene lo interesante. <a href="http://www.springsource.org/">Spring</a> basa principalmente su funcionamiento en la <a href="http://es.wikipedia.org/wiki/Inversi%C3%B3n_de_Control">Inversión de Control(IoC)</a> y un ejemplo seria:</p>
<p><code>&lt;!-- dao --&gt;<br />
&lt;bean id="dao" class="com.nc.dao.impl.DaoImpl"&gt;<br />
&lt;property name="sessionFactory" ref="sessionFactory"/&gt;<br />
&lt;/bean&gt;<br />
&lt;!-- service --&gt;<br />
&lt;bean id="service" class="com.nc.srv.impl.ServiceImpl"&gt;<br />
&lt;property name="dao" ref="dao" /&gt;<br />
&lt;/bean&gt;</code></p>
<p>Esta es la forma de definir los beans en nuestro applicationContext.xml. Como se observa <a href="http://www.springsource.org/">Spring</a> genera una instancia de las clase definida en la etiqueta bean y les asigna el nombre del identificador del campo id. Tras cargar todos los bean inyecta las referencias en las propiedades de cada uno. El código de uno de estos Beans seria algo así:</p>
<p><code>public class ServiceImpl implements Service {<br />
private Dao dao;<br />
public void setDao(Dao dao) {<br />
this.dao = dao;<br />
}<br />
public List&lt;PersonVO&gt; getPeople() {<br />
return dao.getPeople();<br />
}<br />
}</code></p>
<p>Siempre que definimos una propiedad inyectable en nuestro applicationContext.xml el bean debe de disponer como minimo el metodo setter de la misma.</p>
<p>Visto esto el siguiente paso es ¿Como se inyectan beans definidos en <a href="http://www.springsource.org/">Spring</a> en beans definidos para <a href="http://www.google.es/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fjava.sun.com%2Fjavaee%2Fjavaserverfaces%2F&amp;ei=2fF4ScOHK4b00AXIrtks&amp;usg=AFQjCNHClyI0BTzrydM9xT-ETzCKczKJ-A&amp;sig2=NjD2TQVVyqiOumFR-8UCLw">JSF</a>?. <a href="http://www.springsource.org/">Spring</a> no solo realiza la inversión de control, sino que además dispone de adaptadores y otras librerías que le permiten trabajar combinadamente con otros frameworks. Para trabajar con <a href="http://www.google.es/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fjava.sun.com%2Fjavaee%2Fjavaserverfaces%2F&amp;ei=2fF4ScOHK4b00AXIrtks&amp;usg=AFQjCNHClyI0BTzrydM9xT-ETzCKczKJ-A&amp;sig2=NjD2TQVVyqiOumFR-8UCLw">JSF</a>, <a href="http://www.springsource.org/">Spring</a> ofrece un variable-resolver propio que basta con agregar a nuestro fichero faces-config.xml de esta manera:</p>
<p><code>&lt;application&gt;<br />
&lt;variable-resolver&gt;<br />
org.springframework.web.jsf.DelegatingVariableResolver<br />
&lt;/variable-resolver&gt;<br />
&lt;/application&gt;</code></p>
<p>Una vez hecho disponemos de las referencias descritas en el <strong>applicationContext.xml</strong> dentro de nuestro <strong>faces-config.xml</strong> por lo que solo debemos declarar propiedades en nuestros Beans de <a href="http://www.google.es/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fjava.sun.com%2Fjavaee%2Fjavaserverfaces%2F&amp;ei=2fF4ScOHK4b00AXIrtks&amp;usg=AFQjCNHClyI0BTzrydM9xT-ETzCKczKJ-A&amp;sig2=NjD2TQVVyqiOumFR-8UCLw">JSF</a> y las referencias como podeis ver en este ejemplo:</p>
<p><code>&lt;managed-bean&gt;<br />
&lt;managed-bean-name&gt;index&lt;/managed-bean-name&gt;<br />
&lt;managed-bean-class&gt;com.nc.jsf.IndexBean&lt;/managed-bean-class&gt;<br />
&lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
&lt;managed-property&gt;<br />
&lt;property-name&gt;service&lt;/property-name&gt;<br />
&lt;value&gt;#{service}&lt;/value&gt;<br />
&lt;/managed-property&gt;<br />
&lt;/managed-bean&gt;</code></p>
<p>Las referencias definidas anteriormente en el <strong>applicationContext.xml</strong> son usadas para ser inyectadas en nuestros Beans de <a href="http://www.google.es/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fjava.sun.com%2Fjavaee%2Fjavaserverfaces%2F&amp;ei=2fF4ScOHK4b00AXIrtks&amp;usg=AFQjCNHClyI0BTzrydM9xT-ETzCKczKJ-A&amp;sig2=NjD2TQVVyqiOumFR-8UCLw">JSF</a>, por lo que podemos acceder a ellas sin problemas:</p>
<p><code>private Service service;<br />
public void setService(Service service) {<br />
this.service = service;<br />
}<br />
public String getText() {<br />
List&lt;PersonVO&gt; people = service.getPeople();</code></p>
<p>Hasta aquí llega la explicación así que si teneís dudas podeís descargaros el proyecto NetBeans aquí y probarlo por vosotros mismos.</p>
<p><a rel="attachment wp-att-103" href="http://nuevascreaciones.com/archives/91/jsf_spring">Proyecto Netbeans JSF + Spring</a></p>
<p><strong>¡Ojo este proyecto usa una BD Derby y una de las BD de prueba denominada travel! por ello deberiais cambiar las opciones de conexión definidas en el applicationContext.xml y cambiar los mapeos de hibernate del proyecto(solo es una tabla con id,valor).</strong></p>
<p>Espero que os haya ayudado y en un futuro tratare de ampliar un poco más este post hablando de la parte de Hibernate que tiene integrada <a href="http://www.springsource.org/">Spring</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://nuevascreaciones.com/archives/91/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Permisos Joomla! 1.5.x (phpGACL)</title>
		<link>http://nuevascreaciones.com/archives/62</link>
		<comments>http://nuevascreaciones.com/archives/62#comments</comments>
		<pubDate>Tue, 30 Dec 2008 02:06:03 +0000</pubDate>
		<dc:creator>makensi</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Joomla!]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[phpGACL]]></category>

		<guid isPermaLink="false">http://nuevascreaciones.com/?p=62</guid>
		<description><![CDATA[Durante este último mes he estado trabajando un poco con Joomla! 1.5.x. Tras realizar mi última instalación, me surgio la duda ¿que pasa si quiero disponer de grupos y permisos distintos de los que Joomla! ofrece?. Ya sabia desde hacia tiempo que Joomla! hacia uso de phpGACL, pero lo que realmente me sorprendio tras revisar [...]]]></description>
			<content:encoded><![CDATA[<p>Durante este último mes he estado trabajando un poco con <a href="http://www.joomla.org/">Joomla!</a> <strong>1.5.x</strong>. Tras realizar mi última instalación, me surgio la duda ¿que pasa si quiero disponer de grupos y permisos distintos de los que <a href="http://www.joomla.org/">Joomla!</a> ofrece?. Ya sabia desde hacia tiempo que <a href="http://www.joomla.org/">Joomla!</a> hacia uso de <a href="http://phpgacl.sourceforge.net/">phpGACL</a>, pero lo que realmente me sorprendio tras revisar un poco es que no hace uso de esta (al menos no en su totalidad).<span id="more-62"></span></p>
<p>Para empezar el responsable de gestionar los permisos de todos los elementos que componen <a href="http://www.joomla.org/">Joomla!</a> es la clase <code><strong>JAuthorization </strong></code>(<code>~/libraries/joomla/user/authorization.php</code>). Esta clase carga la ACL de <a href="http://www.joomla.org/">Joomla!</a> según lo dispuesto en su constructor. Un ejemplo es:<br />
<code><br />
$this-&gt;addACL( 'com_frontpage', 'manage', 'users', 'super administrator' );<br />
</code><br />
En este ejemplo obtenido de este constructor se observa que: los usuarios del grupo <strong>Super Administrator</strong> pertenecientes a la sección <strong>Users</strong> para el item <code>com_frontpage </code>(pagina principal de Frontend) dispone del permiso manage. ¿Facíl no?</p>
<p>Ya disponemos de la forma en que se lleva acabo ahora solo falta el mecanismo y la herramienta. La herramienta es un componente denominado <a href="http://extensions.joomla.org/extensions/access-&amp;-security/group-access/4758/details">JXtended Control</a> el cual nos permite gestionar desde el Backend de <a href="http://www.joomla.org/">Joomla!</a> las tablas de <a href="http://phpgacl.sourceforge.net/">phpGACL</a>(no entraremos en los detalles de las tablas ya que nos extenderiamos demasiado) de una forma más simplificada.</p>
<p>Una vez instalado accedemos a <strong>Componentes -&gt; <a href="http://extensions.joomla.org/extensions/access-&amp;-security/group-access/4758/details">Control</a></strong> (en el Backend), seleccionamos configuración y marcamos en el combo <strong>Extension Mode</strong> como <strong>Advanced Mode</strong>, guardamos y actualizamos la pagina (no refresca la configuración <img src='http://nuevascreaciones.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ).</p>
<p>Tras refrescar aparecera un menú más extenso peor nos centraremos solamente en:</p>
<ul>
<li><strong>Section</strong>, con la opción <strong>Tipo </strong>a <strong>Permissions(ACOs)</strong></li>
<li><strong>Objects</strong>, con  					 						la opción <strong>Filter Type</strong> a <strong>Permissions(ACOs)</strong></li>
<li><strong>Groups</strong>, con la opción <strong>Filter Group Type</strong> a <strong>Users Groups(AROs)</strong></li>
<li><strong>Rules</strong></li>
</ul>
<p>Bien si nos fijamos en el ejemplo anterior obtenido del constructor de JAuthorization, para agregar el mismo permiso basta con agregar:</p>
<ul>
<li>Una <strong>Section</strong> con valor <code><strong>com_frontpage</strong></code> (como nombre suele ser útil usar el mismo que valor tanto para este caso como para los siguientes).</li>
<li>Un <strong>Object</strong> con valor <code><strong>manage</strong></code> y que pertenezca a la seccion <code><strong>com_frontpage</strong></code>.</li>
<li>En este caso no es necesario agregar un <strong>Group</strong> ya que podemos hacer uso de los existentes.</li>
<li>Finalmente una <strong>Rule</strong> en la que agregaremos un texto descriptivo en el campo Note, marcamos el checkbox correspondiente a <strong>com_frontpage &#8211; manage</strong> y el checkbox correspondiente a <strong>Super Administrator</strong>.</li>
</ul>
<p>Con esto ya disponemos de una regla igual a la del ejemplo por lo que el resto es generar las que deseemos (es aconsejable crear todas las del grupo <strong>Super Administrator</strong> para evitar problemas en el siguiente paso).</p>
<p>El mecanismo para hacer que sea <a href="http://phpgacl.sourceforge.net/">phpGACL</a> el que gestione los permisos es cambiar en la clase <code><strong>JAuthorization</strong></code> el valor de la variable <code>$_checkMode</code> a <code>1</code>. Este es el código que debemos buscar:<br />
<code><br />
/**<br />
* The check mode.  0 = Joomla!, 1 = phpGACL<br />
* @var    int<br />
*/<br />
var $_checkMode = 0;<br />
</code><br />
Una vez realizado este cambio si no disponemos previamente de los permisos necesarios(por eso es necesario agregar todos los de <strong>Super Administrador</strong>) muchos de los menús del Backend desapareceran.</p>
<p>Hasta aquí ya disponemos de un mecanismo para agregar nuevos grupos y permisos pero obtener los permisos de cada modulo y componente instalado puede ser un engorro. Lo más aconsejable es agregar a la clase <code><strong>JAuthorization</strong></code> en la función <code><strong>acl_check</strong></code> algo así:<br />
<code><br />
echo sprintf("(%s)<br />
$aco_section_value, $aco_value, $aro_section_value,<br />
$aro_value, $axo_section_value, $axo_value,<br />
$root_aro_group, $root_axo_group &lt;br /&gt;",<br />
parent::acl_check( $aco_section_value, $aco_value,<br />
$aro_section_value, $aro_value, $axo_section_value,<br />
$axo_value, $root_aro_group, $root_axo_group )?"true":"false");<br />
</code><br />
Esto nos permitira ver en la pagina las reglas y el valor true si esta permitida la accion y false en caso contrario.</p>
<p>Aunque no he entrado en mucho detalle espero escribir en un futuro otro post con una explicación algo más extensa.</p>
]]></content:encoded>
			<wfw:commentRss>http://nuevascreaciones.com/archives/62/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Woodstock y Facelets una convivencia extraña</title>
		<link>http://nuevascreaciones.com/archives/18</link>
		<comments>http://nuevascreaciones.com/archives/18#comments</comments>
		<pubDate>Mon, 03 Nov 2008 11:00:06 +0000</pubDate>
		<dc:creator>makensi</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Facelets]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Java ServerFaces]]></category>
		<category><![CDATA[Woodstock]]></category>

		<guid isPermaLink="false">http://nuevascreaciones.com/?p=18</guid>
		<description><![CDATA[En el último proyecto en el que estuve trabajando tome la decisión de hacer uso la librería de componentes JSF, Woodstock. Antes de comenzar el desarrollo pensé en hacer uso de una librería para el desarrollo de templates compatible con JSF. Pensé en Struts Tiles y Facelets y tras un rato evaluándolos(basándome en mi experiencia [...]]]></description>
			<content:encoded><![CDATA[<p>En el último proyecto en el que estuve trabajando tome la decisión de hacer uso la librería de componentes <a href="http://java.sun.com/javaee/javaserverfaces/">JSF</a>, <a href="https://woodstock.dev.java.net/index.html">Woodstock</a>. Antes de comenzar el desarrollo pensé en hacer uso de una librería para el desarrollo de templates compatible con <a href="http://java.sun.com/javaee/javaserverfaces/">JSF</a>. Pensé en <a href="http://struts.apache.org/1.x/struts-tiles/">Struts Tiles</a> y <a href="https://facelets.dev.java.net/">Facelets</a> y tras un rato evaluándolos(basándome en mi experiencia con cada uno) me decante por <a href="https://facelets.dev.java.net/">Facelets</a> por varios motivos:  <span id="more-18"></span></p>
<ul>
<li>No se tiene que configurar cada página en el <strong>tiles-conf</strong>. Es cierto puede ser una tontería pero la razón de peso para mi es que, este oculta e incrementa el tiempo necesario para la compresión de proyectos que ya están desarrollados.</li>
<li>Solo se hace uso de una tecnología (<a href="http://java.sun.com/javaee/javaserverfaces/">JSF</a>), lo cual para mi es una razón de peso. A mayor número de tecnologías usadas, mayor es la complejidad y la dificultad de compresión del proyecto web y claro esta en el desarrollo de aplicaciones web ya intervienen unas cuantas de tecnologías como para complicarlo más.</li>
<li>El trabajo con <a href="https://facelets.dev.java.net/">Facelets</a> se asimila mucho al uso de templates con <a href="http://es.wikipedia.org/wiki/XSLT">XSLT</a> (en lo cual me siento muy cómodo). Dispones de elementos como <strong>ui:composion</strong> en vez de <strong>xsl:call-templates</strong>, y <strong>xsl:apply</strong> templates y siempre conoces que ficheros de templates usa tu página.</li>
</ul>
<p>Tras descargarme las últimas versiones de ambas librerías, la configuración no fue un problema ya que solo debemos agregar estas lineas a nuestro <strong>web.xml</strong> para configurar el gestor de temas de <a href="https://woodstock.dev.java.net/index.html">Woodstock</a> y el filtro de subida de ficheros: <code> </code></p>
<p><code>&lt;filter&gt;<br />
&lt;filter-name&gt;UploadFilter&lt;/filter-name&gt;<br />
&lt;filter-class&gt;com.sun.webui.jsf.util.UploadFilter&lt;/filter-class&gt;<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;maxSize&lt;/param-name&gt;<br />
&lt;param-value&gt;1000000&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;sizeThreshold&lt;/param-name&gt;<br />
&lt;param-value&gt;4096&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
&lt;/filter&gt;<br />
&lt;filter-mapping&gt;<br />
&lt;filter-name&gt;UploadFilter&lt;/filter-name&gt;<br />
&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;<br />
&lt;/filter-mapping&gt; </code> <code><br />
&lt;servlet&gt;<br />
&lt;servlet-name&gt;ThemeServlet&lt;/servlet-name&gt;<br />
&lt;servlet-class&gt;com.sun.webui.theme.ThemeServlet&lt;/servlet-class&gt;<br />
&lt;/servlet&gt;<br />
&lt;servlet-mapping&gt;<br />
&lt;servlet-name&gt;ThemeServlet&lt;/servlet-name&gt;<br />
&lt;url-pattern&gt;/theme/*&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;</code></p>
<p>Y en el caso de <a href="https://facelets.dev.java.net/">Facelets</a> que es un poco más complejo solo necesitamos agregar los siguientes parámetros de configuración al <strong>web.xml</strong>:</p>
<p><code> &lt;context-param&gt;<br />
&lt;param-name&gt;javax.faces.DEFAULT_SUFFIX&lt;/param-name&gt;<br />
&lt;param-value&gt;.xhtml&lt;/param-value&gt;<br />
&lt;/context-param&gt;<br />
&lt;context-param&gt;<br />
&lt;param-name&gt;facelets.DEVELOPMENT&lt;/param-name&gt;<br />
&lt;param-value&gt;false&lt;/param-value&gt;<br />
&lt;/context-param&gt;<br />
&lt;context-param&gt;<br />
&lt;param-name&gt;facelets.SKIP_COMMENTS&lt;/param-name&gt;<br />
&lt;param-value&gt;true&lt;/param-value&gt;<br />
&lt;/context-param&gt; </code></p>
<p>Y el siguiente manejador de vistas al <strong>faces-config.xml</strong>:  <code></p>
<p>&lt;application&gt;<br />
&lt;view-handler&gt;com.sun.facelets.FaceletViewHandler&lt;/view-handler&gt;<br />
&lt;/application&gt;</code></p>
<p>Con esto habremos configurado todo lo necesario y los que uséis <a href="http://www.netbeans.org/">NetBeans</a> no tendréis ni que configurar esto ya que durante la creación de vuestro proyecto Web una vez seleccionados los frameworks <a href="http://java.sun.com/javaee/javaserverfaces/">JSF</a> y <a href="https://facelets.dev.java.net/">Facelets</a> esta configuración sera agregada.  Por norma las configuraciones de <a href="http://java.sun.com/javaee/javaserverfaces/">JSF</a> suele disponer de un mapeo del servlet sobre <strong>/faces/*</strong> o <strong>*.jsf</strong>, si os fijáis en el parámetro <strong>javax.faces.DEFAULT_SUFFIX</strong> mapea <strong>*.xhtml</strong>. ¿Qué significa esto?:</p>
<ol>
<li> Todas las peticiones que vayan contra un fichero con extensión <strong>*.xhtml</strong> serán usadas como ficheros de templates.</li>
<li>Todas las peticiones que vayan contra un fichero con extensión <strong>*.jsf</strong> (si usaste esta configuración) o estén en la ruta <strong>/faces/*</strong> (si usaste esta) serán tratados como páginas <a href="http://java.sun.com/javaee/javaserverfaces/">JSF</a> normales.</li>
</ol>
<p>El resto de parámetros de como <strong>facelets.DEVELOPMENT</strong> para mostrar los errores y trazas vía web (para esto ya tenemos una bonita consola en nuestro IDE) y <strong>facelets.SKIP_COMMENTS</strong> (se salta cualquier comentario sin tratarlo) no son de importancia (de hecho podemos trabajar sin ellos ya que disponen de configuración por defecto en la librería).  Bien ahora viene lo interesante, creamos un fichero <strong>template.xhtml</strong> con el siguiente contenido en el raíz de nuestro sitio web: <code> </code></p>
<p><code>&lt;f:view xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:webuijsf="http://www.sun.com/webui/webuijsf"&gt;<br />
&lt;webuijsf:page&gt;<br />
&lt;webuijsf:html&gt;<br />
&lt;webuijsf:head&gt;<br />
&lt;f:facet name="title"&gt;<br />
&lt;ui:insert name="title"&gt;Titulo por defecto&lt;/ui:insert&gt; </code><code><br />
&lt;/f:facet&gt;<br />
&lt;/webuijsf:head&gt;<br />
&lt;webuijsf:body&gt;<br />
&lt;webuijsf:form id="indexForm"&gt;<br />
&lt;ui:insert name="body"&gt;Cuerpo por defecto&lt;/ui:insert&gt;<br />
&lt;/webuijsf:form&gt;<br />
&lt;/webuijsf:body&gt;<br />
&lt;/webuijsf:html&gt;<br />
&lt;/webuijsf:page&gt;<br />
&lt;/f:view&gt;</code></p>
<p>Y otro fichero <strong>index.jsp</strong> con: <code> </code></p>
<p><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:ui="http://java.sun.com/jsf/facelets"&gt;<br />
&lt;ui:composition template="/template.xhtml"&gt;<br />
&lt;ui:define name="title"&gt;Texto de titulo&lt;/ui:define&gt;<br />
&lt;ui:define name="body"&gt;Texto de cuerpo&lt;/ui:define&gt;<br />
&lt;/ui:composition&gt;<br />
&lt;/jsp:root&gt;</code></p>
<p>Paso a describiros que es lo que hacemos en cada fichero:</p>
<ol>
<li><strong>template.xhtml</strong>: Este fichero es la plantilla y dispone de una vista de <a href="http://java.sun.com/javaee/javaserverfaces/">JSF</a> en la que agregamos el cuerpo de nuestra pagina que como se observa hace uso de los tags de <a href="https://woodstock.dev.java.net/index.html">Woodstock</a>. En determinadas posiciones como son el título de la página agregamos las etiquetas <strong>ui:insert</strong> con un nombre que más tarde usaremos para remplazar su contenido.</li>
<li><strong>index.jsp</strong>: En el disponemos de una llamada <strong>ui:composion</strong> con el atributo template apuntando a nuestro fichero de template <strong>template.xhtml</strong>. Seguidamente dispone de ui:define apuntando a los <strong>ui:insert</strong> de nuestro fichero<strong> template.xhtml</strong>(igual que un <strong>xsl:call-template</strong> con sus <strong>xsl:param</strong>) y con los nuevos valores(no tiene por que ser texto puede ser etiquetado <a href="http://java.sun.com/javaee/javaserverfaces/">JSF</a>).</li>
</ol>
<p>Como se observa lo que conseguimos de este modo es disponer de un cuerpo único para todas nuestra páginas. Algo importante al respecto de <a href="https://facelets.dev.java.net/">Facelets</a> es que se permiten realizar <strong>ui:define</strong> en nuestro ficheros jsp a atributos que estan en otros <strong>ui:composion</strong> de nuestro template, esto quiere decir que podemos combinar varios templates a través de llamadas <strong>ui:composion</strong> e insertar solo las partes que nos hacen falta.</p>
<h3>La convivencia</h3>
<p>El uso conjunto de <a href="https://facelets.dev.java.net/">Facelets</a> y <a href="https://woodstock.dev.java.net/index.html">Woodstock</a> cambia los atributos del segundo. ¿Que quiere decir esto?, pues que si creamos por ejemplo:</p>
<ul>
<li> Un <strong>webuijsf:button</strong> este deberá usar atributos <strong>action</strong> en vez de <strong>actionExpression</strong>.</li>
<li>Un <strong>webuijsf:upload</strong> deberá disponer de un atributo <strong>value</strong> en vez de un <strong>fileUploaded</strong> y además obligara a insertar un <strong>enctype=&#8221;multipart/form-data&#8221;</strong> en nuestro <strong>webuijsf:form</strong> para que funcione.</li>
</ul>
<p>Solo puedo deciros que el proyecto <a href="https://woodstock.dev.java.net/index.html">Woodstock</a> tiene modificada su API (estos atributos que cambian están marcados como <strong>DEPRETATED</strong>) y que cuando trabaja con <a href="https://facelets.dev.java.net/">Facelets</a> estos cambian (Un par de horas o tres me dan la razón <img src='http://nuevascreaciones.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ).  Podéis descargaros el proyecto de <a href="http://www.netbeans.org/">NetBeans</a> (se necesitan los plugins <a href="http://www.netbeans.org/kb/60/web/intro.html">Visual Web JSF Components</a> y <a href="https://facelets.dev.java.net/">Facelets</a> para disponer de las librerías) <a rel="attachment wp-att-31" href="http://nuevascreaciones.com/archives/18/woodstock_facelets_example">aquí</a>.  Espero que os sirva de algo.  <img src='http://nuevascreaciones.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://nuevascreaciones.com/archives/18/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creando componentes con JSFTemplating</title>
		<link>http://nuevascreaciones.com/archives/4</link>
		<comments>http://nuevascreaciones.com/archives/4#comments</comments>
		<pubDate>Mon, 27 Oct 2008 15:05:42 +0000</pubDate>
		<dc:creator>makensi</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Java ServerFaces]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JSFTemplating]]></category>
		<category><![CDATA[Mootools]]></category>

		<guid isPermaLink="false">http://nuevascreaciones.com/?p=4</guid>
		<description><![CDATA[Recientemente me he tenido que realizar una evaluación de librerías y componentes JSF para desarrollar una aplicación web y pensé entonces en JSFTemplating, una librería que permite desarrollar componentes JSF de manera fácil y rápida. Tras las primeras búsquedas di con este tutorial. Jugué con esta librería durante una hora, descubrí que con ella podía [...]]]></description>
			<content:encoded><![CDATA[<p>Recientemente me he tenido que realizar una evaluación de librerías y componentes <a href="http://java.sun.com/javaee/javaserverfaces/">JSF</a> para desarrollar una aplicación web y pensé entonces en <a href="https://jsftemplating.dev.java.net/">JSFTemplating</a>, una librería que permite desarrollar componentes <a href="http://java.sun.com/javaee/javaserverfaces/">JSF</a> de manera fácil y rápida. Tras las primeras búsquedas di con este <a href="http://www.theserverside.com/tt/articles/article.tss%3Fl%3DJSFTemplateComponent">tutorial</a>.<a href="http://www.theserverside.com/tt/articles/article.tss%3Fl%3DJSFTemplateComponent"></a></p>
<p>Jugué con esta librería durante una hora, descubrí que con ella podía convertir librerías javascript de efectos en librerías de componentes <a href="http://java.sun.com/javaee/javaserverfaces/">JSF</a> y pensé en <a title="MooTools" href="http://mootools.net/">Mootools</a> una librería javascript muy liviana que siempre me ha gustado mucho.</p>
<p>Así que he escrito este pequeño tutorial el cual adjunta el código al final del mismo, de como montar y crear componentes con esta librería.</p>
<p><span id="more-4"></span>En primer lugar creamos un proyecto web en <a href="http://www.netbeans.org/">Netbeans</a> con soporte para <a href="http://java.sun.com/javaee/javaserverfaces/">Java ServerFaces</a> (Evitaremos tener que escribir la configuración del <strong>web.xml</strong>), descargamos la última Nightly de la página de <a href="https://jsftemplating.dev.java.net/">JSFTemplating</a> y  <a title="MooTools" href="http://mootools.net/">mootools</a>. El servidor sobre el cual trabajaremos es <a href="https://glassfish.dev.java.net/">Glassfish</a> v2 (por defecto viene con <a href="http://www.netbeans.org/">Netbeans</a>) y así las librerías <a href="http://java.sun.com/javaee/javaserverfaces/">JSF</a> serán incluidas  automáticamente en el <strong>classpath</strong> de nuestro proyecto.</p>
<p>Una vez tenemos todo lo necesario para trabajar, deberemos incorporar las librerías de <a href="https://jsftemplating.dev.java.net/">JSFTemplating</a> a nuestro proyecto:</p>
<ul>
<li><strong>jsftemplating-dt.jar</strong>: librería de etiquetado (design time) solo útil en desarrollo, no se incorpora al despliegue.</li>
<li><strong>jsftemplating.jar</strong>: librería base de <a href="https://jsftemplating.dev.java.net/">JSFTemplating</a>.</li>
</ul>
<p>Luego creamos bajo Web Pages un directorio js donde copiaremos el fichero mootools.js. Y ya solo nos queda decidir que componente javascript queremos crear yo en mi caso Accordion (me recuerda al de <a href="https://woodstock.dev.java.net/">Woodstock</a>).</p>
<p>Nos creamos un paquete y las clases para nuestro componente que en mi caso es:</p>
<ul>
<li><strong>com.nc.component </strong>
<ul>
<li><strong>Accordion.java</strong></li>
<li><strong>AccordionFactory.java</strong></li>
<li><strong>AccordionTab.java</strong></li>
<li><strong>AccordionTabFactory.java</strong></li>
</ul>
</li>
</ul>
<p>No explicare como están realizados por dentro ya que en el <a href="http://www.theserverside.com/tt/articles/article.tss%3Fl%3DJSFTemplateComponent">tutorial</a> de la URL del principio del articulo esta perfectamente descrito, solo tenemos que realizar la modificación oportuna para el fichero de template usado por el componente y el nombre del mismo. p.e en <strong>Accordion</strong>:</p>
<p><strong>setLayoutDefinitionKey(&#8220;tpl/accordion.jsp&#8221;);</strong></p>
<p>Creamos un directorio bajo Web Pages llamado tpl y en el creamos dos ficheros jsp llamados:</p>
<ul>
<li><strong>accordion.jsp</strong></li>
<li><strong>accordionTab.jsp</strong></li>
</ul>
<p>Una vez realizado registramos nuestros los componentes en nuestro <strong>faces-config.xml</strong>:<br />
<code><br />
&lt;component&gt;<br />
&lt;component-type&gt;com.nc.Accordion&lt;/component-type&gt;<br />
&lt;component-class&gt;com.nc.component.Accordion&lt;/component-class&gt;<br />
&lt;/component&gt;<br />
&lt;render-kit&gt;<br />
&lt;renderer&gt;<br />
&lt;component-family&gt;com.nc.Accordion&lt;/component-family&gt;<br />
&lt;renderer-type&gt;com.nc.Accordion&lt;/renderer-type&gt;<br />
&lt;renderer-class&gt;com.sun.jsftemplating.renderer.TemplateRenderer&lt;/renderer-class&gt;<br />
&lt;/renderer&gt;<br />
&lt;/render-kit&gt;</code><br />
<code><br />
&lt;component&gt;<br />
&lt;component-type&gt;com.nc.AccordionTab&lt;/component-type&gt;<br />
&lt;component-class&gt;com.nc.component.AccordionTab&lt;/component-class&gt;<br />
&lt;/component&gt;<br />
&lt;render-kit&gt;<br />
&lt;renderer&gt;<br />
&lt;component-family&gt;com.nc.AccordionTab&lt;/component-family&gt;<br />
&lt;renderer-type&gt;com.nc.AccordionTab&lt;/renderer-type&gt;<br />
&lt;renderer-class&gt;com.sun.jsftemplating.renderer.TemplateRenderer&lt;/renderer-class&gt;<br />
&lt;/renderer&gt;<br />
&lt;/render-kit&gt;<br />
</code><br />
Como podéis observar el nombre de componente difiere del nombre de paquete, tened cuidado. Una vez definidos los componentes podemos pasar a modificar las plantillas de estos:</p>
<p><strong>accordion.jsp</strong><br />
<code>"&lt;script language="javascript" type="text/javascript" src="js/mootools.js"&gt;&lt;/script&gt;<br />
"&lt;script language="javascript" type="text/javascript"&gt;<br />
"    window.onload=function(){<br />
"        var myAccordion = new Accordion($("$this{clientId}"),".toggler", ".element");<br />
"    }<br />
"&lt;/script&gt;<br />
"&lt;div id="$this{clientId}"&gt;<br />
&lt;!foreach _child : $this{children}&gt;<br />
&lt;component id="#{_child.id}" /&gt;<br />
&lt;/foreach&gt;<br />
"&lt;/div&gt;<br />
</code><br />
<strong>accordionTab.jsp</strong><br />
<code>"&lt;h3 class="toggler"&gt;$property{title}&lt;/h3&gt;<br />
"&lt;p class="element"&gt;<br />
&lt;!foreach _child : $this{children}&gt;<br />
&lt;component id="#{_child.id}" /&gt;<br />
&lt;/foreach&gt;<br />
"&lt;/p&gt;<br />
</code><br />
<a href="https://jsftemplating.dev.java.net/">JSFTemplating</a> dispone de un etiquetado propio para la definición de templates pero también podemos hacer uso de etiquetado <strong>h:</strong> y <strong>f:</strong>. Al principio de cada linea agrego una &#8221; que realiza la misma operación que un <strong>f:verbatim</strong> mostrando el código que le precede sin tratarlo. Los <strong>foreach</strong> nos permiten recorrer todos los tags hijos (<strong>html</strong>, componentes <a href="http://java.sun.com/javaee/javaserverfaces/">JSF</a>,&#8230;) y con una llamada a la etiqueta component hacemos que estos se muestren.</p>
<p>Teóricamente todo debería funcionar según lo especificado en el <a href="http://www.theserverside.com/tt/articles/article.tss%3Fl%3DJSFTemplateComponent">tutorial</a>, pero esto no es así ya que el empaquetado de la aplicación que aparece en ese tutorial hace uso de una tarea <a href="http://ant.apache.org/">ANT</a> denominada <strong>APT (Annotation Processor Tool)</strong>. Ya que no hacemos uso de esta tarea deberemos agregar al raíz de nuestro directorio de fuentes (en <a href="http://www.netbeans.org/">Netbeans</a> <strong>src/java</strong>) el directorio <strong>META-INF/jsftemplating</strong> y en el los ficheros:</p>
<ul>
<li><strong>UIComponentFactory.map</strong>: Aquí se definen las factorías para los componentes p.e.: <strong>mu\:accordion=com.nc.component.AccordionFactory</strong> (<strong>tag=factoria</strong>).</li>
<li><strong>Handler.map</strong>: Si usas manejadores aquí se definen las clases y los parámetros para el manejo de eventos (Véase el <a href="http://www.theserverside.com/tt/articles/article.tss%3Fl%3DJSFTemplateComponent">tutorial</a> o la documentación de eventos y manejadores de <a href="https://jsftemplating.dev.java.net/">JSFTemplating</a>).</li>
</ul>
<p>Una vez terminemos basta con escribir en nuestro <strong>index.jsp</strong>:<br />
<code><br />
&lt;mu:accordion id="accordion"&gt;<br />
&lt;mu:accordionTab title="Titulo 1"&gt;<br />
&lt;f:verbatim&gt;<br />
Esto es el texto que sera incorporado al titulo 1,<br />
&lt;/f:verbatim&gt;<br />
&lt;/mu:accordionTab&gt;<br />
&lt;mu:accordionTab title="Titulo 2"&gt;<br />
&lt;f:verbatim&gt;<br />
como se observa se puede hacer uso de etiquetado &amp;lt;f: y &amp;lt;h:,<br />
&lt;/f:verbatim&gt;<br />
&lt;/mu:accordionTab&gt;<br />
&lt;mu:accordionTab title="Titulo 3"&gt;<br />
&lt;h:outputText value="sin problema alguno." /&gt;<br />
&lt;/mu:accordionTab&gt;<br />
&lt;/mu:accordion&gt;<br />
</code></p>
<p>El proyecto <a href="http://www.netbeans.org/">Netbeans</a> del ejemplo podéis descargarlo <a rel="attachment wp-att-12" href="http://nuevascreaciones.com/archives/4/jsftemplating_example">aquí</a>.</p>
<p>Espero que os sea de ayuda.</p>
]]></content:encoded>
			<wfw:commentRss>http://nuevascreaciones.com/archives/4/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
