eu assisti aqui no MIX10 a uma belissima palestra sobre como mensurar o que o usuário faz numa aplicação Silverlight (desde cliques até consumo de vídeos) e reportar isso para um serviço de analytics. pra minha e nossa alegria esse framework…(read more)
Microsoft Innovation Day Curitiba 2010
Fique por dentro das novas tecnologias da Microsoft em um evento presencial na cidade Curitiba realizado pelo Centro de Inovação da Microsoft.
Data: 27/03/2010 (Sábado)
Horário: 09h00min às 16h50min
Local: Auditório do Centro Tecnológico da Universidade Positivo (Rua Alf. Ângelo Sampaio,2300)
Inscrições: Clique aqui e faça a sua inscrição. Vagas limitadas!
Entrada: Uma lata de leite em pó.
Confira a programação
| 09:00h | Welcome Coffee |
| 09:30h | Abertura: Apresentação de parceiros |
| 09:50h | Palestra: Windows Azure e a plataforma Cloud Computing
Palestrante: Waldermir Cambiucci, Microsoft Brasil. |
| 10:40h | Palestra: Obtendo sua certificação Microsoft
Palestrante: Thiago Henrique Zen, MIC Curitiba. |
| 10:50h | Palestra: Microsoft Smooth HD. |
| Palestrante: Márcio Gomes, (MCPD/MCT), TechResult | |
| 11:40h | Palestra: Segurança da Informação com ferramentas Microsoft
Palestrante: Herbert Moroni, 4sec Brasil. |
| 12:30h | Intervalo |
| 14:00h | Palestra: Novidades da .NET Framework 4.0
Palestrante: Diego Rodrigo Neufert (MVP), ALL-América Latina Logística. |
| 14:50h | Palestra: Linguagens Dinâmicas
Palestrante: Marcelo D’Ávila de Pauli (MVP), TechResult. |
| 15:40h | Palestra: Ferramentas de Arquitetura e Desenvolvimento com Visual Studio 2010 Ultimate.
Palestrante: Daniel Oliveira (MVP), TechResult. |
| 16:30h | Encerramento: Sorteio de Brindes |
Eu já fiz a minha inscrição! Nos encontramos lá!
XAMLCast – 2a Temporada – Episódio 9 – Finger Style, SLARToolkit, Windows Phone 7 e pré-MIX10
Olá olá pessoal!

