martes, 26 de julio de 2011

Instalar Elgg en Mac OS X con MAMP

Recientemente he estado peleando un poco la instalación de Elgg 1.7.6 en mi portátil con MAMP 1.9.5. En la propia documentación advierten de ciertos problemas a la hora de instalar Elgg en MAMP y como solventarlos. Después de varias pruebas conseguí dar con la forma de instalarlo correctamente. Empecemos:

- En la configuración de Apache de MAMP tengo el DocumentRoot en /Applications/MAMP/htdocs.
- Dentro de dicha carpeta crear otras dos: elgg para alojar la aplicación y data (requerida por elgg). Se puede alojar Elgg en la raíz y así ahorrar un paso más.
- Copiar el contenido de la distribución de elgg a /Applications/MAMP/htdocs/elgg/
- Crear la base de datos para elgg(p.e. elgg) usando phpMyAdmin que viene con MAMP.
- Modificar/Applications/MAMP/conf/php5.3/php.ini y comentar la línea que configura la extensión zend anteponiendo ';': ;zend_extension = "/Applications/MAMP/bin/php5.3/lib/php/extensions/no-debug-non-zts-20090626/xcache.so"
- Modificar en la configuración de Apache (/Applications/MAMP/conf/apache/httpd.conf) el valor de la entrada "AllowOverride None" en la configuración del directorio raíz a "AllowOverride All". Es decir lo que antes era:


<Directory />
Options Indexes FollowSymLinks

AllowOverride None

</Directory>

Debe quedar como:


<Directory />
Options Indexes FollowSymLinks

AllowOverride All

</Directory>

- Ahora sólo queda arrancar los servidores desde MAMP y acceder a localhost:8888/elgg/
- Una vez rellenados los datos de configuración de la BBDD el asistente nos llevará a una segunda pantalla donde rellenaremos los datos del sitio. Una vez que lo hagamos y pulsemos sobre guardar nos dará nuestro primer error. Para solventarlo abrimos el fichero /Applications/MAMP/htdocs/elgg/.htaccess y la línea que está comentada con #RewriteBase / la descomentamos y cambiamos el valor de "/" por "/elgg/" que es la ruta donde está nuestra instalación de Elgg. Reiniciamos Apache, accedemos nuevamente a la página donde configuramos el sitio y ya nos permite terminar la instalación.

miércoles, 29 de diciembre de 2010

Seam: Error en org.jboss.seam.framework.Query.getCountEjbql()

Este método que genera la consulta para obtener el número de resultados posee varios errores/limitaciones a tener en cuenta.
1) Produce un error si la consulta contiene group by con más de un campo:
Este error se corrige modificando el código para que use count(*) en lugar de count(distinct + getGroupBy).
2) Aún corrigiendo lo anterior falla si la consulta posee más de un group by, ejemplo:
select e ..... where e.propiedad in (select o .... group by o.propiedad) group by e.propiedad.
La consulta anterior se podría resolver cambiando el group by de la subconsulta por distinct o.propiedad1,o.propiedad2 si sólo deseamos eliminar duplicados, pero en otro tipo de consultas que se necesite group by no sería posible.

viernes, 29 de octubre de 2010

Seam: Controlar conversaciones en la vista

Si queremos terminar una conversación mediante un enlace o botón hay que tener en cuenta lo siguiente:
- Si nuestra acción no produce una redirección a otra página no debemos usar ni <s:link> ni <s:button> ya que aunque indiquemos propagation="end", esto sólo introduce en la URL un parámetro que indica que se debe terminar la conversación y es en la navegación a la vista destino cuando se lee dicho parámetro y se termina la conversación. En su lugar usaremos <h:commandbutton>,<a4j:commandbutton>, <h:commandlink> o <a4j:commandlink> con la etiqueta <s:conversationpropagation type="end"> anidada.

lunes, 25 de octubre de 2010

JSF: Pasar acción como parámetro en panel modal

El escenario es el siguiente:
- Tengo un modal panel con un backbean/controlador de dicho moda panel
- Este modal panel se va a usar en distintas vistas
- Tiene una misma acción que en cada vista ejecuta un método distinto

Solución 1:
- Crear en el controlador un método para cada acción
- Enviar como parámetro o en cualquier propiedad del controlador la acción que se debe ejecutar
- En el modal panel deben existir un commandLink por cada acción y usar el parámetro anterior
para determinar cual renderizar

Solución 2(a probar):
- Pasar la acción como parámetro y usar la clase org.jboss.seam.core.Expressions para invocar el método.

lunes, 18 de octubre de 2010

JSF: Método para saber si una petición es postback

protected boolean isPostBack() {
FacesContext facesContext = FacesContext.getCurrentInstance();
return facesContext.getRenderKit().getResponseStateManager().isPostback(facesContext);
}