Ordenar cadenas de texto que contengan números en MySQL y Symfony
En un proyecto reciente, tuve que ordenar una columna que contenía RUN, estas cadenas tienen entre 7 y 8 números enteros y un dígito verificador que puede ser un número entre 0-9 o una letra K, ordenar estas cadenas puede ser algo complicado pues el ordenamiento no es numérico.
En este sitio presentan una solución bastante sencilla, básicamente es sumarle un cero a la columna por la que queremos ordenar.
mysql> SELECT column FROM table_name ORDER BY column+0;
Esta idea se puede llevar a symfony simplemente añadiendo una cláusula de ordenamiento en un Criteria.
$c = new Criteria();
$c->addDescendingOrderByColumn('USERNAME+0');
Saludos!
Usando JSON con jQuery en Symfony
JSON es una forma bastante cómoda de tratar con “objetos” y si lo usamos junto con AJAX puede resultar muy sencillo tratar con respuestas que contienen mas de un elemento, tales como una array o un objeto. En el siguiente ejemplo veremos como usar jQuery y JSON para realizar consultas AJAX en symfony (sin helpers o similares)
Voy a evitar declarar el modelo de datos, por lo que supongo que el lector ya tiene algunos conocimientos básicos de este framework.
1.- El Action
Lo primero que haremos es crear un nuevo método para nuestro action, el objetivo es retornar un texto serializado con información de un usuario.
public function executeAjaxDatosCorredorById(sfWebRequest $request){
/* Asegurar que la solicitud sea AJAX */
if (!$request->isXmlHttpRequest())
return $this->renderText(json_encode(array('error'=>'Sólo respondo consultas vía AJAX.')));
/* si paso por POST o GET la variable sfUserId, continuar */
if($request->getParameter('sfUserId'))
{
$usuario = sfGuardUserPeer::retrieveByPK($request->getParameter('sfUserId'));
/* Crear array asociativo con los atributos del objeto $usuario */
$datosUsuario = array(
"nombre" => $usuario->getProfile()->getNombre(),
"apellidoP" => is_null($usuario->getProfile()->getApellidoP()) ? '' : $usuario->getProfile()->getApellidoP(),
"apellidoM" => is_null($usuario->getProfile()->getApellidoM()) ? '' : $usuario->getProfile()->getApellidoM(),
"rut" => $usuario->getUsername()
);
/* retornar el arreglo en formato JSON*/
return $this->renderText(json_encode($datosUsuario));
}
return $this->renderText(json_encode(array('error'=>'Faltan parámetros para realizar la consulta')));
}
Listo. la respuesta está lista para ser “interpretada”. Ahora vamos a ver cómo procesamos la consulta:
2.- La funcion AJAX
Los parámetros de esta función son:
sfAction: es dirección http de la accion de symfony a ejecutar.
idTrigger: Id del elemento DOM que desencadena el evento.
valorParametro: valor que toma laa variable GET['sfUserId']
function getDatosUsuarioById(sfAction, idTrigger, valorParametro)
{
$.ajax(
{
url: sfAction,
data: ({sfUserId: valorParametro}),
dataType: "json",
beforeSend: function()
{
$("#"+idTrigger).append('<span id="cargando_datos"> Cargando datos...');
},
complete: function()
{
$("#cargando_datos").hide();
},
success: function (data, status)
{
$("#propuesta_nombre_contratante").val(data.nombre);
$("#propuesta_apellido_p_contratante").val(data.apellidoP);
$("#propuesta_apellido_m_contratante").val(data.apellidoM);
/* ... etc */
}
error: function (data, status, e)
{
alert('Ocurrió un error cargando los datos solicitados:.\n'+data.error);
}
});
}
En la sección success se puede ver que la respuesta, representada por data, se interpreta como si fuera un objeto.
3.- La puesta en marcha
Para ver el código en funcionamiento debemos agregar el siguiente código en la vista o template en la que necesitemos la función recién implementada. En este ejemplo la función getDatosUsuarioById(…) se dispara al entrar en foco el elemento DOM con Id: propuesta_nombre_contratante. Por otra parte, nótese cómo se declara la variable sfCargaDatosUsuario, se utiliza el helper url_for para crear una ruta, utilizando enrutamiento absoluto, hacia el URL del action a ejecutar.
$(document).ready(function(){
var sfCargaDatosUsuario = "<?php echo url_for('propuesta/ajaxDatosUsuarioById')?>";
$("#propuesta_nombre_contratante").focus(function()
{
if($("#propuesta_cliente_id").val()>0)
{
getDatosUsuarioById(
sfCargaDatosUsuario,
"propuesta_cliente_id",
$("#propuesta_cliente_id").val(),
);
}
});
});
Eso por el momento, espero le sea de utilidad a alguien, iré puliendo esta entrada para que quede más clara.
jQuery – Seleccionando elemento de un Select Box
Una forma sencilla de marcar como “seleccionado” a un elemento de un select box, usando jQuery, es con el siguiente código
$("#miSelectBox option[value="+miValue+"]").attr("selected",true);
Esto puede resultar particularmente útil en un Select Box que haya “hidratado” via AJAX y despues hacer submit haya perdido las opciones y debas volver a cargarlas. Si eso es exactamente lo que andas buscando, se hace así:
var miValue = $("#miSelectBox" ).val();
if (miValue >0)
$("#miSelectBox option[value="+miValue+"]").attr("selected",true);
Muy sencillo
Fuente: jivebay.com (ojo con algunos selectores utilizados, varios de ellos ya están obsoletos en la versión 1.3 )
Symfony – Ver los detalles de error en Formularios Personalizados
Si no utilizas los templates que genera automáticamente symfony para nuestros formularios, ya sea porque requieres agregarle un poco de color, algo más de información etc, seguramente más de una vez te haz topado que algo falló y no sabes qué es (validación, olvidaste agregar un campo, etc), una solución rápida e informativa es agregar la siguiente pieza de código en alguna parte visible de nuestro template:
<ul class="error_list">
<?php if($form->hasErrors()):?>
<?php foreach ($form->getErrorSchema() as $name => $error): ?>
<li><?php echo $name.': '.$error ?></li>
<?php endforeach; endif?>
</ul>
Esto nos mostrará un listado los errores de nuestro formulario.
Saludos
Symfony – Obtener el nombre del Module o Action actual
Para obtener el nombre del Módulo (module) o Acción (action) en el que estamos trabajando:
Desde un Action
sfContext::getInstance()->getActionName(); sfContext::getInstance()->getModuleName();
Desde un template:
$sf_context->getActionName(); $sf_context->getModuleName();
Esto puede útil si estamos construyendo una barra de menú y queremos saber “dónde estamos” para resaltar esta ubicación
.
Me enteré vía: El blog de David Vega
Symfony – Accediendo a sfUser desde un Template
Para acceder al sfUser desde una vista o template es tan sencillo como:
<?php if($sf_user->isAuthenticated()):? >
< ?php echo "User is authenticated"?>
<?php else:?>
<?php echo "User is not authenticated"?>
<?php endif?>
Asimismo si quisiéramos acceder al sfGuardUser, podemos hacer algo como esto:
<?php $usuarioId = $sf_user->getGuardUser()->getId(); ?>
Fuente: symfonynotes
Instalando Apache y PHP 5.3 en Snow Leopard
Si bien PHP y Apache también viene incluídos en OS X Snow Leopard, éstos no son muy personalizables. Por esto prefiero instalar desde MacPorts (el tutorial es igualmente válido para SL).
Para instalar PHP 5.3 recomiendo seguir los primeros pasos de este tutorial:
http://blog.ryanparman.com/2009/07/11/installing-php-5-3-with-mysqlnd-on-mac-os-x-with-macports/
Ojo donde instala los extras, si necesitas ver otros, simplemente corre este comando
port list php5-*
Les dejo a su criterio la instalación del motor de bases de datos:
pss… quieres instalar MySQL de 64 bits ? (compilar es necesario)
http://www.icoretech.org/2009/08/install-mysql-and-mysql-ruby-gem-on-snow-leopard-64-bit/
Primer vistazo al soporte de symfony en NetBeans 6.8
El pasado 1 de Agosto salió el Milestone 1 de NetBeans 6.8, el cual dentro de otras caracteristicas, ofrece “algo” de soporte para symfony.
Update: ya está disponible el Milestone 2 (enlace al final de la entrada).
Dentro de las principales caracteristicas:
- Permite crear e importar Proyectos symfony.
- Soporte para crear Aplicaciones añadiendoles flags u parámetros.
- Consola de comandos de symfony (casi igual a la de on Rails), característica que sin duda le gustará a los usuarios de Windows, donde es un poco más complejo utilizar la consola.
- Permite expandir/minimizar las secciones de los archivos YAML.
Todavía no pruebo otras caracteristicas propias del lenguaje, pero al menos provee lo básico para empezar o continuar un proyecto. Ojalá veamos pronto más novedades.
Symfony – Configurando Eclipse como IDE
Es primera vez que meteré manos en el framework MVC para PHP de nombre symfony, no entraré en detalles de sus bondades, sólo diré que me aburrí de re-inventar la rueda cada vez y el proyecto en el que trabajaré los próximos meses merece el uso de este framework.
En esta primera entrada detallaré propondré una configuración para el IDE Eclipse que permite alivianar un poco la labor de programar, añadiendo soporte básico para las operaciones (de consola) de symfony y un editor para archivos yml.
Curso de Symfony – Javier Eguíluz
En mi búsqueda recopilatoria de información complementaria para la documentación oficial de Symfony me encontrado un curso (diapositivas) de Javier Eguíluz, que sigue el libro Jobbet, el cual pretende enseñar de forma práctica y en 24 sesiones de 1 hora el funcionamiento de Symfony.



