Rodrigo Borrego Bernabé - Software Developer



Invocando url_for desde el modelo

Category : Programación, Symfony · No Comments · by Abr 5th, 2011

El modo ‘feo’ (AKA The Ugly Way), dado que rompe el paradigma MVC:

sfContext::getInstance()->getConfiguration()->loadHelpers(array('Url'));
$url = url_for('mi_url', true); // El segundo parámetro (absolute) depende del destino de la variable $url

El modo ‘elegante’:

$url = sfContext::getInstance()->getController()->genUrl('mi_url', true);

o en una acción:

$this->getController()->genUrl('string');

Reemplazar texto con imágenes vía CSS

Category : HTML/CSS, Programación · No Comments · by Mar 22nd, 2011

Motivación

  1. Quiero una imagen en mi botón/enlace/elemento de menú/loquesea
  2. Quiero que los que no vean las imágenes (navegadores modo texto, bots, lectores de pantalla, etc.) tengan un texto equivalente
  3. Quiero que los demás no vean ese texto

HTML:

<div class="miclase">Mi texto alternativo</div>

CSS:

.miclase {
 text-indent: -100em;
 overflow: hidden;
 background: url(miimagen.png) no-repeat;
 height: 100px;
 width: 100px;
 }

Escribir mensajes de log desde el modelo que funcionan en las tareas CLI de Symfony

Category : Programación, Symfony · No Comments · by Mar 5th, 2011

El problema de echo es que aparece por pantalla de la web y no queremos que eso ocurra en producción.
El problema del sfLogger es que se accede a través del contexto y no lo tenemos en las tareas de línea de comandos (task in CLI) de Symfony.

Entonces, ¿Cómo escribir un mensaje de log desde el modelo que funcione en ambas situaciones?


ProjectConfiguration::getActive()
->getEventDispatcher()
->notify(new sfEvent(NULL, 'application.log', array('message' => "Mi mensaje",
'priority' => sfLogger::INFO)));

No puede ser tan costoso sacar una lista de idiomas

Category : Programación · No Comments · by Ene 27th, 2011

Os voy a soltar el código así sin anestesia ni nada.

implode (', ', array_intersect_key($_languages_, array_combine ( $object->getLanguagesArray(), $object->getLanguagesArray())));

Y ahora os explico qué hace. Básicamente tenemos un array no asociativo obtenido con $object->getLanguagesArray() que contiene una lista de claves de lenguajes (es, fr, en, por ejemplo). Y por otro lado tenemos un array asociativo con los nombres de todos los lenguajes como valor y sus códigos como clave. Algo como esto:

Array (
  [0] => en
  [1] => pt
  [2] => fr
  [3] => es
)
Array (
  [aa] => Afar
  [ab] => Abjasio
  [af] => Afrikaans
  [am] => Amárico
...)

Y todo lo que quiero es una cadena, separada por comas con los nombres de los idiomas de $object.

Bueno, pues me ha costado casi una hora buceando en las funciones de array de PHP. Espero que a alguien por ahí le ahorre tiempo.

Invocando el helper i18n (for translation) desde una acción

Category : breves, Programación, Symfony · No Comments · by Ene 11th, 2011

A menudo necesitas invocar el helper de tradicción, __(), desde fuera de la vista. Se puede hacer de dos maneras:

a) Cargarlo explícitamente y llamarlo igual que desde la vista (aunque se cargará dos veces, pues se seguirá cargando en la vista).

sfLoader::LoadHelpers(array('I18N'));

b) O utilizar una llamada puntual:

sfContext::getInstance()->getI18n()->__($text, $args, 'messages');

Traducción libre de: http://snippets.symfony-project.org/snippet/65

Filtrando en symfony con un selector los campos de texto

Category : Programación, Symfony · (5) Comments · by Dic 16th, 2010

A menudo se declara en el esquema un campo como string (texto) cuando en la práctica va a ser una clave de un conjunto de valores. ¿Por qué no lo ponemos en el esquema como ‘type: Enum’? Por ejemplo porque no sabemos, en principio, cuales son los valores que se van a guardar ahí.

En ese caso el filtro no pondrá un desplegable con los valores, lógicamente, sino un input[type=text].

Si posteriormente queremos que en el filtro aparezcan los valores en forma de desplegable hacemos algo como esto:

$choices = array_merge(array('' => ''), <array_con_valores>);
$this->widgetSchema['myField']   = new sfWidgetFormSelect(array('choices' => $choices, 'multiple' => false));

Pues bien, esto mostrará el filtro tal y como lo queremos, pero no funcionará. ¿Qué falta? Pues que le digamos al filtro que tiene que filtrar por un conjunto de claves:

public function getFields() {
 return array('myField' => 'Enum') + parent::getFields();
 }

Es importante el orden, porque al existir ya ‘myField’ en el esquema, si hacemos la unión de los arrays al revés el valor recibido en el padre pisará el nuestro.

Utiliza CDN al incluir jQuery

Category : breves, Programación · No Comments · by Dic 14th, 2010

Estoy viendo y leyendo mucho últimamente, que en lugar de incluir las bibliotecas de jQuery y jQueryUI (y esto es aplicable al resto de bibliotecas disponibles) en tu propio servidor, es mejor alternativa utilizar los repositorios similares a los ofrecidos por Google (o el de Google).

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.8/jquery.min.js"></script>

¿Que por qué? Pues he recopilado tres ventajas y un inconveniente.

Las ventajas son:

  • Aumenta la probabilidad de que los usuarios tengan el archivo en caché (y cuanto más gente utilice esta técnica mayor probabilidad)
  • El navegador puede paralelizar la descarga de este archivo con otros al estar en distintos dominios
  • Si tu público principal está en EEUU y tu hosting en Europa los usuarios de allá se beneficiarán de mayor velocidad de descarga.

Desventajas:

  • Si Google no está accesible (no pienses en caidas de la gran G, piensa en ubicaciones donde el dominio google.com y otros asociados están bloqueados) nos quedamos sin jQuery*.

* Cuando encuentre tiempo escribiré sobre cómo solucionar este «problema»

UPDATE: La URL ha cambiado a (y no solo por el número de versión) https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js. Lo cual me hace pensar que esos cambios en la URL son nuevos problemas, y gordos.

Evitando los OutputEscaping en elementos que no son objetos

Category : Programación, Symfony · No Comments · by Nov 26th, 2010

Habitualmente los proyectos de symfony filtran la vista de manera que se evite la ejecución de código malicioso. Para ellos se sirve de los llamados Output Escaping Decorators. Sin embargo, en muchas ocasiones nos interesa (con cuidado) saltarnos este control.

Normalmente basta con hacer

$object->getAtributo(ESC_RAW) ó $object->getRawValue()->getAttributo()

Pero a veces no es un objeto lo que queremos utilizar. Pongamos que sea una cadena. En ese caso, la manera de actuar es la siguiente

$sf_data->getRaw('variable');

Si queremos ir más allá (mucho cuidado al hacer esto). Podemos desactivarlo para toda una acción desde el controlador:

public function executeMiAccion(sfWebRequest $request)
{
 sfConfig::set('sf_escaping_strategy', false);
 [...]
}

El lío de los navegadores

Category : breves, HTML/CSS · No Comments · by Nov 5th, 2010

Es tal la maraña de diferencias de renderizado de los diferentes navegadores que es habitual incluir, entre las hojas de estilo (CSS) de las diferentes páginas web una destinada a tratar de uniformizar ese renderizado antes de comenzar a construir una imagen para la web.

Pero un ejemplo del caos que puede llegar a ser eso está en esta página que nos muestra 11, sí lector@s, ONCE, maneras diferentes de construir esa hoja de estilos.

http://perishablepress.com/press/2007/10/23/a-killer-collection-of-global-css-reset-styles/

Por cierto, gracias, al menos puedo probar varias opciones cuando tengo que iniciar un proyecto nuevo.

#main-menu li.item10 {  list-style-image: url(‘/images/icons/dot10.png’); }

Eliminando plugins de Symfony

Category : Programación, Symfony · No Comments · by Nov 4th, 2010

Normalmente cuando quieres desinstalar un plugin de symfony basta con hacer:

$ symfony plugin:uninstall <nombre_plugin>

Pero a veces el resultado no es el deseado, obteniendo un error como este:

>> plugin    uninstalling plugin "nombre_plugin"
>> sfSymfonyPluginManager Plugin "nombre_plugin" is not installed

Intenta en ese caso

symfony plugin:uninstall symfony/nombre_plugin

P.D: Lo que no te evitas en ningún caso es la eliminación manual del enlace simbólico en ./web que se crea al instalar el plugin con el publish-assets