logo
  • Home
  • Acerca
  • Autores
  • Faq
  • Rede
  Twitter   Feed-me! RSS!
Mai 13

JavaScriptMVC

Escrito por Fábio Batista da Silva em 1, 2.0, 6, action, Ajax, Aplicativos, app, AR, back, backend, BI, C#, class, classe, classes, código, Componente, Componentes, configuração, control, CRUD, css, dados, demo, Desenvolvimento, Design Patterns, development, Dica, dispatchEvent, Download, email, err, erro, error, Estilo, event, Evento, Eventos, Ferramenta, Flex, fonte, for, Formulário, formulario de contato, framework, function, gestão, git, Google, html, html5, IE, if, image, int, Java, Javascript, JQuery, label, labs, lista, map, mg, mvc, O, on, padrão, PHP, Plugin, pt, rails, RIA, Ria’s Geral, RoR, S+S, serviço, Serviços, string, tag, TAT, Tecnologia, template, Teste, tv, UI, uint, update, UX, web @ 05 13th, 2011 | 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á,

Com a chegada eminente do HTML5 e outras tecnologias baseadas em javascript como MongoDB e node.js
tenho deixado o Flex o meio de lado e me dedicado um pouco mais ao javascript.
Porem fica a questão, Como ter um front-end com a mesma performance, escalabilidade e desacoplamento que o flex permite ?
Realmente nesses termos ainda não encontrei nada que me proporcione o que o Flex proporciona.

Nesse Post vou falar um pouco sobre Framework JavaScriptMVC
Me perece uma das melhores alternativas para manter um frond-end JavaScript/HTML

JavaScriptMVC é formado por uma seria de ferramentas para construção de aplicativos JavaScript e consiste nos seguintes componentes:

  • StealJS -Gestão de Dependência
  • FuncUnit – Testes Unitários
  • jQueryMX – Biblioteca de Componentes
  • DocumentJS – Geração de JSDoc

O JavaScriptMVC pode ser utilizado com qualquer back-end , java,php,rails, etc…
Ele pode ser instalado baixando diretamente aqui ou instalando cada componente individualmente atreves do github.

Os componentes devem ficar nas raiz do diretório web da sua aplicação, nesse caso a pasta public.
Então as estrutura da aplicação fica assim.

public
  /documentjs
  /funcunit
  /jquery
  /steal
  /js

O JavaScriptMVC tem ferramentas de geração de código para auxiliar na criação da aplicação.
Vamos começar criando a aplicação pelo terminal, então o JavaScriptMVC vai gerar toda a estrutura do projeto.

    cd path-to-application/public/
   ./js jquery/generate/app contacts

Assim como o rails o JavaScriptMVC possui scaffolds que podem gerar seu CRUD.
Para isso basta executar o comando scaffold passando como parâmetro o nome do modelo.
Os nomes das classes seguem o seguinte padrão : ..
então temos o model “Contacts.Models.Contact”

     ./js jquery/generate/scaffold Contacts.Models.Contact

O JavaScriptMVC vai gerar o controlador, modelos, views e testes unitários da aplicação.
Porem o único arquivo que sera incluído na aplicação é o steal.js ele é responsável por gerenciar as dependências da aplicação.
No ambiente de desenvolvimento ele vai incluir individualmente todos os controladores, modelos, etc..

 type='text/javascript'  src='../steal/steal.js?contacts,development'>>

O parâmetro “?contacts” na tag de inclusão indica o nome do arquivo de configuração que tem o mesmo nome da aplicação nesse caso contacts.js
nele ficam mapeados todas dependências do projeto que serão gerenciadas pelo StealJS
contacts/contacts.js – Arquivo de configuração

steal.plugins(
    'jquery/controller',
    'jquery/controller/subscribe',
    'jquery/view/ejs',
    'jquery/controller/view',
    'jquery/model',
    'jquery/lang/json',
    'jquery/dom/form_params')

.css('contacts')

