oriolrius.cat

Des del 2000 compartiendo sobre…

Category: Development, Models and Methodologies

symfony: interficies amb tabs de forma molt senzilla

Reading time: 1 – 2 minutes

L’últim snippet que han pujat al repositori de symfony és un somni fet realitat. Sempre m’ha fet molta ràbia haver de montar-me un sistema de tabbing per una interficie web (UI web) i el que ens proposa aquest snippet és un helper que permet cridar una llibreria anomenada Tab Pane (llicència web 2.0) que a través de javascript modifica els objectes DOM de la pàgina web i ens permet treballar amb uns tabuladors molt ràpids. A més fins hi tot suporta diferents aspectes. Realment una forma molt còmode i senzilla de treballar amb interficies tabulades.

tabs.png

Doncs tornant a l’snippet de symfony podem cridar el helper i començar a usar el codi de forma ben senzilla, a la pròpia descripció en podeu veure un exemple. Doneu-hi un cop d’ull a Helper for Javascript Tabbed Panes. Com és obvi recordeu que aquest helper s’ha d’invocar des de la vista (template).

aptana: eina professional per programar UI Web

Reading time: 2 – 2 minutes

aptana esta disponible per Mac, Windows, Linux i fins hi tot com a plug-in per l’Eclipse. Així doncs es tracta d’una eina que ens ajudarà a programar. Com ja posava en el títol esta orientada a la creació d’interficies d’usuari via web. Ralment és per gent molt i molt professionals, abstenir-se principiants. Ja que li treurem realment el suc quan treballem amb JavaScript, AJAX, Yahoo UI, CSS, Dojo Javascript library, etc. De fet no em declaro ni usuari de l’eina ni segurament futur usuari de la mateixa, però això no treu que després de veure els screencast que té l’eina m’hagi caigut la baba i hagi sabut apreciar la gran feina que s’ha fet per crear una eina com aquesta.


screenshot_library_project_select.png

Per si tot això fos poc es tracta d’una eina OpenSource i com ja he dit multiplataforma. L’aspecte gràfic esta molt acurat i a més suporta força navegadors per comprobar que el codi que anem programant és compatible en tots ells. Com passa en tots els projectes vanguardistes també disposa d’un blog des d’on podeu anar seguint les millores que va tenint el programa, ja que ara mateix només hi ha disponible la versió beta.

symfony: cridant funcions i18n des de les actions

Reading time: 2 – 4 minutes

Una eina molt potent de symfony és la d’internacionalització (i18n), concretament la funció __() es converteix en una de les més usades i indispensables en la capa de vista de les nostres aplicacions. Ja que permet després de forma molt senzilla traduir la nostre aplicació a l’idioma que sigui. El problema és quan des de la part del model em de carregar informació a objectes que després seràn directament mostrats per la vista. Si volem que aquesta informació sigui fàcilment traudible malgrat trobar-se en el model i no pas en la capa de vista la cosa es complica una miqueta. De fet, fins avui no sabia com es feia i ho he descobert gràcies a un snippet publicat a la web de symfony.

Concretament symfony tracta la funció __() com el que ell anomena un helper que ens permeten dinamitzar i donar moltíssima potència als nostres templates. Si no sabeu el que són els helpers us recomano que repasseu la documentació de symfony concretmanet View chapter. De fet, symfony té molts tipus de helpers: url, javascript, form, i18n, etc. fins hi tot podem programar els nostres propis helpers.

Així doncs el que comentaré serà com usar els helpers de tipus i18n des del model, però la resta de helpers també es poden invocar de la mateixa manera.

Primer cal pensar en incloure des del model el codi on es declaren les funcions del helper:

include_once('symfony/helper/I18NHelper.php');

Per invocar la funció __(), hem de fer:

sfConfig::get('sf_i18n_instance')->__($text, $args, 'messages');

El que no sé és si les eines de traducció que es dediquen a extreure els missatges de les funcions __() són capaces de recorre també els fitxers d’accions definits al model o només passen pels templates. Tot i que no deu ser molt difícil dir-los que també mirin els fitxers del model.

