Eu criei um component genérico para obtenção de dados do Banco.
Já que o escambo de código aqui é permitido.... segue minha implementação.
Basicamente eu criei um objeto de resposta na forma de XML que me
informa se a requisição foi bem sucedida ou não.
Ao invés de estourar erros ou exceptions no PHP, eu defino as
mensagens no meu objeto resposta e o retorno. A estrutura é mais ou
menos esta:
<response>
<status><![CDATA[ ERROR ]]></status>
<message><![CDATA[ Erro inesperado ao retornar dados ]]></message>
<data/>
</response>
No caso de uma requisição bem executada - e espeficamente no caso de
um combobox -, a resposta é algo parecido com isto:
<response>
<status><![CDATA[ OK ]]></status>
<message/>
<data>
<item>
<id><![CDATA[ 1 ]]></id>
<name><![CDATA[ Banco do Brasil ]]></name>
</item>
<item>
<id><![CDATA[ 2 ]]></id>
<name><![CDATA[ Correios ]]></name>
</item>
</data>
</response>
E aí eu tenho meu componente base de implementação chamado de DynamicComboBox:
<?xml version="1.0" encoding="utf-8"?>
<mx:ComboBox xmlns:mx="http://www.adobe.com/2006/mxml" labelField="name">
<mx:Script>
<![CDATA[
import mx.events.ListEvent;
import mx.rpc.events.ResultEvent;
public static var EVENT:String = "Change";
protected var _selectedId:String = "-1";
public function set selectedId(value:String):void
{
_selectedId = value;
updateSelection();
}
public function get selectedId():String
{
return _selectedId;
}
public function set url(value:String):void
{
itemService.url = value;
}
public function get url():String
{
return itemService.url;
}
public function synchronize():void
{
itemService.cancel();
itemService.send();
}
protected function
handleItemServiceResult(event:ResultEvent):void
{
dataProvider =
XMLList(XMLList(XML(event.result).data)[0].item);
if (_selectedId != "-1") {
updateSelection();
}
}
protected function updateSelection():void
{
if (this.dataProvider != null)
{
var items:XMLList =
XMLList(this.dataProvider);
for (var i:int = 0, len:uint =
items.length(); i < len; i++)
{
var item:XML = XML(items[i]);
var id:String =
item.hasOwnProperty('id')
?
XML(item.id).toString()
: XMLList([EMAIL
PROTECTED]).toString();
if (_selectedId == id)
{
this.selectedIndex = i;
this.dispatchEvent(new
ListEvent(ListEvent.CHANGE, false, false, 0, i));
break;
}
}
}
}
]]>
</mx:Script>
<mx:HTTPService id="itemService" method="POST" useProxy="false"
resultFormat="e4x"
result="handleItemServiceResult(event)"/>
</mx:ComboBox>
Com este componente, eu tenho a possibilidade de auto-selecionar items
baseado no ID, alterar a URL de pesquisa, etc. Além disto, eu
implementei o sistema de notificação de alterações através da
aplicação. O que isto significa? Cada componente que herdar de
DynamicComboBox, tem um evento relacionado à sua alteração chamado de
EVENT. Por exemplo... neste caso específico, a minha resposta é
proveniente de uma consulta de Companies (Empresas). Portanto, eu crio
meu componente CompanyComboBox e nomeio meu evento para atualização de
dados como "ChangeCompany". Minha implementação da subclasse fica
assim:
<?xml version="1.0" encoding="utf-8"?>
<DynamicComboBox xmlns="core.controls.*"
xmlns:mx="http://www.adobe.com/2006/mxml"
initialize="init()" prompt="Select Company">
<mx:Script>
<![CDATA[
import core.Environment;
import mx.core.Application;
public static var EVENT:String = "ChangeCompany";
protected function init():void
{
var app:Application =
Environment.getApplication();
app.addEventListener(CompanyComboBox.EVENT,
function (e:Event):void
{
synchronize();
});
this.url = Environment.getInstance().CORE_URL +
"Controls_CompanyComboBox/Item";
this.synchronize();
}
]]>
</mx:Script>
</DynamicComboBox>
Peço desculpas por não expor minha classe Environment, mas ela
controle alguns acessos específicos. Basicamente é uma classe
Singleton e a utilização dela aqui é para obter a aplicação e a URL
base do código base do lado do PHP:
public static function getApplication():Application
{
return Application(Application.application);
}
public const CORE_URL:String =
"http://localhost:20080/aplicacao/web/core_dev.php/";
Eu modifiquei o componente para usar a classe mx:HTTPService do Flex e
não o meu componente rpc:Service que trata automaticamente as chamadas
que geraram erro.
Com toda essa parafernália.... basta apenas implementar as subclasses
e tudo funcionará perfeitamente para você.
Espero ter ajudado.
[]s,
2008/9/15 Mário Júnior <[EMAIL PROTECTED]>:
> primeiro... tenha certeza q o event.result contenha dados.
> segundo.. verifique qual a estrutura do objeto retornado para o resultEvent,
> e se estão vindo carregados (não nulos).
>
> joga um breakpoint no método q vc associa o e.result ao seu arrayCollection.
> (tenho 90% de certeza que e.result.dados não existe)
>
> only.
>
> um abraço.
>
>
>
> 2008/9/15 Jaison <[EMAIL PROTECTED]>
>>
>> Como vocês fazem pra popular o combobox com os dados vindo do banco?
>>
>>
>> 2008/9/15 Jaison <[EMAIL PROTECTED]>
>>>
>>> no meu caso não é isso não, pois a variavel ta criada.
>>>
>>>
>>> 2008/9/15 Vinícius Velasco <[EMAIL PROTECTED]>
>>>>
>>>> Eu nao sei mto de flex nao mas uma vez q isso aconteceu comigo era pq eu
>>>> nao tinha criado a variavel arraycollection q no seu caso chama listaAreas
>>>> como Bindable
>>>>
>>>> 2008/9/15 Jaison <[EMAIL PROTECTED]>
>>>>>
>>>>> pessoal seguinte, eu tenho um metodo que popula um combobox:
>>>>>
>>>>> public function carregaAreas():void{
>>>>> patologia.retornaAreas.send();
>>>>> }
>>>>>
>>>>> public function resultadoRetornaAreas(e:ResultEvent):void{
>>>>> listaAreas = ArrayCollection(e.result.dados);
>>>>> }
>>>>>
>>>>> no php ta assim:
>>>>>
>>>>> function retornaAreas(){
>>>>> $retorno['dados'] ="";
>>>>> $i = 0;
>>>>> $query = "select * from area ORDER BY nome_area ASC";
>>>>> $resultado = pg_query(conecta(),$query);
>>>>> if(pg_num_rows($resultado)>0){
>>>>> while ($linha = pg_fetch_array($resultado)) {
>>>>> $retorno['dados'][$i]['id_area'] =
>>>>> $linha['id_area'];
>>>>> $retorno['dados'][$i]['nome_area'] =
>>>>> utf8_decode($linha['nome_area']);
>>>>> $i++;
>>>>> }
>>>>> }
>>>>> return $retorno;
>>>>> }
>>>>>
>>>>> no flex ta assim:
>>>>>
>>>>> <mx:ComboBox x="10" y="43" width="326" dataProvider="{listaAreas}"></
>>>>> mx:ComboBox>
>>>>>
>>>>>
>>>>> minha dúvida: Porque naum popula? eu quero que apareça no combobox o
>>>>> nome da area (nome_area) mas naum aparece nada :( Alguem poderia me
>>>>> falar onde estou pecando?! :(
>>>>>
>>>>> abraço Galera!
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Bel. Vinícius Velasco
>>>>> Analista de Desenvolvimento - Ábaco
>>>>> MSN: [EMAIL PROTECTED]
>>>>> Skype: ircvinicius
>>>>> Fone: 66 8411 0245
>>>>> Rondonópolis - Mato Grosso - Brasil
>>>>> "Tudo Posso Naquele que me Fortalece" Fil 4:13
>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> Jaison.
>>> msn: [EMAIL PROTECTED] / 48. 84191383
>>> Site: www.portalandroid.org
>>
>>
>>
>> --
>> Jaison.
>> msn: [EMAIL PROTECTED] / 48. 84191383
>> Site: www.portalandroid.org
>>
>>
>
>
>
> --
> Mário de Souza Júnior
> Programador Java / Adobe Flex
> (44) 4009-3550 Maringá-PR
> http://blog.mariojunior.com
> [EMAIL PROTECTED] (gtalk, msn, etc..)
>
> >
>
--
Guilherme Blanco - Web Developer
CBC - Certified Bindows Consultant
Cell Phone: +55 (16) 9166-6902
MSN: [EMAIL PROTECTED]
URL: http://blog.bisna.com
Rio de Janeiro - RJ/Brazil
--~--~---------~--~----~------------~-------~--~----~
Você recebeu esta mensagem porque está inscrito na lista "flexdev"
Para enviar uma mensagem, envie um e-mail para [email protected]
Para sair da lista, envie um email em branco para [EMAIL PROTECTED]
Mais opções estão disponíveis em http://groups.google.com/group/flexdev
-~----------~----~----~----~------~----~------~--~---