.resources()
.models('contact')
.controllers('contact')
.views();

Depois de fazer uma refatoração a aplicação ficou assim :

contacts/view/contact/contacts.html – Tela inicial da aplicação

>
    >
        >JS - MVC>
         type='text/javascript'  src='../steal/steal.production.js?contacts'>>
    >
    >
        
 id='contacts'>
            
>Contacts>
            
 id='contact'>>
        >
    >
>

contacts/view/contact/list_view.ejs – Template para a listagem de contatos


 class="link">
     href="javascript://" class='text_button create' >Create>
    
/>
>

 class="table">
    
>
        
>
            
>Name>
            
>E-Mail>
            
> >
        >
    >
    
>
        <%for(var i = 0; i < contacts.length ; i++)%>
        
 <%= contacts[i]%>>
            
><%= contacts[i].name%>>
            
><%= contacts[i].email%>>
            
 class="last">
                 href='javascript://' class='edit'>edit>%>
    >
>

contacts/view/contact/list_view.ejs – Template para o formulario de contatos


 <%= contact%> >
    
 action="#" class="form">
        
>
             class="label">Name>
            
 type="text" class="text_field" id="name" name="name" value="<%= contact.name%>" />
             class="label">E-Mail>
            
 type="text" class="text_field" id="email" name="email" value="<%= contact.email%>" />
        >
        
 class="link">
             href="javascript://" class="text_button save">Save>
             href="javascript://" class="text_button cancel">Cancel>
        >
    >
>

contacts/models/contact.js – Classe ‘Contacts.Models.Contact’ Reponsavel pela abstração do acesso aos serviços

$.Model.extend('Application.Models.Contact',
/* @Static */

    /**
     * Service url.
     */
    url: 'http://localhost/patho-to-app/contacts/',

    /**
     * Recupera os dados dos contacts do serviço no backend.
     * @param Object params
     * @param Function success
     * @param Function error
     */
    findAll: function( params, success, error )
        $.ajax(
            url     : this.url,
            type    : 'get',
            dataType: 'json',
            data    : params,
            success : this.callback(['wrapMany',success]),
            error   : error
        );
    },
    /**
     * Cria um novo contacto
     * @param Object attrs
     * @param Function success
     * @param Function error
     */
    create: function( attrs, success, error )
        $.ajax(
            url     : this.url + 'save',
            type    : 'post',
            dataType: 'json',
            error   : error,
            success : success,
            data    : contact:attrs
        });
    }
    /**
     * Altera os dados de um contacto
     * @param String id
     * @param Object attrs
     * @param Function success
     * @param Function error
    */
    update: function( id, attrs, success, error )
        $.ajax(
            url     : this.url + 'save',
            type    : 'post',
            dataType: 'json',
            data    : contact:attrs,
            success : success,
            error   : error
        });
    },
    /**
     * Remove um contacto
     * @param String id
     * @param Function success
     * @param Function error
     */
    destroy: function( id, success, error )
        $.ajax(
            url     : this.url + 'destroy/id/'+id,
            type    : 'post',
            dataType: 'json',
            error   : error,
            success : success
        );
    },
},
);

contacts/controllers/contact_controller.js – Classe ‘Contacts.Controllers.Contact’ Responde a eventos da view e do modelo