Este é o XAMLCast pré-MIX10.
Estamos ansiosos para a chegada deste grande evento que irá nos trazer grandes novidades e anúncios. E para nossa alegria, e como já havíamos falado antes, o XAMLCaster Kelps estará em Las Vegas cobrindo o evento e enviando tudo em primeira mão!
Neste episódio falamos de:
- Finger Style – Artigo fantástico do Charles Petzold sobre Multitouch em Silverlight
- MultiTouchVista – simulador de multitouch com múltiplos mouses para Windows
- Artigo do Roberto Sonnino (em inglês) sobre touch com WPF e MultiTouchVista
- SLARToolkit – A experiência de AR (Realidade Aumentada) com Silverlight virou um framework
- Aplicação do correio americano para tamanhos de caixas com AR
-
Não confunda:
- Blender – programa de modelagem 3D
- Balder – engine 2D/3D que funciona com Silverlight
- Blend – ferramenta para design de aplicações WPF/Silverlight
- Concurso de Silverlight/WPF da Magenic Studios – prêmios até 500 US$ + 3000 US$ pro Haiti
- Copa de Talentos Microsoft
- Anuncio oficial do Silverlight no Windows Phone 7
- Video no TechEd Middle East mostrando XNA no Windows Phone, Xbox e Windows
- MIX10
- HVP no MIX
- Video do ScottGu no Channel 9 falando sobre o MIX
Bolão do MIX10!
Envie sua previsão do que irá acontecer no MIX10. Para participar, basta referenciar a hashtag #bolaoxamlcast no seu post do twitter.
Ajudem o XAMLCast a entrevistar o ScottGu no MIX10
Envie um tweet (em inglês) para @ScottGu pedindo uma entrevista com o @XAMLCast (Brazilian Podcast) ou @kelps.Com muitos pedindo, o acesso torna-se mais fácil.
Se quiserem, podem pedir para outras “personalidades” do .net/WPF/SL, como Scott Hanselman, Phil Haack, John Papa, S. Somasegar, Tim Heuer, Karen Corby, Glenn Block… o Kelps vai ter trabalho em Vegas!
Atenção!
O XAMLCast da semana que vem será especial sobre o MIX10! Assim, em vez de um grande episódio, soltaremos as notícias aos poucos, o mais rápido possível, conforme o Kelps for mandando. Por isso, não deixe de assinar e seguir o XAMLCast para não perder nada!
Para assinar:
- Feed RSS: http://www.xamlcast.net
- iTunes/iPod: pcast://www.xamlcast.net
- Zune: zune://subscribe/?XAMLCast=http://www.xamlcast.net
O XAMLCast também está no Twitter!
- Twitter oficial: @xamlcast (e hashtag #xamlcast)
- Siga os XAMLCasters:
- Adicione o Twibbon do XAMLCast ao seu avatar!
Até o próximo!
Abraços,
Kelps, Roberto Sonnino e Rodrigo Kono
Iniciando com o Mate Framework
Entrevista com Stefan Horochovec
Stefan Horochovec
Engenheiro de Software
Adobe Community Manager – http://www.flexduck.org/
Blog: http://www.horochovec.com.br/
Twitter: http://twitter.com/horochovec
Ved: Em sua opinião, qual a importância de um framework MVC para Flex?
Stefan: A adoção de um framework no desenvolvimento da aplicação contribui bastante com a manutenção do projeto, com a qualidade do código fonte (padronização), e por possuir diversos facilitadores para a codificação, [...]
Modules
About modules
Modules are SWF files that can be loaded and unloaded by an application. They cannot be run independently of an application, but any number of applications can share the modules. The main application, can dynamically load other modules that it requires, when it needs them.
Benefits of modules
- Smaller initial download size of the SWF file.
- Shorter load time due to smaller SWF file size.
- Better encapsulation of related aspects of an application.
ModuleManager and ModuleLoader
Module domains
By default, a module is loaded into a child domain of the current application domain. You can specify a different application domain by using the applicationDomain property of the ModuleLoader class. Because a module is loaded into a child domain, it owns class definitions that are not in the main application’s domain. For example, the first module to load the PopUpManager class becomes the owner of the PopUpManager class for the entire application because it registers the manager with the SingletonManager. If another module later tries to use the PopUpManager, Adobe ® Flash® Player throws an exception. The solution is to ensure that managers such as PopUpManager and DragManager and any other shared services are defined by the main application (This technique also applies to components). Typically, this is done by adding the following to a script block:
import mx.managers.PopUpManager;
import mx.managers.DragManager;
private var popUpManager:PopUpManager;
private var dragManager:DragManager;
Because a Flex module must be in the same
security domain as the application (SWF) that loads it, when you’re using modules in an AIR application any module SWF must be located in the same directory as the main application SWF or one of its subdirectories, which ensures that like the main application SWF, the module SWF is in the AIR application security sandbox.Creating ActionScript-based modules
Reducing module size
To reduce the size of the modules, you can optimize the module by instructing it to externalize classes that are included by the application. The result is that the module includes only the classes it requires, while the framework code and other dependencies are included in the application.
To externalize framework classes with the command-line compiler, you generate a linker report from the application that loads the modules. You then use this report as input to the module’s load-externs compiler option. The compiler externalizes all classes from the module for which the application contains definitions. This process is also necessary if your modules are in a separate project from your main application in Flex Builder.
1. Generate the linker report and compile the application:
mxmlc -link-report=report.xml MyApplication.mxml
2. Compile the module and pass the linker report to the load-externs option:
mxmlc -load-externs=report.xml MyModule.mxml
Using the ModuleManager class to load modules
import mx.events.ModuleEvent;
import mx.modules.ModuleManager;
import mx.modules.IModuleInfo;
public var info:IModuleInfo;
private function initApp():void {
info = ModuleManager.getModule(“ColumnChartModule.swf”);
info.addEventListener(ModuleEvent.READY, modEventHandler);
// Load the module into memory. Calling load() makes the
// IFlexModuleFactory available. You can then get an
// instance of the class using the factory’s create() method.
info.load();
}
private function modEventHandler(e:ModuleEvent):void {
// Add an instance of the module’s class to the display list.
vb1.addChild(info.factory.create() as ColumnChartModule);
}
Evitando problemas com Views e DTOs
No seu aplicativo você tem um DTO cujo os dados são renderizados por diferentes Views (telas). Então, toda hora que o seu DTO muda, você percebe sua aplicação travada por uns segundos. Depois de um tempo você percebe que o problema é que mesmo as telas que estão invisíveis estão executando código de apresentação de dados com base no novo DTO. Bem, este é um problema comum quando trabalhamos com DTOs complexos e abusamos do Data Binding.
A notícia ruim é que se você não teve este problema ainda, um dia você terá. A notícia boa é que uma das maneiras de evitar este problema é utilizar o DTOViewHelper, componente disponibilizado neste screencast.
Alguns Frameworks atuais do Flex oferecem maneiras de resolver este problema, mas o DTOViewHelper é independente do Framework que você usa. Além disso, como pode ser visto no Screencast, você pode definir métodos auxiliares dentro do DTOViewHelper com o objetivo compartilhar lógica de apresentação de dados de DTOs entre diferentes Views (veja o exemplo da Data que mostra a string “Hoje” no Screencast).
Clique aqui para fazer o download do código fonte do exemplo “errado” (I could be WRONG).
Clique aqui para fazer o download do código fonte do exemplo “certo” (I could be RIGHT).
Lumine + ZendAmf + Flex 5/5
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
Lumine + ZendAmf + Flex 4/5
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
Lumine + ZendAmf + Flex 3/5
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 :
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



