<?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; PHP</title>
	<atom:link href="http://nuevascreaciones.com/archives/tag/php/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>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>
	</channel>
</rss>