$.Controller.extend('Contacts.Controllers.Contact',onDocument: true,

     /**
     * Função chamada quando a página é carregada
     */
     load: function()
        this.findAll();
     ,

     /**
     * Função que renderiza a listagem de contatos apartir do template /contacts/views/list_view.ejs
     * @param Array contacts
     */
     listView: function( contacts )
        $('#contact').html(this.view('list_view', contacts:contacts ));
     },

     /**
     * Função que renderiza o formulario de contatos apartir do template /contacts/views/form_view.ejs
     * @param Contacts.Models.Contact contact
     */
     formView: function(contact)
        $('#contact').html(this.view('form_view', contact:contact));
     },

     /**
     * Função que lista os contatos atraves do model e renderiza a tela quando obtem resultado
     */
     findAll: function(){
        Contacts.Models.Contact.findAll(, this.callback('listView'));
     },

    /**
     * Listener para o evento 'click' no link create
     */
    '.create click': function()
        // cria um novo contato e monta o formulario
        var contact = new Contacts.Models.Contact();
        this.formView(contact);
    ,

     /**
     * Listener para o evento 'click' no link edit
     * @param jQuery el
     */
    '.edit click': function( el )
        // Recupera o contato selecionado e monta o formulario
        var contact = el.closest('.contact').model();
        this.formView(contact);
    ,

     /**
     * Listener para o evento 'click' no link destroy
     * @param jQuery el
     */
    '.destroy click': function( el )
        if(confirm("Are you sure you want to destroy?"))
            // Recupera o contato selecionado e o remove
            var contact = el.closest('.contact').model();
            contact.destroy();
        
     },

    /**
     * Listener para o evento 'click' no link save
     * @param jQuery el
     */
    '.save click': function(el)
        // Recupera o contato selecionado
        var contact = el.closest('.contact').model();
        // Recupera os dados do formulario
        var attrs   = $('.form').formParams();
        // Atualiza os dados no "objeto"
        contact.attrs(attrs);
        // Salva
        contact.save();      	// a função save é erdada do objeto Model
                               // ela verifica se o objeto ja existe e chama o metodo create ou update
    ,

    /**
     * Listener para o evento 'click' no link cancel
     */
    '.cancel click': function()
        this.findAll();
    ,

    /**
     * Listener para o evento 'created' disparado pelo "objeto" Contacts.Models.Contact
     * @param String called
     * @param Event contact
     */
    'contact.created subscribe': function( called, contact )
        this.findAll();
    ,

    /**
     * Listener para o evento 'updated' disparado pelo "objeto" Contacts.Models.Contact
     * @param String called
     * @param Event contact
     */
    'contact.updated subscribe': function( called, contact )
        this.findAll();
    ,

     /**
     * Listener para o evento 'destroyed' disparado pelo "objeto" Contacts.Models.Contact
     * @param String called
     * @param Event contact
     */
    "contact.destroyed subscribe": function(called, contact)
        this.findAll();
     
});

Agora antes de colocar a aplicação em ambiente de produção podemos compactar todos os arquivos .js e .css gerando uma versão final.

 ./js contacts/scripts/build.js

O StealJS utiliza o Google Closure para compactar todos os arquivos
e gerar arquivos compactados/concatenados que serão usados em produção contacts/production.js e contacts/production.css .

Com isso reduzimos todos os arquivos da aplicação, estilos, plugins, etc.. são reduzidos a apenas um arquivo .js e um arquivo .css.
E para mudar as configuração do ambiente temos apelas que mudar o tag de inclusão do StealJS

<script type='text/javascript'  src='../steal/steal.production.js?contacts'>script>

Esse foi apenas uma pequena amostra do JavaScriptMVC.
Com essa estrutura ele nos permite construir grandes aplicações de forma modular
com um bom ambiente de teste, velocidade no desenvolvimento e performance no ambiente de produção.

Essa aplicação esta rodando aqui : http://flexria.com.br/labs/js-mvc/
E os fontes estão disponíveis no github : https://github.com/FabioBatSilva/js-mvc

Abraço e até a próxima…. ;-)

Jan 3

Ajude a criar o livro Dominando Flex Mobile

Escrito por Daniel Schmitz em 1, 4, Adobe, Adobe Flex, Air, AR, back, backend, BI, cliente, dados, Desenvolvimento, Diversos, exemplo, Exemplos, flash, flash builder, Flex, Flex 4, for, framework, IE, int, Java, Livro, livro flex, Livros, mobile, NaN, O, on, Outros, PHP, rest, RIA, Ria’s Geral, Tecnologia, Tema, UI, zend, Zend Framework @ 01 3rd, 2011 | via http://flex.etc.br | 1 comentário
Daniel Schmitz
? 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 »