Aprofitant que parlo del tema de la internacionlització us recomano una eina per traduir els fitxers d’idioma (XLIFF) és una eina multiplataforma programada en java: open language tools XLIFF editor. Com podeu veure l’aspecte i la simplicitat és inmillorable. Ideal per persones no tècniques que ens poden fer les traduccions de les aplicacions.

Per generar els fitxers XLIFF des de symfony us recomano: HowToGenerateI18NFiles. És un petit manual que he trobat al wiki de symfony.

symfony: Problemes de javascript

Reading time: 1 – 2 minutes

prototype.png

Symfony usa prototype com a framework de JavaScript. Malgrat la potència del projecte té un petit problema de disseny que ens dona problemes quan intentem integrar el nostre codi fet en prototype/symfony amb codi JavaScript de tercers. De fet, el problema de disseny és molt senzill prototype exten dues classes bàsiques de JavaScript: Object i Array ambdues són classes molt bàsiques i sovint usades en qualsevol script així doncs quan aquest codi intenta usar aquestes classes bàsiques al estar exteses no tenen el comportament habitual, així doncs el codi d’aquestes persones s’ha d’adaptar per suportar les modificacions de prototype. Així doncs, si això no és possible tindrem un problema d’incompatibilitat entre codis.

Si voleu més detalls tèncis sobre el problema l’Oriol m’ha passat un parell d’enllaços es raona el problema:

Validador de targetes de crèdit pel symfony

Reading time: 3 – 5 minutes

symfony.gifMalgrat els molts validadors de camps de formularis que inclou el famework symfony no n’inclou un de força important. El validador dels codis de les targetes de crèdit. Com segur que sabeu, els codi d’una targeta de crèdit és autoverificable. És a dir compleix un algoritme matemàtic entre els seus grups de 4 números. Doncs bé com que no tenia cap ganes d’implementar el que ja esta implementat moltes vegades, vaig trobar que a phpclasses.org un tal Harish Chauhan havia penjat una classe programada en PHP4 que implementava un validador de força tipus de targetes de crèdit (VISA, MASTERCARD, DISCOVER, AMEX, DINERS, JCB, Australian Bankcard, EnRoute i Switch Solo). Així doncs, vaig decidir integrar aquesta classe amb el sistema de validador de camps de formularis del symfony.

El primer que vaig fer va ser declarar els mètodes orginals com a privats i després extendre la classe sfValidator que és la usada pels validadors de symfony. Creant un parell de mètodes públics estàndards pels validadors, bàsicament serveixen per instanciar el mètode del validador real i per capturar els paràmetres rebuts des del fitxer yml corresponent.

Doncs bé si voleu consultar el codi de la classe i un exemple d’ús a part de poder-ho consultar en la part extesa d’aques article podeu mirar als snippets de symfony, concretament a Credit Card validator.

Codi del validador:

getParameterHolder()->get('num');
		$num = $this->getContext()->getRequest()->getParameter($num_param);
		$tipo_param = $this->getParameterHolder()->get('tipo');
		$tipo = $this->getContext()->getRequest()->getParameter($tipo_param);
		// Lanzamos la validación
		$validada=$this->_isVAlidCreditCard($num,$tipo,false);
		// Informamos de como ha ido la validación
		sfContext::getInstance()->getLogger()->info("CCVAL.class.php: Tipo: ".$tipo." Num: ".$num." Validada: ".$validada);
		if ($validada==false)
		{
			$error = $this->getParameterHolder()->get('error');
			return false;
		}
		return true;
	}
	public function initialize ($context, $parameters = null)
	{
		// initialize parent
		parent::initialize($context);
		$this->getParameterHolder()->add($parameters);
		return true;
	}
	/**
	 * Testing checksum
	 *
	 * @param integer $ccnum
	 * @return boolean
	 */
	private function _checkSum($ccnum)
	{
		$checksum = 0;
		for ($i=(2-(strlen($ccnum) % 2)); $i<=strlen($ccnum); $i+=2)
		{
			$checksum += (int)($ccnum{$i-1});
		}
		// Analyze odd digits in even length strings or even digits in odd length strings.
		for ($i=(strlen($ccnum)% 2) + 1; $i< 10)
			{ $checksum += $digit; }
			else
			{ $checksum += ($digit-9); }
		}
		if (($checksum % 10) == 0)
		return true;
		else
		return false;
	}
	/**
	 * Launch validation
	 *
	 * @param integer $ccnum
	 * @param string $type
	 * @param boolean $returnobj
	 * @return boolean
	 */
	private function _isVAlidCreditCard($ccnum,$type="",$returnobj=false)
	{
		$creditcard=array(  "visa"=>"/^4d{3}-?d{4}-?d{4}-?d{4}$/",
		"mastercard"=>"/^5[1-5]d{2}-?d{4}-?d{4}-?d{4}$/",
		"discover"=>"/^6011-?d{4}-?d{4}-?d{4}$/",
		"amex"=>"/^3[4,7]d{13}$/",
		"diners"=>"/^3[0,6,8]d{12}$/",
		"bankcard"=>"/^5610-?d{4}-?d{4}-?d{4}$/",
		"jcb"=>"/^[3088|3096|3112|3158|3337|3528]d{12}$/",
		"enroute"=>"/^[2014|2149]d{11}$/",
		"switch"=>"/^[4903|4911|4936|5641|6333|6759|6334|6767]d{12}$/");
		if(empty($type))
		{
			$match=false;
			foreach($creditcard as $type=>$pattern)
			if(preg_match($pattern,$ccnum)==1)
			{
				$match=true;
				break;
			}
			if(!$match)
			return false;
			else
			{
				if($returnobj)
				{
					$return=new stdclass;
					$return->valid=$this->_checkSum($ccnum);
					$return->ccnum=$ccnum;
					$return->type=$type;
					return $return;
				}
				else
				return $this->_checkSum($ccnum);
			}
		}
		else
		{
			if(@preg_match($creditcard[strtolower(trim($type))],$ccnum)==0)
			return false;
			else
			{
				if($returnobj)
				{
					$return=new stdclass;
					$return->valid=$this->_checkSum($ccnum);
					$return->ccnum=$ccnum;
					$return->type=$type;
					return $return;
				}
				else
				return $this->_checkSum($ccnum);
			}
		}
	}
}
?>

Un exemple de com es crida el validador des dels fitxers yml de configuració al directori validate:

methods:
  post: [ntarjeta]
names:
  ntarjeta:
    required:     Yes
    required_msg: Credit Card number is required
    validators:   validarCC
validarCC:
    class:       CCVAL
    param:
      num:       ntarjeta
      tipo:      tipoCC
      error:     Your credit card number is invalid

Un parell d’enllaços molt bons sobre UTF-8 i PHP

Reading time: 1 – 2 minutes

Primer una cosa realment útil, un detector de quin format té un text per poder-lo transformar a UTF8 si cal. Sembla una tonteria però el no tenir-ho sempre et fa anar de corcoll: Detectando UTF8 en PHP (local).

L’altre enllaç és d’un wiki, on ens parlen del comportament de diverses funcions de PHP amb UTF8 i com jugar amb elles sense morir en l’intent i alguna coseta més:

Trac – Control de versions i gestió de Projectes

Reading time: 2 – 4 minutes

trac.png

Ja he comentat varies vegades que com a eina per documentar, mantenir i desenvolupar un projecte (programa) uso trac. Doncs bé en faré cinc cèntims del perquè m’agrada tant. Bàsicament disposa d’un visor del codi a mode del ViewSVN, això ens permet tenir sempre visible el codi font del repositori del subversion, si no recordo malament també pot treballar amb CVS i algún altre.

A través del sistema de tiquets podem generar incidències i requisits pels membres del projecte i per qualsevol altre persona aliena a ell, amb o sense autenticació. Malgrat no és un sistema te tiquets tan elavorat com el bugzilla, per la majoria de projecte relativament petits (menys de 100 persones) jo diria que esta més que bé. A més tota la part de visor de tiquets és molt configurable si volem anar més enllà.

