<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MXStudio &#187; Pedro Claudio</title>
	<atom:link href="http://www.mxstudio.com.br/author/pedroclaudio/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mxstudio.com.br</link>
	<description>Macromedia e Adobe - Artigos, colunas, tutorias e muito mais...</description>
	<lastBuildDate>Sun, 29 Jan 2012 11:31:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Middleware RIA da Adobe</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/coldfusion/middleware-ria-da-adobe/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/coldfusion/middleware-ria-da-adobe/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 07:23:13 +0000</pubDate>
		<dc:creator>Pedro Claudio</dc:creator>
				<category><![CDATA[Coldfusion]]></category>
		<category><![CDATA[destaque]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=4739</guid>
		<description><![CDATA[A absorção de aplicativos RIA em todos os segmentos de mercado, para uso em redes interna principalmente, é crescente, em grande parte baseados no Flash Player, ou seja, construídos em Flash ou Flex, e invariavelmente o produto do sistema é um relatório em PDF. Observando a frase anterior mais detalhadamente, concluímos que a tecnologia Adobe [...]]]></description>
			<content:encoded><![CDATA[<p>A absorção de aplicativos RIA em todos os segmentos de mercado, para uso em redes interna principalmente, é crescente, em grande parte baseados no Flash Player, ou seja, construídos em Flash ou Flex, e invariavelmente o produto do sistema é um relatório em PDF.</p>
<p>Observando a frase anterior mais detalhadamente, concluímos que a tecnologia Adobe está presente na construção da maioria dos softwares RIA.  Sabendo disto, a Adobe têm aperfeiçoando o <span style="color: #000080;"><span style="text-decoration: underline;"><a href="http://www.adobe.com/products/coldfusion/">ColdFusion Server </a></span></span> para facilitar a construção das aplicações RIA.</p>
<p>E cada incremento inova de algum conceito ou funcionalidade, neste ponto, a tecnologia ColdFusion pode ser vista como um formador de opinião, com recursos usados em outras tecnologias (IDE ou Servidores), que começaram a perceber que as facilidades do ColdFusion não estão apenas no código CFML, mas também nos serviços.</p>
<p>Como exemplo podemos citar, que o ColdFusion foi o primeiro servidor a receber suporte AMF com o NetServices.as, os componentes auto documentáveis, componentes multisserviço (classes publica, classe remota ou ainda wsdl ), com o serviço RDS, entre outros.</p>
<p>Lembro ainda, que nessa época (NetServices),  a união ColdFusion Server+AMF foi o embrião do conceito RIA, pois anteriormente, aplicativos RIA só realizava requisições XML (estático ou dinâmico) , e posteriormente nasceria o Flex 1 junto com a geração MX, que hoje é um dos serviços ColdFusion.</p>
<p>Um incremento mais recente, foi a incorporação de recursos LiveCycle ao servidor ColdFusion, possibilitando a geração e manipulação de de PDF, permitindo um gerenciamento completo dos recursos PDF, desde criação de thumbnail a controle de permissão. Onde o sistema é mais requisitado, o ColdFusion ficou mais flexível. E com suporte nativo a LiveCycle DS ou BlazeDS.</p>
<p>Agora, a Adobe habilita todas essas facilidades do ColdFusion para implementação direta em MXML, quando cria o <span style="color: #000080;"><span style="text-decoration: underline;"><a href="http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSe9cbe5cf462523a0-5d0bd438122084e1759-7ffc.html">CFaaS (ColdFusion as service)</a> para versão 9.</span></span></p>
<p><strong>MXML com a cara do CFML</strong></p>
<p>CFaaS é um serviço ColdFusion que gerencia o acesso a um conjunto de outros serviços ColdFusion, habilitando a execução remota no servidor, sem a necessidade de construção de script no servidor, em resumo (obedecendo as regras de acesso do gerenciamento), todos os recursos descritos nos parágrafos anteriores estarão disponíveis em MXML, com auxílio de bibliotecas SWC (<span style="color: #000080;"><span style="text-decoration: underline;"><a href="http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WS71D0858A-D8BF-487d-AFBF-803EDD2068D3.html">mxml</a></span></span> e <span style="color: #000080;"><span style="text-decoration: underline;"><a href="http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WS4775AB3E-2865-4d72-A5C0-6F758BF73ABA.html">air</a></span></span>) disponíveis no servidor em /CFIDE/scripts/AIR/.</p>
<p>Os serviços CFaaS ou tags MXML do ColdFusion, até este momento, são:</p>
<ul>
<li><span style="color: #000080;"><span style="text-decoration: underline;"><a href="http://help.adobe.com/en_US/FlashPlatform/beta/reference/actionscript/3/coldfusion/service/mxml/Chart.html">Chart</a></span></span> – proxy para o serviço de geração de gráficos, que é baseado 	no <span style="color: #000080;"><span style="text-decoration: underline;"><a href="http://www.gpoint.com/website/WebCharts50/gallery/area.jsp">WebCharts3D </a></span></span>(no ColdFusion 9 o WebCharts3d está na versão 	5.1). Os gráficos são gerados no formato png, jpg ou swf;</li>
<li><span style="color: #000080;"><span style="text-decoration: underline;"><a href="http://help.adobe.com/en_US/FlashPlatform/beta/reference/actionscript/3/coldfusion/service/mxml/Document.html">Document</a></span></span> – proxy para geração de documentos imprimíveis a partir do 	Flash Player, os formatos dos documentos gerados são PDF ou 	SWF/FlashPaper;</li>
<li><span style="color: #000080;"><span style="text-decoration: underline;"><a href="http://help.adobe.com/en_US/FlashPlatform/beta/reference/actionscript/3/coldfusion/service/mxml/Image.html">Image</a></span></span> – proxy para manipulação de imagens, hoje é possível realizar 	a seguentes ações: AddBorder, batchOperation, Blur, Crop, Flip, 	GetEXIFMetaData, GetEXIFTAG, GetHeight, GetIPTCMetadata, GetIPTCTag, 	GetWidth, GrayScale, Info, Negative, Overlay, Resize, Rotate, 	ScaletoFit, Sharpen, Shear;</li>
<li><span style="color: #000080;"><span style="text-decoration: underline;"><a href="http://help.adobe.com/en_US/FlashPlatform/beta/reference/actionscript/3/coldfusion/service/mxml/Ldap.html">Ldap</a></span></span> – permite acesso a qualquer servidor LDAP, e a configuração da 	conexão entre o cliente SWF e o servidor LDAP é realizada 	inteiramente no MXML,;</li>
<li><span style="color: #000080;"><span style="text-decoration: underline;"><a href="http://help.adobe.com/en_US/FlashPlatform/beta/reference/actionscript/3/coldfusion/service/mxml/Mail.html">Mail</a></span></span> – sintetiza o conceito da tecnologia CFaaS, esta tag permite que 	qualquer aplicação SWF envie e-mail direto ao servidor STMP;</li>
<li><span style="color: #000080;"><span style="text-decoration: underline;"><a href="http://help.adobe.com/en_US/FlashPlatform/beta/reference/actionscript/3/coldfusion/service/mxml/Pdf.html">Pdf</a></span></span> – proxy ao serviço de manipulação de PDF, que possui as 	seguintes ações: GetInfo, DeletePages, MergeFiles, ExtractPages, 	AddWaterMark, RemoveWaterMark, Protect, MergeSpecificPages, SetInfo, 	thumbnail, ProcessDDX;</li>
<li><span style="color: #000080;"><span style="text-decoration: underline;"><a href="http://help.adobe.com/en_US/FlashPlatform/beta/reference/actionscript/3/coldfusion/service/mxml/Pop.html">Pop</a></span></span> – Proxy de acesso a gerenciamento de servidores POP;</li>
<li><span style="color: #000080;"><span style="text-decoration: underline;"><a href="http://help.adobe.com/en_US/FlashPlatform/beta/reference/actionscript/3/coldfusion/air/Conflict.html">Conflict</a></span></span> – gerencia conflitos em  entre mensages do client, do server e a 	mensagem original;</li>
<li><span style="color: #000080;"><span style="text-decoration: underline;"><a href="http://help.adobe.com/en_US/FlashPlatform/beta/reference/actionscript/3/coldfusion/air/Session.html">Session</a></span></span> – gerencia todas as operações entre o cliente AIR e o SQLite;</li>
<li><span style="color: #000080;"><span style="text-decoration: underline;"><a href="http://help.adobe.com/en_US/FlashPlatform/beta/reference/actionscript/3/coldfusion/air/SyncManager.html">SyncManager</a></span></span> &#8211;  Classe responsável em facilitar a construção da sinconização 	entre o Servidor ColdFusion e o cliente AIR.</li>
</ul>
<p>E aqui codifiquei um exemplo prático, onde o cliente criar e visualizar em FlashPaper, recebendo a url do PDF para download &#8211; Este código depende de configuração de usuário/senha e ip cliente registrados no Administrador ColdFusion; Para implementação do MXML a seguir, você deve incorporar ao projeto o arquivo /CFIDE/scripts/AIR/cfservices.swc.</p>
<p><a href="http://www.mxstudio.com.br/wp-content/uploads/2010/08/03082010pc1.png"><img class="aligncenter size-medium wp-image-4740" src="http://www.mxstudio.com.br/wp-content/uploads/2010/08/03082010pc1-300x269.png" alt="mxml de exemplo" width="300" height="269" /></a></p>
<p>Observe que só foi usado MXML e ActionScript, obtendo o seguinte resultado:</p>
<p><a href="http://www.mxstudio.com.br/wp-content/uploads/2010/08/03082010pc2.png"><img class="aligncenter size-medium wp-image-4741" src="http://www.mxstudio.com.br/wp-content/uploads/2010/08/03082010pc2-300x133.png" alt="exemplo de tela" width="300" height="133" /></a></p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } -->Estou focando no CFaaS, porém, o ColdFusion 9 ainda possui incontáveis recursos para agilizar o desenvolvimento, como o suporte a ORM (Hibernate) com configuração e codificação reduzida, entre outras.</p>
<p><strong>Conclusão</strong></p>
<p>Com um tempo de desenvolvimento otimizado, utilizando a tecnologia CFaaS e CFML, o prazo para a entrega de um projeto será reduzido, gerando competitividade no custo do projeto, quando comparado com outra linguagem, permitindo a absorção de mais projetos em menos tempo, aumentando o lucro, diluindo o custo do ColdFusion Server.</p>
<p><a href="http://www.mxstudio.com.br/wp-content/uploads/2010/08/03082010pc3.png"><img class="aligncenter size-medium wp-image-4742" src="http://www.mxstudio.com.br/wp-content/uploads/2010/08/03082010pc3-300x167.png" alt="grafico" width="300" height="167" /></a></p>
<p>Observação: A licença do ColdFusion Builder inclui uma licença (opcional) de Flash Builder 4.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/coldfusion/middleware-ria-da-adobe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CFML Evolução da Linguagem</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/coldfusion/cfml-evolucao-da-linguagem/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/coldfusion/cfml-evolucao-da-linguagem/#comments</comments>
		<pubDate>Sun, 19 Jul 2009 11:52:37 +0000</pubDate>
		<dc:creator>Pedro Claudio</dc:creator>
				<category><![CDATA[Coldfusion]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=2591</guid>
		<description><![CDATA[O ColdFusion 9 traz uma grande implementação na linguagem, quanto a OOP, os componentes ColdFusion agora podem ser escritos inteiramente SEM TAGS, e a invocação destes componentes são realizadas através dos operadores NEW e IMPORT, onde o método init é reconhecido como construtor, e com o métodos getters e settres implícitos, ou seja, você não [...]]]></description>
			<content:encoded><![CDATA[<p>O ColdFusion 9 traz uma grande implementação na linguagem, quanto a OOP, os componentes ColdFusion agora podem ser escritos inteiramente SEM TAGS, e a invocação destes componentes são realizadas através dos operadores NEW e IMPORT, onde o método init é reconhecido como construtor, e com o métodos getters e settres implícitos, ou seja, você não precisa escrever.</p>
<p>Para exemplificar, peço licença a Hal Helms, mas fiz uma releitura do artigo de <a href="http://www.adobe.com/devnet/coldfusion/articles/supsub.html">Using Inheritance and Composition in ColdFusion Components</a>. Não vou reescreve-lo por completo, vou refazer apenas as classes, todo o restante do texto ainda é atual, então <a href="http://www.adobe.com/devnet/coldfusion/articles/supsub.html">leia</a> o artigo do Hal.</p>
<p><span> </span></p>
<p>Na parte que fala de herança, a classes Vehicle.cfc fica da seguinte forma:</p>
<div class="code actionscript3"><span style="color: #000000;">component<br />
displayname=&#8221;Vehicle&#8221;<br />
hint=&#8221;I am a Vehicle&#8221;<br />
output=&#8221;false&#8221;<br />
<span style="color: #000099;">{</span><br />
property Numeric mph;</p>
<p>public Vehicle function init()<br />
output=&#8221;false&#8221;<br />
hint=&#8221;I am constructor&#8221;<br />
<span style="color: #000099;">{</span><br />
Variables.mph = 0;<br />
return this;<br />
<span style="color: #000099;">}</span></p>
<p>public Numeric function increaseSpeed(Numeric mph)<br />
output=&#8221;false&#8221;<br />
hint=&#8221;I increase speed&#8221;<br />
<span style="color: #000099;">{</span><br />
Variables.mph = Variables.mph + Arguments.mph;<br />
return Variables.mph;<br />
<span style="color: #000099;">}</span></p>
<p>public Numeric function decreaseSpeed(Numeric mph)<br />
output=&#8221;true&#8221;<br />
hint=&#8221;I decrease speed&#8221;<br />
<span style="color: #000099;">{</span><br />
if(Variables.mph &gt;</p>
<p></span>= Variables.speedIncrement) <span style="color: #000099;">{</span><br />
Variables.mph = Variables.mph &#8211; Arguments.mph;<br />
<span style="color: #000099;">}</span> else <span style="color: #000099;">{</span><br />
stop();<br />
<span style="color: #000099;">}</span><br />
return Variables.mph;<br />
<span style="color: #000099;">}</span></p>
<p>public void function stop()<br />
output=&#8221;true&#8221;<br />
<span style="color: #000099;">{</span><br />
Variables.mph = 0;<br />
writeoutput(&#8220;Your vehicle has stopped.<span style="color: #000099;"><br />
</span>&#8220;);<br />
<span style="color: #000099;">}</span></p>
<p><span style="color: #000099;">}</span></div>
<p>E a classe Car.cfc que extende de Vehicle, fica assim:</p>
<div class="code"><span style="color: #000000;">component<br />
displayname=&#8221;Vehicle&#8221;<br />
hint=&#8221;I am a Vehicle&#8221;<br />
output=&#8221;false&#8221;<br />
<span style="color: #000099;">{</span><br />
property Numeric mph;</p>
<p>public Vehicle function init()<br />
output=&#8221;false&#8221;<br />
hint=&#8221;I am constructor&#8221;<br />
<span style="color: #000099;">{</span><br />
Variables.mph = 0;<br />
return this;<br />
<span style="color: #000099;">}</span></p>
<p>public Numeric function increaseSpeed(Numeric mph)<br />
output=&#8221;false&#8221;<br />
hint=&#8221;I increase speed&#8221;<br />
<span style="color: #000099;">{</span><br />
Variables.mph = Variables.mph + Arguments.mph;<br />
return Variables.mph;<br />
<span style="color: #000099;">}</span></p>
<p>public Numeric function decreaseSpeed(Numeric mph)<br />
e            output=&#8221;true&#8221;<br />
hint=&#8221;I decrease speed&#8221;<br />
<span style="color: #000099;">{</span><br />
if(Variables.mph &gt;</p>
<p></span>= Variables.speedIncrement) <span style="color: #000099;">{</span><br />
Variables.mph = Variables.mph &#8211; Arguments.mph;<br />
<span style="color: #000099;">}</span> else <span style="color: #000099;">{</span><br />
stop();<br />
<span style="color: #000099;">}</span><br />
return Variables.mph;<br />
<span style="color: #000099;">}</span></p>
<p>public void function stop()<br />
output=&#8221;true&#8221;<br />
<span style="color: #000099;">{</span><br />
Variables.mph = 0;<br />
writeoutput(&#8220;Your vehicle has stopped.<span style="color: #000099;"><br />
</span>&#8220;);<br />
<span style="color: #000099;">}</span></p>
<p><span style="color: #000099;">}</span><br />
d# <span style="color: #000099;"><br />
</span>&#8220;);<br />
return local.currentSpeed;<br />
<span style="color: #000099;">}</span></p>
<p>public void function stop()<br />
output=&#8221;true&#8221;<br />
<span style="color: #000099;">{</span><br />
super.stop();<br />
<span style="color: #000099;">}</span></p>
<p><span style="color: #000099;">}</span></div>
<p>e o teste das classes, TestCar.cfm, da seguinte forma:</p>
<div class="code"><span style="color: #000000;"> <span style="color: #000000;"><br />
&lt;cfscript&gt;<br />
import CF9Demo.com.pcsilva.demo.machine.Car;<br />
myCar = new Car();<br />
myCar.stepOnGas();<br />
myCar.stepOnGas();<br />
myCar.stepOnGas();<br />
myCar.stepOnGas();<br />
myCar.stepOnBrakes();<br />
myCar.stepOnBrakes();<br />
myCar.stepOnBrakes();<br />
myCar.stop();<br />
&lt;/cfscript&gt;<br />
</span><br />
</span></div>
<p>Obtendo o seguinte resultado:</p>
<p><img src="http://blog.pcsilva.com/images/cf9_demo_oop_car.JPG" alt="" /></p>
<p>Na parte que Hal fala de composição, a classe Address.cfc fica da seguinte forma:</p>
<div class="code"><span style="color: #000000;">component<br />
displayname=&#8221;Address&#8221;<br />
hint=&#8221;I am an Address&#8221;</p>
<p><span style="color: #000099;">{</span><br />
property String address1;<br />
property String address2;<br />
property String city;<br />
property String province;<br />
property String postalCode;</p>
<p>public Address function init()<br />
output=&#8221;false&#8221;<br />
hint=&#8221;I am constructor&#8221;<br />
<span style="color: #000099;">{</span><br />
return this;<br />
<span style="color: #000099;">}</span><br />
<span style="color: #000099;">}</span></p>
<p></span></div>
<p>A classe Person.cfc, assim:</p>
<div class="code"><span style="color: #000000;">component<br />
displayname=&#8221;Person&#8221;<br />
hint=&#8221;I am a Person&#8221;<br />
<span style="color: #000099;">{</span><br />
property String firstName;<br />
property String lastName;<br />
property Address address;</p>
<p>public Person function init()<br />
output=&#8221;false&#8221;<br />
hint=&#8221;I am constructor&#8221;<br />
<span style="color: #000099;">{</span><br />
return this;<br />
<span style="color: #000099;">}</span><br />
<span style="color: #000099;">}</span></p>
<p></span></div>
<p>O formulário de teste é o mesmo, a pagina de  processamento do formulário é que deve ser alterada:</p>
<div class="code"><span style="color: #000000;"><span style="color: #000000;"><br />
&lt;cfscript&gt;<br />
add = new CF9Demo.com.pcsilva.demo.people.Address();<br />
add.setAddress1(form.add1);<br />
add.setAddress2(form.add2);<br />
add.setCity(form.city);<br />
add.setProvince(form.province);<br />
add.setPostalCode(form.postalCode);<br />
user = new CF9Demo.com.pcsilva.demo.people.Person();<br />
user.setFirstName(form.firstName);<br />
user.setLastName(form.lastName);<br />
user.setAddress(add);<br />
&lt;cfscript&gt;<br />
</span></p>
<p><span style="color: #990033;">&lt;cfdump var=&#8221;#user#&#8221;</span>&gt;</p>
<p></span></div>
<p>Onde obtemos o seguinte print na tela.</p>
<p><img src="http://blog.pcsilva.com/images/cf9_demo_oop_person.JPG" alt="" /></p>
<p>Estas são algumas das novidades do ColdFusion 9, acompanhem esta semana estarei mostrando mais.</p>
<p>&#8211;<br />
Pedro Claudio<br />
Adobe User Group Manager &#8211; CFUG-BR<br />
Adobe Certified Expert<br />
Adobe Certified Professional</p>
<p>http://blog.pcsilva.com/en</p>
<p>http://twitter.com/pcsilva</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/coldfusion/cfml-evolucao-da-linguagem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ColdFusion 9</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/coldfusion/coldfusion-9/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/coldfusion/coldfusion-9/#comments</comments>
		<pubDate>Sun, 19 Jul 2009 11:37:09 +0000</pubDate>
		<dc:creator>Pedro Claudio</dc:creator>
				<category><![CDATA[Coldfusion]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=2587</guid>
		<description><![CDATA[Introdução O ColdFusion desde a versão MX vem recebendo importantes funcionalidades a cada nova versão, agora no ColdFusion 9, que já é uma inovação importante, traz consigo uma série de implementações surpreendentes e aprimoramentos que Comunidade ColdFusion desejava, superando todas as expectativas, outro avanço importante foi a criação do bugtracker público do ColdFusion. Aqui vou [...]]]></description>
			<content:encoded><![CDATA[<h2>Introdução</h2>
<p>O ColdFusion desde a versão MX vem recebendo importantes funcionalidades a cada nova versão, agora no <a href="http://www.adobe.com/products/coldfusion/">ColdFusion 9</a>, que já é uma inovação importante, traz consigo uma série de implementações surpreendentes e aprimoramentos que <a href="http://cfugbr.com/">Comunidade ColdFusion</a> desejava, superando todas as expectativas, outro avanço importante foi a criação do <a href="http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html">bugtracker público do ColdFusion</a>.</p>
<p>Aqui vou citar algumas das novas funcionalidades acreditando que você também ficará surpreso do que o ColdFusion 9 pode fazer.</p>
<h2>MXML ColdFusion (CFaaS)</h2>
<p>Esta funcionalidade, Serviço ColdFusion Exposto, é a mais impressionante, principalmente para aqueles que desenvolvem em Flex/AIR, que de forma quase padronizada para todas as linguagens server. No ColdFusion 9 deixa de existir, ou seja, você não vai precisar escrever códigos ColdFusion (CFML) para acessar serviços ColdFusion de dentro do seu projeto Flex/AIR, permitindo um projeto inteiramente em MXML e ActionScript.</p>
<h2>SpoolMail gerenciado</h2>
<p>O Administrador ColdFusion recebeu um gerenciador de e-mails, onde é possível visualizar os e-mails que deixaram de ser enviados. Um pedido antigo da <a href="http://cfugbr.com/">Comunidade ColdFusion</a>.</p>
<p><img src="http://blog.pcsilva.com/images/cf9mailsmall.png" alt="" width="420" height="305" /></p>
<h2>Variáveis Application</h2>
<p>As novas variáveis são:</p>
<ul>
<li>datasource: com esta variável você não vai precisar informar o nome do datasource em outras partes da aplicação, ou seja, tags cfquery sem o atributo datasource.</li>
<li>smtpServer: sobre escreve as definições do Administrator.</li>
<li>ormenabled: permite trabalhar com o ORM do ColdFusion 9.</li>
<li>ormsettings: define como o ORM deve trabalhar.</li>
<li>serverSideFormValidation: permite desabilitar a validação no servidor.</li>
<li>timeout: esta variável sobre escreve a tag cfsetting, mas trabalha da mesma forma que a tag &lt;cfsetting timeout=&#8221;xxx&#8221;&gt;.</li>
<li>debugipaddress: permite adicionar os IP que deseja receber debug.</li>
<li>enablerobustexception: habilita robust exception.</li>
<li>googlemapkey: onde informamos a KEY do googlemaps para que a tag cfmap possa trabalhar.</li>
</ul>
<h2>CFML Evolução da Linguagem</h2>
<p>Aqui houve realmente um revolução na linguagem CFML, para todos os servidores ColdFusion, visto que esta evolução foi padronizada pelo órgão regulador, pois o CFML é open source, então vamos a elas.</p>
<p>Componentes ColdFusion (CFC) podem ser escritos inteiramente sem tags, com implementação de todas as tags em forma de Classes, com isso você poderá usar todas as funcionalidades de tags como objetos instanciados. O uso do operador IMPORT para adicionar Classes ColdFusion (CFC), para com o operador NEW instanciar um objeto. A criação do escopo Local para utilização dentro dos métodos. E ainda todas as propriedades que declarar no CFC criarão getters e setters de forma controlada no código, mas por padrão todos as propriedades criação getter e setters.</p>
<p>Método OnServerStart no Application.cfc, com ele você vai iniciar scripts junto com o start do Servidor ColdFusion.</p>
<p>Método OnCFCRequest no Application.cfc, trabalha da mesma forma que o método onRequest, mas este é para Componentes ColdFusion. Este implemento é visto como um FIX, pois na versão anterior o método onRequest interferia em requisições de Componentes ColFusion.</p>
<h2>ORM</h2>
<p>A primeira sigla da linguagem foi DBML (Database Markup Language), isto porque o Servidor ColdFusion nasceu para facilitar a integração de paginas dinâmicas com bancos de dados. Neste ponto uma outra revolução aconteceu, isto porque, de forma nativa, o ColdFusion disponibiliza uma framework de mapeamento objeto/relacional, sim ORM Hibernate nativo, de forma tão simplificada que surpreende qualquer Java programmer, isto faz com que você deixa de escrever +/- 60% de sql nas aplicações, dando uma potabilidade excelente, em tratando-se de Banco de dados, mas permite que você crie fórmulas (SQL), controle eventos preLoad, postLoad, preInsert, postInsert, preUpdate, postUpdate, preDelete, postDelete.</p>
<h2>Integração com SharePoint e Office</h2>
<p>Com a tag cfsharepoint você pode interagir com o SharePoint de forma transparente, e com a tag cfspreadsheet você vai transformar arquivos excel em querys, ou inserir, alterar e deletar dados da planilha.</p>
<h2>ColdFusion Administrator Tool</h2>
<p>Com uma ferramenta feita em AIR, você vai poder administrar remotamente no formato desktop, vários Servidores ColdFusion, possibilitando comparar configurações e verificar necessidades de aplicar HotFix automaticamente.</p>
<p><img src="http://blog.pcsilva.com/images/CF9ServerManager.jpg" alt="" width="300" height="206" /></p>
<h2>Apache Solr/Lucene</h2>
<p>Este serviço integrado ao servidor dá um poder maior de indexação de documentos, pois ele não limita o número de documentos que podem ser indexados, e o Verity permanece.</p>
<h2>Conclusão</h2>
<p>Destaquei algumas das novas funcionalidades, existem ainda outras mais, mas o importante é <a href="http://www.adobe.com/products/coldfusion/">testar</a>, para verificar mais funcionalidades e informar os bugs no <a href="http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html">bugtraker</a>.</p>
<p>&#8211;<br />
Pedro Claudio<br />
Adobe User Group Manager &#8211; CFUG-BR<br />
Adobe Certified Expert<br />
Adobe Certified Professional</p>
<p>http://blog.pcsilva.com/en</p>
<p>http://twitter.com/pcsilva</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/coldfusion/coldfusion-9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ColdFusion Web Day</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/coldfusion/coldfusion-web-day/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/coldfusion/coldfusion-web-day/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 20:34:32 +0000</pubDate>
		<dc:creator>Pedro Claudio</dc:creator>
				<category><![CDATA[Coldfusion]]></category>
		<category><![CDATA[Eventos]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=2313</guid>
		<description><![CDATA[ColdFusion Web Day é o primeiro evento on-line totalmente dedicado ao compartilhamento de técnicas, conceito e mercado de uma das linguagens de programação web mais produtivas que existem. Serão 5 horas de palestras com a participação de grandes nomes da comunidade ColdFusion brasileira, compartilhando o máximo e informações sobre ColdFusion, o seu mercado no Brasil, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.cfwebday.com/cfw">ColdFusion Web Day</a> é o primeiro evento on-line totalmente dedicado ao compartilhamento de técnicas, conceito e mercado de uma das linguagens de programação web mais produtivas que existem.</p>
<p>Serão 5 horas de palestras com a participação de grandes nomes da comunidade ColdFusion brasileira, compartilhando o máximo e informações sobre ColdFusion, o seu mercado no Brasil, funcionalidades, produtividade, novidades e futuras versões.</p>
<p>O evento será realizado no dia 11 de Abril de 2009 a partir das 13:30, e será totalmente on-line e gratuíto. Para isto, basta deixar seu nome e email através do menu &#8220;Quero participar&#8221;. No dia do evento basta acessar a sala de palestras através do link Acesso que estará disponível nesta mesma página.</p>
<p>Não fique de fora desta e conheça todos os diferenciais de uma das linguagens mais usadas para o desenvolvimento de aplicações ricas para a internet. <a href="http://www.cfwebday.com/cfwd2009/">Conheça o ColdFusion! </a> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/coldfusion/coldfusion-web-day/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reunião de Fim de Ano no CFUGBR</title>
		<link>http://www.mxstudio.com.br/noticias/eventos/reuniao-de-fim-de-ano-no-cfugbr/</link>
		<comments>http://www.mxstudio.com.br/noticias/eventos/reuniao-de-fim-de-ano-no-cfugbr/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 12:48:49 +0000</pubDate>
		<dc:creator>Pedro Claudio</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Coldfusion]]></category>
		<category><![CDATA[ug]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=1812</guid>
		<description><![CDATA[Próxima reunião será no dia dia 06/12/2008 no Café com o Tom, as 15:00 hs. A palestra tem por objetivo demonstrar a integração entre o ColdFusion e o LiveCyce Data Services através do Flex 3, desde as configurações necessárias a utilização das extenções do Coldfusion para Eclipse. E teremos como palestrante Francisco Paulino, Tofinha. Adobe [...]]]></description>
			<content:encoded><![CDATA[<p>Próxima reunião será no dia <strong><a href="http://www.treinatom.com.br/cafe-com-o-tom" target="_blank">dia 06/12/2008 no Café com o Tom, as 15:00 hs</a></strong>.</p>
<p>A palestra tem por objetivo demonstrar a integração entre o ColdFusion e o LiveCyce Data Services através do Flex 3, desde as configurações necessárias a utilização das extenções do Coldfusion para Eclipse.</p>
<p>E teremos como palestrante Francisco Paulino, Tofinha. Adobe Community Expert, entusiasta ColdFusion.</p>
<p><img style="block" src="http://www.cfugbr.com/images/banners/eventos/cfug_treinatom_apoios.gif" alt="" width="460" /><br />
<img style="block" src="http://www.cfugbr.com/images/banners/eventos/cfug_treinatom.gif" alt="" width="460" /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/noticias/eventos/reuniao-de-fim-de-ano-no-cfugbr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ColdFusion 8 e Imagens</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/coldfusion/coldfusion-8-e-imagens/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/coldfusion/coldfusion-8-e-imagens/#comments</comments>
		<pubDate>Thu, 01 May 2008 23:59:32 +0000</pubDate>
		<dc:creator>Pedro Claudio</dc:creator>
				<category><![CDATA[Coldfusion]]></category>
		<category><![CDATA[CFML]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=1340</guid>
		<description><![CDATA[Introdução Já há algum tempo, não escrevo, o ColdFusion 8 foi lançado, então escolhi a maior novidade (IMHO) desta versão, que é a criação/edição/manipulação de imagens online, o mais apropriado seria uma abordagem mais ampla e resumida do assunto ColdFusion 8, mas irá achar o assunto bem interessante. Não vou me aprofundar em definir e [...]]]></description>
			<content:encoded><![CDATA[<h4>Introdução</h4>
<p>Já há algum tempo, não escrevo, o ColdFusion 8 foi lançado, então escolhi a maior novidade (IMHO) desta versão, que é a criação/edição/manipulação de imagens online, o mais apropriado seria uma abordagem mais ampla e resumida do assunto ColdFusion 8, mas irá achar o assunto bem interessante.</p>
<p>Não vou me aprofundar em definir e muito menos descrever as funções, devido a grande quantidade de funções (<a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions-pt0_11.html" target="_blank">50</a>)para tratamento de imagens agregadas nesta versão CF, vou exibir um cfc comentado e simular várias execuções, aproveitem.</p>
<h4>Pré-requisito</h4>
<p>ColdFusion 8 (<a href="http://www.adobe.com/products/coldfusion/" target="_blank">download</a>)</p>
<h4>Conceito</h4>
<p>Vou trabalhar com uma nova tag, a <a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/Tags_i_02.html" target="_blank">CFIMAGE</a>, com apenas uma action (writeToBrowser), que simplesmente converte a imagem da memória para arquivo, escreve em html a tag IMG apontando para o caminho da imagem gerada na conversão.</p>
<p>Os demais processos embutidos no CFC trabalharão com as funções:</p>
<ul>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_in-k_15.html" target="_blank">IsImage</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_in-k_16.html" target="_blank">IsImageFile</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_37.html" target="_blank">ImageRead</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_34.html" target="_blank">imageNew</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_09.html" target="_blank">ImageCopy</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_22.html" target="_blank">ImageFlip</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_10.html" target="_blank">ImageCrop</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_36.html" target="_blank">ImagePaste</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_47.html" target="_blank">ImageSetDrawingTransparency</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_44.html" target="_blank">ImageSetBackgroundColor</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_49.html" target="_blank">ImageShear</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_39.html" target="_blank">ImageResize</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_46.html" target="_blank">ImageSetDrawingColor</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_14.html" target="_blank">ImageDrawLine</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_43.html" target="_blank">ImageSetAntialiasing</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_19.html" target="_blank">ImageDrawRect</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_21.html" target="_blank">ImageDrawText</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_07.html" target="_blank">ImageBlur</a></li>
<li><a href="http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_18.html" target="_blank">ImageDrawQuadraticCurve</a></li>
</ul>
<p>A partir das funções CFML  8 crio então os métodos para manipulações específicas, de forma a facilitar a utilização e minimizar os possíveis erros, são eles:</p>
<ul>
<li>ImageBin</li>
<li>ImageReflection</li>
<li>ImageGradient</li>
<li>Text2Image</li>
<li>ImageShadow</li>
<li>ImageRounded</li>
</ul>
<h4>O componente</h4>
<div style="auto;">
<pre><span style="#993300;">&lt;cfcomponent&gt;</span>
<span style="#cccccc;">&lt;!--- método testa o tipo da variável, que sempre deve ser um caminho de imagem ou uma variável do tipo imagem ---&gt;</span>
<span style="#993300;">&lt;cffunction name=<span style="#000099;">"ImageBin"</span> returntype=<span style="#000099;">"any"</span>&gt;</span>
<span style="#cccccc;">&lt;!--- caminho da imagem ou variável do tipo imagem ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"image"</span> 		   type=<span style="#000099;">"any"</span>     required=<span style="#000099;">"yes"</span> &gt;</span>
<span style="#cccccc;">&lt;!--- método util apenas quando criamos imagens dantro deste método, largura da imagem ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"width"</span>           type=<span style="#000099;">"numeric"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"150"</span> &gt;</span>
<span style="#cccccc;">&lt;!--- método util apenas quando criamos imagens dantro deste método, altura da imagem ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"height"</span>          type=<span style="#000099;">"numeric"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"50"</span> &gt;</span>
<span style="#cccccc;">&lt;!--- método util apenas quando criamos imagens dantro deste método, dor de fundo da imagem ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"backgroundColor"</span> type=<span style="#000099;">"string"</span>  required=<span style="#000099;">"no"</span> default=<span style="#000099;">"##FFFFFF"</span> &gt;</span>
<span style="#993300;">&lt;cfscript&gt;</span>
//Objeto não é do tipo imagem
if(NOT <span style="#000099;">IsImage</span>(Arguments.image)){
//Objeto é um arquivo de imagem
if(<span style="#000099;">isImageFile</span>(Arguments.image)){
//lê o arquivo de imagem e retorna o binário da imagem
return <span style="#000099;">ImageRead</span>(Arguments.image);
}
//cria imagem e retorna o binário da imagem
return <span style="#000099;">imageNew</span>(<span style="#000099;">""</span>, Arguments.width, Arguments.height, <span style="#000099;">"rgb"</span>, Arguments.backgroundColor);
}
//retorna o binário da imagem
return Arguments.image;
<span style="#993300;">&lt;/cfscript&gt;</span>
<span style="#993300;">&lt;/cffunction&gt;</span>
<span style="#cccccc;">&lt;!--- método usado para criar reflexo da imagem ---&gt;</span>
<span style="#993300;">&lt;cffunction name=<span style="#000099;">"ImageReflection"</span> returntype=<span style="#000099;">"any"</span>&gt;</span>
<span style="#cccccc;">&lt;!--- caminho da imagem ou variável do tipo imagem ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"image"</span>           type=<span style="#000099;">"any"</span>     required=<span style="#000099;">"yes"</span> &gt;</span>
<span style="#cccccc;">&lt;!--- se haverá reflexão ou não ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"posicao"</span>      type=<span style="#000099;">"boolean"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"false"</span> &gt;</span>
<span style="#cccccc;">&lt;!--- inverte direção da reflexão---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"right"</span>           type=<span style="#000099;">"boolean"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"true"</span> &gt;</span>
<span style="#cccccc;">&lt;!--- inverte direção do gradiente ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"gdirection"</span>      type=<span style="#000099;">"boolean"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"false"</span> &gt;</span>
<span style="#cccccc;">&lt;!--- cor de fundo da reflexão ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"backgroundColor"</span> type=<span style="#000099;">"string"</span>  required=<span style="#000099;">"no"</span> default=<span style="#000099;">"##FFFFFF"</span> &gt;</span>
<span style="#993300;">&lt;cfscript&gt;</span>
//carrega variável com binario da imagem
var img1  = <span style="#000099;">ImageBin</span>(Arguments.image);
<span style="#008000;">//cria uma copia da imagem
</span>			var Copy = <span style="#000099;">ImageCopy</span>(img1, 0, 0, img1.width, img1.height);
//cria imagem de fundo da reflexão
var img  = ImageNew(<span style="#000099;">""</span>, img1.width*2.17, img1.height*2, <span style="#000099;">"rgb"</span>, Arguments.backgroundColor);
<span style="#008000;">//inicia variavel
</span>			var x = 0;
<span style="#008000;">//inicia variavel
</span>			var direction = 1.4;
<span style="#008000;">//inicia variavel
</span>			var width = img1.width;
<span style="#008000;">//inicia variavel
</span>			var height = img.height*.7;
//modifica posição inicial da imagem caso a rfração seja em cima da imagem
<span style="#000099;">if</span>(Not Arguments.right and Arguments.posicao){
direction *=-1;
x = img.width - img1.width;
}
//espelhamento da visão da imagem
<span style="#000099;">ImageFlip</span>(Copy, <span style="#000099;">"vertical"</span>);
<span style="#008000;">//corte em 85% da altura da imagem
</span>				ImageCrop(Copy, 0, 0,  img1.width, Round(img1.height * .85));
<span style="#008000;">//aplica gradiente na imagem
</span>				Copy = <span style="#000099;">ImageGradient</span>(Copy,Arguments.gdirection,false,1,100,Arguments.backgroundColor);
//uni as imagem original com fundo da reflexão
<span style="#000099;">ImagePaste</span>(img,img1,x,0);
<span style="#008000;">//aplica transparencia na imagem unida
</span>				<span style="#000099;">ImageSetDrawingTransparency</span>(img,45);
<span style="#008000;">//aplica cor de fundo na imagem unida
</span>				<span style="#000099;">ImageSetBackgroundColor</span>(Copy,Arguments.backgroundColor);
//verifica direção da reflexão
<span style="#000099;">if</span>(Arguments.posicao){
<span style="#008000;">//trnasforma imagem
</span>					<span style="#000099;">ImageShear</span>(Copy,direction,<span style="#000099;">"horizontal"</span>, <span style="#000099;">"bicubic"</span>);
<span style="#008000;">//redimenciona imagem
</span>					ImageResize(Copy,<span style="#000099;">"100%"</span>,<span style="#000099;">"50%"</span>,<span style="#000099;">"MEDIUMQUALITY"</span>,2);
<span style="#008000;">//redefine variavel
</span>					width = img.width;
<span style="#008000;">//redefine variavel
</span>					height = img.height *.71;
}else{
<span style="#008000;">//redimenciona imagem
</span>					ImageResize(Copy,<span style="#000099;">"100%"</span>,<span style="#000099;">"70%"</span>,<span style="#000099;">"MEDIUMQUALITY"</span>,2);
}
//uni imagem alterada com a refração
<span style="#000099;">ImagePaste</span>(img,Copy, 0,img1.height);
<span style="#008000;">//corta imagem no tamanho correto
</span>				<span style="#000099;">ImageCrop</span>(img, 0,0,width,height);
<span style="#008000;">//retorna imagem
</span>			return img;
<span style="#993300;">&lt;/cfscript&gt;</span>
<span style="#993300;">&lt;/cffunction&gt;</span>
<span style="#cccccc;">&lt;!--- método para aplicar gradiente na imagem informada---&gt;</span>
<span style="#993300;">&lt;cffunction name=<span style="#000099;">"ImageGradient"</span> returntype=<span style="#000099;">"any"</span>&gt;</span>
<span style="#cccccc;">&lt;!--- caminho da imagem ou variável do tipo imagem ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"image"</span> 		   type=<span style="#000099;">"any"</span>     required=<span style="#000099;">"yes"</span> &gt;</span>
<span style="#cccccc;">&lt;!--- direção do gradiente vertical/horizontal ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"direction"</span>	   type=<span style="#000099;">"boolean"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"false"</span> &gt;</span>
<span style="#cccccc;">&lt;!--- inicio do gradiente ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"position"</span>		   type=<span style="#000099;">"boolean"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"false"</span> &gt;</span>
<span style="#cccccc;">&lt;!--- afastamento do gradiente ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"limit"</span>		   type=<span style="#000099;">"numeric"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"1"</span> &gt;</span>
<span style="#cccccc;">&lt;!--- alpha ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"index"</span>		   type=<span style="#000099;">"numeric"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"100"</span> &gt;</span>
<span style="#cccccc;">&lt;!--- cor do gradiente ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"backgroundColor"</span> type=<span style="#000099;">"string"</span>  required=<span style="#000099;">"no"</span> default=<span style="#000099;">"##FFFFFF"</span> &gt;</span>
<span style="#993300;">&lt;cfscript&gt;</span>
//carrega variável com binario da imagem
var img  = <span style="#000099;">ImageBin</span>(Arguments.image);
//limita final do gradiente até o limite percentual informado
var h 	 = img.height*Arguments.limit;
<span style="#008000;">//inicia variavel
</span>			var w 	 = img.width;
<span style="#008000;">//divide o alpha em linhas de acordo com a altura
</span>			var i    = Arguments.index/h;
<span style="#008000;">//inicia variavel
</span>			var per  = 0;
<span style="#008000;">//inicia variavel
</span>			var k    = 0;
<span style="#008000;">//inicia variavel
</span>			var j    = 0;
//verifica a direção do gradiente
<span style="#000099;">if</span>(Arguments.direction){
//modifica direção do gradiente
h = w*Arguments.limit;
//altera divisão
i = Arguments.index/h;
}
<span style="#008000;">// aplica a cor do gradiente
</span>				<span style="#000099;">ImageSetDrawingColor</span>(img, Arguments.backgroundColor);
<span style="#008000;">// para cada linha (das 100) em Arguments.index/h aplica uma transparencia diferente
</span>				for(;k lte h;k++){
<span style="#008000;">// redefine variavel
</span>					j = k;
//corrige numero dependendo da posição, sutil diferença
<span style="#000099;">if</span>(Arguments.position) j = h-k;
<span style="#008000;">//calcula percentual de transparencia corrente
</span>					per = 100 - round(i*j*(1.8*Arguments.limit));
<span style="#008000;">//corrige percentual
</span>					<span style="#000099;">if</span>(per lt 0) per = 0;
<span style="#008000;">//aplica tranparencia
</span>					<span style="#000099;">ImageSetDrawingTransparency</span>(img, per);
//verifica direção do gradiente
<span style="#000099;">if</span>(Arguments.direction){
//torna o gradiente visivel começando pela direita
<span style="#000099;">ImageDrawLine</span>(img, k, 0, k,img.height);
}else{
//torna o gradiente visivel cpomeçando pela esquerda
<span style="#000099;">ImageDrawLine</span>(img, 0, k, img.width, k);
}
}
<span style="#008000;">//retorna imagem
</span>			return img;
<span style="#993300;">&lt;/cfscript&gt;</span>
<span style="#993300;">&lt;/cffunction&gt;</span>
<span style="#cccccc;">&lt;!--- método aplica texto em imagem ---&gt;</span>
<span style="#993300;">&lt;cffunction name=<span style="#000099;">"Text2Image"</span> returntype=<span style="#000099;">"any"</span>&gt;</span>
<span style="#cccccc;">&lt;!--- texto ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"text"</span>            type=<span style="#000099;">"string"</span>  required=<span style="#000099;">"no"</span> default=<span style="#000099;">"teste"</span> &gt;</span>
<span style="#cccccc;">&lt;!--- caminho da imagem ou variável do tipo imagem ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"img"</span>             type=<span style="#000099;">"any"</span>     required=<span style="#000099;">"no"</span> default=<span style="#000099;">""</span> &gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"width"</span>           type=<span style="#000099;">"numeric"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"150"</span> &gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"height"</span>          type=<span style="#000099;">"numeric"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"50"</span> &gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"x"</span>               type=<span style="#000099;">"numeric"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"10"</span> &gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"y"</span>               type=<span style="#000099;">"numeric"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"25"</span> &gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"backgroundColor"</span> type=<span style="#000099;">"string"</span>  required=<span style="#000099;">"no"</span> default=<span style="#000099;">"##FFFFFF"</span> &gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"textColor"</span>       type=<span style="#000099;">"string"</span>  required=<span style="#000099;">"no"</span> default=<span style="#000099;">"##000000"</span> &gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"font"</span>            type=<span style="#000099;">"string"</span>  required=<span style="#000099;">"no"</span> default=<span style="#000099;">"Trebuchet MS"</span> &gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"size"</span>            type=<span style="#000099;">"numeric"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"25"</span> &gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"style"</span>           type=<span style="#000099;">"string"</span>  required=<span style="#000099;">"no"</span> default=<span style="#000099;">"bold"</span> &gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"strikethrough"</span>   type=<span style="#000099;">"boolean"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"no"</span> &gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"underline"</span>       type=<span style="#000099;">"boolean"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"no"</span> &gt;</span>
<span style="#993300;">&lt;cfscript&gt;</span>
//carrega variável com binario da imagem
var image  = <span style="#000099;">ImageBin</span>(Arguments.img,Arguments.width, Arguments.height, Arguments.backgroundColor);
<span style="#008000;">//inicia variavel
</span>			var Styles = <span style="#000099;">StructNew</span>();
<span style="#008000;">// tipo da fonte
</span>				Styles.font          = Arguments.font;
<span style="#008000;">// tamanho da fonte
</span>				Styles.size          = Arguments.size;
<span style="#008000;">// bold/normal
</span>				Styles.style         = Arguments.style;
// uso de strikethrough ou não
Styles.strikethrough = Arguments.strikethrough;
// underline ou não
Styles.underline     = Arguments.underline;
<span style="#008000;">//prepara imagem para receber o texto
</span>				<span style="#000099;">ImageSetAntialiasing</span>(image, <span style="#000099;">"ON"</span>);
<span style="#008000;">// prepara cor do texto
</span>				<span style="#000099;">ImageSetDrawingColor</span>(image, Arguments.textColor);
<span style="#008000;">// aplica o texto na imagem
</span>				<span style="#000099;">ImageDrawText</span>(image, Arguments.text, Arguments.x, Arguments.y, Styles);
<span style="#008000;">//retorna imagem
</span>			return image;
<span style="#993300;">&lt;/cfscript&gt;</span>
<span style="#993300;">&lt;/cffunction&gt;</span>
<span style="#993300;">&lt;cffunction name=<span style="#000099;">"ImageShadow"</span> returnType=<span style="#000099;">"any"</span>&gt;</span>
<span style="#cccccc;">&lt;!--- caminho da imagem ou variável do tipo imagem ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"image"</span>           type=<span style="#000099;">"any"</span> 	required=<span style="#000099;">"true"</span>&gt;</span>
<span style="#cccccc;">&lt;!--- define para que lado a sombra será aplicada ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"position"</span>        type=<span style="#000099;">"numeric"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"1"</span>&gt;</span>
<span style="#cccccc;">&lt;!--- distancia da sombra ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"off"</span>             type=<span style="#000099;">"numeric"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"1.5"</span>&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"backgroundColor"</span> type=<span style="#000099;">"string"</span>  required=<span style="#000099;">"no"</span> default=<span style="#000099;">"##FFFFFF"</span> &gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"shadow"</span>          type=<span style="#000099;">"string"</span> 	required=<span style="#000099;">"no"</span> default=<span style="#000099;">"##A0A0A0"</span>&gt;</span>
<span style="#cccccc;">&lt;!--- intensidade do blur---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"blur"</span> 	          type=<span style="#000099;">"numeric"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"10"</span>&gt;</span>
<span style="#993300;">&lt;cfscript&gt;</span>
var i = 2*Arguments.off;
//carrega variável com binario da imagem
var img  = <span style="#000099;">ImageBin</span>(arguments.image);
<span style="#008000;">//inicia variavel
</span>			var img1 = <span style="#000099;">""</span>;
//verifica direção da sombra
<span style="#000099;">if</span>(Arguments.position){
//cria imagem com com dimensões para tornar sombra visivel
img1 = ImageBin(<span style="#000099;">''</span>,img.width + i,img.height + i,Arguments.backgroundColor);
}else{
//cria imagem com com dimensões para tornar sombra visivel
img1 = ImageBin(<span style="#000099;">''</span>,img.width + (i*2),img.height + (i*2),Arguments.backgroundColor);
}
<span style="#008000;">//aplica cor da sombra na imagem criada
</span>				<span style="#000099;">ImageSetDrawingColor</span>(img1,Arguments.shadow);
//verifica lado que será aplicada a sombra
<span style="#000099;">switch</span>(Arguments.position){
case 1:
<span style="#008000;">//cria sombra
</span>						<span style="#000099;">ImageDrawRect</span>(img1, Arguments.off, Arguments.off, img.width, img.height, <span style="#000099;">"yes"</span>);
<span style="#008000;">//aplica blur
</span>						<span style="#000099;">ImageBlur</span>(img1,Arguments.blur);
<span style="#008000;">//uni as imagens
</span>						<span style="#000099;">ImagePaste</span>(img1,img,0,0);
break;
case 2:
<span style="#008000;">//cria sombra
</span>						<span style="#000099;">ImageDrawRect</span>(img1, Arguments.off, 0, img.width, img.height, <span style="#000099;">"yes"</span>);
<span style="#008000;">//aplica blur
</span>						<span style="#000099;">ImageBlur</span>(img1,Arguments.blur);
<span style="#008000;">//uni as imagens
</span>						<span style="#000099;">ImagePaste</span>(img1,img,0,Arguments.off);
break;
case 3:
<span style="#008000;">//cria sombra
</span>						<span style="#000099;">ImageDrawRect</span>(img1, 0, 0, img.width, img.height, <span style="#000099;">"yes"</span>);
<span style="#008000;">//aplica blur
</span>						<span style="#000099;">ImageBlur</span>(img1,Arguments.blur);
<span style="#008000;">//uni as imagens
</span>						<span style="#000099;">ImagePaste</span>(img1,img,Arguments.off,Arguments.off);
break;
case 4:
<span style="#008000;">//cria sombra
</span>						<span style="#000099;">ImageDrawRect</span>(img1, 0, Arguments.off, img.width, img.height, <span style="#000099;">"yes"</span>);
<span style="#008000;">//aplica blur
</span>						<span style="#000099;">ImageBlur</span>(img1,Arguments.blur);
<span style="#008000;">//uni as imagens
</span>						<span style="#000099;">ImagePaste</span>(img1,img,Arguments.off,0);
break;
}
<span style="#008000;">//retorna imagem
</span>			return img1;
<span style="#993300;">&lt;/cfscript&gt;</span>
<span style="#993300;">&lt;/cffunction&gt;</span>
<span style="#993300;">&lt;cffunction name=<span style="#000099;">"ImageRounded"</span> returntype=<span style="#000099;">"any"</span>&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"image"</span>  		   type=<span style="#000099;">"any"</span> 	  required=<span style="#000099;">"true"</span>&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"off"</span>   		   type=<span style="#000099;">"numeric"</span> required=<span style="#000099;">"no"</span> default=<span style="#000099;">"10"</span>&gt;</span>
<span style="#cccccc;">&lt;!--- cor do gradiente ---&gt;</span>
<span style="#993300;">&lt;cfargument name=<span style="#000099;">"backgroundColor"</span> type=<span style="#000099;">"string"</span>  required=<span style="#000099;">"no"</span> default=<span style="#000099;">"##FFFFFF"</span> &gt;</span>
<span style="#993300;">&lt;cfscript&gt;</span>
//carrega variável com binario da imagem
var img  = <span style="#000099;">ImageBin</span>(arguments.image);
<span style="#008000;">//inicia variavel
</span>			var i = 0;
<span style="#008000;">//grau da curva dos cantos
</span>			var index = Arguments.off;
<span style="#008000;">//aplica cor de fundo
</span>				<span style="#000099;">ImageSetDrawingColor</span>(img,Arguments.backgroundColor);
<span style="#008000;">//prepara imagem
</span>				<span style="#000099;">ImageSetAntialiasing</span>(img,<span style="#000099;">"ON"</span>);
<span style="#008000;">//aplica uma linha curva para grau
</span>				for(i=0;i lte index;i++){
ImageDrawQuadraticCurve(img,i,0,i/(index/2),i/(index/2),0,i);
ImageDrawQuadraticCurve(img,img.width-i,0,img.width-i/(index/2),i/(index/2),img.width,i);
ImageDrawQuadraticCurve(img,0,img.height-(index-i),(index-i)/(index/2),img.height-((index-i)/(index/2)),(index-i),img.height);
ImageDrawQuadraticCurve(img,img.width,img.height-(index-i),img.width-((index-i)/(index/2)),img.height-((index-i)/(index/2)),img.width-(index-i),img.height);
}
<span style="#008000;">//retorna imagem
</span>			return img;
<span style="#993300;">&lt;/cfscript&gt;</span>
<span style="#993300;">&lt;/cffunction&gt;</span>
<span style="#993300;">&lt;/cfcomponent&gt;</span></pre>
</div>
<h4>Exibindo resultados</h4>
<p>O componente é bem variado quanto tipos de transformações, colocarei agora os resultados que imagino sejam possível, mas você pode achar mais alguns.</p>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg171701618911845636.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).Text2Image(&#8216;pcsilva&#8217;,&#8221;,100,35,10,25,&#8217;##FF0000&#8242;)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg3477841042032849768.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).Text2Image(&#8216;pcsilva&#8217;,&#8221;,100,35,10,25,&#8217;##FF0000&#8242;,&#8217;##FFFFFF&#8217;)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg4289039260121974509.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageGradient(&#8216;cf8.jpg&#8217;)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg996013277162879731.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageGradient(&#8216;cf8.jpg&#8217;,true)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg7566309307247356240.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageGradient(&#8216;cf8.jpg&#8217;,true,true)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg-402407146947593768.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageGradient(&#8216;cf8.jpg&#8217;,true,true,.55)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg2942200302430507072.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageGradient(&#8216;cf8.jpg&#8217;,false,true,.55)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg7175597984730692930.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageGradient(&#8216;cf8.jpg&#8217;,false,true,.55,70)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg-3417231784475157673.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageGradient(&#8216;cf8.jpg&#8217;,false,true,.55,70,&#8217;##FF9900&#8242;)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg6461030391651104737.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageReflection(createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).Text2Image(&#8216;pcsilva&#8217;))#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg5520463850170450086.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageReflection(&#8216;cf8.jpg&#8217;)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg9129576351823147990.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageReflection(createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).Text2Image(&#8216;texto&#8217;,'cf8.jpg&#8217;,150,50,10,100))#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg-7129630003230826252.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageReflection(&#8216;cf8.jpg&#8217;,true)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg8057905479504704339.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageReflection(&#8216;cf8.jpg&#8217;,true,false)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg-6795639091596356858.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageReflection(&#8216;cf8.jpg&#8217;,false,true,false,&#8217;##FF9900&#8242;)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg-3394198307482273922.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageShadow(&#8216;cf8.jpg&#8217;,1,3,&#8217;##FFFFFF&#8217;,'##FF6600&#8242;)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg-3050662789329625312.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageShadow(&#8216;cf8.jpg&#8217;,2,3,&#8217;##FFFFFF&#8217;,'##FF6600&#8242;)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg654119194009571738.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageShadow(&#8216;cf8.jpg&#8217;,3,3,&#8217;##FFFFFF&#8217;,'##FF6600&#8242;)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg1765667349888020171.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageShadow(&#8216;cf8.jpg&#8217;,4,3,&#8217;##FFFFFF&#8217;,'##FF6600&#8242;)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg-7617496142372707736.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageRounded(&#8216;cf8.jpg&#8217;,15,&#8217;##FFFFFF&#8217;)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg2494684409112769751.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageGradient(createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageRounded(&#8216;cf8.jpg&#8217;,15,&#8217;##FFFFFF&#8217;),false,true,.55,70)#&#8221;&gt;</div>
<div class="mydestaque"><img src="http://www.mxstudio.com.br/wp-content/uploads/2008/05/_cfimg-1452564548040168502.png" alt="" /></div>
<div>&lt;cfimage action=&#8221;writeToBrowser&#8221; source=&#8221;#createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageReflection(createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageGradient(createobject(&#8216;component&#8217;,'PlayingPictures&#8217;).ImageRounded(&#8216;cf8.jpg&#8217;,15,&#8217;##FFFFFF&#8217;),false,true,.55,70))#&#8221;&gt;</div>
<p><!-- aqui chamamos a função para formatar todas as DIV's --></p>
<p>[]s</p>
<p><a href="http://pcsilva.blogspot.com">Pedro Claudio</a></p>
<p>Adobe Certified Professional</p>
<p>Macromedia ColdFusion MX 7 Developer </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/coldfusion/coldfusion-8-e-imagens/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>CFFORM com MXML 1.5 Componentes</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/coldfusion/cfform_com_mxml_1_5_componentes/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/coldfusion/cfform_com_mxml_1_5_componentes/#comments</comments>
		<pubDate>Sat, 02 Jun 2007 00:00:00 +0000</pubDate>
		<dc:creator>Pedro Claudio</dc:creator>
				<category><![CDATA[Coldfusion]]></category>
		<category><![CDATA[AS CFML]]></category>
		<category><![CDATA[CFML]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Como &#233; poss&#237;vel MXML em CFFORMs?]]></description>
			<content:encoded><![CDATA[<br />
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td>
<h1>Introdução</h1>
<p>A algum tempo venho postando em <a href="http://pcsilva.blogspot.com">meu blog</a>, <a href="http://pcsilva.blogspot.com/search/label/Video">videos demonstrativos</a> da interação possível de CFFORM (flash) com componentes mxml.<br />
Para os que não conhecem a compilação do CFFORM (flash) , ela é provida pelo mesmo compilador do Servidor Flex 1.5, em outras palavras o ColdFusion MX 7 e supeirores (até o momento) dispõem de um Servidor Flex 1.5, o que favorece a utilização de arquivos MXML (1.5)  em paginas CFML, e será isto que será visto aqui. E os videos do meu blog, a grande maioria, utiliza este artifício, o que facilita em muito algumas construções, como exemplo para este artigo <a href="http://pcsilva.blogspot.com/2007/05/cfform-chart-em-continuidade-sequncia.html">escolhi a geração de gráficos</a>, muitos podem dizer &#8220;AH! Mas temos o CFCHART!&#8221;, e concordo, mas como verão o resultado final, os efeitos visuais são bem mais interativos e agradáveis.</p>
<h1>Pré-requisito</h1>
<p>- ColdFusion MX 7.0.2.</p>
<h1>         Conceitos</h1>
<p>O conceito utiliado é o mesmo para utilização de componentes MXML 1.5 por PopUps, para um melhor entendimento, separei alguns links importantes do livedocs:<br />
<a href="http://livedocs.adobe.com/flex/15/flex_docs_en/00000451.htm">Using MXML components &#8212; Version 1.5</a></p>
<p><a href="http://livedocs.adobe.com/flex/15/flex_docs_en/00000451.htm">      </a><br />
<a href="http://livedocs.adobe.com/flex/15/flex_docs_en/00000378.htm">Creating a pop-up TitleWindow container using the PopUp Manager</a><br />
<a href="http://livedocs.adobe.com/flex/15/flex_docs_en/00000380.htm">Passing data to a pop-up TitleWindow container</a></p>
<p>E a forma utilizada na chamada do componente MXML foi através das classes PopUpManager e TitleWindow, isto porque até o momento o cfform <strong>não é flexível o suficientes</strong> para absorver novas tags a partir de componentes MXML, como o própio MXML faz.</p>
<p>Com este tipo de desenvolvimento teremos duas linguaguens de marcação e uma linguagem de script para a construção de um aplicativo, são eles: <a href="http://livedocs.adobe.com/coldfusion/7/">CFML (&gt;=7)</a>, <a href="http://livedocs.adobe.com/flex/15/flex_docs_en/wwhelp/wwhimpl/js/html/wwhelp.htm?href=part3_as.htm">MXML (1.5) </a>e <a href="http://livedocs.adobe.com/flex/15/asdocs_en/">ActionScript (2.0 com classes do Flex 1.5)</a>.</p>
<h1>Conteúdo</h1>
<p>Para a parte da utilização do MXML não produzi nenhum código, para não complicar esta matéria, mais do que já pôde ser, então o componente utilizado será o contido no artigo <a href="http://www.adobe.com/devnet/flex/articles/charting_print.html"><em>&#8220;Beyond the DataGrid Control: Better Data Visualization with Flex Charting Components<br />
de Ely Greenfield&#8221;</em></a> publicado no <a href="http://www.adobe.com/devnet/flex/">DevNet Flex</a>.</p>
<p>Então como você já leu o artigo de Greenfield e baixou os arquivos, vamos a parte CFML.<br />
Para uma interação básica, nenhuma alteração será feita nos arquivos de Greenfield, e para a chamada do componente em ma pagina CFML, um trabalho imenso de escrita para chamar o componente MXML.</p>
<p>Lembrando apenas que os arquivos do MXML e AS devem estar no mesmo diretório que ficaram as paginas CFML</p>
<p>c:\inetpub\wwwroot\cfform\charting\ZingerChart.cfm</p>
<p>  &lt;cfform<br />
format=&#8221;flash&#8221;<br />
onload=&#8221;var mxml = mx.managers.PopUpManager.createPopUp(_root, ZingerChart_final); &#8221; &gt;<br />
&lt;/cfform&gt;</p>
<p>Onde invocamos o componente ZingerChart_final.mxml sem o &#8220;.MXML&#8221; , <a href="http://livedocs.adobe.com/flex/15/flex_docs_en/00000378.htm">da mesma forma que você observou no artigo do livedocs</a>.</p>
<p>Agora vamos deixar o Panel livre dentro do cfform final (no cliente), ou melhor vamos dar-lhe a propriedade Drag, para que o cliente possa movimentar o Panel, e para isto precisamos modificar o MXML de Greenfield, então salve ZingerChart_final.mxml com o nome ZingerChart_final_1.mxml e abra que possa ser editado ficando da seguinte forma.</p>
<p>c:\inetpub\wwwroot\cfform\charting\ZingerChart_final_1.mxml</p>
<p>  &lt;mx:Panel title=&#8221;sample chart&#8221; xmlns:mx=&#8221;http://www.macromedia.com/2003/mxml&#8221;<br />
initialize=&#8221;initDummyData();&#8221; height=&#8221;330&#8243; width=&#8221;450&#8243; &gt; &lt;mx:Script source=&#8221;zingerChartFunctions.as&#8221; /&gt;</p>
<p>&lt;mx:Effect&gt;<br />
&lt;mx:SeriesInterpolate duration=&#8221;500&#8243; elementOffset=&#8221;5&#8243; name=&#8221;drillDownEffect&#8221; /&gt;<br />
&lt;/mx:Effect&gt;</p>
<p>&lt;mx:ColumnChart verticalAxisStyle=&#8221;linedNumericAxis&#8221; dataProvider=&#8221;{zingerManufacturingData}&#8221; width=&#8221;100%&#8221; height=&#8221;70%&#8221; showDataTips=&#8221;true&#8221;<br />
mouseClickData=&#8221;getDrillDownDataForMonth(event.hitData.element.yField, event.hitData.item);&#8221; &gt;<br />
&lt;mx:horizontalAxis&gt;<br />
&lt;mx:CategoryAxis dataProvider=&#8221;{zingerManufacturingData}&#8221; categoryField=&#8221;Month&#8221; name=&#8221;Month&#8221; /&gt;<br />
&lt;/mx:horizontalAxis&gt;</p>
<p>&lt;mx:verticalAxis&gt;<br />
&lt;mx:LinearAxis name=&#8221;Units Sold&#8221; /&gt;<br />
&lt;/mx:verticalAxis&gt;</p>
<p>&lt;mx:series&gt;<br />
&lt;mx:Array&gt;<br />
&lt;mx:ColumnSeries yField=&#8221;Widgets&#8221; name=&#8221;luxury Widgets&#8221; &gt;<br />
&lt;mx:fill&gt;<br />
&lt;mx:SolidColor color=&#8221;#82C9EB&#8221; /&gt;<br />
&lt;/mx:fill&gt;<br />
&lt;/mx:ColumnSeries&gt;<br />
&lt;mx:ColumnSeries yField=&#8221;Blinkies&#8221; name=&#8221;Mass Market Blinkies&#8221;&gt;<br />
&lt;mx:fill&gt;<br />
&lt;mx:LinearGradient angle=&#8221;0&#8243;&gt;<br />
&lt;mx:entries&gt;<br />
&lt;mx:Array&gt;<br />
&lt;mx:GradientEntry ratio=&#8221;30&#8243; color=&#8221;#258BC8&#8243; /&gt;<br />
&lt;mx:GradientEntry ratio=&#8221;80&#8243; color=&#8221;#82C9EB&#8221; /&gt;<br />
&lt;mx:GradientEntry ratio=&#8221;100&#8243; color=&#8221;#258BC8&#8243; /&gt;<br />
&lt;/mx:Array&gt;<br />
&lt;/mx:entries&gt;<br />
&lt;/mx:LinearGradient&gt;<br />
&lt;/mx:fill&gt;<br />
&lt;/mx:ColumnSeries&gt;<br />
&lt;/mx:Array&gt;<br />
&lt;/mx:series&gt;</p>
<p>&lt;mx:verticalAxisRenderer&gt;<br />
&lt;mx:AxisRenderer labelFunction=&#8221;formatThousands&#8221; /&gt;<br />
&lt;/mx:verticalAxisRenderer&gt;</p>
<p>&lt;/mx:ColumnChart&gt;</p>
<p>&lt;mx:Label id=&#8221;drilldownLabel&#8221; text=&#8221;{drilldownTitle}&#8221; fontSize=&#8221;16&#8243; height=&#8221;10%&#8221; width=&#8221;100%&#8221; fontWeight=&#8221;bold&#8221; /&gt;</p>
<p>&lt;mx:CartesianChart id=&#8221;drillDownChart&#8221; width=&#8221;100%&#8221; height=&#8221;20%&#8221; dataProvider=&#8221;{drilldownValues}&#8221; fontFamily=&#8221;chartLabelFont&#8221;<br />
horizontalAxisStyle=&#8221;hangingCategoryAxis&#8221; verticalAxisStyle=&#8221;linedNumericAxis&#8221;&gt;</p>
<p>&lt;mx:horizontalAxis&gt;<br />
&lt;mx:CategoryAxis dataProvider=&#8221;{drilldownValues}&#8221; categoryField=&#8221;week&#8221; /&gt;<br />
&lt;/mx:horizontalAxis&gt;</p>
<p>&lt;mx:horizontalAxisRenderer&gt;<br />
&lt;mx:AxisRenderer canDropLabels=&#8221;true&#8221; /&gt;<br />
&lt;/mx:horizontalAxisRenderer&gt;</p>
<p>&lt;mx:verticalAxisRenderer&gt;<br />
&lt;mx:AxisRenderer labelFunction=&#8221;formatThousands&#8221; /&gt;<br />
&lt;/mx:verticalAxisRenderer&gt;</p>
<p>&lt;mx:series&gt;<br />
&lt;mx:Array&gt;<br />
&lt;mx:ColumnSeries yField=&#8221;sales&#8221; showDataEffect=&#8221;drillDownEffect&#8221; /&gt;<br />
&lt;mx:LineSeries form=&#8221;curve&#8221; yField=&#8221;avg&#8221; showDataEffect=&#8221;drillDownEffect&#8221;&gt;<br />
&lt;mx:stroke&gt;<br />
&lt;mx:Stroke weight=&#8221;3&#8243; color=&#8221;#82C9EB&#8221; /&gt;<br />
&lt;/mx:stroke&gt;<br />
&lt;/mx:LineSeries&gt;<br />
&lt;/mx:Array&gt;<br />
&lt;/mx:series&gt;</p>
<p>&lt;/mx:CartesianChart&gt;</p>
<p>&lt;/mx:Panel&gt;</p>
<p>Se observou bem os dois arquivos, original (ZingerChart_final.mxml) e cópia (ZingerChart_final_1.mxml ), percebeu que a cópia não possui a tag mx:Style, isto porque todo seu seu conteúdo foi inserido em {cf_root}/WEB-INF/cfform/global.css, e ainda removemos a tag Application, em seu lugar colocamos uma tag container, mx:Panel, que herda algumas propriedades que precisamos.</p>
<p>E a chamada do componente MXML no CFFORM muda muito pouco.<br />
c:\inetpub\wwwroot\cfform\charting\ZingerChartPopUp.cfm</p>
<p>   &lt;cfform<br />
format=&#8221;flash&#8221;<br />
onload=&#8221;var mxml = mx.managers.PopUpManager.createPopUp(_root, ZingerChart_final_1); &#8221; &gt;<br />
&lt;/cfform&gt;</p>
<p>O próximo passo criar a dinâmica de dados para o gráfico, para isso contrui um CFC básico, exemplo simples, para a utilização por Remoting.</p>
<p>c:\inetpub\wwwroot\cfform\charting\data.cfc</p>
<p>    &lt;cfcomponent&gt;<br />
&lt;cffunction name=&#8221;get&#8221; access=&#8221;remote&#8221; returntype=&#8221;query&#8221;&gt;<br />
&lt;cfargument name=&#8221;Year&#8221; type=&#8221;string&#8221; required=&#8221;yes&#8221;&gt;<br />
&lt;cfscript&gt;<br />
var Query = QueryNew(&#8220;&#8221;);<br />
var i = &#8220;&#8221;;<br />
var data = StructNew();<br />
data.Month = Replace(&#8220;January &#8216;|,February &#8216;|,March &#8216;|,April &#8216;|,May &#8216;|,June&#8217;|,July &#8216;|,August &#8216;|,September &#8216;|,October &#8216;|,November &#8216;|,December &#8216;|&#8221;,&#8221;|&#8221;,Arguments.Year,&#8221;All&#8221;);<br />
data.Widgets = &#8220;#RandRange(350000,900000)#&#8221; ;<br />
data.Blinkies = &#8220;#RandRange(150000,350000)#&#8221;;<br />
for(i = 2; i lte 12; i=i+1){<br />
data.Widgets = &#8220;#data.Widgets#,#RandRange(350000,900000)#&#8221; ;<br />
data.Blinkies = &#8220;#data.Blinkies#,#RandRange(150000,350000)#&#8221;;<br />
}<br />
data.monthIdx = &#8220;1,2,3,4,5,6,7,8,9,10,11,12&#8243;;<br />
for(i in data){<br />
QueryAddColumn(Query,i,ListToArray(data[i]));<br />
}<br />
return Query;<br />
&lt;/cfscript&gt;<br />
&lt;/cffunction&gt;<br />
&lt;/cfcomponent&gt;<br />
E alteramos o componente MXML mais uma vez para que fique da seguinte forma.</p>
<p>c:\inetpub\wwwroot\cfform\charting\ZingerChart_final_2.mxml</p>
<p>  &lt;mx:TitleWindow title=&#8221;sample chart&#8221; xmlns:mx=&#8221;http://www.macromedia.com/2003/mxml&#8221;<br />
initialize=&#8221;initDummyData();&#8221; height=&#8221;330&#8243; width=&#8221;450&#8243; &gt; &lt;mx:Script source=&#8221;zingerChartFunctions.as&#8221; /&gt;</p>
<p>&lt;mx:Effect&gt;<br />
&lt;mx:SeriesInterpolate duration=&#8221;500&#8243; elementOffset=&#8221;5&#8243; name=&#8221;drillDownEffect&#8221; /&gt;<br />
&lt;/mx:Effect&gt;</p>
<p>&lt;mx:ColumnChart verticalAxisStyle=&#8221;linedNumericAxis&#8221; dataProvider=&#8221;{zingerManufacturingData}&#8221; width=&#8221;100%&#8221; height=&#8221;70%&#8221; showDataTips=&#8221;true&#8221;<br />
mouseClickData=&#8221;getDrillDownDataForMonth(event.hitData.element.yField, event.hitData.item);&#8221; &gt;<br />
&lt;mx:horizontalAxis&gt;<br />
&lt;mx:CategoryAxis dataProvider=&#8221;{zingerManufacturingData}&#8221; categoryField=&#8221;Month&#8221; name=&#8221;Month&#8221; /&gt;<br />
&lt;/mx:horizontalAxis&gt;</p>
<p>&lt;mx:verticalAxis&gt;<br />
&lt;mx:LinearAxis name=&#8221;Units Sold&#8221; /&gt;<br />
&lt;/mx:verticalAxis&gt;</p>
<p>&lt;mx:series&gt;<br />
&lt;mx:Array&gt;<br />
&lt;mx:ColumnSeries yField=&#8221;Widgets&#8221; name=&#8221;luxury Widgets&#8221; &gt;<br />
&lt;mx:fill&gt;<br />
&lt;mx:SolidColor color=&#8221;#82C9EB&#8221; /&gt;<br />
&lt;/mx:fill&gt;<br />
&lt;/mx:ColumnSeries&gt;<br />
&lt;mx:ColumnSeries yField=&#8221;Blinkies&#8221; name=&#8221;Mass Market Blinkies&#8221;&gt;<br />
&lt;mx:fill&gt;<br />
&lt;mx:LinearGradient angle=&#8221;0&#8243;&gt;<br />
&lt;mx:entries&gt;<br />
&lt;mx:Array&gt;<br />
&lt;mx:GradientEntry ratio=&#8221;30&#8243; color=&#8221;#258BC8&#8243; /&gt;<br />
&lt;mx:GradientEntry ratio=&#8221;80&#8243; color=&#8221;#82C9EB&#8221; /&gt;<br />
&lt;mx:GradientEntry ratio=&#8221;100&#8243; color=&#8221;#258BC8&#8243; /&gt;<br />
&lt;/mx:Array&gt;<br />
&lt;/mx:entries&gt;<br />
&lt;/mx:LinearGradient&gt;<br />
&lt;/mx:fill&gt;<br />
&lt;/mx:ColumnSeries&gt;<br />
&lt;/mx:Array&gt;<br />
&lt;/mx:series&gt;</p>
<p>&lt;mx:verticalAxisRenderer&gt;<br />
&lt;mx:AxisRenderer labelFunction=&#8221;formatThousands&#8221; /&gt;<br />
&lt;/mx:verticalAxisRenderer&gt;</p>
<p>&lt;/mx:ColumnChart&gt;</p>
<p>&lt;mx:Label id=&#8221;drilldownLabel&#8221; text=&#8221;{drilldownTitle}&#8221; fontSize=&#8221;16&#8243; height=&#8221;10%&#8221; width=&#8221;100%&#8221; fontWeight=&#8221;bold&#8221; /&gt;</p>
<p>&lt;mx:CartesianChart id=&#8221;drillDownChart&#8221; width=&#8221;100%&#8221; height=&#8221;20%&#8221; dataProvider=&#8221;{drilldownValues}&#8221; fontFamily=&#8221;chartLabelFont&#8221;<br />
horizontalAxisStyle=&#8221;hangingCategoryAxis&#8221; verticalAxisStyle=&#8221;linedNumericAxis&#8221;&gt;</p>
<p>&lt;mx:horizontalAxis&gt;<br />
&lt;mx:CategoryAxis dataProvider=&#8221;{drilldownValues}&#8221; categoryField=&#8221;week&#8221; /&gt;<br />
&lt;/mx:horizontalAxis&gt;</p>
<p>&lt;mx:horizontalAxisRenderer&gt;<br />
&lt;mx:AxisRenderer canDropLabels=&#8221;true&#8221; /&gt;<br />
&lt;/mx:horizontalAxisRenderer&gt;</p>
<p>&lt;mx:verticalAxisRenderer&gt;<br />
&lt;mx:AxisRenderer labelFunction=&#8221;formatThousands&#8221; /&gt;<br />
&lt;/mx:verticalAxisRenderer&gt;</p>
<p>&lt;mx:series&gt;<br />
&lt;mx:Array&gt;<br />
&lt;mx:ColumnSeries yField=&#8221;sales&#8221; showDataEffect=&#8221;drillDownEffect&#8221; /&gt;<br />
&lt;mx:LineSeries form=&#8221;curve&#8221; yField=&#8221;avg&#8221; showDataEffect=&#8221;drillDownEffect&#8221;&gt;<br />
&lt;mx:stroke&gt;<br />
&lt;mx:Stroke weight=&#8221;3&#8243; color=&#8221;#82C9EB&#8221; /&gt;<br />
&lt;/mx:stroke&gt;<br />
&lt;/mx:LineSeries&gt;<br />
&lt;/mx:Array&gt;<br />
&lt;/mx:series&gt;</p>
<p>&lt;/mx:CartesianChart&gt;</p>
<p>&lt;/mx:TitleWindow&gt;</p>
<p>Finalizando com um arquivo CFML contendo um ActionScript mais complexo para trabalhar com dados remotos.</p>
<p>c:\inetpub\wwwroot\cfform\charting\ZingerChartPopUpDynamic.cfm</p>
<p> &lt;cfform name=&#8221;basic&#8221; format=&#8221;flash&#8221; width=&#8221;650&#8243;&gt;<br />
&lt;cfformitem type=&#8221;script&#8221;&gt;<br />
function createChart(value){<br />
var connection:mx.remoting.Connection = mx.remoting.NetServices.createGatewayConnection(&#8216;http://localhost:8300/flashservices/gateway/&#8217;);<br />
var serviceEvent:Object = {};<br />
serviceEvent.onResult = function(result):Void{<br />
var query = [];<br />
for(var i=0; i &lt; result._items.length; i++){<br />
query[i] = {};<br />
query[i].Month=result._items[i].MONTH;<br />
query[i].Widgets=result._items[i].WIDGETS;<br />
query[i].Blinkies=result._items[i].BLINKIES;<br />
query[i].monthIdx=result._items[i].MONTHIDX;<br />
}<br />
_root[value] = mx.managers.PopUpManager.createPopUp(_root, ZingerChart_final_2);<br />
_root[value].centerPopUp();<br />
_root[value].closeButton = true;<br />
_root[value].zingerManufacturingData = query;<br />
_root[value].title = &#8216;Chart Year &#8216;+value;<br />
var listener:Object = {};<br />
listener.click = function(e){<br />
e.target.deletePopUp();<br />
}<br />
_root[value].addEventListener(&#8216;click&#8217;,listener);<br />
};<br />
serviceEvent.onStatus = function(status):Void{<br />
alert(status.description,status.level);<br />
};<br />
var servicePath:String = &#8216;cfform.charting.data&#8217;;<br />
var service:mx.remoting.NetServiceProxy = connection.getService(servicePath,serviceEvent);<br />
service.get({Year:value});<br />
}<br />
&lt;/cfformitem&gt;<br />
&lt;cfformgroup type=&#8221;hbox&#8221; width=&#8221;642&#8243; style=&#8221;margin:0&#8243;&gt;<br />
&lt;cfselect name=&#8221;Year&#8221; width=&#8221;70&#8243; label=&#8221;Year&#8221; onChange=&#8221;createChart(Year.value);&#8221;&gt;<br />
&lt;cfloop from=&#8221;1&#8243; to=&#8221;12&#8243; index=&#8221;i&#8221;&gt;<br />
&lt;cfset currentYear = 1995+i &gt;<br />
&lt;cfoutput&gt;<br />
&lt;option value=&#8221;#Right(currentYear,2)#&#8221;&gt;#currentYear#&lt;/option&gt;<br />
&lt;/cfoutput&gt;<br />
&lt;/cfloop&gt;<br />
&lt;/cfselect&gt;<br />
&lt;/cfformgroup&gt;<br />
&lt;/cfform&gt;</p>
<p>Enjoy !!<br />
&#8211;<br />
<a href="http://livedocs.macromedia.com/coldfusion" target="_blank"> </a><a href="alert(pcsilva@mxstudio.com.br);">Pedro Claudio<br />
Adobe Certified Professional </a><br />
<a href="http://pcsilva.blogspot.com" target="_blank">Blog</a></td>
</tr>
<tr>
<td>&nbsp;</td>
</tr>
</table>
<p>  FormatCF(new Array(\&#8217;ZingerChart.cfm\&#8217;,\&#8217;ZingerChartPopUpDynamic.cfm\&#8217;,\&#8217;data.cfc\&#8217;,\&#8217;ZingerChartPopUp.cfm\&#8217;));  FormatXML(new Array(\&#8217;ZingerChart_final_2.mxml\&#8217;,\&#8217;ZingerChart_final_1.mxml\&#8217;));   </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/coldfusion/cfform_com_mxml_1_5_componentes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>LocalConnection no CFFORM</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/coldfusion/localconnection_no_cfform/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/coldfusion/localconnection_no_cfform/#comments</comments>
		<pubDate>Fri, 06 Apr 2007 00:00:00 +0000</pubDate>
		<dc:creator>Pedro Claudio</dc:creator>
				<category><![CDATA[Coldfusion]]></category>
		<category><![CDATA[AS CFML]]></category>
		<category><![CDATA[CFML]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[A comunica&#231;&#227;o entre selects em forms diferentes, vamos trabalhar com ele?]]></description>
			<content:encoded><![CDATA[<br />
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td>
<h1>Introdução</h1>
<p>Faz algum tempo =/, que publiquei um <a href="http://pcsilva.blogspot.com/2006/11/cfform-to-cfform-localconnection.html" target="_blank">video demonstrando a comunicação</a> entre swfs construidos com CFFORM, como os pedidos foram muitos venho aqui compartilhar essa implementação com vocês.<br />
<a href="http://www.cfbrasil.com.br/?acao=pagina.visualizarMateria&amp;materia_id=03651008-D876-89A8-44F1D3C122E366B6" target="_blank"><br />
</a></p>
<h1>Pré-requisito</h1>
<p>- ColdFusion MX 7.0.2, <a href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=7&amp;aid=742" target="_blank">com um repositório de classes configurado</a>.</p>
<h1>         Conceitos</h1>
<p>Esta aplicação está baseada na comunicação provida através da <a href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=3&amp;aid=160" target="_blank">classe LocalConnection</a>, e consequentemente todo seu conceito também baseia-se nela.<br />
Esta classe ActionScript cria um objeto, encarregado de transportar mensagens (chamada de função) e responder a uma mensagem (execução da função solicitada), entre aplicações SWF, ao mesmo tempo pode ser rementente e destinatário, fazendo uma analogia ao envio de correspondência na no mundo real.<br />
Quando selecionarmos  (evento change) uma linha<br />
do select, chamaremos uma função no swf de destino, passando como parâmetro a linha selecionado, esta função adicionará este elemento no select de destino, e após a execução da função remota, removeremos a linha selecionada.</p>
<h1>Conteúdo</h1>
<p>Para implementar isto, utilizei dois arquivos ActionScript, e dois arquivos CFM. O primeiro arquivo ActionScript permite o uso da class LocalConnection em qualquer outra aplicação, não está amarrada a esta aplicação, o segundo arquivo, um pouco mais complexo, conté toda as movimentações de dados, e os arquivos cfm é onde contruiremos os forms.</p>
<p>Vamos aos aquivos CFM, não vou comentar ainda, mesmo porque o CFML é bem simples e explicito.<br />
Mas chamo a atenção para a propriedade onload do cfform, nela encontramos a função que construirá toda a comunicação entre os forms, note que os dois primeiros parâmtros da chamada, serão os nomes dos conectores LocalConnection, o primeiro sempre será o objeto corrente, e o segundo o objeto remoto, eles devem ser únicos (repare que foram colocado em posições diferentes na chamada), o mais apropriado seria utilzar a função CFML CreateUUID, não foi feito isso aqui para não confundir, os demais parâmetros podem ser identificados com facilidade.</p>
<p>BD1.cfm</p>
<p> &lt;cfform name=&#8221;form1&#8243; id=&#8221;form1&#8243; method=&#8221;post&#8221; format=&#8221;flash&#8221;  width=&#8221;300&#8243; height=&#8221;250&#8243;<br />
onload=&#8221;cfform2cfform(&#8216;connector1&#8242;,&#8217;connector2&#8242;,&#8217;MyList1&#8242;,&#8217;addRight&#8217;,'Enviar&#8217;)&#8221;&gt;          &lt;cfformitem type=&#8221;script&#8221;&gt;<br />
#include &#8220;communication.as&#8221;<br />
&lt;/cfformitem&gt;</p>
<p>&lt;cfformgroup type=&#8221;horizontal&#8221;&gt;</p>
<p>&lt;cfselect name=&#8221;MyList1&#8243; size=&#8221;5&#8243; multiple=&#8221;yes&#8221;&gt;<br />
&lt;option value=&#8221;pcsilva&#8221;      &gt;pcsilva      &lt;/option&gt;<br />
&lt;option value=&#8221;Pedro&#8221;        &gt;Pedro        &lt;/option&gt;<br />
&lt;option value=&#8221;Pedro Claudio&#8221;&gt;Pedro Claudio&lt;/option&gt;<br />
&lt;/cfselect&gt;</p>
<p>&lt;cfinput type=&#8221;button&#8221; name=&#8221;addRight&#8221; value=&#8221;&gt;&gt;&#8221; /&gt;</p>
<p>&lt;/cfformgroup&gt;</p>
<p>&lt;cfinput type=&#8221;button&#8221; name=&#8221;Enviar&#8221; value=&#8221;Enviar&#8221;  /&gt;</p>
<p>&lt;/cfform&gt;</p>
<p>&lt;cfdump var=&#8221;#FORM#&#8221; /&gt;</p>
<p>BD2.cfm</p>
<p> &lt;cfform name=&#8221;form1&#8243; id=&#8221;form1&#8243; method=&#8221;post&#8221; format=&#8221;flash&#8221; width=&#8221;300&#8243; height=&#8221;250&#8243;<br />
onload=&#8221;cfform2cfform(&#8216;connector2&#8242;,&#8217;connector1&#8242;,&#8217;MyList2&#8242;,&#8217;addLeft&#8217;,'Enviar2&#8242;)&#8221;&gt;          &lt;cfformitem type=&#8221;script&#8221;&gt;<br />
#include &#8220;communication.as&#8221;<br />
&lt;/cfformitem&gt;</p>
<p>&lt;cfformgroup type=&#8221;horizontal&#8221;&gt;</p>
<p>&lt;cfinput type=&#8221;button&#8221; name=&#8221;addLeft&#8221; value=&#8221;&lt;&lt;&#8221; /&gt;</p>
<p>&lt;cfselect name=&#8221;MyList2&#8243; size=&#8221;5&#8243; multiple=&#8221;yes&#8221; /&gt;</p>
<p>&lt;/cfformgroup&gt;</p>
<p>&lt;cfinput type=&#8221;button&#8221; name=&#8221;Enviar2&#8243; value=&#8221;Enviar&#8221;  /&gt;</p>
<p>&lt;/cfform&gt;</p>
<p>&lt;cfdump var=&#8221;#FORM#&#8221; /&gt;</p>
<p>O arquivo seguinte foi utilizado no include ActionScript das duas paginas CFML, tente compreender o que ele faz, pois todas as operações de transferência de dados, forma colocados nele, e possivelmente você possa utilizar estas operações para um <a href="http://www.mxstudio.com.br/forum/index.php?showtopic=21119&amp;st=0&amp;p=92521&amp;#entry92521" target="_blank">select2select no mesmo cfform</a>.</p>
<p>communication.as</p>
<p> function cfform2cfform(connection1:String,connection2:String,gridName:String,buttonAdd:String,buttonPost:String){        /* crio o objeto LocalConnection */<br />
cfLocalConnection.receptor(connection1);</p>
<p>/* primeira ação<br />
nela permitimos que um swf remoto adicione uma linha no select local */<br />
var f1:Function = function(item:Object){<br />
_root[gridName].addItem(item.label,item.data);<br />
_root[gridName].selectedIndex = null;<br />
};<br />
/* adicionamos esta ação no objeto, impondo nome ADD */<br />
cfLocalConnection.append(&#8216;add&#8217;,f1);</p>
<p>/* segunda ação<br />
aqui o swf remoto pode adicionar mais de uma linha no select local */<br />
var f2:Function = function(db:Array){<br />
/* linha estranha?<br />
getDataProvider retona o dataProvider que é um array<br />
concat une dois arrays<br />
setDataProvider atribui um array ao dataProvider */<br />
_root[gridName].setDataProvider(_root[gridName].getDataProvider().concat(db));<br />
};<br />
/* chamaremos esta ação de ADDALL e atribuimos ao objeto LocalConnection */<br />
cfLocalConnection.append(&#8216;addAll&#8217;,f2);</p>
<p>/* terceira ação<br />
o swf selecionará todos as linhas do select e enviará o formulário */<br />
var f3:Function = function(){<br />
if(_root[gridName].getLength()&gt;0){<br />
var bd:Array = [];<br />
for(var i = 0; i &lt; _root[gridName].getLength(); i++){<br />
bd.push(i);<br />
}<br />
_root[gridName].setSelectedIndices(bd, false);<br />
}<br />
_root.submitForm();<br />
};<br />
/* denominei esta ação como post <img src='http://www.mxstudio.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  */<br />
cfLocalConnection.append(&#8216;post&#8217;,f3);</p>
<p>/* primerio evento<br />
esta ação é atribuida ao select local */<br />
var listener1:Object = {};<br />
listener1.change = function(event:Object):Void{<br />
/* ao selecinar, executamos remotamente o metodo ADD, no ouvinte connection2, com o parametro sendo a linha corrente*/<br />
cfLocalConnection.execute(connection2, &#8216;add&#8217;,_root[gridName].getSelectedItem());<br />
/* removemos a linha selecionada */<br />
_root[gridName].removeItemAt(_root[gridName].getSelectedIndex());<br />
/* removemos a seleção */<br />
_root[gridName].selectedIndex = null;<br />
};<br />
/* atribuimos ação ao evento */<br />
_root[gridName].addEventListener(&#8216;change&#8217;,listener1);</p>
<p>/* segundo evento<br />
esta ação será atribuida ao botão que adicionará todos os dados da select local no select remoto*/<br />
var listener2:Object = {};<br />
listener2.click = function(event:Object):Void{<br />
/* lista deve ter alguma linha selecionada */<br />
if(_root[gridName].getLength() &gt; 0 ){<br />
/* executamos adição remota */<br />
cfLocalConnection.execute(connection2, &#8216;addAll&#8217;,_root[gridName].getDataProvider());<br />
/* limpamos lista local */<br />
_root[gridName].removeAll();<br />
}<br />
};<br />
/* atribuimos ação ao evento */<br />
_root[buttonAdd].addEventListener(&#8216;click&#8217;,listener2);</p>
<p>/* terceiro evento<br />
esta é a ação de submit dos dois formulários */<br />
var listener3:Object = {};<br />
listener3.click = function(event:Object):Void{<br />
/* ver linha 23 */<br />
f3(&#8216;pcsilva&#8217;);<br />
/* esta linha está executando o &#8216;f3();&#8217; no swf remoto */<br />
cfLocalConnection.execute(connection2, &#8216;post&#8217;,'pcsilva&#8217;);<br />
};<br />
/* atribuimos ação ao evento */<br />
_root[buttonPost].addEventListener(&#8216;click&#8217;,listener3);</p>
<p>}</p>
<p>Por fim, a classe que ficou oculta pelo nome  cfLocalConnection, é até simples comparando com o script acima, mas vamos a ela.</p>
<p>cfLocalConnection.as</p>
<p> import mx.controls.Alert;<br />
class cfLocalConnection extends Object{        /* esta variável é a nossa tão falada LocalConnection, ela é quem executará todas as ações */<br />
private static var conn:LocalConnection;<br />
/* aqui armazenamos todas as ações */<br />
public  static var actions:Object;<br />
/* amarra a comunição de swfs em um dominio */<br />
public  static var domain:String = &#8216;localhost&#8217;;</p>
<p>/* contrutor */<br />
private function cfLocalConnection(){}</p>
<p>/* metodo criador do objeto LocalConnection */<br />
private static function createConnection():Void{<br />
/* cria a o objeto LocalConnection */<br />
conn = new LocalConnection();<br />
/* amarra ao dominio */<br />
conn.allowDomain(domain);<br />
/* cria informe de erro */<br />
conn.onStatus = function(info:Object):Void{<br />
if(info.level==&#8217;error&#8217;){<br />
Alert.show(&#8216;Receptor inexistente!&#8217;,'Erro&#8217;);<br />
}<br />
};<br />
if(actions != null){<br />
var i:String;<br />
for(i in actions){<br />
conn[i]	= actions[i];<br />
}<br />
}<br />
}</p>
<p>/* cria o receptor */<br />
public static function receptor(connector:String):Void{<br />
if(conn == null){<br />
createConnection();<br />
}<br />
conn.connect(connector);<br />
}</p>
<p>/* execução remota */<br />
public static function execute(recepcao:String,functionName:String,param):Void{<br />
if(conn == null){<br />
createConnection();<br />
}<br />
conn.send(recepcao,functionName,param);<br />
}</p>
<p>/* adiciona ações ao objeto localconnection */<br />
public static function append(functionName:String,currentFunction:Function):Void{<br />
if(conn == null){<br />
createConnection();<br />
}<br />
if(actions == null){<br />
actions = new Object();<br />
}<br />
actions[functionName] = currentFunction;<br />
conn[functionName] = currentFunction;<br />
}</p>
<p>}</p>
<p>Feliz Páscoa.</p>
<p>&#8211;<br />
<a href="http://livedocs.macromedia.com/coldfusion" target="_blank"> </a><a href="alert(pcsilva@mxstudio.com.br);">Pedro Claudio<br />
Adobe Certified Professional </a><br />
<a href="http://pcsilva.blogspot.com" target="_blank">Blog</a></td>
</tr>
<tr>
<td>&nbsp;</td>
</tr>
</table>
<p> FormatCF(new Array(\&#8217;bd1.cfm\&#8217;,\&#8217;bd2.cfm\&#8217;)); FormatAS(new Array(\&#8217;communication.as\&#8217;,\&#8217;cfLocalConnection.as\&#8217;)); </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/coldfusion/localconnection_no_cfform/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CFFORM &#8211; Flash Remoting 2</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/coldfusion/cfform___flash_remoting_2/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/coldfusion/cfform___flash_remoting_2/#comments</comments>
		<pubDate>Mon, 20 Nov 2006 00:00:00 +0000</pubDate>
		<dc:creator>Pedro Claudio</dc:creator>
				<category><![CDATA[Coldfusion]]></category>
		<category><![CDATA[AS CFML]]></category>
		<category><![CDATA[CFML]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Finalizando este assunto, falaremos sobre otimiza&#231;&#227;o de c&#243;digo, constru&#231;&#227;o de classes, com foco no remoting]]></description>
			<content:encoded><![CDATA[<table border="0" width="100%" cellPadding="0" cellSpacing="0">
<tr>
<td>
<h1>Introdução</h1>
<p>Quando iniciamos os estudos sobre uma linguagem, ferramenta ou servidor devemos nos aprofundar, para que possamos maximizar a utilização, minimizando a quantidade de código, para criar uma aplicação otimizada. Então demonstrarei aqui como melhorar o código da aplicação de exemplo, passada no final no artigo anterior, de forma que a inclusão de ActionScript no código CFML, seja miníma, e para isto o desenvolvedor deve ter um conhecimento mínimo sobre <a target="_blank" href="http://www.pontoflash.com.br/colunas/materia.php?Coluna=3&amp;Item=367">construção de classes ActionScript 2.0</a> , e também informado <a target="_blank" href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=7&amp;aid=742">onde essas classes devem ser armazenadas</a>.<br />
<a target="_blank" href="http://www.cfbrasil.com.br/?acao=pagina.visualizarMateria&amp;materia_id=03651008-D876-89A8-44F1D3C122E366B6"><br />
</a></p>
<h1>Pré-requisito</h1>
<p>- ColdFusion MX 7.0.2, <a target="_blank" href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=7&amp;aid=742">com um repositório de classes configurado</a>.<br />
- Para que você possa acompanhar os exemplos a seguir, verifique se o mapeamento / do Administrador ColdFusion, será na pasta que ali está registrado onde será armazenado o componente (Usuario.cfc) deste artigo.</p>
<h1>Conceitos</h1>
<p>Não vou conceituar, apenas falarei das peculiaridades, ok? ok! E segurem o folego!<br />
A construção e utilização de classes AcitionScript 2.0 no servidor ColdFusion MX 7, obedece algumas regras e necessita de algum conhecimento específico, a primeira regra que devemos respeitar é a <a target="_blank" href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=7&amp;aid=733">restrição de código imposta pelo servidor</a> , <a target="_blank" href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=7&amp;aid=742">ter um repositório de classes definido em flex-config.xml</a>, implementar classes a partir da classe Object e/ou classes que possam receber chamadas diretas a seus métodos, uma particularidade nas declarações, todas devem ser estáticas (static), exceto o construtor, e para uma depuração detalhada, configure seu servidor para exibir as mensagens warning e/ou erro geradas no momento da execução &#8211; geralmente uso o comando tail (linux) para verificar as últimas entradas nos logs.<br />
Com relação a execução e testes de classes em Flash Forms CFFORM, você pode ouvir, ou até chegar a pensar ?Ah! Eu atualizei a classe, copiei para o repositório configurado, mas quando executo na pagina, ele não demonstra o incremento que fiz!?, isto ocorre porque o servidor ColdFusion possui uma cache própria para Flash Forms, e para que o servidor saiba que deve atualizar a cache, você precisa requisitar sua aplicação por uma url que contenha a variável ?recompile? com valor verdadeiro (?recompile=true).<br />
Basicamente é isso, mas no transcorrer do seu desenvolvimento poderá perceber outras particularidades dependendo do tipo de servidor que estiver usando.<br />
E quanto a compartilhar um diretório para vários sites, bom, não aconselho.</p>
<h1>Conteúdo</h1>
<p>Para o conteúdo vamos utilizar o componente do artigo anterior, que já deve estar configurado e respondendo pela url http://localhost/labs/remoting/Usuario.cfc, como também estar com o banco de dados implementado, se você não fez ou não tem isso <a target="_blank" href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=7&amp;aid=960">leia o artigo anterior</a> , e implemente como orientado.</p>
<p>Basicamente o que faremos é implementar o ActionScript (faça um outro diagrama) em cima do diagrama de classe desenvolvido para componente, o sugere que devemos ter na classe ActionScript ao menos seis métodos, relembrando, eles são: validate, append, update, remove, get e search.<br />
Aos que ficaram perdidos na frase acima, sugiro passar o olho em algum artigo, livro ou texto sobre UML e OO.<br />
Nossa classe ActionScript receberá dois métodos novos, a partir da estrutura do cfc, o primeiro será o comunicador, responsável em criar a conexão e cuidar do transporte das informações entre cliente e servidor, e o segundo apenas fará uma faxina nas informações do cliente (communication,clear), dispondo então da seguinte estrutura.</p>
<p>hUsuario.as</p>
<p>import mx.remoting.NetServices;<br />
import mx.remoting.NetServiceProxy;<br />
import mx.remoting.Connection;<br />
import mx.controls.Alert;<br />
import mx.managers.CursorManager;</p>
<p>class hUsuario extends Object{</p>
<p>private static var currentService:NetServiceProxy;</p>
<p>public static var userid:String;<br />
public static var username:String;<br />
public static var nome:String;<br />
public static var email:String;</p>
<p>private function hUsuario();<br />
private static function communication(onresult:Function):Void;<br />
private static function validate():Object;</p>
<p>public static function append():Void;<br />
public static function update(user:String):Void;<br />
public static function remove(user:String):Void;<br />
public static function get():Void;<br />
public static function search(query:String):Void;<br />
public static function clear():Void;</p>
<p>}</p>
<p>Os atributos userid, username, nome e email, são uma abstração das colunas da tabela lá do banco de dados, e o elemento mais importante nesta classe é o atributo currentService, por default sempre apontará para o mesmo conjunto de serviços, porém receberá ações diferentes, para que sejam executadas no retorno dos serviços, em cada serviço que estiver sendo executado, aqui resolvi coloca-lo como privado.</p>
<p>Os atributos.</p>
<p>private static var currentService:NetServiceProxy;<br />
public static var userid:String;<br />
public static var username:String;<br />
public static var nome:String;<br />
public static var email:String;</p>
<p><strong><br />
</strong>Neste exemplo o construtor não executa nenhum comando, mesmo porque ele está declarado como privado, e não será executado da forma que utilizaremos, como pode ter reparado, nossa classe é filha da classe Object, e é assim que será tratada, ou seja, como um objeto previamente criado &#8220;diferente do padrão&#8221;? Pode ser mas a classe mx.remoting.NetServices, também utiliza este artifício.<br />
O construtor, apenas pro forme.</p>
<p>private function hUsuario(){<br />
}</p>
<p>O próximo método é o mais importante e o motivo da criação desta classe, pois é nele que será construída a comunicador, que fará a ponte com o servidor.</p>
<p>/*<br />
Tem como parâmetro a ações que deve ser executada em um retorno ok do servidor.<br />
*/<br />
private static function communication(onresult:Function):Void {</p>
<p>/* aqui uma firula ao cliente */<br />
CursorManager.setBusyCursor();</p>
<p>/* endereço do gateway */<br />
var defaultGateway:String = &#8220;http://localhost/cfusion/flashservices/gateway/&#8221;;</p>
<p>/* endereço do conjunto de serviços */<br />
var defaultPath:String = &#8220;labs.remoting.Usuario&#8221;;</p>
<p>/* conexão com servidor */<br />
var conn:Connection = NetServices.createGatewayConnection(defaultGateway);</p>
<p>/* prepara parâmetro obrigatório da conexão com serviço*/<br />
var eventReturn:Object = new Object();</p>
<p>/* ação será executada em um retorno ok do servidor, com um leve complexidade, pois é uma execução padrão, e em seu conteúdo o parâmetro do método communication será executado */<br />
eventReturn.onResult = function(o):Void{</p>
<p>/* executa ação de fato */<br />
onresult(o);<br />
/* encerra conexão */<br />
conn.close();<br />
/* destrói a firula */<br />
CursorManager.removeBusyCursor();<br />
}<br />
/* onStatus <img src='http://www.mxstudio.com.br/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' />  */<br />
eventReturn.onStatus = function(info:Object):Void{<br />
Alert.show(info.description,info.level);<br />
conn.close();<br />
CursorManager.removeBusyCursor();<br />
};<br />
/* constrói conexão com o conjunto de serviços, variável poderá ser acessada pelos demais métodos */<br />
currentService = conn.getService(defaultPath,eventReturn);</p>
<p>}</p>
<p>Para um entendimento da lógica da código comentarei agora a operação mais simples desta classe.</p>
<p>/* método invoca todos os registros da base de dados*/<br />
public static function get():Void{/* ação que será executada de fato em um retorno ok do servidor*/<br />
var onResult:Function = function(result):Void{<br />
var query:Array = result._items;<br />
var recordount:Number = query.length;<br />
Alert.show(&#8216;Resposta (&#8216;+recordount+&#8217;) do servidor&#8217;,'result&#8217;);<br />
};</p>
<p>/* executa método passando a função como parâmetro, função esta que será inserida e invocada dentro de outra função, repare no método anterior (communication)*/<br />
communication(onResult);<br />
/* invoca serviço */<br />
currentService.get();</p>
<p>}</p>
<p>Os métodos seguintes são simplesmente os códigos do artigo anterior, contudo dispostos de forma mais organizada e vistosa, não vou comentar, apenas exibirei a classe completa e passarei ao formulário CFML.</p>
<p>hUsuario.as</p>
<p>import mx.remoting.NetServices;<br />
import mx.remoting.NetServiceProxy;<br />
import mx.remoting.Connection;<br />
import mx.controls.Alert;<br />
import mx.managers.CursorManager;</p>
<p>class hUsuario extends Object{</p>
<p>private static var currentService:NetServiceProxy;</p>
<p>public static var userid:String;<br />
public static var username:String;<br />
public static var nome:String;<br />
public static var email:String;</p>
<p>private function hUsuario(){<br />
}</p>
<p>private static function communication(onresult:Function):Void {</p>
<p>CursorManager.setBusyCursor();</p>
<p>var defaultGateway:String = &#8220;http://localhost/cfusion/flashservices/gateway/&#8221;;<br />
var defaultPath:String = &#8220;labs.remoting.Usuario&#8221;;</p>
<p>var conn:Connection = NetServices.createGatewayConnection(defaultGateway);</p>
<p>var eventReturn:Object = new Object();<br />
eventReturn.onResult = function(o):Void{<br />
onresult(o);<br />
conn.close();<br />
CursorManager.removeBusyCursor();<br />
}<br />
eventReturn.onStatus = function(info:Object):Void{<br />
Alert.show(info.description,info.level);<br />
conn.close();<br />
CursorManager.removeBusyCursor();<br />
};<br />
currentService = conn.getService(defaultPath,eventReturn);</p>
<p>}</p>
<p>private static function validate():Object{</p>
<p>var r:Object = new Object();<br />
var error:Boolean = true;</p>
<p>if(username != undefined &amp;&amp; username.length &gt; 0){<br />
r.username = username;<br />
error = false;<br />
}</p>
<p>if(nome != undefined &amp;&amp; nome.length &gt; 0){<br />
r.nome = nome;<br />
error = false;<br />
}</p>
<p>if(email != undefined &amp;&amp; email.length &gt; 0){<br />
r.email = email;<br />
error = false;<br />
}<br />
if(error){<br />
return null;<br />
}<br />
return r;</p>
<p>}</p>
<p>public static function append():Void{</p>
<p>var user = validate();</p>
<p>if(user != null){</p>
<p>var onResult:Function = function(result):Void{<br />
switch(result){<br />
case -1:<br />
Alert.show(&#8220;Erros entre os dados do registro&#8221;,&#8221;Erro&#8221;);<br />
break;<br />
case 0:<br />
Alert.show(&#8220;Duplicata de identificador recusada&#8221;,&#8221;Erro&#8221;);<br />
break;<br />
default:<br />
Alert.show(&#8220;Resposta ok (&#8220;+result+&#8221;)&#8221;,&#8221;result&#8221;);<br />
clear();<br />
break;<br />
}<br />
};</p>
<p>var arg:Object = new Object();<br />
arg.dados = user;<br />
communication(onResult);<br />
currentService.append(arg);</p>
<p>}else{<br />
Alert.show(&#8220;Infomação insuficiente!&#8221;,&#8221;Erro&#8221;);<br />
}</p>
<p>clear();</p>
<p>}</p>
<p>public static function update(user:String):Void{</p>
<p>var u = validate();</p>
<p>if(u != null){</p>
<p>var onResult:Function = function(result):Void{<br />
switch(result){<br />
case -1:<br />
Alert.show(&#8220;Erros entre os dados do registro&#8221;,&#8221;Erro&#8221;);<br />
break;<br />
case 0:<br />
Alert.show(&#8220;Duplicata de identificador recusada&#8221;,&#8221;Erro&#8221;);<br />
break;<br />
default:<br />
Alert.show(&#8220;Resposta ok&#8221;,&#8221;result&#8221;);<br />
clear();<br />
break;<br />
}<br />
};</p>
<p>var arg:Object = new Object();<br />
arg.id = user;<br />
arg.dados = u;<br />
communication(onResult);<br />
currentService.update(arg);</p>
<p>}else{<br />
Alert.show(&#8220;Infomação insuficiente!&#8221;,&#8221;Erro&#8221;);<br />
}</p>
<p>clear();</p>
<p>}</p>
<p>public static function remove(user:String):Void{</p>
<p>var onResult:Function = function(result):Void{<br />
if(result){<br />
Alert.show(&#8216;Resposta do servidor&#8217;,'result&#8217;);<br />
}else{<br />
Alert.show(&#8216;Idenficador recusado&#8217;,'Erro&#8217;);<br />
}<br />
};<br />
var arg:Object = new Object();<br />
arg.id = user;<br />
communication(onResult);<br />
currentService.remove(arg);</p>
<p>}</p>
<p>public static function get():Void{</p>
<p>var onResult:Function = function(result):Void{<br />
var query:Array = result._items;<br />
var recordount:Number = query.length;<br />
Alert.show(&#8216;Resposta (&#8216;+recordount+&#8217;) do servidor&#8217;,'result&#8217;);<br />
};<br />
communication(onResult);<br />
currentService.get();</p>
<p>}</p>
<p>public static function search(query:String):Void{</p>
<p>var onResult:Function = function(result):Void{<br />
var query:Array = result._items;<br />
var recordount:Number = query.length;<br />
if(recordount &gt; 0){<br />
Alert.show(&#8216;Resposta (&#8216;+recordount+&#8217;) do servidor&#8217;,'result&#8217;);<br />
}else{<br />
Alert.show(&#8220;Nenhum registro foi encontrado.&#8221;,&#8217;Erro&#8217;);<br />
}<br />
};<br />
var arg:Object = new Object();<br />
arg.str = query;<br />
communication(onResult);<br />
currentService.search(arg);</p>
<p>}</p>
<p>public static function clear():Void{</p>
<p>username = nome = email = &#8220;&#8221;;</p>
<p>}</p>
<p>}</p>
<p>Vou executar um método por arquivo, iniciando pelo get, muito complicado como pode ver.</p>
<p>1.cfm</p>
<p>&lt;cfform name=&#8221;basic&#8221; format=&#8221;flash&#8221; onload=&#8221;hUsuario.get();&#8221;&gt;<br />
&lt;/cfform&gt;</p>
<p><img width="421" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_112006_Remoting2_imagens/advanced1.gif" height="462" /></p>
<p>O método a seguir realizará a inclusão de um novo registro, caso a inclusão termine com sucesso retornará o ID do novo individuo, vou comentar, porque ele é muito mais complicado que o anterior.</p>
<p>2.cfm</p>
<p>&lt;cfform name=&#8221;basic&#8221; format=&#8221;flash&#8221; onload=&#8221;initRemoting();&#8221;&gt;<br />
&lt;cfformitem type=&#8221;script&#8221;&gt;<br />
function initRemoting(){<br />
//informo nome<br />
hUsuario.nome = &#8220;orlando&#8221;;<br />
//informo e-mail<br />
hUsuario.email = &#8220;velho@mail.com&#8221;;<br />
//informo username<br />
hUsuario.username = &#8220;velho&#8221;;<br />
//adiciono as informações no banco<br />
hUsuario.append();<br />
}<br />
&lt;/cfformitem&gt;<br />
&lt;/cfform&gt;</p>
<p><img width="347" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_112006_Remoting2_imagens/advanced2.gif" height="486" /></p>
<p>Vou aproveitar o ID que foi retornado no append, para nas demais execuções.<br />
A atualização é bem semelhante ao cadastro, a diferença está justamente no identificador do usuário, que deve ser passado como parâmetro, o restante é idêntico..</p>
<p>3.cfm</p>
<p>&lt;cfform name=&#8221;basic&#8221; format=&#8221;flash&#8221; onload=&#8221;initRemoting();&#8221;&gt;<br />
&lt;cfformitem type=&#8221;script&#8221;&gt;<br />
function initRemoting(){<br />
hUsuario.nome = &#8220;Orlando&#8221;;<br />
hUsuario.email = &#8220;gandalf@mail.com&#8221;;<br />
hUsuario.username = &#8220;gandalf&#8221;;<br />
hUsuario.update(&#8220;20&#8243;);<br />
}<br />
&lt;/cfformitem&gt;<br />
&lt;/cfform&gt;</p>
<p><img width="341" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_112006_Remoting2_imagens/advanced3.gif" height="458" /></p>
<p>As próximas execuções apresentam a mesma complexidade que a primeira, ou seja nenhuma.<br />
Removeremos agora o gandalf da base de dados.</p>
<p>4.cfm</p>
<p>&lt;cfform name=&#8221;basic&#8221; format=&#8221;flash&#8221; onload=&#8221;hUsuario.remove(&#8217;20&#8242;);&#8221;&gt;<br />
&lt;/cfform&gt;</p>
<p><img width="343" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_112006_Remoting2_imagens/advanced4.gif" height="460" /></p>
<p>E para finalizar a sequencia, vamos pesquisar um caracter comum a todos os registro.</p>
<p>5.cfm</p>
<p>&lt;cfform name=&#8221;basic&#8221; format=&#8221;flash&#8221; onload=&#8221;hUsuario.search(&#8216;@&#8217;);&#8221;&gt;<br />
&lt;/cfform&gt;</p>
<p><img width="342" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_112006_Remoting2_imagens/advanced5.gif" height="458" /></p>
<p>Para que entendam, mais claramente, de que ser este tipo de implementação, façam uma comparação do código da aplicação do artigo anterior para o código da aplicação a seguir.</p>
<p>index.cfm</p>
<p style="scroll">
<pre>&lt;cfform name="form1" format="flash" onload="initApp()"&gt; 

		&lt;cfformitem type="script"&gt;			function initApp(){				Usuario.formName = 'form1';			}		&lt;/cfformitem&gt; 

		&lt;cfformgroup type="panel" width="420"&gt;			&lt;cfformgroup  type="horizontal" &gt;				&lt;cfinput type="text"   name="qry"    id="qry"                                                                 /&gt;				&lt;cfinput type="button" name="search" id="search" value="Pesquisar" onclick="Usuario.search(_root.qry.text);"  /&gt;			&lt;/cfformgroup&gt;		&lt;/cfformgroup&gt; 

		&lt;cfformgroup type="panel" width="420" visible="false" id="pGrid"&gt;			&lt;cfgrid name="listUsuarios" width="400" rowheaders="false" onchange="_root.pUser.visible = true;"&gt;				&lt;cfgridcolumn name="nome"     /&gt;				&lt;cfgridcolumn name="username" /&gt;				&lt;cfgridcolumn name="email"    /&gt;			&lt;/cfgrid&gt; 			&lt;cfformgroup type="horizontal"&gt;				&lt;cfinput name="RefreshUsuarios" id="RefreshUsuarios" type="button" value="Refresh" onclick="Usuario.get();"                                          /&gt;				&lt;cfinput name="addUsuarios"     id="addUsuarios"     type="button" value="Novo"    onclick="Usuario.clear(); _root.pUser.visible = true;"            /&gt;				&lt;cfinput name="RemoveUsuarios"  id="RemoveUsuarios"  type="button" value="Remove"  onclick="Usuario.remove(_root.listUsuarios.selectedItem.userid);" /&gt;			&lt;/cfformgroup&gt;		&lt;/cfformgroup&gt; 

		&lt;cfformgroup type="panel" width="420" id="pUser" visible="false"&gt;			&lt;cfinput type="text"    id="id"           name="id"           label="ID"       validate="integer"  enabled="false"  bind="{listUsuarios.selectedItem.userid}"                                           /&gt;			&lt;cfinput type="text"    id="username"     name="username"     label="username" validate="noblanks" required="true"  bind="{listUsuarios.selectedItem.username}"                                         /&gt;			&lt;cfinput type="text"    id="nome"         name="nome"         label="nome"     validate="noblanks" required="false" bind="{(listUsuarios.selectedItem.nome != null)?listUsuarios.selectedItem.nome:''}" /&gt;			&lt;cfinput type="text"    id="email"        name="email"        label="email"    validate="email"    required="true"  bind="{listUsuarios.selectedItem.email}"                                            /&gt;			&lt;cfinput  type="button" id="saveUsuarios" name="saveUsuarios" value="Salvar"					onclick="							Usuario.nome = _root.nome.text ;							Usuario.email = _root.email.text;							Usuario.username = _root.username.text;							if(_root.id.text == ''){								Usuario.append();							}else{								Usuario.update(_root.id.text);							}" &gt;		&lt;/cfformgroup&gt; 

&lt;/cfform&gt;</pre>
<p><img width="514" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_112006_Remoting2_imagens/app1.gif" height="290" /></p>
<p><img width="509" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_112006_Remoting2_imagens/app2.gif" height="509" /></p>
<p><img width="455" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_112006_Remoting2_imagens/app3.gif" height="635" /></p>
<p>Obs.: São três imagens, mas não houve reload, basta testar o cfml e verá.</p>
<h1>Conclusão</h1>
<p>&#8220;Uma boa prática deixa seu código muito mais apresentável, otimizado, com uma produtividade alta e um tempo de implementação reduzido.&#8221;</p>
<p>&#8211;<br />
<a target="_blank" href="http://livedocs.macromedia.com/coldfusion"></a><a href="alert(pcsilva@mxstudio.com.br);">Pedro Claudio &#8211; pcsilva@mxstudio.com.br</a><br />
<a target="_blank" href="http://forum.mxstudio.com.br/index.php?showforum=31">visite o fórum MXStudio ColdFusion </a><br />
<a target="_blank" href="http://pcsilva.blogspot.com">Blog</a></td>
</tr>
<tr>
<td> </td>
</tr>
</table>
<p>     FormatCF(new Array(\&#8217;1.cfm\&#8217;,\&#8217;2.cfm\&#8217;,\&#8217;3.cfm\&#8217;,\&#8217;4.cfm\&#8217;,\&#8217;5.cfm\&#8217;,\&#8217;index.cfm\&#8217;));   FormatAS(new Array(\&#8217;hUsuario.as\&#8217;,\&#8217;oget\&#8217;,\&#8217;communication\&#8217;,\&#8217;Construtor\&#8217;,\&#8217;atributos\&#8217;)); </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/coldfusion/cfform___flash_remoting_2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CFFORM &#8211; Flash Remoting 1</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/coldfusion/cfform___flash_remoting_1/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/coldfusion/cfform___flash_remoting_1/#comments</comments>
		<pubDate>Sun, 19 Nov 2006 00:00:00 +0000</pubDate>
		<dc:creator>Pedro Claudio</dc:creator>
				<category><![CDATA[Coldfusion]]></category>
		<category><![CDATA[AS CFML]]></category>
		<category><![CDATA[CFML]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Estudando as diferen&#231;as do Flash Remoting do Flash para o CFFORM Flash]]></description>
			<content:encoded><![CDATA[<table border="0" width="100%" cellPadding="0" cellSpacing="0">
<tr>
<td>
<h1>Introdução</h1>
<p>Desde de a chegada do ColdFusion MX 7, venho publicando exemplos que utilizam Flash Remoting, mas aqui vamos detalhar a utilização desta tecnologia em aplicações construídas com a TAG CFFORM com o farmato flash, e o desenvolvimento do ActionScript nesta aplicação..<br />
Depois da leitura deste documento tente exercitar com os artigos passados, identificando esta tocnologia ali contida.<br />
<a target="_blank" href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=7&amp;aid=741">#include AS no CFFORM</a><br />
<a target="_blank" href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=7&amp;aid=780">Ações e eventos</a><br />
<a target="_blank" href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=7&amp;aid=477">Flash Form e Flash Remoting</a><br />
<a target="_blank" href="http://www.cfbrasil.com.br/?acao=pagina.visualizarMateria&amp;materia_id=03651008-D876-89A8-44F1D3C122E366B6">Flash Remoting em Formulrios CFFORM</a><a target="_blank" href="http://www.cfbrasil.com.br/?acao=pagina.visualizarMateria&amp;materia_id=03651008-D876-89A8-44F1D3C122E366B6">E como pode ser visto através deste último, que estarei falando sobre um assunto já abordado.</p>
<p></a></p>
<h1>Pré-requisito</h1>
<p>- ColdFusion MX 7.0.2<br />
- Para que você possa acompanhar os exemplos a seguir, verifique para qual pasta o mapeamento / do Administrador ColdFusion aponta, e crie uma estrutura de diretórios, a partir da pasta registrada, par que fique da seguinte forma [caminho visto no cfadmin]/labs/remoting, e o repositório do componente (Usuario.cfc) deste artigo, será a pasta remoting.</p>
<h1>Conceitos</h1>
<p>O conceito de Flash Remoting é muito confundido ao conceito de RIA, com uma simples diferença o Flash Remoting, é um mensageiro, é um dos elementos que permitem as aplicações RIA realizarem comunicações/requests sem reload de pagina, assim como wsdl, ajax e similares.<br />
A tecnologia está baseada no protocolo AMF criado pela Macromedia, que logo foi incorporado ao servidor ColdFusion MX 6, e continuado na versão seguinte ColdFusion MX 7.<br />
Tratando-se de aplicações Flash Remoting com Coldfusion, basicamente será preciso um componente com pelo menos um método com o tipo de access sendo remoto, e o desenvolvimento de uma aplicação ActionScript, para que o cliente acesse este componente.<br />
Como pode reparar o cliente vai ter a sua disposição uma comunicação cliente/servidor, isto é garantido através de um gateway servido pelo ColdFusion e com a construção de um proxy no ActionScript, isto permite que a aplicação realize todos as operações sem a necessidade de uma atualização de pagina no cliente..</p>
<h1>Conteúdo</h1>
<p><strong>Componente Remoto</strong><br />
Como foi dito um componente é necessário na utilização desta tecnologia, então vejamos o cfc.</p>
<p>Usuario.cfc</p>
<p><pre>&lt;cfcomponent name="Usuario" alias="labs.remoting.Usuario"&gt; 

  &lt;cffunction name="validate" access="private" output="false" returntype="struct"&gt;
  &lt;cfargument name="dados"  type="struct" required="true" /&gt;
  &lt;cfargument name="type"   type="string" required="true" /&gt; 

  &lt;cfset var user        = StructNew()                        /&gt;
  &lt;cfset var colunas     = ListToArray("nome,email,username") /&gt;
  &lt;cfset var isRequerida = ListToArray("false,true,true")     /&gt;
  &lt;cfset var i           = 0                                  /&gt; 

  &lt;cfset user.destino  = ArrayNew(1)                        /&gt;
  &lt;cfset user.value    = ArrayNew(1)                        /&gt;
  &lt;cfset user.valid    = false                              /&gt; 

  &lt;cfloop from="1" to="#ArrayLen(colunas)#" index="i"&gt; 

  &lt;cfif StructKeyExists(arguments.dados,colunas[i]) and  Len(Trim(arguments.dados[colunas[i]])) &gt; 

  &lt;cfif arguments.type eq "update"&gt;
  &lt;cfset ArrayAppend(user.value,"#colunas[i]# = '#Trim(arguments.dados[colunas[i]])#'") /&gt;
  &lt;cfelse&gt;
  &lt;cfset ArrayAppend(user.destino,colunas[i])                                           /&gt;
  &lt;cfset ArrayAppend(user.value,"'#Trim(arguments.dados[colunas[i]])#'")                /&gt;
  &lt;/cfif&gt; 

  &lt;cfset user.valid = true     /&gt; 

  &lt;cfelseif isRequerida[i] &gt;
  &lt;cfset    user.valid = false /&gt;
  &lt;cfreturn user               /&gt;
  &lt;/cfif&gt; 

  &lt;/cfloop&gt; 

  &lt;cfreturn user /&gt; 

  &lt;/cffunction&gt; 

  &lt;cffunction name="append"   access="remote"  output="false" returntype="numeric"&gt;
  &lt;cfargument name="dados" type="struct" required="true" /&gt; 

  &lt;cfset var user  = validate(arguments.dados,"add") /&gt;
  &lt;cfset var query = ""                              /&gt;  

  &lt;cfif user.valid &gt; 

  &lt;cfset query = search(arguments.dados.username) /&gt;
  &lt;cfif query.recordcount&gt;
  &lt;cfreturn 0 /&gt;
  &lt;/cfif&gt; 

  &lt;cfquery datasource="mxstudio_mysql"&gt;
          insert into usuarios (#ArrayToList(user.destino)#) values (#ArrayToList(user.value)#)
  &lt;/cfquery&gt; 

  &lt;cfset query = search(arguments.dados.username) /&gt; 

  &lt;cfif query.recordcount&gt;
  &lt;cfreturn query.userid /&gt;
  &lt;/cfif&gt; 

  &lt;/cfif&gt; 

  &lt;cfreturn -1 /&gt; 

  &lt;/cffunction&gt; 

  &lt;cffunction name="update"   access="remote"  output="false" returntype="numeric"&gt;
  &lt;cfargument name="dados" type="struct"  required="true" /&gt;
  &lt;cfargument name="id"    type="numeric" required="true" /&gt; 

  &lt;cfset var user = validate(arguments.dados,"update") /&gt;
  &lt;cfset var query = ""                                /&gt;  

  &lt;cfif user.valid &gt; 

  &lt;cfquery name="query" datasource="mxstudio_mysql"&gt;
          select * from usuarios
          where userid &lt;&gt; #arguments.id#
          and   username = '#arguments.dados.username#'
  &lt;/cfquery&gt;
  &lt;cfif query.recordcount&gt;
  &lt;cfreturn 0 /&gt;
  &lt;/cfif&gt; 

  &lt;cfquery datasource="mxstudio_mysql"&gt;
          update usuarios set
          #ArrayToList(user.value)#
          where userid = #arguments.id#
  &lt;/cfquery&gt; 

  &lt;cfreturn 1 /&gt; 

  &lt;/cfif&gt; 

  &lt;cfreturn -1 /&gt; 

  &lt;/cffunction&gt; 

  &lt;cffunction name="remove"   access="remote"  output="false" returntype="boolean"&gt;
  &lt;cfargument name="id" type="string" required="true" /&gt; 

  &lt;cfset var soma = 0 /&gt; 

  &lt;cftry&gt; 

  &lt;cfset soma = ArraySum(ListToArray(arguments.id)) /&gt; 

  &lt;cfcatch type="expression"&gt;
  &lt;cfreturn false/&gt;
  &lt;/cfcatch&gt; 

  &lt;/cftry&gt; 

  &lt;cfquery datasource="mxstudio_mysql"&gt;
          delete from usuarios
          where userid in (#arguments.id#)
  &lt;/cfquery&gt; 

  &lt;cfreturn true/&gt;  

  &lt;/cffunction&gt; 

  &lt;cffunction name="get"      access="remote"  output="false" returntype="query"&gt; 

  &lt;cfset var query = "" /&gt; 

  &lt;cfquery name="query" datasource="mxstudio_mysql"&gt;
          select userid as data, nome as label, usuarios.* from usuarios
  &lt;/cfquery&gt; 

  &lt;cfreturn query /&gt; 

  &lt;/cffunction&gt; 

  &lt;cffunction name="search"   access="remote"  output="false" returntype="query"&gt;
  &lt;cfargument name="str" type="any" required="true" /&gt; 

  &lt;cfset var query = "" /&gt; 

  &lt;cfquery name="query" datasource="mxstudio_mysql"&gt;
          select userid as data, nome as label, usuarios.* from usuarios
          where
  &lt;cfif IsNumeric(arguments.str)&gt;
          userid      = #arguments.str#
  &lt;cfelse&gt;
          username like '%#arguments.str#%'
          or  nome     like '%#arguments.str#%'
          or  email    like '%#arguments.str#%'
  &lt;/cfif&gt;
  &lt;/cfquery&gt; 

  &lt;cfreturn query /&gt; 

  &lt;/cffunction&gt; 

&lt;/cfcomponent&gt;</pre>
<p><strong>Banco de dados</strong><br />
Também será necessário um <a target="_blank" href="http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=7&amp;aid=534">database</a>, que aqui recebeu o nome de mxstudio_mysql, que contém a seguinte construção e valores.</p>
<p>Usuario.sql</p>
<p><pre>create table usuarios (
userid int(10) unsigned NOT NULL auto_increment,
username  varchar(100) default  NULL,
nome  varchar(255) default NULL,
email  varchar(255) default NULL,
primary key  (userid)
) engine=InnoDB default charset=utf8; 

insert into usuarios values ('','zezinho','Jose','zezinho@mail.com');
insert into usuarios values ('','cabeça','Andre','andre@mail.com');
insert into usuarios values ('','cachaça','Walter','cachaca@mail.com');</pre>
<p><strong><br />
ActionScript</strong></p>
<p>A parte CFML já está a disposição para acesso por Flash Remoting, dependendo da construção do proxy ActionScript na aplicação flash cliente.<br />
Quando do lançamento do ColdFusion MX 6, o mesmo não dispunha de aplicações Flash Form, que eram/são construídas no Flex ou Flash, então vou comparar uma construção ActionScript Flash com CFFORM Flash.</p>
<p>Para construir o proxy no Flash é preciso fazer o include de uma classe, isso na primeira versão de Flash MX, e nas verões posteriores através de import, como pode ser encontrado com facilidade em qualquer buscador.</p>
<p>Essa mesma construção em uma aplicação CFFORM Flash muda completamente, pois a época do desenvolvimento do ColdFusion MX 7, o ActionScript no qual foi baseado sofria grandes alterações, e também devido as restrições que este ActionScript recebeu quando inserido como features no ColdFusion, assunto que já foi visto http://www.mxstudio.com.br/views.tutorial.php?act=view&amp;cid=7&amp;aid=733.</p>
<p>O include ActionScript é permitido no CFFORM, porém desnecessário na construção de um proxy Flash Remoting nele, já que podemos realizar chamadas diretas as classes que estão no servidor.</p>
<p>Os exemplos foram construídos sem qualquer elemento cfform, a não ser o proprio cfform, que carrega proxy e executa o serviço.<br />
E uma chamada remoting simples aos serviços disponibilizados no cfc que vimos, fica assim:</p>
<p>1.cfm</p>
<p><pre>
  &lt;!--- o no evento onload do cfform invoco a inicialização do Remoting ---&gt;
    &lt;cfform name="basic" format="flash" onload="initRemoting();"&gt;
  &lt;cfformitem type="script"&gt;
   function initRemoting(){ 

    /*
    A classe mx.remoting.NetServices através do método
    createGatewayConnection construímos o a ligação
    cliente/servidor
    */
    var connection:mx.remoting.Connection = mx.remoting.NetServices.createGatewayConnection("http://localhost/cfusion/flashservices/gateway/");
   // objeto receberá ações para o serviço
    var serviceEvent:Object   = {};  

    // toda ação de um invoke ok, estaré em onResult
    serviceEvent.onResult = function(result):Void{
    alert('Resposta do servidor','result');
    }; 

    // caminho para o componente
    var servicePath:String = "labs.remoting.Usuario"; 

    // conecta o cliente ao serviço
    var service:mx.remoting.NetServiceProxy = connection.getService(servicePath,serviceEvent); 

    // invoca serviço
    service.get(); 

    }
  &lt;/cfformitem&gt;
  &lt;/cfform&gt;</pre>
<p><img width="421" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_Nov_2006_Remoting_1_imagens/basic1.gif" height="372" /></p>
<p>Quando disse que o objeto receberá &#8220;ações&#8221; para o serviço, não está errado, isto porque o serviço pode responder a dois eventos, que são onResult e onStatus, este segundo só será executado caso ocorra uma anomalia na conexão com o serviço ou na execução dele. Separei alguns exemplos disto para observarmos.</p>
<p>Nesta primeira observação um exemplo sem erros, apenas para verificar quais as propriedades do evento receberemos do servidor, reparem na função onStatus.</p>
<p>2_1.cfm</p>
<p><pre>
    &lt;cfform name="basic" format="flash" onload="initRemoting();"&gt;
  &lt;cfformitem type="script"&gt;
      function initRemoting(){ 

      var connection:mx.remoting.Connection = mx.remoting.NetServices.createGatewayConnection("http://localhost/cfusion/flashservices/gateway/");
     var serviceEvent:Object   = {};  

      serviceEvent.onResult = function(result):Void{
      alert('Resposta do servidor','result');
      };
      serviceEvent.onStatus = function(info:Object):Void{
      /*
      info.code - corrente SERVER.PROCESSING
      info.type - nome da classe envolvida no erro
      info.details - informa onde ocorreu o erro
      info.level - tipo do status, no remoting sempre erro
      info.description - mensagem de erro do servidor
      */
      alert(info.description,info.level);
      }; 

      var servicePath:String = "labs.remoting.Usuario"; 

      var service:mx.remoting.NetServiceProxy = connection.getService(servicePath,serviceEvent); 

      service.get(); 

      }
  &lt;/cfformitem&gt;
  &lt;/cfform&gt;</pre>
<p><img width="421" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_Nov_2006_Remoting_1_imagens/basic2_1.gif" height="369" /></p>
<p>Agora sim, a série de erros provocados, neste tentarei conectar o cliente a um serviço que não existe.</p>
<p>2_2.cfm</p>
<pre>

&lt;cfform name="basic" format="flash" onload="initRemoting();"&gt;
  &lt;cfformitem type="script"&gt;
      function initRemoting(){ 

      var connection:mx.remoting.Connection = mx.remoting.NetServices.createGatewayConnection("http://localhost/cfusion/flashservices/gateway/"); 

 var serviceEvent:Object   = {};  

      serviceEvent.onResult = function(result):Void{
      alert('Resposta do servidor','result');
      };
      serviceEvent.onStatus = function(info:Object):Void{
      alert(info.description,info.level);
      }; 

 // aqui o erro provocado
      var servicePath:String = "labs.remoting.ERRO"; 

      var service:mx.remoting.NetServiceProxy = connection.getService(servicePath,serviceEvent); 

      service.get(); 

      }
  &lt;/cfformitem&gt;
  &lt;/cfform&gt;</pre>
<p><img width="424" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_Nov_2006_Remoting_1_imagens/basic2_2.gif" height="364" /></p>
<p>Uma tentativa de conexão, onde o caminho do serviço não é um componente, neste exemplo em particular o caminho informado é uma pasta, e o serviço não pede um cfc e sim um cfm, não me pergunte porque, mas o caminho deve ser um componente.</p>
<p>2_3.cfm</p>
<pre>

&lt;cfform name="basic" format="flash" onload="initRemoting();"&gt;
  &lt;cfformitem type="script"&gt;
      function initRemoting(){ 

      var connection:mx.remoting.Connection = mx.remoting.NetServices.createGatewayConnection("http://localhost/cfusion/flashservices/gateway/"); 

 var serviceEvent:Object   = {};  

      serviceEvent.onResult = function(result):Void{
      alert('Resposta do servidor','result');
      };
      serviceEvent.onStatus = function(info:Object):Void{
      alert(info.description,info.level);
      }; 

      // aqui o erro provocado
      var servicePath:String = "labs.remoting"; 

      var service:mx.remoting.NetServiceProxy = connection.getService(servicePath,serviceEvent); 

      service.get(); 

      }
  &lt;/cfformitem&gt;
  &lt;/cfform&gt;</pre>
<p><img width="424" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_Nov_2006_Remoting_1_imagens/basic2_3.gif" height="374" /></p>
<p>Uma conexão sem caminho.</p>
<p>2_4.cfm</p>
<pre>

&lt;cfform name="basic" format="flash" onload="initRemoting();"&gt;
  &lt;cfformitem type="script"&gt;
      function initRemoting(){ 

      var connection:mx.remoting.Connection = mx.remoting.NetServices.createGatewayConnection("http://localhost/cfusion/flashservices/gateway/"); 

 var serviceEvent:Object   = {};  

      serviceEvent.onResult = function(result):Void{
      alert('Resposta do servidor','result');
      };
      serviceEvent.onStatus = function(info:Object):Void{
      alert(info.description,info.level);
      }; 

      // aqui o erro provocado
      var servicePath:String = ""; 

      var service:mx.remoting.NetServiceProxy = connection.getService(servicePath,serviceEvent); 

      service.get(); 

      }
  &lt;/cfformitem&gt;
  &lt;/cfform&gt;</pre>
<p><img width="424" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_Nov_2006_Remoting_1_imagens/basic2_4.gif" height="373" /></p>
<p>A tentiva de execução de um serviço que não existe.</p>
<p>2_5.cfm</p>
<pre>

&lt;cfform name="basic" format="flash" onload="initRemoting();"&gt;
  &lt;cfformitem type="script"&gt;
      function initRemoting(){ 

      var connection:mx.remoting.Connection = mx.remoting.NetServices.createGatewayConnection("http://localhost/cfusion/flashservices/gateway/"); 

 var serviceEvent:Object   = {};  

      serviceEvent.onResult = function(result):Void{
      alert('Resposta do servidor','result');
      };
      serviceEvent.onStatus = function(info:Object):Void{
      alert(info.description,info.level);
      }; 

      var servicePath:String = "labs.remoting.Usuario"; 

      var service:mx.remoting.NetServiceProxy = connection.getService(servicePath,serviceEvent); 

      // aqui o erro provocado
      service.ERRO(); 

      }
  &lt;/cfformitem&gt;
  &lt;/cfform&gt;</pre>
<p><img width="422" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_Nov_2006_Remoting_1_imagens/basic2_5.gif" height="368" /></p>
<p>A chamada de um serviço que necessita de parâmetro, mas não foi informado.</p>
<p>2_6.cfm</p>
<pre>

&lt;cfform name="basic" format="flash" onload="initRemoting();"&gt;
  &lt;cfformitem type="script"&gt;
      function initRemoting(){ 

      var connection:mx.remoting.Connection = mx.remoting.NetServices.createGatewayConnection("http://localhost/cfusion/flashservices/gateway/"); 

 var serviceEvent:Object   = {};  

      serviceEvent.onResult = function(result):Void{
      alert('Resposta do servidor','result');
      };
      serviceEvent.onStatus = function(info:Object):Void{
      alert(info.description,info.level);
      }; 

      var servicePath:String = "labs.remoting.Usuario"; 

      var service:mx.remoting.NetServiceProxy = connection.getService(servicePath,serviceEvent); 

      // aqui o erro provocado
      service.search(); 

      }
  &lt;/cfformitem&gt;
  &lt;/cfform&gt;</pre>
<p><img width="423" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_Nov_2006_Remoting_1_imagens/basic2_6.gif" height="369" /></p>
<p>A execução de um serviço onde o parâmetro passado é diferente do requerido.</p>
<p>2_7.cfm</p>
<pre>

&lt;cfform name="basic" format="flash" onload="initRemoting();"&gt;
  &lt;cfformitem type="script"&gt;
      function initRemoting(){ 

      var connection:mx.remoting.Connection = mx.remoting.NetServices.createGatewayConnection("http://localhost/cfusion/flashservices/gateway/"); 

 var serviceEvent:Object   = {};  

      serviceEvent.onResult = function(result):Void{
      alert('Resposta do servidor','result');
      };
      serviceEvent.onStatus = function(info:Object):Void{
      alert(info.description,info.level);
      }; 

      var servicePath:String = "labs.remoting.Usuario"; 

      var service:mx.remoting.NetServiceProxy = connection.getService(servicePath,serviceEvent); 

      var param:Object = {};
      // aqui o erro provocado
      param.dados=""; 

 service.append(param); 

      }
  &lt;/cfformitem&gt;
  &lt;/cfform&gt;</pre>
<p><img width="424" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_Nov_2006_Remoting_1_imagens/basic2_7.gif" height="373" /></p>
<p>Prosseguindo, veremos agora a passagem de parâmetros ao serviço. O mais correto é informar os parâmetros dentro de um objeto.</p>
<p>3.cfm</p>
<pre>

&lt;cfform name="basic" format="flash" onload="initRemoting();"&gt;
  &lt;cfformitem type="script"&gt;
    function initRemoting(){ 

    var connection:mx.remoting.Connection = mx.remoting.NetServices.createGatewayConnection('');
    connection.connect("http://localhost/cfusion/flashservices/gateway/"); 

 var serviceEvent:Object   = {};  

    serviceEvent.onResult = function(result):Void{
    alert('Resposta do servidor','result');
    };
    serviceEvent.onStatus = function(info:Object):Void{
    alert(info.description,info.level);
    }; 

    var servicePath:String = "labs.remoting.Usuario"; 

    var service:mx.remoting.NetServiceProxy = connection.getService(servicePath,serviceEvent); 

    //cria o objeto que receberá os parâmetros
    var params:Object = {};
    /*
    adiciona o nome do parâmetro exatamente como está no serviço,
    no atributo name da tag cfargument,
  &lt;cfargument name="str" ...&gt;
    */
    params.str = 'W'; 

    service.search(params); 

    }
  &lt;/cfformitem&gt;
  &lt;/cfform&gt;</pre>
<p><img width="415" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_Nov_2006_Remoting_1_imagens/basic3.gif" height="368" /></p>
<p>E por fim o tratamento do tipo de dado retornado pelo serviço na execução do onResult. Os tipos de dados comuns entre linguagens serão manipulados normalmente como estivesse na linguagem de origem, porém você deve estar atento ao case-sensitive do ActionScript, e por vezes alguns servidores passam ao cliente estruturas de dados (structs) e o ActionScript recebe este como Object, natural, mas em alguns casos suas keys estarão em caixa alta, e o tratamento deste objeto no cliente estaria esperando uma key em caixa baixa, atenção com isto ? já vi casos de desenvolvedor ficar um dia inteiro procurando o erro.<br />
Contudo, o exemplo a seguir é de um tipo de dado mais complexo, que no servidor ColdFusion é do tipo Query, na verdade é um outro, mas não vamos confundir, e no cliente será recebido como Array, e em uma propriedade especial.</p>
<p>4.cfm</p>
<pre>

&lt;cfform name="basic" format="flash" onload="initRemoting();"&gt;
  &lt;cfformitem type="script"&gt;
    function initRemoting(){ 

    var connection:mx.remoting.Connection = mx.remoting.NetServices.createGatewayConnection('');
    connection.connect("http://localhost/cfusion/flashservices/gateway/"); 

 var serviceEvent:Object   = {};  

    serviceEvent.onResult = function(result):Void{
    // _items é a propriedade onde estará a query retornada
    var query:Array = result._items;
    // identifico o recordcount da query retornada
    var recordCount:Number = query.length;
    var columnlist:String ="";
    // cria um lista com os keys do primeiro registro
    for(var i in query[0]){
    columnlist+=i+",";
    }
    alert('RecordCount = '+recordCount,'result');
    alert('ColumnList = '+columnlist,'result');
    };
    serviceEvent.onStatus = function(info:Object):Void{
    alert(info.description,info.level);
    }; 

    var servicePath:String = "labs.remoting.Usuario"; 

    var service:mx.remoting.NetServiceProxy = connection.getService(servicePath,serviceEvent); 

    service.get(); 

    }
  &lt;/cfformitem&gt;
  &lt;/cfform&gt;</pre>
<p><img width="423" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_Nov_2006_Remoting_1_imagens/basic4.gif" height="373" /></p>
<h1>Conclusão</h1>
<p>Seu conhecimento vai definir a variedade de operações<br />
que o Flash Form deve possuir, e também defini o quão reutilizável será seu código, em consequencia a quantidade de linhas, a praticidade e produtividade no desenvolvimento, bom isto veremos em um próximo post, e para exercitar deixo aqui uma aplicaçãozinha construída com as informações deste artigo.</p>
<p>index.cfm</p>
<pre>

&lt;cfform name="form1" format="flash"&gt;
  &lt;cfformgroup type="panel" width="420"&gt;
  &lt;cfformgroup  type="horizontal"&gt;
  &lt;cfinput type="text" name="qry" id="qry" &gt;
  &lt;cfinput type="button" name="search" id="search" value="Pesquisar"
    onclick="
    var params:Object = {};
    params.str = _root.qry.text; 

    var connection:mx.remoting.Connection = mx.remoting.NetServices.createGatewayConnection('http://localhost/cfusion/flashservices/gateway/'); 

    var serviceEvent:Object   = {};  

    serviceEvent.onResult = function(result):Void{
    _root.listUsuarios.dataProvider = result._items;
    _root.id.text = '';
    _root.username.text = '';
    _root.email.text = '';
    _root.nome.text = '';
    CFFormValidators.resetInValidFields();
    }; 

    var servicePath:String = 'labs.remoting.Usuario'; 

    var service:mx.remoting.NetServiceProxy = connection.getService(servicePath,serviceEvent); 

    service.search(params); 

  "
  &gt; 

 &lt;/cfformgroup&gt;
  &lt;/cfformgroup&gt;
  &lt;cfformgroup type="panel" width="420"&gt;
  &lt;cfgrid name="listUsuarios" width="400" rowheaders="false"&gt;
  &lt;cfgridcolumn name="nome" &gt;
  &lt;cfgridcolumn name="username" &gt;
  &lt;cfgridcolumn name="email" &gt;
  &lt;/cfgrid&gt;
  &lt;cfformgroup type="horizontal"&gt;
  &lt;cfinput name="RefreshUsuarios" id="RefreshUsuarios" type="button" value="Refresh"
    onclick="
    var connection:mx.remoting.Connection = mx.remoting.NetServices.createGatewayConnection('http://localhost/cfusion/flashservices/gateway/'); 

    var serviceEvent:Object   = {};  

    serviceEvent.onResult = function(result):Void{
    _root.listUsuarios.dataProvider = result._items;
    _root.id.text = '';
    _root.username.text = '';
    _root.email.text = '';
    _root.nome.text = '';
    CFFormValidators.resetInValidFields();
    }; 

    var servicePath:String = 'labs.remoting.Usuario'; 

    var service:mx.remoting.NetServiceProxy = connection.getService(servicePath,serviceEvent); 

    service.get(); 

  "
  &gt;
  &lt;cfinput name="RemoveUsuarios" id="RemoveUsuarios" type="button" value="Remove"
    onclick="
    if(_root.listUsuarios.selectedItem != null){ 

    var params:Object = {};
    params.id = _root.listUsuarios.selectedItem.userid; 

    var connection:mx.remoting.Connection = mx.remoting.NetServices.createGatewayConnection('http://localhost/cfusion/flashservices/gateway/'); 

    var servicePath:String = 'labs.remoting.Usuario'; 

    var serviceEvent:Object   = {};  

    serviceEvent.onResult = function(result):Void{
    if(result){
    var dt:Array = [];
    for(var i =0; i &lt; _root.listUsuarios.dataProvider.length;i++ ){
    if(_root.listUsuarios.dataProvider[i].userid != params.id){
    dt.push(_root.listUsuarios.dataProvider[i]);
    }
    }
    _root.listUsuarios.dataProvider = dt;
    _root.id.text = '';
    _root.username.text = '';
    _root.email.text = '';
    _root.nome.text = '';
    CFFormValidators.resetInValidFields();
    alert('Ok','result');
    }else{
    alert('Erro','result');
    }
    };
    serviceEvent.onStatus = function(info:Object):Void{
    alert(info.description,info.level);
    }; 

    var service:mx.remoting.NetServiceProxy = connection.getService(servicePath,serviceEvent); 

    service.remove(params);
    }else{
    alert('Selecione um usuario','Erro');
    }
  "
  &gt;
  &lt;/cfformgroup&gt;
  &lt;/cfformgroup&gt;
  &lt;cfformgroup type="panel" width="420"&gt;
  &lt;cfinput type="text" id="id" name="id" label="ID" bind="{listUsuarios.selectedItem.userid}" enabled="false" validate="integer"&gt;
  &lt;cfinput type="text" id="username" name="username" label="username" bind="{listUsuarios.selectedItem.username}" validate="noblanks" required="true"&gt;
  &lt;cfinput type="text" id="nome" name="nome" label="nome" bind="{(listUsuarios.selectedItem.nome != null)?listUsuarios.selectedItem.nome:''}" validate="noblanks" required="false"&gt;
  &lt;cfinput type="text" id="email" name="email" label="email" bind="{listUsuarios.selectedItem.email}" validate="email" required="true" &gt;
  &lt;cfinput name="saveUsuarios" id="saveUsuarios" type="button" value="Salvar"
    onclick="
    _root.enableAllValidators();
    CFFormValidators.resetInValidFields();
    if(mx.validators.Validator.isStructureValid(this, 'form1')){ 

    var params:Object = {};
    params.dados = {};
    params.dados.username = _root.username.text;
    params.dados.email = _root.email.text ;
    params.dados.nome = _root.nome.text ;
    var serviceName = 'append';
    if(_root.id.text != ''){
    serviceName = 'update';
    params.id = _root.id.text ;
    } 

    var connection:mx.remoting.Connection = mx.remoting.NetServices.createGatewayConnection('http://localhost/cfusion/flashservices/gateway/'); 

    var servicePath:String = 'labs.remoting.Usuario'; 

    var serviceEvent:Object   = {};  

    serviceEvent.onResult = function(result):Void{
    _root.id.text = '';
    _root.username.text = '';
    _root.email.text = '';
    _root.nome.text = '';
    CFFormValidators.resetInValidFields();
    alert(result,'result');
    };
    serviceEvent.onStatus = function(info:Object):Void{
    alert(info.description,info.level);
    }; 

    var service:mx.remoting.NetServiceProxy = connection.getService(servicePath,serviceEvent);
    service[serviceName](params);
    }else{
    _root.userOnError();
    }
  "
  &gt; 

 &lt;/cfformgroup&gt;
    &lt;/cfform&gt;</pre>
<p><img width="446" src="http://www.mxstudio.com.br/imagens_artigos/PedroClaudio_Nov_2006_Remoting_1_imagens/basic_application.gif" height="629" /><br />
&#8211;<br />
<a target="_blank" href="http://livedocs.macromedia.com/coldfusion"></a><a href="alert(pcsilva@mxstudio.com.br);">Pedro Claudio &#8211; pcsilva@mxstudio.com.br</a><br />
<a target="_blank" href="http://forum.mxstudio.com.br/index.php?showforum=31">visite o fórum MXStudio ColdFusion </a></td>
</tr>
<tr>
<td> </td>
</tr>
</table>
<p>     FormatCF(new Array(\&#8217;/labs/remoting/Usuario.cfc\&#8217;,\&#8217;1.cfm\&#8217;,\&#8217;2_1.cfm\&#8217;,\&#8217;2_2.cfm\&#8217;,\&#8217;2_3.cfm\&#8217;,\&#8217;2_4.cfm\&#8217;,\&#8217;2_5.cfm\&#8217;,\&#8217;2_6.cfm\&#8217;,\&#8217;2_7.cfm\&#8217;,\&#8217;3.cfm\&#8217;,\&#8217;4.cfm\&#8217;,\&#8217;index.cfm\&#8217;));   FormatSQL(new Array(\&#8217;Usuario.sql\&#8217;)); </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/coldfusion/cfform___flash_remoting_1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