Inicialmente um ótimo 2011 para todos! Esse ano promete!

Ajude a criar o livro Dominando Flex Mobile. Assim como foi feito em Dominando Adobe Flex 4 e Dominando Flex e Java, estamos convocando todos os interessados no desenvolvimento Mobile a comentar sobre quais tópicos devem ser abordados, de forma a criar uma obra com mais qualidade, voltada aos interesses dos leitores.

Após o desenvolvimento de 5 livros em 2010, percebemos que os leitores pedem exemplos práticos relacionado ao tema, e no livro Flex Mobile iremos criar uma aplicação completa para restaurantes, envolvendo as tecnologias nas mais diversas áreas (cliente, garçom, caixa, cozinha,gerente). Será uma aplicação completa, que lhe dará uma ótima base para criar aplicações mobile nos mais diversos níveis. O backend será com PHP e Zend Framework.

Mas antes de criar a aplicação, precisamos abordar a teoria e no desenvolvimento Mobile é muito importante saber o que fazer e o que não fazer, por questões de performance. Isto também será visto com detalhes.

Mais informações importantes:

  1. Será livro impresso ou eBook? impresso
  2. Data de lançamento: Assim que o Flex Hero e o Flash Builder Burrito forem oficialmente lançados – ainda está na versão rc. Todos os exemplos serão testados na versão oficial
  3. Quantidade de páginas: 250
  4. Preço: por volta de 58 reais
  5. Haverá pré venda? Sim, siga @Daniel_Schmitz para saber quando

Agora é a sua vez! O que você quer ver no livro Dominando Flex Mobile? Deixe o seu comentário e vamos criar uma obra espetacular !!!!!

Abr 22

[Fiel Cookbook] Manipulando Datas entre Flex e PHP

Escrito por Jose Carlos Fiel em 1, 4, 6, Adobe, Adobe Flex, AMF, app, AR, auto, back, backend, BI, class, control, Controls, Cookbook, event, events, exemplo, explicação, Fiel Cookbook, Flex, for, function, handle, html, IE, if, int, label, MXML, NaN, O, on, PHP, problema, Projetos, pt, RIA, Ria’s Geral, string, UI, XML, XP, zend, Zend Amf, Zend Framework @ 04 22nd, 2010 | via http://blog.josecarlosfiel.com.br | Sem comentários
Jose Carlos Fiel
? 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 »

Problema

Temos um DateField no Flex e queremos enviar a data selecionada para o PHP como um objeto Date e não somente uma simples string no fomato DD/MM/YYYY. Enviando o objeto Date, teremos o benefício de ter todas as informações de Timezone, GMT e etc para serem manipuladas futuramente via backend.

Solução

Para resolvermos nosso problema, devemos utilizar o Zend Amf para serialização/deserialização de objetos entre Flex e PHP. No Flex simplesmente usaremos a propriedade selectedDate do DateField para selecionarmos o objeto Date e após enviar ao PHP via RemoteObject. O Zend Amf terá o papel de converter este objeto para Zend Date e vice versa.

Explicação Detalhada

Obs.: O ViewSource está habilitado no exemplo abaixo para quem quiser acompanhar melhor esta explicação.

1º – Capturamos o objeto Date pela propriedade selectedDate do DateField e enviamos para o PHP.

FlexPHPDate.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" viewSourceURL="srcview/index.html">

<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;

public function getTimezone():void
{
remote.getTimezone(dt.selectedDate);
}

public function getTimestamp():void
{
remote.getTimestamp(dt.selectedDate);
}

protected function remote_resultHandler(event:ResultEvent):void
{
Alert.show(event.result.toString());
}

]]>
</mx:Script>

<mx:DateField id="dt" formatString="DD/MM/YYYY" />