Totes les accions que fem amb qualsevol component del sistema es registra en una línia de temps (timeline) que ens permet veure sempre quina es l’activitat del projecte i en quines parts. A més també podem marcar-nos fites (roadmap) per les noves versions amb dates i el sistema ens farà un seguiment dels tiquets oberts que hi ha perquè es pugui considerar assolida la fita de la nova versió. Per tant, aquests tres components estan molt ben integrats.

Per mi la guinda del pastel és el wiki, que permet documentar el projecte amb un sistema súper integrat amb la resta de móduls del Trac. O sigui, podem per exemple incloure imatges al wiki que realment estan dintre del repositori i les podem referenciar de forma molt senzilla. A més també podem referenciar tiquets, parts del roadmap o de la timeline. A més d’altres funcions típiques dels wikis com poder adjuntar fitxers a les pàgines o fer un control de versions implíssit del contingut de les mateixes. A més tot aquest control de versions també surt reflexat a la línia de temps.

Per si tot això fos poc disposa de funcions tan necessaries com la possilitat de poder-nos sindicar per RSS als tiquets i a la timeline, s’exporten els roadmaps a iCalendar (.ICS), fer busquedes per tot el sistema, transformar gran part dels documents a formats imprimibles i obviament també fa highlight del codi font del repositori. Les ajudes i documentació esta prou bé i és senzill d’usar. A més el sistema de control d’usuaris malgrat ser força primari és força potent, li faltaria poder treballar sobre BBDD o tenir una interfície per gestionar-lo, però per equips de treball no massa grans esta bé.

Client SOAP genèric

Reading time: < 1 minute

A SOAPClient.com tenen un munt d’aplicacions i eines via web per provar els serveis SOAP que programem o que hem d’usar. Concretament volia descatar el client genèric SOAP, al qual només cal passar-li la direcció URL del WSDL i ell ens mostra un formulari per llençar una petició SOAP contra el servidor i després podem veure la sortida en format XML o HTML. Realment útil per saber si el nostre SOAPService funciona correctament.

Oracle 8i i sensibilidad de majúscules i minúscules

Reading time: < 1 minute

Com ja diu la cultura popular, no te acostarás sin saber 2 o 3 cosas más. La última cosa que m’ha deixat a quadres ha estat aquesta:

Oracle 8i is case sensitive for the field names but not for table names.

Doncs si nanos, ara resulta que l’Oracle és sensible a maj. i min. en els només dels camps d’una taula, però no en el nom de la taula. La tonteria m’ha fet perdre dies i dies de proves amb models de dades :'(

I love symfony

Reading time: 2 – 2 minutes

symfony.gif

Porto dos dies enganxat al Zend Studio programant en PHP5, concretament amb el framework anomenat symfony. Doncs bé no tinc cap ganes de posar-me a escriure un article tècnic sobre aquests dos aplicatius i menys a entrar en detall en la potencia d’ambdues eines juntes. Però si que volia deixar constància que això no té res que veure amb la programació de PHP que feia fa uns anys amb el PHP3. Això si que és un plaer, classes, object factories, ADO amb Abstract Factory Design, debugger, SOAP… i un llarg etcetera que no s’acaba mai.

Realment si quan heu de programar us agrada tenir eines com deu mana al vostre abast, jo diria que aquest és el duo perfecte. Si a més podeu tenir un servidor amb apache2 i el Zend Studio Server instal·lat, un control de versions amb subversion, una gestió de tasques amb taskspro i un sistema de tiqueting i roadmap amb trac jo diria que ja no es pot demanar gran cosa més.

L’últim comentari al tema abans de plegar per avui, la curva d’aprenentage del symfony és força llarga, a més interioritzar el model MVC i la implmentació basada en mojavi que en fa symfony costa lo seu. Però després passes a una nova dimenció, m’ha costat arribari però ara em declaro un enamorat del symfony.