Diumenge plujós a Barcelona
Aprofitant que fa mal temps, aquesta tarda la dedicarem a modelar bases de dades =)
Ricard LuqueroFiled under: symfonyDiumenge plujós a BarcelonaAprofitant que fa mal temps, aquesta tarda la dedicarem a modelar bases de dades =) Improving symfony backend filters. Taking advantage of the screen using a window
When we started to use the backend generated by Symfony, the first thing we noticed is a block of filters that reduce the capacity of expansion of primary data.
Solution: Use a window to show the filters.
By doing so we can expand the data horizontally. The filters will be displayed/hidden through a filter button.
Configuring JQuery and JQueryUI is very simple. We only have to:
A feature of this configuration is that we must have a toggle button that allows to change the visibility of the window filters. For a configuration similar to the first snapshoot our layout.php will be similar to:
<div id="menuwrapper">
<ul>
<li><?php echo link_to('Píldoras', '@lib_pill'); ?></li>
<li>Atributos
...
// Rest of menu
</ul>
<ul style="float:right">
<?php if (sfContext::getInstance()->getActionName() == 'index'): ?>
<li>
<?php echo link_to_function(__('No active filters'),
'showFilters()',
array('id'=>'filters_link'));
?>
</li>
<?php endif; ?>
<li class="dark"><?php echo link_to('Cerrar sesión', '@signout'); ?></li>
</ul>
</div>
<div id="content">
<?php echo $sf_content ?>
</div>
...function showFilters (module)
{
var action = ($("#sf_admin_bar").dialog('isOpen'))? 'close':'open';
$("#sf_admin_bar").dialog(action);
}Finally, in order to run the filters in this new form, we take advantage of the way in which Symfony generates the code, its nomenclature and the capabilities of jQuery to traverse the elements of HTML items. The final layout.php shines as follows:
// Menu configured as we have said previously
<div id="content">
<?php echo $sf_content ?>
</div>
<?php if (sfContext::getInstance()->getActionName() == 'index'): ?>
<script type="text/javascript">
$("#sf_admin_bar").dialog({
autoOpen: false,
width: 600,
height: 500,
title: '<?php echo __('Filters') ?>' });
var hasFilter = false;
$("*[id*='lib_<?php echo sfContext::getInstance()->getModuleName(); ?>_filters']").each(function(i) {
if (this.name.indexOf('[is_empty]') != -1) {
if (this.checked) {
hasFilter = true;
}
}
else if (this.value.length > 0) {
hasFilter = true;
}
});
if (hasFilter)
{
$("#filters_link").text('<?php echo __('There are active filters'); ?>');
$("#filters_link").css('background-color','#F1B2B2');
}
</script>
<?php endif; ?>Voilà:
This fragment is valid for all modules because it uses the function getModuleName(). When there are active filters, we change the background color of filters-toggle button to notify the user.
Enjoy !
Puesta a punto del proyecto Symfony para trabajar con Zend Studio
En un artículo anterior comentaba como configurar un entorno ideal de Symfony en el que compartir todo lo redundante entre diferentes Workspaces.
A continuación vamos a tratar la puesta a punto del proyecto anterior para poder trabajar con Zend Studio (PDT podría servir)
Condiciones iniciales
Creación del proyecto y primer import al SVNEn este momento tenemos les entornos preparados y correctamente configurados de forma que si accedemos a http://dev1.mydomain vemos la página principal típica: Symfony Project Created. Creamos un nuevo proyecto en Zend en el que indicaremos el nombre del proyecto (myProject) la ruta donde se encuentra el entorno (/data/dev1.mydomain) e idealmente indicaremos la ruta donde se encuentra symfony como external library. Por otro lado, como el proyecto tiene una área común (/data/common/project) también crearemos sobre esta ruta un nuevo proyecto, idéntico al anterior, al que llamaremos myProyectCommon. Bien, suponiendo que tenemos ya los 2 proyectos configurados (myProject y myProjectCommon) y también una repositorio SVN localizable por ejemplo en svn://svnserver/repos/myrepos procedemos a conectar los espacios de trabajo con sus respectivas rutas versionadas. Desde Zend Studio:Botón derecho sobre el proyecto > Team > Share Project > SVN En este punto creamos el nuevo repositorio (creamos la conexión). En la siguiente fase seleccionamos "Use project name" como primera opción y "Use single project layout" como segunda. Cancelamos el diálogo final (para los 2 proyectos) para poder seleccionar libremente los directorios que queremos ignorar. Así pues procedemos a aplicar los svn-ignore sobre los siguientes directorios del proyecto principal:
Botón derecho sobre el proyecto > Team > Add to version control Como ya hemos aplicado el svn-ignore podemos seleccionar todos los items. Ok, una cosa es haber añadido todas las rutas que deben sincronizarse al repositorio y otra es hacer realmente el import que sube los archivos al servidor SVN. Así pues ha llegado el momento de realizar el primer import.Regenerando un nuevo espacio de trabajo a través del SVNEl primer espacio de trabajo (dev1.myproject) desde el que se ha creado y adaptado la SandBox está configurado y sincronizado con el SVN, pero para poder verificar que todo está funcionando como es debido vamos a dejar listo otro entorno de trabajo (dev2.myproject) a través del SVN. En dev2.myproject actualmente no hay nada, así que creamos un nuevo proyecto sobre esta ruta vacía. Como estamos probando (ya que no tiene sentido que un mismo desarrollador tenga configurados 2 workspaces) vamos a llamar a este proyecto myProjectWorkspaceTest. Desde Zend Studio:Se crea un nuevo PHP Project (myProjectWorkspaceTest) sobre la estructura de dev2.mydomain Una vez creado el proyecto se debe iniciar la comparticion del mismo: Botón derecho sobre el proyecto > Team > Share Project > SVN Del mismo modo que con el primer proyecto creamos una nueva conexión (myProjectWorkspaceTest) En la siguiente fase seleccionamos "Use project name" como primera opción y "Use single project layout" como segunda. En este caso también cancelamos el diálogo que aparece al final del proceso pero con intención diferente a la primera vez que lo hicimos. En este caso lo hacemos para poder cambiar (switch) seguidamente de repositorio. Botón derecho sobre el proyecto > Team > Switch Seleccionamos el proyecto principal (myProject) y desde el repositorio SVN (la vista) eliminamos el proyecto del mismo temporal (myProjectWorkspaceTest). Cuidado con el archivo: .project y los directorios: .cache y .settings, es posible que sea necesario eliminarlos manualmente si no se ignoraron en el primer import. Si ahora hacemos un svn-update esto nos debería dejar el espacio configurado para funcionar. Así pues, si ahora accedemos a http://dev2.myproject deberíamos ver también el archiconocido: Symfony Project Created Se deberán realizar algunos ajustes tales como crear en dev2 los directorios cache y log (que no se han obtenido del SVN ya que están como svn-ignore) y asignar permisos de escritura a estos 2 nuevos directorio. Finalmente para dar por finalizado el proceso se ha optado por eliminar del SVN los directorios y archivos relacionados con el proyecto de Zend (Eclipse): .project, .cache, .settingsConfigurar un entorno ideal de Symfony
Es cierto que Symfony ofrece múltiples opciones para configurar en entorno en el que empezar a trabajar de forma rápida. El más extendido es, sin duda, la sandbox, peeeero en algunas ocasiones viene bien pensar en un entorno algo más sofisticado de cara a permitir el desarrollo compartido entre múltiples desarrolladores.
Condiciones inicialesSe piensa en un entorno que:
Configuración del espacio de cada desarrolladorPara el caso que nos ocupa se ha optado por una estructura del tipo: Sobre esta estructura están mapeados 3 Virtual Host, uno para cada desarrollador. Estas rutas además son accesibles por SAMBA para facilitar su manipulación en Zend desde Windows (el caso que se tratará aquí). Así pues si ahora dejamos un archivo /data/dev1.mydomain/www/index.php con su pertinente echo "Hello World!"; podremos acceder directamente al mismo desde http://dev1.mydomain siempre que tengamos correctamente configurado correctamente el archivo archivo hosts.Instalación de SymfonySe ha optado por la instalación de Symfony vía SVN checkout entre otras razones para poder aplicar parches de forma rápida. También se ha optado por esta opción ya que para compartir las librerías en el servidor de desarrollo esta es una de las mejores opciones. Vamos a suponer que el espacio de desarrollo (no donde apuntan los vhosts) es /data. Así pues se hace un checkout mediante el comandosvn co http://svn.symfony-project.com/branches/1.1 o svn co http://svn.symfony-project.com/tags/RELEASE_1_1_4 Creado un proyecto symfonyEn este momento tenemos configurados convenientemente los 3 vhosts y las librerías de symfony listas para poder trabajar, así que lo que nos falta es configurar un proyecto de Symfony que haga uso de las mismas. Este tipo de instalación de symfony (SVN checkout) espera que ya exista una estructura de proyecto creada, como este no es el caso, tenemos que procurarnos una, bien a través de la descarga de la SandBox bien a partir de la creación de una sandbox desde nuestra instalación a de Symfony.[data/dev1.mydomain] $ cd /data/common/symfony/1.1/data/bin [data/common/symfony/1.1/data/bin]$ ./create_sandbox.sh [data/common/symfony/1.1/data/bin]$ rm sf_sanbox.zip [data/common/symfony/1.1/data/bin]$ tar xvf sf_sandbox.tgz [data/common/symfony/1.1/data/bin]$ rm xvf sf_sandbox.tgz [data/common/symfony/1.1/data/bin]$ mv sf_sandbox/* /data/d1.mydomain/ [data/common/symfony/1.1/data/bin]$ cd /data/d1.mydomain [dev1.mydomain] $ ./symfony -V > symfony version 1.1.5-DEV (/data/common/symfony/1.1/lib) Reconectando las libreríasBien, lo que nos interesa ahora es desenchufar el proyecto de la versión incorporada en la SandBox para que haga uso de las librerías descargadas y residentes en /data/symfony. Esto se consigue editando /data/dev1.mydomain/config/ProjectConfiguration.class.php<?php
require_once dirname(__FILE__).
'/../../common/symfony/1.1/lib/autoload/sfCoreAutoload.class.php';
sfCoreAutoload::register();
class ProjectConfiguration extends sfProjectConfiguration
{
// ...
}[dev1.mydomain]$ rm -r lib/symfony/ [dev1.mydomain]$ mv web www <?php
require_once dirname(__FILE__).
'/../../common/symfony/1.1/lib/autoload/sfCoreAutoload.class.php';
sfCoreAutoload::register();
class ProjectConfiguration extends sfProjectConfiguration
{
$this->setWebDir($this->getRootDir().'/www');
}[dev1.mydomain]$ rm -r www/sf/ [dev1.mydomain]$ ln -s /data/common/symfony/1.1/data/web/sf/ www/sf [dev1.mydomain]$ rm -r data/symfony [dev1.mydomain]$ rm data/sandbox.db Configuración de más áreas compartidasEn el apartado anterior hemos visto como se ha eliminado el directorio /sf que viene con la distribución de la SandBox para que pase a unificarse en una ruta única para todas los entornos de desarrollo. Estos han tenido que crear un link simbólico a ese nuevo /sf. Esta misma filosofía se sigue para otra información, que llamaremos estática y que no interesa replicar en cada entorno, para este objeto se piensa en:
Desarrollo de una Micro-Red-Social con SymfonyTal y como comentaba anteriormente el sábado estuve presentando Symfony en la primera Barcelona PHP Workshop. La verdad es que hubo algunos inconvenientes, tales como el retraso con que empezamos el taller, problemas con el sonido y sobretodo el recorte de tiempo que no permitió llegar hasta donde estaba previsto, pero bueno, en general la experiencia fue satisfactoria. A continuación dejo los materiales de la presentación. Es interesante descargarse previamente el archivo msn_pack.zip antes de empezar con la presentación. También, si quieres, puedes descargarte la aplicación final que podrás hacer correr en tu servidor web siempre que éste disponga de la extensión SQLITE y XSL. Bitter Sweet Symfony!Aquesta setmana, dissabte concretament, estaré participant com a ponent en el Barcelona PHP Workshop. Presentaré la part pràctica del taller Bitter Sweet Symfony! El meu company serà l’Aldo Chiecchia i s’esperen com a mínim 100 assistents, sobretot tenint en compte que les 200 entrades ja s’han exhaurit. Així doncs, tindrem el dissabte ocupat, primer presentant Symfony, on molt superficialment intentarem cimentar les bases d'una micro-social-network i després aprofitant per fer una mica de safareig amb la resta de la gent. Tota la info de l’event la podeu trobar a la web del grup de programadors PHP de Barcelona. |
|