<mx:Button label="Get Timezone" click="getTimezone()" enabled="{ dt.selectedDate != null }" />
<mx:Button label="Get UNIX timestamp" click="getTimestamp()" enabled="{ dt.selectedDate != null }" />

<mx:RemoteObject id="remote" destination="zend" endpoint="../gateway.php"
source="DateService"
result="remote_resultHandler(event)"/>

</mx:Application>

2º – Recebemos o objeto Date no PHP já convertido para Zend_Date. Isso é feito automaticamente pelo Zend_Amf.

DateService.php (está localizando dentro da pasta /services/)

<?php

class DateService
{
public function getTimezone(Zend_Date $date)
{
return $date->getTimezone();
}

public function getTimestamp(Zend_Date $date)
{
return $date->getTimestamp();
}
}

Exemplo da Solução: Ao selecionarmos a data e selecionando Get Timezone, mandaremos para o PHP o objeto Date e após o PHP enviará para nós um timestamp desta data atravéz do Zend_Date. Acontece o mesmo para Get UNIX Timestamp.

Baixe aqui o projeto Flex incluindo o PHP: FlexPHPDate.zip

Observações Finais

Esta prática é interessante para manipularmos o mesmo objeto Date de uma linguagem para outra, com várias informações de Timezone, GMT e etc, como citados acima.

Abraços a todos e até o próximo Fiel Cookbook.

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 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

Mai 28

RestfulX – Introdução, instalação, configuração e primera aplicação em 5 minutos

Escrito por Elvis Fernandes em backend, Desenvolvimento, Flex, framework, rails, restfulx, RIA, ruby on rails @ 05 28th, 2009 | via http://www.elvis.eti.br | Sem comentários
Elvis Fernandes
? 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 »

O RestfulX é um framework que se propõe, basicamente, a trazer para o Flex a abstração que o Rails faz da camada de dados. Ele possui um conjunto de geradores de código que facilitam o trabalho de programação ao automatizar tarefas repetitivas, como criar Value Objects (VOs) e tratar a comunicação com o backend para realizar operações de manipulação do banco de dados – criar, recuperar, atualizar e apagar registros, operações conhecidas sob o acrônimo CRUD (Create, Retrieve, Update e Delete).

Toda a geração de código é baseada no Rails, mas você não é obrigado a utilizar o Rails como backend. Você também pode armazenar seus dados no Google App Engine (GAE), ou até gerar uma aplicação em AIR que acesse dados em uma base SQLite, dispensando conexão com a internet ou a instalação de um webserver / SGBD na máquina local.
(…)
Leia o restante do artigo RestfulX – Introdução, instalação, configuração e primera aplicação em 5 minutos (439 palavras)


© Elvis for Elvis Fernandes, 2009. |
Permalink |
8 comentários |
Adicione ao
del.icio.us


Tags: backend, Flex, framework, restfulx, ria, ruby on rails

Set 29

Hello world, again!

Escrito por Mario Junior em 6, AR, back, backend, BI, blog, empresas, exemplo, Exemplos, Flex, for, Hibernate, int, Java, LCDS, O, on, Pessoal, RIA, Ria’s Geral, Ria's Geral, servidor, site, Spring, UI @ 09 29th, 2008 | via http://blog.mariojunior.com | Sem comentários
Mario Junior
? 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 »

Eae pessoal, tudo bom? Sentiram minha falta?

Pois é, muita coisa aconteceu na minha vida nesses ultimos 3 meses. Novamente mudei de estado (MS>> PR >> SC >> agora RJ) e agora estou trabalhando com uma das maiores/melhores empresas de RIA do Mundo, a DClick.

Também, o servidor do blog mudou (o que acarretou na perda dos posts antigos, mas tenho alguns backups), mas agora tenho suporte a Java o que irá abrir novas possibilidades de exemplos (integrações com backend java, spring security, hibernate, ibatis, spring-flex, lcds, data-push, etc).

Enfim, espero voltar com tudo e ajudar a galera com posts interessantes.

Forte abraço a todos.

|

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 2795 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