logo
  • Home
  • Acerca
  • Autores
  • Faq
  • Rede
  Twitter   Feed-me! RSS!
Jun 10

PHPHEDERAL

Escrito por Leonardo França em 1, 6, Adobe, Adobe Flex, AMF, api, AR, AUG, class, Curso, Cursos, event, Evento, Flex, IE, if, image, Livro, Livros, mg, NaN, O, on, Palestra, Palestras, PHP, RIA, Ria’s Geral, Sun, variados, zend, zendAMF @ 06 10th, 2010 | via http://www.leonardofranca.com.br | Sem comentários
Leonardo França
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »



Ocorera nos dias 16 e 17 de julho, o evento sobre PHP em Brasília, o PHPHEDERAL(lê-se php federal), serão dois dias de palestras e minicursos dos mais variados assuntos. O AUGDF foi convidado a dar uma palestra sobre Adobe Flex e ZendAMF. O nosso amigo Daniel Schmitz(http://www.flex.etc.br) cedeu dois livros Dominando Adobe Flex e Zend para sorteio em nossa palestra :)
Mais detalhes:
http://www.phphederal.com.br

Mai 22

User Group Tour – Flash Platform

Escrito por Leonardo França em 1, 4, 6, Actionscript 3.0, Adobe, api, AR, AUG, Catalyst, CFUGBR, class, ColdFusion, event, Evento, Eventos, flash, flash builder, Flash Catalyst, Flash Platform, Flex, Flex 4, for, if, image, mg, O, on, PHP, platform, RIA, Ria’s Geral, UI, zendAMF @ 05 22nd, 2010 | via http://www.leonardofranca.com.br | Sem comentários
Leonardo França
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »




Ocorrerá no próximo dia 25 de maio, o evento em Brasília promovido pelo AUGDF sobre os ultimos lançamentos da Flash Platform, entre eles Flash Builder, Flex 4, Flash Catalyst, ColdFusion 9 e ColdFusion Builder

Se você é do Rio de Janeiro, participe do evento promovido pelo CFUGBR
http://www.cfugbr.com/evento/

Fev 22

Lumine + ZendAmf + Flex

Escrito por Fábio Batista da Silva em 1, 4, 6, Adobe Flex, AMF, AR, back, blog, código, código fonte, Desenvolvedor, desenvolvedores, Dica, err, erro, Flex, Flex 2, Flex 3, Flex 4, fonte, IE, int, O, on, Pessoal, PHP, RIA, Ria’s Geral, Tutorial, UI, Ved, zend, zendAMF, zendFramework @ 02 22nd, 2010 | via http://www.flexria.com.br/home | Sem comentários
Fábio Batista da Silva
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Olá pessoal !!!
Uma das metas que me dei p esse ano de 2010 e colocar esse blog p funcionar de fato.
nos últimos dias postei aqui uma dica sobre Swiz Prototype e tive um otimo feedback oq me incentivou a escrever esse tutorial, uma serie de 5 posts que irão mostrar a integração entre Lumine, ZendAmf e Flex.
Desde já peço desculpas p qualquer erro e espero que possa ser util aos desenvolvedores.

Tutorial : Lumine + ZendAmf + Flex 1/5
Tutorial : Lumine + ZendAmf + Flex 2/5
Tutorial : Lumine + ZendAmf + Flex 3/5
Tutorial : Lumine + ZendAmf + Flex 4/5
Tutorial : Lumine + ZendAmf + Flex 5/5

O código fonte da aplicação pode ser baixado aqui

Valew pessoal, abraço e até a próxima !!!

Fev 22

Lumine + ZendAmf + Flex 5/5

Escrito por Fábio Batista da Silva em 1, 4, 6, action, Adobe, Adobe Flex, AMF, app, AR, Arquitetura, auto, back, backend, bar, BI, Bindable, busca, class, código, código fonte, control, Controls, DataGrid, DataProvider, demo, Desenvolvedor, desenvolvedores, dispatch, dispatchEvent, email, err, erro, event, EventListener, Evento, Eventos, events, Flex, Flex 2, Flex 3, Flex 4, fonte, for, framework, function, handle, ide, IE, if, Iniciando, Java, label, layout, MXML, Number, O, on, Pessoal, PHP, Projetos, pt, RIA, Ria’s Geral, servidor, tag, TAT, Tema, TextInput, Tutorial, tv, UI, update, Ved, vs, XML, XP, zend, zendAMF, zendFramework @ 02 22nd, 2010 | via http://www.flexria.com.br/home | Sem comentários
Fábio Batista da Silva
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Lumine + ZendAmf + Flex 5/5

Olá pessoal !!!

Agora que temos nosso backend e regra de negocio pronta podemos implementar nossas views e actions.

Application

Iniciando pelo nosso application que terá apenas as configurações do Swiz e uma instância de nossa view :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
	xmlns:mx="http://www.adobe.com/2006/mxml" 
	xmlns:swiz="http://swiz.swizframework.org"
	xmlns:views="br.com.flexria.views.*"
	layout="absolute" xmlns:local="*"
	creationPolicy="all"
	height="100%"
	width="100%">
 
	<local:ApplicationSwizConfig/>
 
	<views:ContactView 
		horizontalCenter="0" 
		verticalCenter="0"
		width="600"
		bottom="20" 
		top="20"/>
</mx:Application>

Views

A aplicação possui 2 view extremamente simples ContactView e PhoneView, sendo que a segunda será utilizado como filha da primeira:

ContactView.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Panel 
	xmlns:mx="http://www.adobe.com/2006/mxml"
	xmlns:views="br.com.flexria.views.*" 
 	creationComplete="{init()}"
 	title="Contatos">
	<mx:Script source="actions/ContactAction.as"/>
	<mx:ViewStack id="_vs" width="100%" height="100%">
		<mx:Canvas width="100%" height="100%" id="_canvasList">
			<mx:HBox left="20" right="20" top="5">
				<mx:Label text="Nome"/>
				<mx:TextInput id="_txFind" width="80%"/>
				<mx:Button label="Buscar" click="find()"/>
			</mx:HBox>
			<mx:DataGrid 
				id="_dataGrid"
				top="40"
				left="10"
				right="10"
				bottom="60" 
				doubleClick="update()"
				doubleClickEnabled="true"
				dataProvider="{contactController.dataProvider}" >
				<mx:columns>
					<mx:DataGridColumn headerText="Nome" 	dataField="name"/>
					<mx:DataGridColumn headerText="Email" 	dataField="email"/>
				</mx:columns>
			</mx:DataGrid>
			<mx:ControlBar bottom="10" width="95%" horizontalCenter="0" horizontalAlign="left" verticalAlign="middle">
				<mx:Button label="Novo" 	id="_btnCreate" 	click="{create()}"/>
				<mx:Button label="Editar" 	id="_btnUpdate" 	click="{update()}"		enabled="{_dataGrid.selectedItem!=null}"/>
				<mx:Button label="Remover" 	id="_btnRemove" 	click="{remove()}"		enabled="{_dataGrid.selectedItem!=null}"/>
			</mx:ControlBar>
		</mx:Canvas>
		<mx:Canvas  width="100%" height="100%" id="_canvasForm">
			<mx:TabNavigator width="100%" height="100%">
				<mx:Form 
					top="10"
					left="10"
					right="10"
					bottom="10" 
					borderStyle="solid" label="Contato">
					<mx:FormHeading label="{contact.id>0?'Editando':'Incluindo'} contato"/>
					<mx:FormItem label="Nome:" required="true">
						<mx:TextInput 
							width="339" 
							id="_txtName" 
							text="{contact.name}"/>
					</mx:FormItem>
					<mx:FormItem label="Email:">
						<mx:TextInput 
							width="339" 
							id="_txtEmail" 
							text="{contact.email}"/>
					</mx:FormItem>
					<mx:FormItem width="100%" direction="horizontal">
						<mx:Button label="Cancelar" id="_btnCancel" 	click="{cancel()}"/>
						<mx:Button label="Confirmar" id="_btnConfirm" 	click="{save()}"/>
					</mx:FormItem>
				</mx:Form>
                                <!--Instancia de PhoneView-->
				<views:PhoneView 
					id="_phoneView" 
					contact="{contact}" 
					label="Telefones" 
					enabled="{contact.id>0}"/>
			</mx:TabNavigator>
		</mx:Canvas>
	</mx:ViewStack>
</mx:Panel>

PhoneView.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas 
	xmlns:mx="http://www.adobe.com/2006/mxml" 
 	creationComplete="{init()}">
	<mx:Script source="actions/PhoneAction.as"/>
	<mx:ViewStack id="_vs" width="100%" height="100%">
		<mx:Canvas width="100%" height="100%" id="_canvasList">
			<mx:DataGrid 
				id="_dataGrid"
				top="10"
				left="10"
				right="10"
				bottom="60" 
				doubleClick="update()"
				doubleClickEnabled="true"
				dataProvider="{phoneController.dataProvider}" >
				<mx:columns>
					<mx:DataGridColumn headerText="Número" 	dataField="number"/>
				</mx:columns>
			</mx:DataGrid>
			<mx:ControlBar bottom="10" width="95%" horizontalCenter="0" horizontalAlign="left" verticalAlign="middle">
				<mx:Button label="Novo" 	id="_btnCreate" 	click="{create()}"/>
				<mx:Button label="Editar" 	id="_btnUpdate" 	click="{update()}"		enabled="{_dataGrid.selectedItem!=null}"/>
				<mx:Button label="Remover" 	id="_btnRemove" 	click="{remove()}"		enabled="{_dataGrid.selectedItem!=null}"/>
			</mx:ControlBar>
		</mx:Canvas>
		<mx:Canvas  width="100%" height="100%" id="_canvasForm">
			<mx:Form 
				top="10"
				left="10"
				right="10"
				bottom="10" 
				borderStyle="solid">
				<mx:FormHeading label="{phone.id>0?'Editando':'Incluindo'} telefone"/>
				<mx:FormItem label="Número:" required="true">
					<mx:TextInput 
						width="339" 
						id="_txtNumber" 
						text="{phone.number}"/>
				</mx:FormItem>
				<mx:FormItem width="100%" direction="horizontal">
					<mx:Button label="Cancelar" id="_btnCancel" 	click="{cancel()}"/>
					<mx:Button label="Confirmar" id="_btnConfirm" 	click="{save()}"/>
				</mx:FormItem>
			</mx:Form>
		</mx:Canvas>
	</mx:ViewStack>
</mx:Canvas>

Actions

E para finalizar as respectivas Actions para ContactView e PhoneView.
Essas action possuem os métodos que disparam os eventos de chamada ao servidor e métodos handler que serão chamados quando a requisição for completada.
Além disso temos a meta tag [Autowire] que faz a injeção do respectivo controller.
ContactAction.as

import br.com.flexria.controllers.ContactController;
import br.com.flexria.events.ContactEvent;
import br.com.flexria.vo.ContactVO;
import org.swizframework.Swiz;
import mx.events.CloseEvent;
import mx.controls.Alert;
 
 
[Bindable]
private var contact:ContactVO=new ContactVO();
 
[Bindable]
[Autowire]
public var contactController:ContactController;
 
/**
 * init()
 */
private function init():void
{
	find();
 
	Swiz.addEventListener(ContactEvent.SAVE_COMPLETE, saveCompleteHandler);
	Swiz.addEventListener(ContactEvent.REMOVE_COMPLETE, removeCompleteHandler);
}
 
/**
 * create()
 */
private function create():void
{
	contact=new ContactVO();
	_vs.selectedChild=_canvasForm;
}
 
/**
 * update()
 */
private function update():void
{
	contact=_dataGrid.selectedItem as ContactVO;
	_vs.selectedChild=_canvasForm;
}
 
/**
 * cancel()
 */
private function cancel():void
{
	contact=new ContactVO();
	_vs.selectedChild=_canvasList;
}
 
/**
 * find()
 */
private function find():void
{
	_vs.selectedChild=_canvasList;
	var event:ContactEvent=new ContactEvent(ContactEvent.FIND);
	event.contact=new ContactVO();
	event.contact.name=_txFind.text;
	Swiz.dispatchEvent(event);
}
 
/**
 * save()
 */
private function save():void
{
	contact.name=_txtName.text;
	contact.email=_txtEmail.text;
	var event:ContactEvent=new ContactEvent(ContactEvent.SAVE);
	event.contact=contact;
	Swiz.dispatchEvent(event);
}
 
/**
 * remove()
 */
private function remove():void
{
	Alert.show("Deseja realmente excluir o registro selecionado?", "Excluir", Alert.NO | Alert.YES | Alert.NONMODAL, null, function(e:CloseEvent):void
	{
		if (e.detail == Alert.YES)
		{
			contact=_dataGrid.selectedItem as ContactVO;
			var event:ContactEvent=new ContactEvent(ContactEvent.REMOVE);
			event.contact=contact;
			Swiz.dispatchEvent(event);
		}
	});
 
}
 
/**
 * saveCompleteHandler()
 */
private function saveCompleteHandler(event:Event):void
{
	_vs.selectedChild=_canvasList;
	find();
}
 
/**
 * removeCompleteHandler()
 */
private function removeCompleteHandler(event:Event):void
{
	_vs.selectedChild=_canvasList;
	find();
}

PhoneAction.as

import br.com.flexria.controllers.ContactController;
import br.com.flexria.controllers.PhoneController;
import br.com.flexria.events.ContactEvent;
import br.com.flexria.events.PhoneEvent;
import br.com.flexria.vo.ContactVO;
import br.com.flexria.vo.PhoneVO;
import org.swizframework.Swiz;
import mx.events.CloseEvent;
import mx.controls.Alert;
 
[Bindable]
private var _contact:ContactVO;
 
[Bindable]
private var phone:PhoneVO=new PhoneVO();
 
[Bindable]
[Autowire]
public var phoneController:PhoneController;
 
public function set contact(value:ContactVO):void
{
	_contact=value;
	if (_contact != null && _contact.id > 0)
	{
		load();
	}
}
 
/**
 * init()
 */
private function init():void
{
	Swiz.addEventListener(PhoneEvent.SAVE_COMPLETE, saveCompleteHandler);
	Swiz.addEventListener(PhoneEvent.REMOVE_COMPLETE, removeCompleteHandler);
}
 
/**
 * load()
 */
private function load():void
{
	_vs.selectedChild=_canvasList;
	var event:PhoneEvent=new PhoneEvent(PhoneEvent.LOAD);
	event.contact=_contact;
	Swiz.dispatchEvent(event);
}
 
/**
 * create()
 */
private function create():void
{
	phone=new PhoneVO();
	_vs.selectedChild=_canvasForm;
}
 
/**
 * update()
 */
private function update():void
{
	phone=_dataGrid.selectedItem as PhoneVO;
	_vs.selectedChild=_canvasForm;
}
 
/**
 * cancel()
 */
private function cancel():void
{
	phone=new PhoneVO();
	_vs.selectedChild=_canvasList;
}
 
/**
 * save()
 */
private function save():void
{
	phone.contactId=_contact.id;
	phone.number=_txtNumber.text;
	var event:PhoneEvent=new PhoneEvent(PhoneEvent.SAVE);
	event.phone=phone;
	Swiz.dispatchEvent(event);
}
 
/**
 * remove()
 */
private function remove():void
{
	Alert.show("Deseja realmente excluir o registro selecionado?", "Excluir", Alert.NO | Alert.YES | Alert.NONMODAL, null, function(e:CloseEvent):void
	{
		if (e.detail == Alert.YES)
		{
			phone=_dataGrid.selectedItem as PhoneVO;
			var event:PhoneEvent=new PhoneEvent(PhoneEvent.REMOVE);
			event.phone=phone;
			Swiz.dispatchEvent(event);
		}
	});
 
}
 
/**
 * saveCompleteHandler()
 */
private function saveCompleteHandler(event:Event):void
{
	_vs.selectedChild=_canvasList;
	load();
}
 
/**
 * removeCompleteHandler()
 */
private function removeCompleteHandler(event:Event):void
{
	_vs.selectedChild=_canvasList;
	load();
}

Assim finalizamos nossa aplicação !!!

O código fonte da aplicação pode ser baixado aqui

Espero que esse tutorial possa ser utíl aos desenvolvedores PHP que pretendem utilizar essa arquitetura em seus projetos e peço desculpas por algum erro ou se deixei de explicar algo durante o post.
Se houver alguma duvida podem podem perguntar via comentário no post ou email Q respondo na medida do possível..

Abraço a todos e até a próxima !!!!

Tutorial : Lumine + ZendAmf + Flex 1/5
Tutorial : Lumine + ZendAmf + Flex 2/5
Tutorial : Lumine + ZendAmf + Flex 3/5
Tutorial : Lumine + ZendAmf + Flex 4/5
Tutorial : Lumine + ZendAmf + Flex 5/5

Fev 22

Lumine + ZendAmf + Flex 4/5

Escrito por Fábio Batista da Silva em 1, 4, 6, action, Adobe Flex, AMF, AR, auto, BI, Bindable, boolean, class, classe, classes, collection, control, Controls, DataProvider, demo, Dica, dispatch, dispatchEvent, email, err, erro, error, event, Evento, Eventos, events, flash, Flex, Flex 2, Flex 3, Flex 4, for, framework, function, handle, ide, IE, if, int, Java, lista, map, MXML, Number, O, on, override, Pessoal, PHP, Remoting, RIA, Ria’s Geral, RoR, servidor, string, Sun, tag, TAT, Tutorial, tv, UI, uint, XML, zend, zendAMF, zendFramework @ 02 22nd, 2010 | via http://www.flexria.com.br/home | Sem comentários
Fábio Batista da Silva
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Lumine + ZendAmf + Flex 4/5

Olá pessoal !!!

Vamos dar continuidade a nossa serie de posts.
no ultimo posto configuramos da nossa aplicação flex, e agora iremos implementar nossas classes de modelo e regra de negocio.

VOs

Começamos criando nossos os VO’s/DTO’s, copias das classes que temos no PHP.
Possuem apenas seus atributos e as meta tag [Bindable] [RemoteClass(alias="xxx")]
Quem Tornam o objeto bindable e mapeiam a classe equivalente no PHP respectivamente.
br.com.flexria.vo.ContactVO e br.com.flexria.vo.PhoneVO

package br.com.flexria.vo
{
	/**
	 * @author Fabio B. Silva
	 */
	[Bindable]
	[RemoteClass(alias="ContactVO")]
	public class ContactVO
	{
		public var id:uint;
		public var name:String;
		public var email:String;
		public var phoneCollection:Array;
 
	}
}
 
package br.com.flexria.vo
{
	/**
	 * @author Fabio B. Silva
	 */
	[Bindable]
	[RemoteClass(alias="PhoneVO")]
	public class PhoneVO
	{
		public var id:uint;
		public var number:String;
		public var contactId:uint;
 
	}
}

Events

E agora os eventos de nossa aplicação que serão utilizados pelo Swiz.
Cada evento possui 6 constantes estáticas que identificarão o evento de chamada ao servidor e o evento de resposta.
br.com.flexria.events.ContactEvent e br.com.flexria.events.PhoneEvent

package br.com.flexria.events
{
	import br.com.flexria.vo.ContactVO;
	import flash.events.Event;
 
	/**
	 * @author Fabio B. Silva
	 */
	public class ContactEvent extends Event
	{
		public static const FIND		:String='ContactEvent.FIND';
		public static const SAVE		:String='ContactEvent.SAVE';
		public static const REMOVE		:String='ContactEvent.REMOVE';
		public static const FIND_COMPLETE	:String='ContactEvent.FIND_COMPLETE';
		public static const SAVE_COMPLETE	:String='ContactEvent.SAVE_COMPLETE';
		public static const REMOVE_COMPLETE	:String='ContactEvent.REMOVE_COMPLETE';
 
 
		public var contact:ContactVO;
 
		public function ContactEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
		{
			super(type, bubbles, cancelable);
		}
 
		public override function clone():Event
		{
			return new ContactEvent(type, bubbles, cancelable);
		}
 
	}
}
 
package br.com.flexria.events
{
	import br.com.flexria.vo.ContactVO;
	import br.com.flexria.vo.PhoneVO;
	import flash.events.Event;
 
	/**
	 * @author Fabio B. Silva
	 */
	public class PhoneEvent extends Event
	{
		public static const LOAD		:String='PhoneEvent.LOAD';
		public static const SAVE		:String='PhoneEvent.SAVE';
		public static const REMOVE		:String='PhoneEvent.REMOVE';
		public static const LOAD_COMPLETE	:String='PhoneEvent.LOAD_COMPLETE';
		public static const SAVE_COMPLETE	:String='PhoneEvent.SAVE_COMPLETE';
		public static const REMOVE_COMPLETE	:String='PhoneEvent.REMOVE_COMPLETE';
 
 
		public var phone:PhoneVO;
		public var contact:ContactVO;
 
		public function PhoneEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
		{
			super(type, bubbles, cancelable);
		}
 
		public override function clone():Event
		{
			return new PhoneEvent(type, bubbles, cancelable);
		}
 
	}
}

Delegates

Vamos então aos delegates que farão as chamadas as métodos remotos do PHP.
Apenas três métodos em cada um deles, para salvar/remover/listar.
Além disso temos a meta tag [Autowire(bean="xxx")] que indica ao Swiz que ali deve ser injetado o bean “xxx” mapeado no BeanLoader.

br.com.flexria.delegates.ContactDelegate e br.com.flexria.delegates.PhoneDelegate

package br.com.flexria.delegates
{
	import mx.rpc.remoting.mxml.RemoteObject;
	import br.com.flexria.vo.ContactVO;
	import mx.rpc.AsyncToken;
 
	/**
	 * @author Fabio B. Silva
	 */
	public class ContactDelegate
	{
		[Autowire(bean="contactRemote")]
		public var contactRemote:RemoteObject;
 
		/**
		 * find()
		 *
		 * @param 	contact:ContactVO
		 * @return 	AsyncToken
		 */
		public function find(contact:ContactVO):AsyncToken
		{
			return contactRemote.find(contact);
		}
 
		/**
		 * save()
		 *
		 * @param 	contact:ContactVO
		 * @return 	AsyncToken
		 */
		public function save(contact:ContactVO):AsyncToken
		{
			return contactRemote.save(contact);
		}
 
		/**
		 * remove()
		 *
		 * @param 	contact:ContactVO
		 * @return 	AsyncToken
		 */
		public function remove(contact:ContactVO):AsyncToken
		{
			return contactRemote.remove(contact);
		}
 
	}
}
 
 
package br.com.flexria.delegates
{
	import mx.rpc.remoting.mxml.RemoteObject;
	import br.com.flexria.vo.ContactVO;
	import br.com.flexria.vo.PhoneVO;
	import mx.rpc.AsyncToken;
 
	/**
	 * @author Fabio B. Silva
	 */
	public class PhoneDelegate
	{
		[Autowire(bean="phoneRemote")]
		public var phoneRemote:RemoteObject;
 
		/**
		 * load()
		 *
		 * @param 	contact:ContactVO
		 * @return 	AsyncToken
		 */
		public function load(contact:ContactVO):AsyncToken
		{
			return phoneRemote.load(contact);
		}
 
		/**
		 * save()
		 *
		 * @param 	phone:PhoneVO
		 * @return 	AsyncToken
		 */
		public function save(phone:PhoneVO):AsyncToken
		{
			return phoneRemote.save(phone);
		}
 
		/**
		 * remove()
		 *
		 * @param 	phone:PhoneVO
		 * @return 	AsyncToken
		 */
		public function remove(phone:PhoneVO):AsyncToken
		{
			return phoneRemote.remove(phone);
		}
 
	}
}

Controllers

Agora podemos implementar nosso controladores.
Eles estendem a classe org.swizframework.controller.AbstractController
e possuem 3 métodos publicos para salvar, remover e listar.
Esses métodos são mapeados pelo Swiz atraves da meta tag [Mediate(event='xxx')] que indica ao Swiz que sempre que o evento ‘xxx’ for disparado esse método deve ser chamado

package br.com.flexria.controllers
{
	import org.swizframework.controller.AbstractController;
	import br.com.flexria.delegates.ContactDelegate;
	import br.com.flexria.events.ContactEvent;
	import mx.collections.ArrayCollection;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.events.FaultEvent;
	import org.swizframework.Swiz;
	import mx.controls.Alert;
 
 
	/**
	 * @author Fabio B. Silva
	 */
	[Bindable]
	public class ContactController extends AbstractController
	{
		[Autowire]
		public var contactDelegate:ContactDelegate;
 
		public var dataProvider:ArrayCollection;
 
 
		/**
		 * find()
		 *
		 * @param 	e:ContactEvent
		 */
		[Mediate(event='ContactEvent.FIND')]
		public function find(e:ContactEvent):void
		{
			executeServiceCall(contactDelegate.find(e.contact), findHandler, faultHandler);
		}
 
		/**
		 * save()
		 *
		 * @param 	e:ContactEvent
		 */
		[Mediate(event='ContactEvent.SAVE')]
		public function salve(e:ContactEvent):void
		{
			executeServiceCall(contactDelegate.save(e.contact), saveHandler, faultHandler);
		}
 
		/**
		 * remove()
		 *
		 * @param 	e:ContactEvent
		 */
		[Mediate(event='ContactEvent.REMOVE')]
		public function remove(e:ContactEvent):void
		{
			executeServiceCall(contactDelegate.remove(e.contact), removeHandler, faultHandler);
		}
 
		/**
		 * findHandler()
		 *
		 * @param 	e:ResultEvent
		 */
		private function findHandler(e:ResultEvent):void
		{
			dataProvider=new ArrayCollection(e.result as Array);
			Swiz.dispatchEvent(new ContactEvent(ContactEvent.FIND_COMPLETE));
		}
 
		/**
		 * saveHandler()
		 *
		 * @param 	e:ResultEvent
		 */
		private function saveHandler(e:ResultEvent):void
		{
			Swiz.dispatchEvent(new ContactEvent(ContactEvent.SAVE_COMPLETE));
		}
 
		/**
		 * removeHandler()
		 *
		 * @param 	e:ResultEvent
		 */
		private function removeHandler(e:ResultEvent):void
		{
			Swiz.dispatchEvent(new ContactEvent(ContactEvent.REMOVE_COMPLETE));
		}
 
		/**
		 * faultHandler()
		 *
		 * @param 	e:FaultEvent
		 */
		private function faultHandler(e:FaultEvent):void
		{
			Alert.show(e.fault.message, "ERROR");
		}
 
	}
}
 
 
package br.com.flexria.controllers
{
	import org.swizframework.controller.AbstractController;
	import br.com.flexria.delegates.PhoneDelegate;
	import br.com.flexria.events.PhoneEvent;
	import mx.collections.ArrayCollection;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.events.FaultEvent;
	import org.swizframework.Swiz;
	import mx.controls.Alert;
 
 
	/**
	 * @author Fabio B. Silva
	 */
	[Bindable]
	public class PhoneController extends AbstractController
	{
		[Autowire]
		public var phoneDelegate:PhoneDelegate;
 
		public var dataProvider:ArrayCollection;
 
 
		/**
		 * find()
		 *
		 * @param 	e:PhoneEvent
		 */
		[Mediate(event='PhoneEvent.LOAD')]
		public function find(e:PhoneEvent):void
		{
			executeServiceCall(phoneDelegate.load(e.contact), loadHandler, faultHandler);
		}
 
		/**
		 * save()
		 *
		 * @param 	e:PhoneEvent
		 */
		[Mediate(event='PhoneEvent.SAVE')]
		public function salve(e:PhoneEvent):void
		{
			executeServiceCall(phoneDelegate.save(e.phone), saveHandler, faultHandler);
		}
 
		/**
		 * remove()
		 *
		 * @param 	e:PhoneEvent
		 */
		[Mediate(event='PhoneEvent.REMOVE')]
		public function remove(e:PhoneEvent):void
		{
			executeServiceCall(phoneDelegate.remove(e.phone), removeHandler, faultHandler);
		}
 
 
 
 
		/**
		 * findHandler()
		 *
		 * @param 	e:ResultEvent
		 */
		public function loadHandler(e:ResultEvent):void
		{
			dataProvider=new ArrayCollection(e.result as Array);
			Swiz.dispatchEvent(new PhoneEvent(PhoneEvent.LOAD_COMPLETE));
		}
 
		/**
		 * saveHandler()
		 *
		 * @param 	e:ResultEvent
		 */
		public function saveHandler(e:ResultEvent):void
		{
			Swiz.dispatchEvent(new PhoneEvent(PhoneEvent.SAVE_COMPLETE));
		}
 
		/**
		 * removeHandler()
		 *
		 * @param 	e:ResultEvent
		 */
		public function removeHandler(e:ResultEvent):void
		{
			Swiz.dispatchEvent(new PhoneEvent(PhoneEvent.REMOVE_COMPLETE));
		}
 
		/**
		 * faultHandler()
		 *
		 * @param 	e:FaultEvent
		 */
		public function faultHandler(e:FaultEvent):void
		{
			Alert.show(e.fault.message, "ERROR");
		}
 
	}
}

Com nossa regra de negocio pronta podemos implementar nossas views e actions.
que é o assunto do próximo post : Tutorial : Lumine + ZendAmf + Flex 5/5

Até já !!!

Tutorial : Lumine + ZendAmf + Flex 1/5
Tutorial : Lumine + ZendAmf + Flex 2/5
Tutorial : Lumine + ZendAmf + Flex 3/5
Tutorial : Lumine + ZendAmf + Flex 4/5
Tutorial : Lumine + ZendAmf + Flex 5/5

Fev 22

Lumine + ZendAmf + Flex 3/5

Escrito por Fábio Batista da Silva em 1, 4, 6, Adobe, Adobe Flex, AMF, app, AR, as3, auto, back, backend, bug, class, control, Debug, demo, event, events, Flex, Flex 2, Flex 3, Flex 4, for, framework, frontend, IE, if, image, int, map, Messaging, mg, MXML, O, on, Pessoal, PHP, Projetos, pt, Remoting, RIA, Ria’s Geral, Swiz Framework, Tutorial, UI, uint, XML, zend, zendAMF, zendFramework @ 02 22nd, 2010 | via http://www.flexria.com.br/home | Sem comentários
Fábio Batista da Silva
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Lumine + ZendAmf + Flex 3/5

Olá pessoal !!!

Vamos dar continuidade aos posts anteriores que trataram do Backend da nossa aplicação.
Nesse post vamos codificar o frontend da nossa aplicação, para isso vamos utilizar a dubla que se tornou titular em meus projetos : Flex + Swiz framework.

Flex Project

A estrutura do nosso Flex Project fica da seguinte forma :

Estrutura do projeto flex

Estrutura do projeto flex

Flex Compiler

Como estamos usando Swiz e as configurações de remote através do services.xml precisamos adicionar alguns argumento ao Flex Compiler, nesse caso ficou assim : -locale en_US -services=..services.xml -keep-as3-metadata+=Autowire.

RemotingService

Agora podemos configurar nosso RemotingService com o arquivo services.xml
Lembrando que o endpoint uri deve ser alterado para apontar para o seu projeto php
services.xml

<?xml version="1.0" encoding="UTF-8"?>
<services-config>
    <services>
        <service id="zend-service"
            class="flex.messaging.services.RemotingService"
            messageTypes="flex.messaging.messages.RemotingMessage">
            <destination id="zend">
                <channels>
                    <channel ref="zend-endpoint"/>
                </channels>
                <properties>
                    <source>*</source>
                </properties>
            </destination>
        </service>
    </services>
    <channels>
        <channel-definition id="zend-endpoint"
            class="mx.messaging.channels.AMFChannel">
            <endpoint uri="http://localhost/lumine-zend-flex/php/gateway.php"
                class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>
    </channels>
</services-config>

Swiz

Então podemos configurar o Swiz para isso temos 2 arquivos :
ApplicationSwizConfig.mxml : Responsável pelas configurações básicas do Swiz
ApplicationBeans.mxml : Responsável pelo mapeamento dos nossos beans

ApplicationSwizConfig.mxml

<?xml version="1.0" encoding="utf-8"?>
<swizframework:SwizConfig
	xmlns:mx="http://www.adobe.com/2006/mxml" 
	xmlns:swizframework="org.swizframework.*"
	eventPackages="{['br.com.flexria.events']}"
	viewPackages="{['br.com.flexria.view']}"
	logEventLevel="{LogEventLevel.DEBUG}"
	beanLoaders="{[ApplicationBeans]}"
	injectionEvent="preinitialize"
	mediateBubbledEvents="true"
	strict="true">
 
	<mx:Script>
		<![CDATA[
			import mx.logging.LogEventLevel;
		]]>
	</mx:Script>
 
	<mx:TraceTarget id="logTarget"
		includeCategory="true"
	    includeLevel="true" 
	    includeDate="true" 
	    includeTime="true"/>
 
</swizframework:SwizConfig>

ApplicationBeans.mxml

<?xml version="1.0" encoding="utf-8"?>
<BeanLoader xmlns="org.swizframework.util.*"
		xmlns:mx="http://www.adobe.com/2006/mxml"
		xmlns:factory="org.swizframework.factory.*"
		xmlns:delegates="br.com.flexria.delegates.*"
		xmlns:controllers="br.com.flexria.controllers.*">
 
   <!--DELEGATES-->
   <delegates:ContactDelegate 	id="contactDelegate"/>
   <delegates:PhoneDelegate 	id="phoneDelegate"/>
 
   <!--CONTROLLERS-->
   <controllers:ContactController   id="contactController"/>
   <controllers:PhoneController   id="phoneController"/>
 
   <!--REMOTES-->
   <mx:RemoteObject destination="zend"   id="contactRemote" source="ContactService" />
   <mx:RemoteObject destination="zend"   id="phoneRemote"   source="PhoneService" />
 
</BeanLoader>

Agora que temos nosso projeto flex configurado e podemos começar a codificar p valer : Tutorial : Lumine + ZendAmf + Flex 4/5

Até já !!!

Tutorial : Lumine + ZendAmf + Flex 1/5
Tutorial : Lumine + ZendAmf + Flex 2/5
Tutorial : Lumine + ZendAmf + Flex 3/5
Tutorial : Lumine + ZendAmf + Flex 4/5
Tutorial : Lumine + ZendAmf + Flex 5/5

Fev 22

Lumine + ZendAmf + Flex 2/5

Escrito por Fábio Batista da Silva em 1, 4, 6, Adobe Flex, AMF, AR, arte, auto, back, backend, camp, class, classe, classes, código, collection, dados, demo, Desenvolvimento, email, Flex, Flex 2, Flex 3, Flex 4, for, framework, function, html, IE, int, lista, Number, O, on, Outros, padrão, Pessoal, PHP, Projetos, rest, RIA, Ria’s Geral, serviço, Tutorial, tv, UI, update, XP, zend, zendAMF, zendFramework @ 02 22nd, 2010 | via http://www.flexria.com.br/home | Sem comentários
Fábio Batista da Silva
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Lumine + ZendAmf + Flex 2/5

Olá pessoal !!!

No post anterior configuramos nosso projeto php com Lumine e ZendAmf.
Essa parte que veremos agora se refere as nossas classes de “modelo” : VO’s e ActiveRecord’s.
Pode parecer meio confuso ou “Muito código” porem tudo isso pode ser gerado no Lumine de maneira bem pratica e rápida através do Lumine reverse.

Entaum vamos lá !!!

ActiveRecord

O Lumine é um ORM Brasileiro para php que utiliza ActiveRecord.
Eu particularmente não gosto muito do padrão ActiveRecord nem do Lumine
porem outros ORM para php como Doctrine e Zend_Db não possuem integração com VO’s/DTO’s.
Então acabei adotando ele como padrão para meus projetos flex + php devido a agilidade no desenvolvimento.

as classes de ActiveRecord estendem o Lumine_Base e possuem o método _initialize que configura os campos da tabela e seus relacionamentos.
Temos então duas classes Contact e Phone.

models/entities/Contact.php e models/entities/Phone.php

class Contact extends Lumine_Base {
 
    protected $_tablename = 'contact';
    protected $_package   = 'models.entities';
 
    public $id;
    public $name;
    public $email;
 
    public $phoneCollection = array();
 
    /**
     * Inicia os valores da classe
     * @return void
     */
    protected function _initialize() {
 
        $this->_addField("id",      "id",       "int",      10,     array('primary' => true, 'notnull' => true, 'autoincrement' => true));
        $this->_addField("name",    "name",     "varchar",  200,    array('notnull' => true));
        $this->_addField("email",   "email",    "varchar",  200,    array());
 
        $this->_addForeignRelation("phoneCollection", self::ONE_TO_MANY, "Phone", "contactId", null, null, null);
    }
}
 
 
class Phone extends Lumine_Base {
 
    protected $_tablename = 'phone';
    protected $_package   = 'models.entities';
 
    public $id;
    public $number;
    public $contactId;
 
    /**
     * Inicia os valores da classe
     * @return void
     */
    protected function _initialize() {
        $this->_addField("id",      "id",       "int",      10,     array('primary' => true, 'notnull' => true, 'autoincrement' => true));
        $this->_addField("number",  "number",   "varchar",  45,     array());
 
        $this->_addField("contactId","contactId",  "int", 10, array(
                'notnull' => true,
                'foreign' => '1',
                'onUpdate' => 'RESTRICT',
                'onDelete' => 'RESTRICT',
                'linkOn' => 'id',
                'class' => 'Contact')
        );
    }
}

VO

Temos também os seus respectivos VO’s/DTO’s para o transporte do dados entre o php e o flex:models/vo/ContactVO.php e models/vo/PhoneVO.php

class ContactVO {
 
    public $id;
    public $name;
    public $email;
    public $phoneCollection = array();
 
    public $_explicitType = 'ContactVO';
}
 
class PhoneVO {
 
    public $id;
    public $number;
    public $contactId;
 
    public $_explicitType = 'PhoneVO';
}

Services

E finalmente nossas classes de serviço apenas três métodos para: salvar, remover e listar:
services/ContactService.php e services/PhoneService.php

class ContactService {
 
    /**
     * @var Contact
     */
    private $contact;
 
    /**
     * construct
     */
    public function __construct() {
        $this->contact = new Contact();
    }
 
    /**
     * getContact()
     *
     * @return Contact
     */
    public function getContact() {
        return $this->contact;
    }
 
    /**
     * findAll()
     *
     * @param   ContactVO $contact
     * @return  array<ContactVO>
     */
    public function find(ContactVO $contact) {
        $this->getContact()->find();
        return $this->getContact()->allToObject();
    }
 
    /**
     * save()
     *
     * @param  ContactVO $contact
     * @return ContactVO $contact
     */
    public function save(ContactVO $contact) {
        $this->getContact()->setFrom($contact);
        $this->getContact()->save();
        return $this->getContact()->toObject();
    }
 
    /**
     * remove()
     *
     * @param  ContactVO $contact
     * @return ContactVO $contact
     */
     public function remove(ContactVO $contact) {
        $phone = new Phone();
        $phone->where("contactId = '{$contact->id}'");
        $phone->delete(true);
 
        $this->getContact()->setFrom($contact);
        $this->getContact()->delete();
        return $this->getContact()->toObject();
    }
}
 
 
 
class PhoneService {
 
    /**
     * @var Phone
     */
    private $phone;
 
    /**
     * construct
     */
    public function __construct() {
        $this->phone = new Phone();
    }
 
    /**
     * getPhone()
     *
     * @return Phone
     */
    public function getPhone() {
        return $this->phone;
    }
 
    /**
     * load()
     *
     * @param   ContactVO $contact
     * @return  array<PhoneVO>
     */
    public function load(ContactVO $contact) {
        $this->getPhone()->where("contactId = '{$contact->id}'");
        $this->getPhone()->find();
        return $this->getPhone()->allToObject();
    }
 
    /**
     * save()
     *
     * @param  PhoneVO $phone
     * @return PhoneVO $phone
     */
    public function save(PhoneVO $phone) {
        $this->getPhone()->setFrom($phone);
        $this->getPhone()->save();
        return $this->getPhone()->toObject();
    }
 
    /**
     * remove()
     *
     * @param  PhoneVO $phone
     * @return PhoneVO $phone
     */
    public function remove(PhoneVO $phone) {
        $this->getPhone()->setFrom($phone);
        $this->getPhone()->delete();
        return $this->getPhone()->toObject();
    }
 
}

Com isso finalizamos tudo que precisamos em nosso Backend
e podemos partir para a aplicação flex : Tutorial : Lumine + ZendAmf + Flex 3/5

Até já !!!

Tutorial : Lumine + ZendAmf + Flex 1/5
Tutorial : Lumine + ZendAmf + Flex 2/5
Tutorial : Lumine + ZendAmf + Flex 3/5
Tutorial : Lumine + ZendAmf + Flex 4/5
Tutorial : Lumine + ZendAmf + Flex 5/5

Fev 22

Lumine + ZendAmf + Flex 1/5

Escrito por Fábio Batista da Silva em 1, 4, 6, abas, Adobe Flex, AMF, app, AR, auto, back, backend, BI, class, classe, classes, código, configuração, dados, demo, Dica, Download, email, engine, err, erro, error, Flex, Flex 2, Flex 3, Flex 4, for, framework, function, game, handle, IE, image, int, library, Links, mg, mysql, Number, O, on, Password, Pessoal, PHP, Projetos, pt, reference, RIA, Ria’s Geral, RoR, server, Tecnologia, Tutorial, UI, uint, zend, zendAMF, zendFramework @ 02 22nd, 2010 | via http://www.flexria.com.br/home | Sem comentários
Fábio Batista da Silva
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Lumine + ZendAmf + Flex 1/5

Olá pessoal !!!

Peço desculpas para os iniciantes mas este tutorial vai ser p pessoal + avançado, Então temos como requisito para esse tutorial que o leitor tenha um conhecimento básico de Lumine, ZendAmf e Flex.
Vou tentar focar na integração e não nas tecnologias utilizadas. Então vai ser bastante código e pouca teoria.

Parar o Backend vamos utilizar um trio que p mim tem se mostrado bastante produtivo nos últimos projetos e que pode ser baixada nos seguintes links: MYSQL + Lumine + ZendAmf

Base de Dados

Nossa base de dados será bem simples apenas 2 tabelas com um relacionamento 1 X N:

CREATE  DATABASE `lumine_zend_flex`;
 
CREATE TABLE  `contact` (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL,
  `email` varchar(200) DEFAULT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;
 
CREATE TABLE  `phone` (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `number` varchar(45) NOT NULL,
  `contactId` int(10) UNSIGNED NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `fk_phone_contact` (`contactId`),
  CONSTRAINT `fk_phone_contact` FOREIGN KEY (`contactId`) REFERENCES `contact` (`id`)
) ENGINE=InnoDB;

PHP Project

Bom, depois das libs baixadas e da base instalada vamos configurar nosso projeto php.
A estrutura fica da seguinte forma :

Estrutura do projeto php

Estrutura do projeto php

Arquivos de configuração

Temos 2 arquivos de configuração em nosso projeto
gateway.php : gateway para chamadas amf
lumine-conf.php : Arquivo de configuração do Lumine

gateway.php

//adiciona diretorios ao include path
set_include_path('.'
        . PATH_SEPARATOR . './library/'
        . PATH_SEPARATOR . './services/'
        . PATH_SEPARATOR . './models/vo/'
        . PATH_SEPARATOR . './models/entities/'
        . PATH_SEPARATOR . get_include_path()
);
 
 
//inclui bibliotecas
require_once 'lumine-conf.php';
require_once 'Lumine/Lumine.php';
require_once 'Zend/Loader/Autoloader.php';
require_once 'ApplicationLoader.php';
 
 
 
//seta tempo infinito de execucao
set_time_limit(0);
 
//Mostrar todos os erros independente qual seja
error_reporting(E_ALL|E_STRICT);
 
// indica o timezone padrao
date_default_timezone_set('Brazil/East');
 
// auto-carregamento de classes de Lumine
spl_autoload_register(array('Lumine','Import'));
 
// auto-carregamento de classes DTO de Lumine
spl_autoload_register(array('Lumine','ImportDTO'));
 
// instancia uma configuracao do lumine
$cfg = new Lumine_Configuration($lumineConfig);
 
// registra uma funcao para o fechamento da conexao ao termino do script
register_shutdown_function(array($cfg->getConnection(),'close'));
 
// carregamento automatico das classes zend
Zend_Loader_Autoloader::getInstance();
 
// carregamento automatico das classes da aplicação
ApplicationLoader::getInstance();
 
$server = new Zend_Amf_Server();
$server->addDirectory('./services/');
$server->addDirectory('./models/vo/');
echo($server->handle());

lumine-conf.php

$lumineConfig = array(
        'dialect'   => 'MySQL',
        'port'      => '3306',
        'user'      => 'xxxx',
        'password'  => 'xxxx',
        'host'      => 'localhost',
        'database'  => 'lumine_zend_flex',
        'package'   => 'models.entities',
        'class_path'=> 'xxxx\www\lumine-zend-flex\php',
 
        'options' => array(
                'auto_cast_dto' => '1',
                'dto_format'    => '%sVO',
                'dto_package'   => 'models.vo',
        )
);

Com isso finalizamos a configuração da Base de dados, Lumine e ZendAmf.
Agora podemos partir para a configuração das nossas classes de modelo de dados:
Tutorial : Lumine + ZendAmf + Flex 2/5

Até já !!!

Tutorial : Lumine + ZendAmf + Flex 1/5
Tutorial : Lumine + ZendAmf + Flex 2/5
Tutorial : Lumine + ZendAmf + Flex 3/5
Tutorial : Lumine + ZendAmf + Flex 4/5
Tutorial : Lumine + ZendAmf + Flex 5/5

Jan 31

AMFPHP ou ZendAmf

Escrito por Eduardo Kraus em AMF, amfphp, AR, Comunicação de Dados, Curso, Cursos, Desenvolvimento, exemplo, Flex, framework, Monitoramento, O, on, PHP, pt, Ria’s Geral, Software, UI, validação, XML, zend, Zend Framework, zendAMF @ 01 31st, 2010 | via http://blog.mxml.com.br | 1 comentário
Eduardo Kraus
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Uma discussão que esta em alta é em relação a velocidade do ZendAmf. O ZendAmf é realmente mais lento por possuir recursos extras e ser baseado no Zend Framework.

Eu já fiz a validação do XML ou AMFPHP, e nesta mostrei que o AMFPHP é muito mais rápido que o XML.

Então aproveitando o exemplo mostro que o AMFPHP ainda continua mais rápido que o ZendAmf e por isso muitos programadores ainda optem por este no desenvolvimento de seus softwares.

Out 7

Ved Cookbook – episódio 3 – Configurando e Utilizando o ZendAMF

Escrito por Ved em AMF, Cookbook, Desenvolvimento, Flex, PHP, Screencast, Zend Framework, zendAMF @ 10 7th, 2009 | via http://www.vedovelli.com.br | Sem comentários
Ved
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Neste episódio será feita a configuração do ZendAMF, utilizado para conectar uma interface Flex ao PHP. O código gerado durante a gravação está disponível ao final do post.
Dica: assista em tela cheia.

Ved Cookbook – episódio 3 – ZendAMF from Fabio Vedovelli on Vimeo.
>

Assistir no Vimeo
Assistir no Blip.tv
Conhecer meu canal no Blip.tv
Assinar no iTunes
Use o RSS [...]

« Entradas anteriores | Entradas recentes »

ACERCA

O que é o RedeRIA ?

O redeRIA não é nada mais que um agregador de feed's que disponibiliza o conteudo de varios blogs e autores ao redor do mundo RIA, actualmente agregamos mais de 2791 entradas vindas de 53 blogs especializados em ria’s, pelo que só fica a ganhar em assinar o feed ou seguir a comunidade no twitter.

Se acha que o seu blog ou um blog de um amigo é interessante e util para os leitores o redeRIA, faça a sua submissão aqui.

Feed: assine já
Twitter: siga-nos

GOOGLE

Votação


Deveria o RedeRia agregar conteúdo em inglês?
Ver Resultados

AUTORES


Eduardo KrausAlexandre TadashiBindableCognitiva SoluçõesDaniel LopesDaniel SchmitzDanielPedrinhaDClick TeamEbercomEdgard DavidsonElvis FernandesErko BrideeFabiel PrestesFábio Batista da SilvaFabio da SilvaFabriccio BernardesFelipe BorellaFlavia MoreiraGabriel VersalliniGabriela T. PerryIgor MusardoJanderson CardosoJoão AugustoJose Carlos FielKelps SousaLeonardo FrançaLucas MarçalLuis MessiasLuiz TarabalMario JuniorMário SantosMauro MartinsPablo SouzaPedro ClaudioreneRia BrazilriaPTRicardo CerqueiraRobson FernandesRodrigo Pereira FragaSaintBrSamuelFacchinelloSergio SouzaSilva DeveloperStefan HorochovecTech CaffeTecinforThiago BuenoVedVinícius SandimWillian ManoXAML Cast

PUBLICIDADE








Powered by Wordpress & msdevstudio.com