<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Zis Code</title>
	<atom:link href="http://tiagozis.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://tiagozis.wordpress.com</link>
	<description>Um raciocínio lógico leva você de A a B. A imaginação leva você a qualquer lugar que você quiser. &#34;Albert Einstein&#34;</description>
	<lastBuildDate>Mon, 28 Feb 2011 03:23:00 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='tiagozis.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Zis Code</title>
		<link>http://tiagozis.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://tiagozis.wordpress.com/osd.xml" title="Zis Code" />
	<atom:link rel='hub' href='http://tiagozis.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Novo endereço do Blog Zis Code &#8211; http://ziscode.com</title>
		<link>http://tiagozis.wordpress.com/2011/02/28/novo-endereco-do-blog-zis-code-httpziscode-com/</link>
		<comments>http://tiagozis.wordpress.com/2011/02/28/novo-endereco-do-blog-zis-code-httpziscode-com/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 03:17:35 +0000</pubDate>
		<dc:creator>Tiago Zis</dc:creator>
				<category><![CDATA[Desenvolvimento de Software]]></category>

		<guid isPermaLink="false">http://tiagozis.wordpress.com/?p=202</guid>
		<description><![CDATA[Pessoal a partir de hoje o blog Zis Code encontra-se em um novo endereço onde pode ser conferido todo o conteúdo já existente aqui e os futuros tutoriais. Então aproveitem, como já sabem dúvidas ou sugestões deixem um recado. Endereço do novo Blog: http://ziscode.com<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagozis.wordpress.com&amp;blog=14385764&amp;post=202&amp;subd=tiagozis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Pessoal a partir de hoje o blog Zis Code encontra-se em um novo endereço onde pode ser conferido todo o conteúdo já existente aqui e os futuros tutoriais. Então aproveitem, como já sabem dúvidas ou sugestões deixem um recado.</p>
<p>Endereço do novo Blog: <a href="http://ziscode.com" target="_blank">http://ziscode.com</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagozis.wordpress.com/202/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagozis.wordpress.com/202/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagozis.wordpress.com/202/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagozis.wordpress.com/202/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tiagozis.wordpress.com/202/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tiagozis.wordpress.com/202/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tiagozis.wordpress.com/202/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tiagozis.wordpress.com/202/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagozis.wordpress.com/202/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagozis.wordpress.com/202/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagozis.wordpress.com/202/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagozis.wordpress.com/202/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagozis.wordpress.com/202/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagozis.wordpress.com/202/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagozis.wordpress.com&amp;blog=14385764&amp;post=202&amp;subd=tiagozis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tiagozis.wordpress.com/2011/02/28/novo-endereco-do-blog-zis-code-httpziscode-com/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a1446e0154d18fe1bcd7376e4f660f2b?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tiagozis</media:title>
		</media:content>
	</item>
		<item>
		<title>Transportando valores de atributos extras do Zend Framework e Doctrine para o Flex</title>
		<link>http://tiagozis.wordpress.com/2011/02/07/transportando-valores-de-atributos-extras-do-zend-framework-e-doctrine-para-o-flex/</link>
		<comments>http://tiagozis.wordpress.com/2011/02/07/transportando-valores-de-atributos-extras-do-zend-framework-e-doctrine-para-o-flex/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 21:13:17 +0000</pubDate>
		<dc:creator>Tiago Zis</dc:creator>
				<category><![CDATA[Desenvolvimento de Software]]></category>
		<category><![CDATA[atributos]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex 3]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://tiagozis.wordpress.com/?p=191</guid>
		<description><![CDATA[Durante a criação do post Integração Flex + Zend Framework + Doctrine mais especificamente na terceira parte do post (http://tiagozis.wordpress.com/2010/09/21/integracao-flex-zend-framework-doctrine-parte-3/), abordei um caso onde foi necessário adicionar dois atributos extras à classe “Reserva”, e devido a abstração das classes geradas pelo Doctrine teve-se a necessidade de criar um método para carregar os valores correspondentes aos [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagozis.wordpress.com&amp;blog=14385764&amp;post=191&amp;subd=tiagozis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Durante a criação do post Integração Flex + Zend Framework + Doctrine mais especificamente na terceira parte do post (<a href="http://tiagozis.wordpress.com/2010/09/21/integracao-flex-zend-framework-doctrine-parte-3/" target="_blank">http://tiagozis.wordpress.com/2010/09/21/integracao-flex-zend-framework-doctrine-parte-3/</a>), abordei um caso onde foi necessário adicionar dois atributos extras à classe “Reserva”, e devido a abstração das classes geradas pelo Doctrine teve-se a necessidade de criar um método para carregar os valores correspondentes aos atributos extras da classe. Método esse que era chamado após criar ou chamar a classe correspondente.</p>
<p>Neste post explicarei a solução encontrada para este problema onde será possível carregar os atributos adicionados à classe dentro do array (_data) que encaminha dos dados do Zend Framework para o Flex <!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE                           &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                            &lt;![endif]--><!--[if gte mso 10]&gt;--></p>
<p><span id="more-191"></span></p>
<p>Antes de iniciar a explicação gostaria de esclarecer que a solução aqui encontrada foi desenvolvida pelo Professor Carlos Henrique Bughi da UNIVALI, após eu ter terminado o post da integração passei o mesmo para ele e expliquei sobre o problema encontrado durante o processo de integração, dias depois ele concedeu uma solução para o problema que será explicado aqui.</p>
<p>Então gostaria de agradecer ao Professor Carlos pela solução do problema aqui abordado.</p>
<p>Como já sabemos a classe responsável pelas classes de modelo geradas pelo Doctrine é a classe Doctrine_Record, nesta classe existe um método chamado “getInterator()”, este método tem como valor de retorno um objeto da classe Doctrine_Record_Interator, este objeto é a responsável pelo array de atributos das classes de modelo geradas pelo Doctrine portanto será substituída por uma nova classe que contem as alterações necessárias.</p>
<p>Para alterarmos a classe acesse o arquivo Record.php, vá ao diretório onde se encontra o arquivo na raiz da biblioteca do Doctrine (../Doctrine/Record.php) e abra em um editor. Com a classe aberta em um editor procure o método mencionado anteriormente.</p>
<p>Dentro deste método comente a seguinte linha de código.</p>
<pre class="brush: php;">
//return new Doctrine_Record_Iterator($this);
</pre>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE                           &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                            &lt;![endif]--><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:&quot;Tabela normal&quot;; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin-top:0cm; 	mso-para-margin-right:0cm; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:&quot;Times New Roman&quot;; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:&quot;Times New Roman&quot;; 	mso-bidi-theme-font:minor-bidi;} --> <!--[endif]--></p>
<p class="MsoNormal">E adicione a seguinte linha ao mesmo.</p>
<pre class="brush: php;">
return new Custom_Record_Iterator($this);
</pre>
<p class="MsoNormal">Esta linha retornará o objeto correspondente à classe criada para a solução. Agora dentro do mesmo arquivo ao final da classe Doctrine_Record logo após o fechamento da ultima chave crie uma nova classe chamada Custom_record_Interator, após criar a classe vá até o diretório (../Doctrine/Record/Interator.php)  e abra este arquivo em um editor copie o conteúdo desta classe para dentro da classe criada anteriormente. O código ficará assim:</p>
<pre class="brush: php;">
class Custom_Record_Iterator extends ArrayIterator
{
/**
     * @var Doctrine_Record $record
     */
    private $record;

    /**
     * @var Doctrine_Null $null
     */
    private static $null;

    /**
     * constructor
     *
     * @param Doctrine_Record $record
     */
    public function __construct(Doctrine_Record $record)
    {
        $this-&gt;record = $record;
        parent::__construct($record-&gt;getData());
    }

    /**
     * initNullObject
     *
     * @param Doctrine_Null $null
     */
    public static function initNullObject(Doctrine_Null $null)
    {
        self::$null = $null;
    }

    /**
     * current
     *
     * @return mixed
     */
    public function current()
    {
        $value = parent::current();

        if ($value === self::$null) {
            return null;
        } else {
            return $value;
        }
    }
}
</pre>
<p class="MsoNormal">Uma variável é adicionada “$var” esta variável recebe o array de dados do objeto que está sendo utilizado, em seguida criamos um objeto “ReflectionClass” passando como parâmetro o objeto $record e através desse objeto que se obtem os atributos adicionais da classe modelo criada pelo Doctrine, como parâmetro definimos que queremos apenas os atributos públicos da classe já que os mesmos tem a necessidade de serem reconhecidos entre o lado servidor e lado cliente. Após obter os atributos adicionais da classe o array é percorrido para adicionar o valor do atributo ao array de dados (_data). E por fim passando os valores à classe pai da mesma.</p>
<p><span style="font-size:11pt;line-height:115%;font-family:&quot;">Como pode ser visto não é necessária uma grande alteração para solução do problema apenas alteramos o construtor da classe. Aqui neste caso foi criada uma nova classe para solução, abordei este método para não alterar a classe original da biblioteca do Doctrine, mas nada impede de alterar o construtor da própria classe. O código a seguir é como ficou a classe após a alteração.</span></p>
<pre class="brush: php;">
class Custom_Record_Iterator extends ArrayIterator
{
    /**
     * @var Doctrine_Record $record
     */
    private $record;

    /**
     * @var Doctrine_Null $null
     */
    private static $null;

    /**
     * constructor
     *
     * @param Doctrine_Record $record
     */
    public function __construct(Doctrine_Record $record)
    {
        $this-&gt;record = $record;
        $var = $record-&gt;getData();

        //Obtem o nome da classe
        $reflect = new ReflectionClass($record);
        //Retorna array com os atributos publicos da classe
        $props   = $reflect-&gt;getProperties(ReflectionProperty::IS_PUBLIC);

        //Adiciona os valores dos atributos adicinais da classe ao array de atributos da classe
        foreach ($props as $prop) {
        	$var[$prop-&gt;getName()] = $prop-&gt;getValue($record);
        }

        parent::__construct($var);
    }

    /**
     * initNullObject
     *
     * @param Doctrine_Null $null
     */
    public static function initNullObject(Doctrine_Null $null)
    {
        self::$null = $null;
    }

    /**
     * current
     *
     * @return mixed
     */
    public function current()
    {
        $value = parent::current();

        if ($value === self::$null) {
            return null;
        } else {
            return $value;
        }
    }
}
</pre>
<p class="MsoNormal">Agora como no caso abordado na integração das ferramentas dois atributos tinham sido atribuídos à classe.</p>
<pre class="brush: php;">
  public $nomHospede
  public $nomHotel
</pre>
<p class="MsoNormal">Adicione o método “construct()” à classe e dentro deste método chame os métodos que adicionavam o valor aos atributos ou até mesmo adicione o valor necessário dentro do construtor caso desejar. O código a seguir mostrará como ficará a classe Reserva abordada no post sobre a integração das ferramentas mencionadas.</p>
<pre class="brush: php;">
class Reserva extends Base_Reserva
{

	public $_explicitType = &quot;Reserva&quot;;
	public $nomHospede;
	public $nomHotel;

	public function setTableDefinition(){
		parent::setTableDefinition();
		$this-&gt;hasColumn('cod_reserva as codReserva');
		$this-&gt;hasColumn('cod_hotel_quarto as codHotelQuarto');
		$this-&gt;hasColumn('num_quarto as numQuarto');
		$this-&gt;hasColumn('cod_hospede as codHospede');
		$this-&gt;hasColumn('dat_reserva as datReserva');
		$this-&gt;hasColumn('qtd_dias as qtdDias');
		$this-&gt;hasColumn('sit_reserva as sitReserva');

	}

	public function construct(){
		$this-&gt;setNomHospede();
		$this-&gt;setNomeHotel();
	}

	public function setNomHospede($value = null){
		if(is_null($value)){
			$n = HospedeTable::getInstance();
			$value = $n-&gt;findOneBy('cod_hospede', $this-&gt;codHospede);
			$this-&gt;nomHospede = $value-&gt;nomHospede;
		}else{
			$this-&gt;nomHospede = $value;
		}

	}

	public function getNomHospede(){
		return $this-&gt;nomHospede;
	}

	public function setNomeHotel($value = null){
		if(is_null($value)){
			$q = Doctrine_Query::create()
			-&gt;select('q.nom_hotel, h.cod_hotel_quarto')
			-&gt;from('Hotel q')
			-&gt;leftJoin('q.HotelQuarto h on h.cod_hotel = q.cod_hotel')
			-&gt;where('h.cod_hotel_quarto = '.$this-&gt;codHotelQuarto);
			$result = $q-&gt;execute();
			$v = $result-&gt;getData();
			$this-&gt;nomHotel = $v[0]-&gt;nomHotel;
		}else{
			$this-&gt;nomHotel = $value;
		}
	}

	public function getNomHotel(){
		return $this-&gt;nomHotel;
	}
}
</pre>
<p class="MsoNormal">Como pode ser observado após a alteração necessária basta apenas aplicar a classe com atributos extras o método “construct()” para adicionar os valores desejados ao atributo assim não será mais necessário chamar um método para atribuir os valores cada vez que a classe for utilizada no projeto.</p>
<p class="MsoNormal">Bem espero que esta informação seja útil para quem desenvolve projetos utilizando as ferramentas aqui abordadas. Dúvidas ou sugestões deixem um recado aqui ou enviem um e-mail para <a href="mailto:ziscode@gmail.com">ziscode@gmail.com</a>.</p>
<p class="MsoNormal">Até a próxima.</p>
<div id="_mcePaste" class="mcePaste" style="position:absolute;left:-10000px;top:324px;width:1px;height:1px;overflow:hidden;"><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE                           &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                            &lt;![endif]--><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:&quot;Tabela normal&quot;; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin-top:0cm; 	mso-para-margin-right:0cm; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:&quot;Times New Roman&quot;; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:&quot;Times New Roman&quot;; 	mso-bidi-theme-font:minor-bidi;} --> <!--[endif]-->&nbsp;</p>
<p class="MsoNormal">E adicione a seguinte linha ao mesmo.</p>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagozis.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagozis.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagozis.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagozis.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tiagozis.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tiagozis.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tiagozis.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tiagozis.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagozis.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagozis.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagozis.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagozis.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagozis.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagozis.wordpress.com/191/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagozis.wordpress.com&amp;blog=14385764&amp;post=191&amp;subd=tiagozis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tiagozis.wordpress.com/2011/02/07/transportando-valores-de-atributos-extras-do-zend-framework-e-doctrine-para-o-flex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a1446e0154d18fe1bcd7376e4f660f2b?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tiagozis</media:title>
		</media:content>
	</item>
		<item>
		<title>Flex 3 &#8211; Adicionando componentes à borda de um Panel</title>
		<link>http://tiagozis.wordpress.com/2011/02/06/flex-3-adicionando-componentes-a-borda-de-um-panel/</link>
		<comments>http://tiagozis.wordpress.com/2011/02/06/flex-3-adicionando-componentes-a-borda-de-um-panel/#comments</comments>
		<pubDate>Sun, 06 Feb 2011 03:29:09 +0000</pubDate>
		<dc:creator>Tiago Zis</dc:creator>
				<category><![CDATA[Desenvolvimento de Software]]></category>
		<category><![CDATA[borda]]></category>
		<category><![CDATA[Componente]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex 3]]></category>
		<category><![CDATA[Panel]]></category>

		<guid isPermaLink="false">http://tiagozis.wordpress.com/?p=177</guid>
		<description><![CDATA[Há certo tempo estava desenvolvendo uma aplicação utilizando o Flex 3 e durante o processo tive a necessidade de adicionar um botão na borda superior de um Panel, e após muita pesquisa encontrei um exemplo. Bem vou aplicar o exemplo encontrado e que adotei na aplicação que estava desenvolvendo. Deixo bem claro que esta abordagem [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagozis.wordpress.com&amp;blog=14385764&amp;post=177&amp;subd=tiagozis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span id="more-177"></span>Há certo tempo estava desenvolvendo uma aplicação utilizando o Flex 3 e durante o processo tive a necessidade de adicionar um botão na borda superior de um Panel, e após muita pesquisa encontrei um exemplo.</p>
<p>Bem vou aplicar o exemplo encontrado e que adotei na aplicação que estava desenvolvendo. Deixo bem claro que esta abordagem é apenas para sistema desenvolvidos em Flex 3, pois na versão atual da ferramenta não há a necessidade de fazer isto pois existe os Skins para auxiliar.</p>
<p>Para adicionarmos um novo componente à borda superior do Panel crie uma nova classe, que chamei aqui de “CustomPanel”, e estenda a classe Panel. Em seguida será necessário sobrescrever dois métodos da classe, o método “createChildren” e o método “updateDisplayList”, o primeiro método é sobrescrito para poder adicionar o componente a borda do Panel. Pode-se adicionar vários componentes, o que será abordado no exemplo é o LinkButton, código a seguir.</p>
<pre class="brush: as3;">&lt;strong&gt;
override protected function createChildren():void {

    super.createChildren();

    //Criando um novo botão com o icone de uma lupa.
    linkButtonSearch = new LinkButton();
    linkButtonSearch.height =  borderMetrics.top -6;
    linkButtonSearch.width =  borderMetrics.top -6;
    linkButtonSearch.setStyle('icon', iconSearch);
    linkButtonSearch.setStyle(&quot;themeColor&quot;, 0x666666);
    rawChildren.addChild(linkButtonSearch);

    //Criando um novo botão com o icone para fechar a janela.
    linkButtonClose = new LinkButton();
    linkButtonClose.height =  borderMetrics.top -6;
    linkButtonClose.width =  borderMetrics.top -6;
    linkButtonClose.setStyle('icon', iconClose);
    linkButtonClose.setStyle(&quot;themeColor&quot;, 0x666666);
    //Adicionado evento para fechar a janela adicionada à um popup.
    linkButtonClose.addEventListener(MouseEvent.CLICK, close);
    rawChildren.addChild(linkButtonClose);
}
</pre>
<p>O segundo método a ser sobrescrito é utilizado por vários componentes no Flex para atualizar o componente quando o mesmo é alterado, ou seja, cada vez que o componente sofre uma alteração este método é chamado.  Código abaixo.</p>
<pre class="brush: as3;">
override protected function updateDisplayList (unscaledWidth:Number, unscaledHeight:Number):void {

    super.updateDisplayList(unscaledWidth, unscaledHeight);
    //Obtendo tamanho da borda do Panel e realizando cálculos para posicionar o componente.
    var y:int = borderMetrics.top/2 - linkButtonSearch.width/2;
    var x:int = this.width - linkButtonSearch.width - borderMetrics.right;

    //Posicionando o botão.
    linkButtonSearch.move((x-50), y);
    y = borderMetrics.top/2 - linkButtonClose.width/2;
    x = this.width - linkButtonClose.width - borderMetrics.right;
    linkButtonClose.move((x-5), y);
}
</pre>
<p>Foi adicionado ao código da classe outro método apenas para utilizar o evento para fechar o Panel quando o mesmo for adicionado a um PopUpManeger<span style="text-decoration:underline;">.</span></p>
<p>Abaixo o código da classe criada e o código para testarmos o componente criado.</p>
<pre class="brush: as3;">
package
{
	import flash.events.MouseEvent;

	import mx.containers.Panel;
	import mx.controls.LinkButton;
	import mx.managers.PopUpManager;

	public class CustomPanel extends Panel
	{

		[Embed(source=&quot;assets/open_search.png&quot;)]
		private static var iconSearch:Class;

		[Embed(source=&quot;assets/close_window.png&quot;)]
		private static var iconClose:Class

		private var linkButtonSearch:LinkButton;
		private var linkButtonClose:LinkButton;

		public function CustomPanel()
		{
			super();
		}

		/**
		 * Método para criar componentes que serão filhos deste painel.
		 * */
		override protected function createChildren() : void{

			super.createChildren();

			//Criando um novo botão com o icone de uma lupa.
			linkButtonSearch =  new LinkButton();
			linkButtonSearch.height =  borderMetrics.top -6;
			linkButtonSearch.width =  borderMetrics.top -6;
			linkButtonSearch.setStyle('icon', iconSearch);
			linkButtonSearch.setStyle(&quot;themeColor&quot;, 0x666666);
			rawChildren.addChild(linkButtonSearch);

			//Criando um novo botão com o icone para fechar a janela.
			linkButtonClose =  new LinkButton();
			linkButtonClose.height =  borderMetrics.top -6;
			linkButtonClose.width =  borderMetrics.top -6;
			linkButtonClose.setStyle('icon', iconClose);
			linkButtonClose.setStyle(&quot;themeColor&quot;, 0x666666);
			//Adicionado evento para fechar a janela adicionada à um popup.
			linkButtonClose.addEventListener(MouseEvent.CLICK, close);
			rawChildren.addChild(linkButtonClose);

		}

		/**
		 * Atualiza o componente quando o mesmo sofre uma alteração em seu formato.
		 * */
		override protected function updateDisplayList (unscaledWidth:Number, unscaledHeight:Number):void{

			super.updateDisplayList(unscaledWidth, unscaledHeight);

			//Obtendo tamanho da borda do Panel e realizando cálculos para posicionar o componente.
			var y:int = borderMetrics.top/2 - linkButtonSearch.width/2;
			var x:int = this.width - linkButtonSearch.width - borderMetrics.right;

			//Posicionando o botão.
			linkButtonSearch.move((x-50), y);

			y = borderMetrics.top/2 - linkButtonClose.width/2;
			x = this.width - linkButtonClose.width - borderMetrics.right;
			linkButtonClose.move((x-5), y);
		}

		/**
		 * Método para fechar o Panel quando adicionado em um PopUpManager.
		 * */
		private function close(e:MouseEvent):void {
			PopUpManager.removePopUp(this);
		}
	}
}
</pre>
<pre class="brush: as3;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; layout=&quot;absolute&quot;&gt;
	&lt;mx:Script&gt;
		&lt;![CDATA[
			import mx.managers.PopUpManager;

			public function addPanel():void {
				var panel:CustomPanel = new CustomPanel();
				panel.width = 200;
				panel.height = 100;
				panel.title = &quot;CustomPanel&quot;;
				PopUpManager.addPopUp(panel, this);
				PopUpManager.centerPopUp(panel);
			}
		]]&gt;
	&lt;/mx:Script&gt;
	&lt;mx:Button x=&quot;86&quot; y=&quot;41&quot; label=&quot;Add Panel&quot; click=&quot;addPanel()&quot;/&gt;
&lt;/mx:Application&gt;
</pre>
<p>Link para download dos fontes: <a href="http://www.megaupload.com/?d=SMKKF4LP" target="_blank">http://www.megaupload.com/?d=SMKKF4LP</a></p>
<p class="MsoNormal">Espero que tenham gostado. Dúvidas ou sugestões deixem um recado ou enviem um e-mail para <a href="mailto:ziscode@gmail.com">ziscode@gmail.com</a>.</p>
<div id="_mcePaste" class="mcePaste" style="position:absolute;left:-10000px;top:579px;width:1px;height:1px;overflow:hidden;"><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE                           &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                            &lt;![endif]--><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:&quot;Tabela normal&quot;; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin-top:0cm; 	mso-para-margin-right:0cm; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:&quot;Times New Roman&quot;; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:&quot;Times New Roman&quot;; 	mso-bidi-theme-font:minor-bidi;} --> <!--[endif]-->&nbsp;</p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US">package</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US">{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">import</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> flash.events.MouseEvent;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">import</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> mx.containers.Panel;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">import</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> mx.controls.LinkButton;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">import</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> mx.managers.PopUpManager;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">public</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">class</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> CustomPanel </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">extends</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> Panel</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> {</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> [</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">Embed</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">(source=</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">"assets/open_search.png"</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">)]</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">private</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">static</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">var</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> iconSearch:Class;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> [</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">Embed</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">(source=</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">"assets/close_window.png"</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">)]</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">private</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">static</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">var</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> iconClose:Class</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">private</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">var</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> linkButtonSearch:LinkButton;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">private</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">var</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> linkButtonClose:LinkButton;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">public</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">function</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> CustomPanel()</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;">{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span><span style="font-size:10pt;font-family:&quot;">super</span><span style="font-size:10pt;font-family:&quot;">();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> }</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span><span style="font-size:10pt;font-family:&quot;">/**</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> * Método para criar componentes que serão filhos deste painel.</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">* */</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">override</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">protected</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">function</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> createChildren() : </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">void</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;">super</span><span style="font-size:10pt;font-family:&quot;">.createChildren(); </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span><em><span style="font-size:10pt;font-family:&quot;">//Criando um novo botão com o icone de uma lupa.</span></em></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">linkButtonSearch = </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">new</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> LinkButton();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> linkButtonSearch.height =  borderMetrics.top -6;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> linkButtonSearch.width =  borderMetrics.top -6;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> linkButtonSearch.setStyle(</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">&#8216;icon&#8217;</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">, iconSearch);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> linkButtonSearch.setStyle(</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">&#8220;themeColor&#8221;</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">, 0&#215;666666);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> rawChildren.addChild(linkButtonSearch);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><em><span style="font-size:10pt;font-family:&quot;">//Criando um novo botão com o icone para fechar a janela.</span></em></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">linkButtonClose = </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">new</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> LinkButton();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> linkButtonClose.height =  borderMetrics.top -6;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> linkButtonClose.width =  borderMetrics.top -6;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> linkButtonClose.setStyle(</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">&#8216;icon&#8217;</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">, iconClose);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;">linkButtonClose.setStyle(</span><span style="font-size:10pt;font-family:&quot;">&#8220;themeColor&#8221;</span><span style="font-size:10pt;font-family:&quot;">, 0&#215;666666);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span><em><span style="font-size:10pt;font-family:&quot;">//Adicionado evento para fechar a janela adicionada à um popup.</span></em></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">linkButtonClose.addEventListener(MouseEvent.CLICK, close); </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;">rawChildren.addChild(linkButtonClose);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> }</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span><span style="font-size:10pt;font-family:&quot;">/**</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> * Atualiza o componente quando o mesmo sofre uma alteração em seu formato.</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">* */</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">override</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">protected</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">function</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> updateDisplayList (unscaledWidth:Number, unscaledHeight:Number):</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">void</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;">super</span><span style="font-size:10pt;font-family:&quot;">.updateDisplayList(unscaledWidth, unscaledHeight); </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span><em><span style="font-size:10pt;font-family:&quot;">//Obtendo tamanho da borda do Panel e realizando cálculos para posicionar o componente. </span></em></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">var</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> y:int = borderMetrics.top/2 &#8211; linkButtonSearch.width/2;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">var</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> x:int = </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">this</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">.width &#8211; linkButtonSearch.width &#8211; borderMetrics.right;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><em><span style="font-size:10pt;font-family:&quot;">//Posicionando o botão.</span></em></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> linkButtonSearch.move((x-50), y);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">y = borderMetrics.top/2 &#8211; linkButtonClose.width/2;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> x = </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">this</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">.width &#8211; linkButtonClose.width &#8211; borderMetrics.right;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;">linkButtonClose.move((x-5), y);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> }</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span><span style="font-size:10pt;font-family:&quot;">/**</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> * Método para fechar o Panel quando adicionado em um PopUpManager.</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">* */</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">private</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">function</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> close(e:MouseEvent):</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US">void</span><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> {</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-US"> </span><span style="font-size:10pt;font-family:&quot;">PopUpManager.removePopUp(</span><span style="font-size:10pt;font-family:&quot;">this</span><span style="font-size:10pt;font-family:&quot;">);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> }</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> }</span></p>
<p class="MsoNormal"><span style="font-size:10pt;line-height:115%;font-family:&quot;">}</span></p>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagozis.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagozis.wordpress.com/177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagozis.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagozis.wordpress.com/177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tiagozis.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tiagozis.wordpress.com/177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tiagozis.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tiagozis.wordpress.com/177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagozis.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagozis.wordpress.com/177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagozis.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagozis.wordpress.com/177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagozis.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagozis.wordpress.com/177/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagozis.wordpress.com&amp;blog=14385764&amp;post=177&amp;subd=tiagozis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tiagozis.wordpress.com/2011/02/06/flex-3-adicionando-componentes-a-borda-de-um-panel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a1446e0154d18fe1bcd7376e4f660f2b?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tiagozis</media:title>
		</media:content>
	</item>
		<item>
		<title>Integrando Flex com PHP utilizando Amfphp</title>
		<link>http://tiagozis.wordpress.com/2010/11/02/integrando-flex-com-php-utilizando-amfphp/</link>
		<comments>http://tiagozis.wordpress.com/2010/11/02/integrando-flex-com-php-utilizando-amfphp/#comments</comments>
		<pubDate>Tue, 02 Nov 2010 03:31:18 +0000</pubDate>
		<dc:creator>Tiago Zis</dc:creator>
				<category><![CDATA[Desenvolvimento de Software]]></category>
		<category><![CDATA[AmfPHP]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex Builder]]></category>
		<category><![CDATA[Integração]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://tiagozis.wordpress.com/?p=123</guid>
		<description><![CDATA[Criei este tutorial com o objetivo de mostrar de forma simples como integrar uma aplicação desenvolvida em Flex com a linguagem de programação voltada a servidor o PHP através da utilização da ferramenta Amfphp para comunicação entre os dois lados cliente e servidor. Acho importante que, para quem ainda não utiliza o Flex, conhecer o [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagozis.wordpress.com&amp;blog=14385764&amp;post=123&amp;subd=tiagozis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Criei este tutorial com o objetivo de mostrar de forma simples como integrar uma aplicação desenvolvida em Flex com a linguagem de programação voltada a servidor o PHP através da utilização da ferramenta Amfphp para comunicação entre os dois lados cliente e servidor.</p>
<p><span id="more-123"></span></p>
<p>Acho importante que, para quem ainda não utiliza o Flex, conhecer o funcionamento desta integração sem a utilização de frameworks, pois isto facilita muito o processo de aprendizado, algo que não ocorreu comigo, que ao utilizar a ferramenta de desenvolvimento Flex trabalhei já com o framework Symfony e após um tempo é que apliquei em estudos e testes a integração utilizando somente o Amfphp.</p>
<p>Aproveitem o tutorial.</p>
<p>As ferramentas utilizadas para este tutorial são:</p>
<p>Adobe Flash Builder 4: ferramenta de desenvolvimento distribuído pela Adobe em forma Trial para 60 dias e também a empresa cede licença para estudantes apenas para desenvolver aplicações que não podem ser comercializadas. Link para download: <a href="http://www.adobe.com/br/products/flashbuilder/?sdid=GWQOF" target="_blank">http://www.adobe.com/br/products/flashbuilder/?sdid=GWQOF</a>.</p>
<p>NetBeans 6.9.1: IDE gratuita utilizada para desenvolver a parte do projeto no lado PHP, esta ferramenta tem suporte a várias outras linguagens de programação como o Java que é o carro chefe da IDE, C++, Ruby, etc. Link para download: <a href="http://netbeans.org/downloads/" target="_blank">http://netbeans.org/downloads/</a>.</p>
<p>Amfphp 1.9: Esta será a ferramenta que realizará a comunicação entre o Flex e o PHP através da serialização e desrealização das informações trocadas entre as ferramentas. Apesar do projeto desta ferramenta ter sido descontinuada pelo seu criador, ainda é possível baixar e utilizar a mesma. Outras versões desta ferramenta estão sendo mantidas pela Zend e foi integrada ao framework da empresa chamado de ZendFramework. Link para download do Amfphp: <a href="http://sourceforge.net/projects/amfphp/files/#files. Link do site oficial: http://amfphp.sourceforge.net/" target="_blank">http://sourceforge.net/projects/amfphp/files/#files. Link do site oficial: http://amfphp.sourceforge.net/</a>.</p>
<p>PostgreSQL 8.4: Este é o banco de dados que geralmente uso para desenvolver as aplicações em que trabalho, pois é um banco de dados robusto e de fácil utilização, pois pode ser baixado já com a ferramenta para gerenciamento que se chama PgAdmin. Link para download: <a href="http://www.postgresql.org/download/" target="_blank">http://www.postgresql.org/download/</a>.</p>
<p>Apenas quero destacar aqui que não é necessário utilizar exatamente as ferramentas descritas aqui existem outra IDEs para programação PHP e desenvolvimento da parte Flex do tutorial, bem como outros bancos de dados fica a sua escolha qual ferramenta utilizar.</p>
<p>O que é o Amfphp?<strong> </strong></p>
<p>Amfphp é uma ferramenta open-source que promove a comunicação entre aplicações da parte cliente desenvolvidas em Flash, Flex e AIR com o PHP, que é uma linguagem de programação utilizada no lado servidor. Esta comunicação ocorre através da serialização de tipos nativos e objetos da linguagem actionscript enviadas para o lado do servidor utilizando o protocolo de comunicação AMF.</p>
<p>Explicando de forma mais clara o a aplicação do lado cliente, que pode ser uma aplicação Flex envia a informação serializada para o servidor, ao receber a informação o Amfphp realiza a desrealização da informação e converte para o tipo que o PHP entende, com a informação já tratada, utiliza-se a mesma conforme for necessário enquanto o lado cliente da aplicação espera uma resposta do servidor. A resposta retornada pode ser uma nova informação serializada, uma mensagem, um determinado valor ou até mesmo um erro casso ocorra algum durante a requisição.</p>
<p>E todo esse processo de comunicação entre as duas interfaces é gerenciado pelo Amfphp.</p>
<p>O padrão de arquitetura MVC.<strong> </strong></p>
<p>Para quem ainda não conhece, MVC é um padrão de arquitetura de projetos que visa separar a lógica de um projeto de sua visão. O significado de MVC é model, view e control. O model ou modelo tem como objetivo definir o domínio da aplicação é aqui neste componente que desenvolvemos as classes de domínio da aplicação. O view ou visão é onde ficam os componentes que são visualizados pelo cliente, neste caso a aplicação do lado Flex representa este componente da arquitetura. Já o control ou controle comporta a parte de lógica do negocio da aplicação como, por exemplo, as consultas no banco de dados, tratamento das informações, etc.</p>
<p>Iniciando o projeto.<strong> </strong></p>
<p>Para dar inicio ao projeto crie um diretório no diretório root do servidor (localhost), neste diretório serão alocados os arquivos do projeto. Agora para seguir o modelo de padrão arquitetural MVC dentro da pasta que será criado o projeto crie os diretórios model, view e controller. E para finalizar crie um diretório e nomeie o mesmo de lib. O diretório lib é o local onde serão adicionados os arquivos do amfphp.</p>
<p>Após realizar o download do Amfphp extraia o arquivo para o diretório lib do projeto, deixe o arquivo extraído com o nome amfphp. O diretório do amfphp esta dividido da seguinte forma.</p>
<p>Diretório browser, dentro deste diretório se encontra uma ferramenta muito útil na hora que se está desenvolvendo, ali contêm uma ferramenta desenvolvida em Flex onde podem ser configurados os services do projeto que está sendo criado e testar se o mesmo está cumprindo com as tarefas à que foi designado. Porem não será abordado à utilização desta ferramenta neste tutorial.</p>
<p>No diretório core é onde ficam alocados os arquivos que fazem o Amfphp funcionar, ou seja, é neste diretório que se encontra a parte funcional da ferramenta.</p>
<p>O diretório service será o local onde serão criadas as classes services do sistema, as classes services são designadas para receber a informação enviada do cliente, ou seja, do Flex para o sistema na parte servidor que neste caso é o PHP. Nestas classes determinamos métodos para realizar as tarefas necessárias e através destes métodos que a informação retorna novamente para o lado cliente da aplicação.</p>
<p>Os outros dois arquivos relevantes para a aplicação é o gateway.php e o globals.php. O arquivo gateway é o responsável por receber a requisição enviada pelo lado cliente e encaminhar para o service requisitado e o método solicitado para realizar a tarefa, e é através do mesmo que a informação retorna para o cliente. O arquivo globals é responsável pela configuração do diretório onde se encontram alocado os services, e as classes que representam os objetos transmitidos entre os dois lados da aplicação. Sobre estas classes explicarei mais a frente.</p>
<p>Agora para configurar a ferramenta Amfphp coloque o diretório service no diretório principal do projeto junto dos diretórios da arquitetura MVC e do diretório lib. Apenas deixarei claro que a escolha do local dos diretórios fica a sua escolha, estou optando por colocar o diretório service neste local apenas para deixar o projeto de forma organizada separando a aplicação de forma que fique fácil de gerenciar.</p>
<p>Agora para que o Amfphp encontre a pasta service é necessário configurar a localização do diretório. Abra o arquivo globals.php no editor de sua escolha, neste arquivo existem duas linhas de código que representam o caminho dos diretórios service e vo.</p>
<p>$servicesPath = &#8220;services/&#8221;;</p>
<p>$voPath = &#8220;services/vo/&#8221;;</p>
<p>O diretório service já foi explicado. Mas para que serve o diretório “vo”?</p>
<p>No diretório “vo” ficam alocados as classes PHP que representam os objetos utilizados nas transações entre o lado cliente e o lado servidor. Porem estas classes será representado pelas classes de modelo do sistema, e estas classes serão alocadas no diretório model do projeto. Abaixo como ficarão as linhas de código após a configuração.</p>
<p>$servicesPath = dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR. &#8220;services&#8221; .DIRECTORY_SEPARATOR;</p>
<p>$voPath = dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR. &#8220;model&#8221; .DIRECTORY_SEPARATOR;</p>
<p>Explicando a configuração da constante __FILE__ representa o caminho para o diretório onde se encontra o arquivo de configuração e cada dirname representa o retorno de um nível da hierarquia dos diretórios, desta forma os diretórios estão configurados para serem reconhecidos quando forem solicitados pelo Amfphp.</p>
<p>Com as configurações do Amfphp realizadas já pode ser criado o banco de dados da aplicação, o caso abordado aqui vai utilizar duas tabelas para que se possa visualizar o relacionamento dos objetos. A primeira tabela é a tabela ‘pessoa’ que contêm os campos id, nome e email, a segunda tabela que foi nomeada de ‘informacoes’ contêm os campos id_pessoa, telefone_1, telefone_2 e email_adicional. Esta segunda tabela serve como dados adicionais à pessoa e sua chave primária é também uma chave estrangeira da tabela pessoa.</p>
<pre class="brush: sql;">
CREATE TABLE pessoa (
 id integer NOT NULL,
 nome character varying(255) NOT NULL,
 email character varying(255) NOT NULL
);
ALTER SEQUENCE pessoa_id_seq OWNED BY pessoa.id;
ALTER TABLE ONLY pessoa ADD CONSTRAINT pk_id PRIMARY KEY (id);

CREATE TABLE informacoes (
 id_pessoa bigint NOT NULL,
 telefone_1 character varying(50),
 telefone_2 character varying(50),
 email_adicional character varying(255)
);
ALTER TABLE ONLY informacoes ADD CONSTRAINT pk_id_pessoa PRIMARY KEY (id_pessoa);
ALTER TABLE ONLY informacoes ADD CONSTRAINT fk_id_pessoa FOREIGN KEY (id_pessoa) REFERENCES pessoa(id);
</pre>
<p>Para realizar a conexão com o banco de dados é interessante que seja criado uma classe no PHP para realizar esta função. Então crie uma classe com o nome que desejar, a classe que eu criei foi nomeada de Db. Nesta classe eu criei métodos estáticos para realizar as funções de conexão e consultas no banco de dados, o método abordado para esta classe também fica a sua escolha. A seguir o código da classe de conexão com o banco de dados.</p>
<pre class="brush: php;">
class Db {

 public static $conection;

 function Db(){
 }

 public static function dbConect(){
   try{
     Db::$conection = pg_connect(&quot;host=localhost user=postgres password=ragnarok dbname=db_amfphp&quot;);
   }catch (Exception $ex){
     echo $ex-&gt;getMessage();
   }
 }

 public static function dbInserts($sql){
   try{
     $result = pg_query(Db::$conection, $sql);

     if($result){
       return true;
     }

   }catch (Exception $ex){
     echo $ex-&gt;getMessage();
   }
 }

 public static function dbConsult($sql){
   try{
     $result = pg_query(Db::$conection, $sql);
     if($result){
       return  pg_fetch_all($result);
     }
   }catch (Exception $ex){
     echo $ex-&gt;getMessage();
   }
 }

 public static function dbConsultOneObject($sql){
   try{
     $result = pg_query(Db::$conection, $sql);
     if($result){
       return  pg_fetch_object($result);
     }
   }catch (Exception $ex){
     echo $ex-&gt;getMessage();
   }
 }

 public static function dbClose(){
   pg_close();
 }
}
</pre>
<p>Explicando esta classe, o método dbConect() contêm a string de conexão para o banco de dados, o método dbInserts($sql) é utilizado para realizar as consultas de inserção, alteração e exclusão no banco de dados e recebe como parâmetro o SQL que será executado, o método dbConsult($sql) será utilizado para realizar as consultas que retornam uma lista de registro no banco de dados e que posteriormente se tornará uma lista de objetos que retornará para a aplicação do lado cliente, o método dbConsultOneObject($sql) retorna da consulta apenas um objeto que pode ser utilizado em momentos que se quer obter apenas um registro do banco de dados, porem o retorno vem em forma de objeto padrão do PHP e por ultimo o método dbClose() utilizado para encerrar a conexão com o banco de dados.</p>
<p>Lembrando que os métodos de consulta ao banco de dados aqui abordado se refere ao banco de dados Postgre para outros bancos de dados consulte a documentação do PHP no link: <a href="http://www.php.net/" target="_blank">http://www.php.net/</a>.</p>
<p>Com as tabelas do banco de dados já criadas será necessário criar as classes do domínio do sistema. As classes de domínio ou como conhecida por algumas pessoas como classes de modelo, serão as criadas tanto para representar os campos das tabelas no banco de dados como para ser utilizadas nas transações de objetos entre a aplicação do lado cliente, ou seja, o Flex e a aplicação parte servidor neste caso o PHP.</p>
<p>Crie uma classe chamada Pessoa e outra chamada Informacoes adicione os atributos que representam as tabelas no banco de dados e os métodos set e get de cada atributo.</p>
<p>A seguir como ficarão as classes criadas.</p>
<pre class="brush: php;">
class Pessoa {

 public $id;
 public $nome;
 public $email;

 public $_explicitType = &quot;Pessoa&quot;;

 public function setId($value){
   $this-&gt;id = $value;
 }

 public function getId(){
   return $this-&gt;id;
 }

 public function setNome($value){
   $this-&gt;nome = $value;
 }

 public function getNome(){
   return $this-&gt;nome;
 }

 public function setEmail($value){
   $this-&gt;email = $value;
 }

 public function getEmail(){
   return $this-&gt;email;
 }
}
</pre>
<pre class="brush: php;">
require_once 'Pessoa.php';

class Informacoes {

 public $idPessoa;
 public $telefone1;
 public $telefone2;
 public $emailAdicional;
 public $pessoa;

 function Informacoes(){
   $this-&gt;pessoa = new Pessoa();
 }

 public $_explicitType = &quot;Informacoes&quot;;

 public function setIdPessoa($value){
   $this-&gt;idPessoa = $value;
 }

 public function getIdPessoa(){
   return $this-&gt;idPessoa;
 }

 public function setTelefone1($value){
   $this-&gt;telefone1 = $value;
 }

 public function getTelefone1(){
   return $this-&gt;telefone1;
 }

 public function setTelefone2($value){
   $this-&gt;telefone2 = $value;
 }

 public function getTelefone2(){
   return $this-&gt;telefone2;
 }

 public function setEmailAdicional($value){
   $this-&gt;emailAdicional = $value;
 }

 public function getEmailAdicional(){
   return $this-&gt;emailAdicional;
 }

 public function setPessoa(Pessoa $value){
   $this-&gt;pessoa = $value;
 }

 public function getPessoa(){
   return $this-&gt;pessoa;
 }
}
</pre>
<p>Como pode ser observado nas classes existe um atributo adicional, o $_explicitType, este atributo adicional que recebe como valor uma string com o mesmo nome da classe em que se encontra, este atributo será utilizado pelo AMF para reconhecer qual classe no lado cliente da aplicação lado Flex representa a classe no lado PHP. Não é necessário que as classes tenham o mesmo nome em ambos os lados apenas abordo este método porque acho melhor de controlar a aplicação. Mas fica aqui um detalhe os atributos em ambas as classes têm que ter o mesmo nome para que o objeto criado seja reconhecido em ambos os lados durante as transações da aplicação.</p>
<p>A classe de controle do projeto fará a gerencia do mesmo, nesta classe contêm os métodos que realizarão as consultas no banco de dados e retornarão os resultados quando for necessário e também será utilizada pela classe service. Aqui nesta classe foi utilizado um padrão de projeto que é comum abordar para facilitar o uso da classe, este padrão se chama singleton, não abordarei sobre este padrão aqui, mas existe muito conteúdo na web sobre padrões de projeto inclusive este descrito aqui que melhor explicarão sobre o assunto. Abaixo a classe de controle criada para o projeto</p>
<pre class="brush: php;">
require_once '../config/Db.php';
require_once '../model/Informacoes.php';

class DadosController {

 static private $instance;

 static public function getInstance(){
   if(!isset (self::$instance)){
     $ins = __CLASS__;
     self::$instance = new $ins;
   }
   return self::$instance;
 }

 public function create(Informacoes $object){
   Db::dbConect();
   $object-&gt;getPessoa()-&gt;setId((int)Db::dbConsultOneObject(&quot;select nextval('pessoa_id_seq')&quot;)-&gt;nextval);
   Db::dbInserts(&quot;INSERT INTO pessoa (id, nome, email) VALUES (&quot;.$object-&gt;getPessoa()-&gt;id.&quot;,'&quot;.$object-&gt;getPessoa()-&gt;nome.&quot;','&quot;.$object-&gt;getPessoa()-&gt;email.&quot;')&quot;);
   Db::dbInserts(&quot;INSERT INTO informacoes (id_pessoa, telefone_1, telefone_2, email_adicional) VALUES (&quot;.$object-&gt;getPessoa()-&gt;id.&quot;,'&quot;.$object-&gt;getTelefone1().&quot;','&quot;.$object-&gt;getTelefone2().&quot;','&quot;.$object-&gt;getEmailAdicional().&quot;')&quot;);
   Db::dbClose();
   return $object;
 }

 public function update(Informacoes $object){
   Db::dbConect();
   Db::dbInserts(&quot;UPDATE pessoa SET id = &quot;.$object-&gt;getPessoa()-&gt;id.&quot;, nome = '&quot;.$object-&gt;getPessoa()-&gt;nome.&quot;', email = '&quot;.$object-&gt;getPessoa()-&gt;email.&quot;' WHERE id = &quot;.$object-&gt;getPessoa()-&gt;id);
   Db::dbInserts(&quot;UPDATE informacoes SET id_pessoa = &quot;.$object-&gt;getPessoa()-&gt;id.&quot;, telefone_1 = '&quot;.$object-&gt;getTelefone1().&quot;', telefone_2 = '&quot;.$object-&gt;getTelefone2().&quot;', email_adicional = '&quot;.$object-&gt;getEmailAdicional().&quot;' WHERE id_pessoa = &quot;.$object-&gt;getPessoa()-&gt;id);
   Db::dbClose();
 }

 public function delete(Informacoes $object){
   Db::dbConect();
   Db::dbInserts(&quot;DELETE FROM informacoes WHERE id_pessoa = &quot;.$object-&gt;getPessoa()-&gt;id);
   Db::dbInserts(&quot;DELETE FROM pessoa WHERE id = &quot;.$object-&gt;getPessoa()-&gt;id);
   Db::dbClose();
 }

 public function _list(){
   $array = array();
   $retorno = array();
   Db::dbConect();
   $array = Db::dbConsult('select * from pessoa left join informacoes on (id_pessoa = id)');
   Db::dbClose();

   foreach($array as $item){
     $infromacoes  = new Informacoes();
     $infromacoes-&gt;getPessoa()-&gt;setId($item['id']);
     $infromacoes-&gt;getPessoa()-&gt;setNome($item['nome']);
     $infromacoes-&gt;getPessoa()-&gt;setEmail($item['email']);
     $infromacoes-&gt;setIdPessoa($item['id']);
     $infromacoes-&gt;setTelefone1($item['telefone_1']);
     $infromacoes-&gt;setTelefone2($item['telefone_2']);
     $infromacoes-&gt;setEmailAdicional($item['email_adicional']);

     $retorno[] = $infromacoes;
   }

   return $retorno;
 }
}
</pre>
<p>Existem quatro métodos importantes desta classe, método create(Informacoes $object) realiza as consultas que inserem no banco de dados os valores  cadastrados no lado cliente da aplicação, o método update(Informacoes $object) responsável pela consulta que altera os valores de um registro específico selecionado pelo usuário no lado cliente, o método delete(Informacoes $object) realiza a exclusão dos registros de que foi escolhido pelo usuário e o método _list() responsável por buscar a lista de registros no banco de dados para montar a lista de objetos que retorna para a aplicação do lado cliente e finalmente sendo utilizado para popular o componente DataGrid da aplicação.</p>
<p>Crie uma classe dentro do diretório service do projeto com o nome que desejar, apenas após o nome identifique a classe com a palavra Service para destacar a mesma no projeto, como por exemplo, o nome que coloquei ao criar a classe para este tutorial: DadosService.</p>
<p>Estas classes contêm praticamente os mesmos métodos da classe de controle do projeto, mas daí você se pergunta, por que não utilizar a classe service como controle da aplicação? Nada impede de ser utilizada, mas temos que ter em mente que esta classe é responsável em receber as requisições enviadas pelo cliente, então é melhor que o projeto fique de forma organizada e de melhor manutenção por isso este método de construção da aplicação foi abordado.</p>
<p>A classe service tem como objetivo executar o método solicitado pela requisição na parte cliente e retornar uma resposta para o cliente, parâmetros podem ou não ser passado para os métodos da classe, mas é bom que sempre tenha um retorno nos mesmos, apesar de não ser obrigatório.</p>
<pre class="brush: php;">
include_once '../model/Informacoes.php';
include_once '../controller/DadosController.php';

class DadosService {

 public function create(Informacoes $object){
   return DadosController::getInstance()-&gt;create($object);
 }

 public function update(Informacoes $object){
   DadosController::getInstance()-&gt;update($object);
   return  $object;
 }

 public function delete(Informacoes $object){
   DadosController::getInstance()-&gt;delete($object);
   return true;
 }

 public function lista(){
   return DadosController::getInstance()-&gt;_list();
 }
}
</pre>
<p>Criando o projeto Flex.</p>
<p>Para criar um novo projeto Flex, na ferramenta Flash Builder acesse no menu o campo File-&gt;New-&gt;Flex Project uma janela abrirá.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/11/novo_projeto_flex.jpg"><img class="alignnone size-full wp-image-143" title="novo_projeto_flex" src="http://tiagozis.files.wordpress.com/2010/11/novo_projeto_flex.jpg?w=640&#038;h=673" alt="" width="640" height="673" /></a></p>
<p>Nesta janela será definido o nome do projeto no campo Project name e o diretório onde ficará alocado o projeto definido pelo campo Folder. Escolha o diretório view do projeto na parte do servidor e crie um novo diretório e coloque o nome que desejar, dentro deste novo diretório ficará a aplicação do lado cliente. Clique em Next.</p>
<p>Na próxima janela é definido o local que será criado os arquivos SWF do projeto. Os arquivos SWF são arquivos com extensão Flash que rodam na ferramenta Flash Player e cada vez que a ferramenta Flash Builder compila o projeto gera o arquivo com as alterações ou com o que for criado de novo no projeto.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/11/configura_local_bin1.jpg"><img class="alignnone size-full wp-image-144" title="configura_local_bin" src="http://tiagozis.files.wordpress.com/2010/11/configura_local_bin1.jpg?w=640&#038;h=756" alt="" width="640" height="756" /></a></p>
<p>Por padrão o Flex cria um diretório dentro do projeto chamado de bin-debug, mas neste projeto eu criei um novo diretório chamado índex no diretório view, assim os arquivos compilados pela ferramenta serão alocados neste diretório e no mesmo é que será acessado no browser quando utilizarmos o projeto. Clique em next novamente.</p>
<p>A ultima tela de configuração do projeto é utilizado para incluir bibliotecas ao projeto, configurar o diretório padrão do projeto, o nome do arquivo principal do projeto e a URL de saída do projeto.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/11/configuracao_final1.jpg"><img class="alignnone size-full wp-image-145" title="configuracao_final" src="http://tiagozis.files.wordpress.com/2010/11/configuracao_final1.jpg?w=640&#038;h=756" alt="" width="640" height="756" /></a></p>
<p>No projeto aqui abordado não é necessário incluir nenhuma biblioteca e nem mesmo mudar o diretório padrão do projeto. Apenas decidi trocar o nome do arquivo principal para index.mxml e adicionei a URL onde ficará o arquivo SWF principal do projeto.</p>
<p>Como havia explicado anteriormente para realizar a transação de objetos iguais entre o cliente e o servidor é necessário ter a classe que representa a classe PHP também no projeto do lado Cliente, portanto crie um novo diretório no projeto Flex com o nome model. Dentro deste diretório as classes que representam as classes do PHP e acrescente os mesmos atributos existente na classe PHP. A seguir como ficarão as classes.</p>
<pre class="brush: as3;">
package model
{
  public class Pessoa
  {
    public var id:int;
    public var nome:String;
    public var email:String;
  }
}
</pre>
<pre class="brush: as3;">
package model
{
  public class Informacoes
  {
    public var idPessoa:int;
    public var telefone1:String;
    public var telefone2:String;
    public var emailAdicional:String;

    public var pessoa:Pessoa = new Pessoa();
  }
}
</pre>
<p>Nestas classes também será necessário criar um método para reconhecer a classe PHP da mesma forma que no PHP utilizou um método de reconhecimento da classe no lado cliente. Para isso é necessário adicionar a seguinte declaração à classe [RemoteClass(alias=”Nome_classe_PHP”)]. Abaixo um exemplo da classe pessoa com a declaração. Realize o mesmo para a classe Informacoes.</p>
<pre class="brush: as3;">
package model
{
  [Bindable]
  [RemoteClass(alias=&quot;Pessoa&quot;)]

  public class Pessoa
  {
    public var id:int;
    public var nome:String;
    public var email:String;
  }
}
</pre>
<p>Neste tutorial não vou abordar a criação de telas separadas para listar as informações e outra para cadastro, portanto estes campos serão criados no arquivo principal do projeto. Com o arquivo principal aberto no Flex Builder clique em Design e adicione os campos necessários para o cadastro, o botão para salvar, uma tabela para mostrar as informações salvas e um botão para excluir um item e outro alterá-lo. A imagem a seguir mostra como ficará a tela e na seqüência o código gerado.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/11/tela_tutorial.jpg"><img class="alignnone size-full wp-image-147" title="tela_tutorial" src="http://tiagozis.files.wordpress.com/2010/11/tela_tutorial.jpg?w=640&#038;h=341" alt="" width="640" height="341" /></a></p>
<pre class="brush: as3;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:Application xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
  xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
  xmlns:mx=&quot;library://ns.adobe.com/flex/mx&quot; minWidth=&quot;955&quot; minHeight=&quot;600&quot;&gt;
  &lt;fx:Declarations&gt;
   &lt;!-- Place non-visual elements (e.g., services, value objects) here --&gt;
  &lt;/fx:Declarations&gt;
  &lt;s:Label x=&quot;67&quot; y=&quot;66&quot; text=&quot;Nome:&quot;/&gt;
  &lt;s:Label x=&quot;64&quot; y=&quot;96&quot; text=&quot;E-mail:&quot;/&gt;
  &lt;s:Label x=&quot;41&quot; y=&quot;126&quot; text=&quot;Telefone 1:&quot;/&gt;
  &lt;s:Label x=&quot;41&quot; y=&quot;156&quot; text=&quot;Telefone 2:&quot;/&gt;
  &lt;s:Label x=&quot;10&quot; y=&quot;186&quot; text=&quot;E-mail Adicional:&quot;/&gt;
  &lt;s:TextInput x=&quot;111&quot; y=&quot;56&quot; width=&quot;280&quot;/&gt;
  &lt;s:TextInput x=&quot;111&quot; y=&quot;86&quot; width=&quot;280&quot;/&gt;
  &lt;s:TextInput x=&quot;111&quot; y=&quot;116&quot; width=&quot;280&quot;/&gt;
  &lt;s:TextInput x=&quot;111&quot; y=&quot;146&quot; width=&quot;280&quot;/&gt;
  &lt;s:TextInput x=&quot;111&quot; y=&quot;176&quot; width=&quot;280&quot;/&gt;
  &lt;mx:DataGrid x=&quot;10&quot; y=&quot;261&quot; width=&quot;506&quot; height=&quot;206&quot;&gt;
   &lt;mx:columns&gt;
     &lt;mx:DataGridColumn headerText=&quot;Id Pessoa&quot; dataField=&quot;col1&quot;/&gt;
     &lt;mx:DataGridColumn headerText=&quot;Nome&quot; dataField=&quot;col2&quot;/&gt;
     &lt;mx:DataGridColumn headerText=&quot;E-mail&quot; dataField=&quot;col3&quot;/&gt;
   &lt;/mx:columns&gt;
  &lt;/mx:DataGrid&gt;
  &lt;s:Button x=&quot;321&quot; y=&quot;206&quot; label=&quot;Salvar&quot;/&gt;
  &lt;s:Button x=&quot;188&quot; y=&quot;475&quot; label=&quot;Excluir&quot;/&gt;
  &lt;s:Button x=&quot;266&quot; y=&quot;475&quot; label=&quot;Alterar&quot;/&gt;
&lt;/s:Application&gt;
</pre>
<p>Agora que as classes e a tela do sistema foram criadas, será necessário configurar um XML para definir o end point do lado do servidor que receberá as requisições enviadas pelo Flex. No diretório principal do projeto Flex crie um arquivo XML com o nome de services-config.xml. E coloque o código mostrado a seguir.</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
  &lt;services-config&gt;
    &lt;services&gt;
      &lt;service id=&quot;flextest-service&quot; messageTypes=&quot;flex.messaging.messages.RemotingMessage&quot;&gt;
        &lt;destination id=&quot;flexamf&quot;&gt;
          &lt;channels&gt;
            &lt;channel ref=&quot;my-flexamf&quot;/&gt;
          &lt;/channels&gt;
          &lt;properties&gt;
            &lt;source&gt;*&lt;/source&gt;
          &lt;/properties&gt;
        &lt;/destination&gt;
      &lt;/service&gt;
    &lt;/services&gt;
    &lt;channels&gt;
      &lt;channel-definition id=&quot;my-flexamf&quot;&gt;
        &lt;endpoint uri=&quot;http://localhost/flex_amfphp/lib/amfphp/gateway.php&quot;/&gt;
      &lt;/channel-definition&gt;
    &lt;/channels&gt;
  &lt;/services-config&gt;
</pre>
<p>Como pode ser visto no código existe uma tag no XML que identifica a url do end point no projeto na parte PHP, portanto coloque ali a url com o local onde se encontra o arquivo gateway.php que é o end point do projeto e o arquivo que recebe as requisições do flex.</p>
<p>Após criar e configurar este arquivo é necessário adicionar ao compilador do Flex um novo parâmetro para reconhecer esta configuração recém criada. Então clique no projeto com o botão direito do mouse e o menu de opções do projeto se abrirá vá até propriedades e clique novamente. A janela de propriedades do projeto se abrirá, vá ate a opção Flex Compiler e no campo Additional compiler arguments adicione o seguinte: -services “services-config.xml”. Em seguida clique em OK para finalizar a configuração.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/11/config_services.jpg"><img class="alignnone size-full wp-image-148" title="config_services" src="http://tiagozis.files.wordpress.com/2010/11/config_services.jpg?w=635&#038;h=682" alt="" width="635" height="682" /></a></p>
<p>Agora o próximo passo é desenvolvermos uma classe para enviar as requisições do Flex para o PHP chamando os métodos da classe service que já foi criada. Mas antes será criada uma classe responsável por realizar estas requisições. Só para explicar rapidamente o Flex realiza as requisições através de uma classe chamada RemoteObject, onde é necessário informar o canal de comunicação com o PHP que neste caso é o caminho configurado no arquivo services-config.xml, o método de resposta da requisição, o método que receberá a resposta de erro caso ocorra algum durante a requisição, o service no lado PHP que será requisitado, o método do service requisitado que será executado e os parâmetros do método caso tenha algum.</p>
<p>Então para facilitar esse processo primeiramente crie um novo diretório no projeto do lado Flex e nomeio como quiser no meu caso coloquei como controller, em seguida dentro do mesmo diretório crie uma classe com o nome que desejar. Esta classe deve estender a classe RemoteObject, em seguida configure a classe conforme mostrado a seguir no código.</p>
<pre class="brush: as3;">
package controller
{

  import mx.controls.Alert;
  import mx.rpc.events.FaultEvent;
  import mx.rpc.events.ResultEvent;
  import mx.rpc.remoting.mxml.RemoteObject;

  public class RemoteObj extends RemoteObject
  {
    public function RemoteObj(userSource:String=null, userResult:Function=null)
    {
       super(&quot;flexamf&quot;);
       super.showBusyCursor = true;
       super.addEventListener(FaultEvent.FAULT, onFault);
       if (userSource is String){
         super.source = userSource;
       }
       if (userResult is Function){
         super.addEventListener(ResultEvent.RESULT, userResult);
       }
    }

    private function onFault(e:FaultEvent):void{
      Alert.show(e.fault.faultString+&quot;\n&quot;+e.fault.faultDetail, e.fault.faultCode.toString());
    }
  }
}
</pre>
<p>Ao terminar a configuração crie outra classe que será responsável por requisitar os métodos da classe service no PHP, esta classe também pode ser nomeada como desejar. Nesta classe crie um atributo constate chamado SERVICE_NAME esse atributo receberá como valor o nome do service que será solicitado durante as requisições. Crie também os métodos para criar, alterar, excluir e listar os dados.</p>
<pre class="brush: as3;">
package controller
{
  import model.Informacoes;

  public class ProjectController
  {
    private const SERVICE_NAME:String = &quot;DadosService&quot;;

    public function ProjectController()
    {
    }

    public function create(onResult:Function, object:Informacoes):void{
      var remote:RemoteObj = new RemoteObj(this.SERVICE_NAME, onResult);
      remote.getOperation(&quot;create&quot;).send(object);
    }

    public function update(onResult:Function, object:Informacoes):void{
      var remote:RemoteObj = new RemoteObj(this.SERVICE_NAME, onResult);
      remote.getOperation(&quot;update&quot;).send(object);
    }

    public function _delete(onResult:Function, object:Informacoes):void{
      var remote:RemoteObj = new RemoteObj(this.SERVICE_NAME, onResult);
      remote.getOperation(&quot;delete&quot;).send(object);
    }

    public function list(onResult:Function):void{
      var remote:RemoteObj = new RemoteObj(this.SERVICE_NAME, onResult);
      remote.getOperation(&quot;lista&quot;).send();
    }
  }
}
</pre>
<p>Dentro de cada método desta classe foi criado uma instancia do objeto que requisitará o service no lado PHP, e como parâmetro do construtor o nome do service que será solicitado e a função de resposta caso ocorra tudo certo durante a requisição com o servidor, em seguida é chamado o método da classe getOperation passando como parâmetro o método do service que será executado e finalmente realizando a requisição com o método send passando quando for necessário algum parâmetro.</p>
<p>Agora é necessário criar as funcionalidades do projeto. No arquivo principal do projeto no lado cliente, ou seja, no lado Flex é necessário criar algumas funções responsáveis pela aplicação, verifique o código a seguir com as alterações realizadas e em seguida explicarei as alterações.</p>
<pre class="brush: as3;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:Application xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
 xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
 xmlns:mx=&quot;library://ns.adobe.com/flex/mx&quot; minWidth=&quot;955&quot; minHeight=&quot;600&quot; creationComplete=&quot;list()&quot;&gt;
  &lt;fx:Style source=&quot;index_2.css&quot;/&gt;
  &lt;fx:Script&gt;
  &lt;![CDATA[
    import controller.ProjectController;
    import model.Informacoes;
    import mx.controls.Alert;
    import mx.rpc.events.ResultEvent;

    private var projectController:ProjectController = new ProjectController();
    private var informacoes:Informacoes;

    public function save():void{
      var execute:Boolean = true;
      var message:String = &quot;&quot;;

      if(informacoes == null){
        this.informacoes = new Informacoes();
      }

      if(nome_pessoa.text == &quot;&quot;){
        message += &quot;O campo 'Nome' é obrigatório.\n&quot;;
        execute = false;
      }

      if(email_pessoa.text == &quot;&quot;){
        message += &quot;O campo 'E-mail' é obrigatório.\n&quot;;
        execute = false;
      }

      if(execute){
        this.informacoes.pessoa.nome = nome_pessoa.text;
        this.informacoes.pessoa.email = email_pessoa.text;
        this.informacoes.telefone1 = telefone_1.text;
        this.informacoes.telefone2 = telefone_2.text;
        this.informacoes.emailAdicional = email_adicional.text;

        if(informacoes.idPessoa != 0){
          this.projectController.update(resultSave, this.informacoes);
        }else{
          this.projectController.create(resultSave, this.    informacoes);
        }
      }else{
      Alert.show(message);
     }
   }

   public function deleteObject():void{
     if(table.selectedItem != null){
       this.projectController._delete(resultDelete, (table.selectedItem as Informacoes));
     }else{
       Alert.show(&quot;Selecione um item da tablea para excluir.&quot;);
     }
   }

   public function setDataToEdit():void{
     if(table.selectedItem != null){
       informacoes = table.selectedItem as Informacoes;

       nome_pessoa.text = informacoes.pessoa.nome;
       email_pessoa.text = informacoes.pessoa.email;
       telefone_1.text = informacoes.telefone1;
       telefone_2.text = informacoes.telefone2;
       email_adicional.text = informacoes.emailAdicional;
     }else{
       Alert.show(&quot;Selecione um item da tablea para alterar.&quot;);
     }
   }

   public function list():void{
     this.projectController.list(resultList);
   }

   public function resultList(event:ResultEvent):void{
     table.dataProvider = event.result as Array;
   }

   public function resultSave(event:ResultEvent):void{
     Alert.show(&quot;Item salvo com sucesso.&quot;);
     list();
     clear();
   }

   public function resultDelete(event:ResultEvent):void{
     Alert.show(&quot;Item excluído com sucesso.&quot;);
     list();
   }

   public function clear():void{
     nome_pessoa.text = &quot;&quot;;
     email_pessoa.text = &quot;&quot;;
     telefone_1.text = &quot;&quot;;
     telefone_2.text = &quot;&quot;;
     email_adicional.text = &quot;&quot;;

     informacoes = null;
   }
 ]]&gt;
 &lt;/fx:Script&gt;
 &lt;fx:Declarations&gt;
 &lt;!-- Place non-visual elements (e.g., services, value objects) here --&gt;
 &lt;/fx:Declarations&gt;

  &lt;s:Label x=&quot;64&quot; y=&quot;96&quot; text=&quot;E-mail:&quot;/&gt;
  &lt;s:Label x=&quot;41&quot; y=&quot;126&quot; text=&quot;Telefone 1:&quot;/&gt;
  &lt;s:Label x=&quot;41&quot; y=&quot;156&quot; text=&quot;Telefone 2:&quot;/&gt;
  &lt;s:Label x=&quot;10&quot; y=&quot;186&quot; text=&quot;E-mail Adicional:&quot;/&gt;
  &lt;s:TextInput id=&quot;nome_pessoa&quot; x=&quot;118&quot; y=&quot;56&quot; width=&quot;280&quot; maxChars=&quot;255&quot;/&gt;
  &lt;s:TextInput id=&quot;email_pessoa&quot; x=&quot;118&quot; y=&quot;86&quot; width=&quot;280&quot; maxChars=&quot;255&quot;/&gt;
  &lt;s:TextInput id=&quot;telefone_1&quot; x=&quot;118&quot; y=&quot;116&quot; width=&quot;280&quot; maxChars=&quot;50&quot;/&gt;
  &lt;s:TextInput id=&quot;telefone_2&quot; x=&quot;118&quot; y=&quot;146&quot; width=&quot;280&quot; maxChars=&quot;50&quot;/&gt;
  &lt;s:TextInput id=&quot;email_adicional&quot; x=&quot;118&quot; y=&quot;176&quot; width=&quot;280&quot; maxChars=&quot;255&quot;/&gt;
  &lt;mx:DataGrid id=&quot;table&quot; x=&quot;10&quot; y=&quot;261&quot; width=&quot;506&quot; height=&quot;206&quot;&gt;
    &lt;mx:columns&gt;
      &lt;mx:DataGridColumn headerText=&quot;Id Pessoa&quot; dataField=&quot;pessoa.id&quot;/&gt;
      &lt;mx:DataGridColumn headerText=&quot;Nome&quot; dataField=&quot;pessoa.nome&quot;/&gt;
      &lt;mx:DataGridColumn headerText=&quot;E-mail&quot; dataField=&quot;pessoa.email&quot;/&gt;
    &lt;/mx:columns&gt;
  &lt;/mx:DataGrid&gt;
  &lt;s:Button x=&quot;321&quot; y=&quot;206&quot; label=&quot;Salvar&quot; click=&quot;save()&quot;/&gt;
  &lt;s:Button x=&quot;188&quot; y=&quot;475&quot; label=&quot;Excluir&quot; click=&quot;deleteObject()&quot;/&gt;
  &lt;s:Button x=&quot;266&quot; y=&quot;475&quot; label=&quot;Alterar&quot; click=&quot;setDataToEdit()&quot;/&gt;
  &lt;s:Label x=&quot;65&quot; y=&quot;66&quot; text=&quot;Nome:&quot;/&gt;
  &lt;s:Label x=&quot;111&quot; y=&quot;64&quot; text=&quot;*&quot; fontSize=&quot;16&quot; fontFamily=&quot;Arial&quot; fontWeight=&quot;bold&quot; color=&quot;#FF0000&quot;/&gt;
  &lt;s:Label x=&quot;111&quot; y=&quot;95&quot; text=&quot;*&quot; fontSize=&quot;16&quot; fontFamily=&quot;Arial&quot; fontWeight=&quot;bold&quot; color=&quot;#FF0000&quot;/&gt;
&lt;/s:Application&gt;
</pre>
<p>No inicio do arquivo é declarado uma tag MXML de script esta tag representa o código de script da aplicação. Em seguida dois objetos são criados o primeiro é referente à classe que realiza as requisições ao PHP e a segunda representa o objeto que contêm os atributos referentes aos atributos das classes de referencia no lado PHP do projeto.</p>
<p>Descrevendo os métodos criados aqui:</p>
<p>Método save: Realiza a verificação se os campos nome e email foram preenchidos, pois são campos obrigatórios na tabela do banco de dados, portanto não podem ser vazios. Neste tutorial eu não abordo a validação de campos como, por exemplo, o campo E-mail, mas existem métodos para realizar estas validações no Flex, e abordarei estes métodos em outra ocasião.</p>
<p>Método deleteObject: este método é responsável por enviar para o PHP o objeto que deverá ser excluído do banco de dados.</p>
<p>Método setDataToEdit: criei este método para adicionar os valores nos campos do formulário quando o usuário selecionar um valor da tabela e clicar no botão alterar.</p>
<p>Método list: requisita ao PHP a lista de objetos para popular o componente DataGrid no lado cliente.</p>
<p>Métodos resultList, resultSave e resultDelete: estes métodos são responsáveis por receber a resposta do servidor quando requisitam algo para o mesmo. Estes métodos de retorno são informados quando é realizada alguma operação que requisitará algo para o PHP, por exemplo, no método list(), é utilizado a seguinte operação, this.projectController.list(resultList); esta operação que utiliza o objeto que é referencia da classe que realiza as requisições ao PHP solicita a listagem de objetos e como parâmetro passa o método que receberá a resposta da requisição.</p>
<p>Método clear: limpa os campos do formulário após realizar uma operação de salvar ou alterar um objeto.</p>
<p>Outros detalhes que podemos destacar sobre a alteração deste arquivo são:</p>
<p>No topo do documento na tag Application foi adicionada uma função chamada creationComplete passando como valor a função list. Esta função será chamada assim que o documento carregar requisitando a lista de objetos para o PHP que irão popular o DataGrid ao iniciar a aplicação.</p>
<p>Foram adicionados labels com asteriscos para representar campos obrigatórios do formulário, bem como no DataGrid ou tabela do sistema foram adicionados as colunas da mesma os valores que deverão aparecer no campo dataField, sempre que um valor é necessário ser visualizado na coluna da tabela é este campo que deve ser preenchido. Como pode ser visto o valor aqui abordado são os atributos do objeto pessoa.</p>
<p>Explicarei melhor como funciona. Ao adicionar uma lista de objetos ao DataGrid através do método dataPovider, como é abordado no método deste arquivo o resultList, o componente faz a tarefa de listar os objetos e quando ele realiza a leitura dos atributos deste objeto verifica então se os mesmos batem com o atributo declarado em algum campo dataField das colunas da tabela assim mostrando o valor solicitado.</p>
<p>Portanto ao realizar este processo o mesmo encontra no objeto Informacao a declaração de referencia ao objeto pessoa e assim tem acesso aos atributos do objeto e estes atributos serão mostrados na tabela quando for preenchida.</p>
<p>Desta forma utilizamos o relacionamento entre as classes manipulando o objeto Informacao e Pessoa ao mesmo tempo.</p>
<p>E por fim nas tags Button foram adicionadas a função click com o método referente ao botão para realizar as funções necessárias à aplicação.</p>
<p>Ao terminar esse processo de desenvolvimento já pode ser testada a aplicação, se tudo ocorreu corretamente é possível salvar, alterar, excluir dados no banco de dados bem como listá-los.</p>
<p>Acesse o navegador e verifique como ficou a aplicação. A imagem a seguir mostra o resultado deste tutorial.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/11/resultado_final.jpg"><img class="alignnone size-full wp-image-152" title="resultado_final" src="http://tiagozis.files.wordpress.com/2010/11/resultado_final.jpg?w=640&#038;h=341" alt="" width="640" height="341" /></a></p>
<p>Agradeço por ler este tutorial e espero que tenha gostado do conteúdo aqui proposto, espero poder abordar mais sobre essa área de desenvolvimento de sistemas com Flex e PHP já que tem tomado maior parte do meu tempo a prática de desenvolvimento com estas ferramentas e também estou estudando outros métodos de utilizar as mesmas no desenvolvimento de software.</p>
<p>Novamente muito obrigado por acompanhar o tutorial e segue o link para download da aplicação deste tutorial.</p>
<p>Link para download do código do tutorial: <a href="http://www.megaupload.com/?d=65EPBJC9" target="_blank">http://www.megaupload.com/?d=65EPBJC9</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagozis.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagozis.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagozis.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagozis.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tiagozis.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tiagozis.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tiagozis.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tiagozis.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagozis.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagozis.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagozis.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagozis.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagozis.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagozis.wordpress.com/123/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagozis.wordpress.com&amp;blog=14385764&amp;post=123&amp;subd=tiagozis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tiagozis.wordpress.com/2010/11/02/integrando-flex-com-php-utilizando-amfphp/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a1446e0154d18fe1bcd7376e4f660f2b?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tiagozis</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/11/novo_projeto_flex.jpg" medium="image">
			<media:title type="html">novo_projeto_flex</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/11/configura_local_bin1.jpg" medium="image">
			<media:title type="html">configura_local_bin</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/11/configuracao_final1.jpg" medium="image">
			<media:title type="html">configuracao_final</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/11/tela_tutorial.jpg" medium="image">
			<media:title type="html">tela_tutorial</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/11/config_services.jpg" medium="image">
			<media:title type="html">config_services</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/11/resultado_final.jpg" medium="image">
			<media:title type="html">resultado_final</media:title>
		</media:content>
	</item>
		<item>
		<title>Integração Flex + Zend Framework + Doctrine Parte 3</title>
		<link>http://tiagozis.wordpress.com/2010/09/21/integracao-flex-zend-framework-doctrine-parte-3/</link>
		<comments>http://tiagozis.wordpress.com/2010/09/21/integracao-flex-zend-framework-doctrine-parte-3/#comments</comments>
		<pubDate>Tue, 21 Sep 2010 21:15:31 +0000</pubDate>
		<dc:creator>Tiago Zis</dc:creator>
				<category><![CDATA[Desenvolvimento de Software]]></category>
		<category><![CDATA[Amf]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex Builder]]></category>
		<category><![CDATA[Integração]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://tiagozis.wordpress.com/?p=108</guid>
		<description><![CDATA[Olá pessoal vamos dar inicio à terceira parte e ultima deste tutorial para integração das ferramentas de denvolvimento Flex, Zend Framework e Doctrine. Só para relembrarmos devido ao período que se passou desde o ultimo post, o tutorial parou com a criação da tela do nosso sistema. Neste post para finalizar o sistema que estamos [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagozis.wordpress.com&amp;blog=14385764&amp;post=108&amp;subd=tiagozis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span id="more-108"></span>Olá pessoal vamos dar inicio à terceira parte e ultima deste tutorial para integração das ferramentas de denvolvimento Flex, Zend Framework e Doctrine. Só para relembrarmos devido ao período que se passou desde o ultimo post, o tutorial parou com a criação da tela do nosso sistema.</p>
<p>Neste post para finalizar o sistema que estamos desenvolvendo, será explicado como aplicar a comunicação entre o Flex e o Zend Framework, como realizar as quatro operações básicas de um sistema, ou seja, a criação de um CRUD usando Doctrine e também serão explicados alguns detalhes referentes ao projeto que necessitam de um pouco de atenção ao realizar o desenvolvimento com estas ferramentas.</p>
<p>Para quem não acompanhou os post anteriores a seguir está os links referentes à parte 1 e 2 do tutorial. Então vamos lá mãos à obra.</p>
<p>Primeira parte do tutorial: <a href="http://tiagozis.wordpress.com/2010/07/12/flex-zend-framework-doctrine/" target="_blank"> http://tiagozis.wordpress.com/2010/07/12/flex-zend-framework-doctrine/</a></p>
<p>Segunda parte do tutorial: <a href="http://tiagozis.wordpress.com/2010/08/24/integracao-flex-zend-framework-doctrine-parte-2/" target="_blank">http://tiagozis.wordpress.com/2010/08/24/integracao-flex-zend-framework-doctrine-parte-2/</a></p>
<p>Primeiramente vou explicar o que foi criado no projeto na parte Flex que não foi implementado anteriormente, no código a seguir pode ser visto que algumas functions foram adicionadas ao projeto explicarei na seqüência cada uma delas.</p>
<pre class="brush: as3;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; layout=&quot;absolute&quot; creationComplete=&quot;init()&quot;&gt;
  &lt;mx:Script&gt;
   &lt;![CDATA[
     import mx.controls.HorizontalList;
     import models.Reserva;
     import models.HotelQuarto;
     import mx.collections.IList;
     import models.Hospede;
     import mx.collections.ArrayCollection;
     import models.Hotel;
     import mx.controls.Alert;
     import mx.rpc.events.ResultEvent;
     import controller.RemoteObjectController;

     private var reserva:Reserva;
     private var hotelQuarto:HotelQuarto;
     [Bindable]
     private var arrayQuartos:Array;

     public function init():void{
       listAll();
     }

     public function resultListHotel(e:ResultEvent):void{
       var array:Array = new Array(&quot;Selecione&quot;);
       var ht:Array = e.result as Array;
       var index:int = 0;

       for each(var hotel:Hotel in ht){
         if(hotelQuarto != null &amp;&amp; hotelQuarto.codHotel == hotel.codHotel){
           index = ht.indexOf(hotel)+1;
         }
         array.push(hotel);
       }
       comboHotel.dataProvider =  array;
       comboHotel.selectedIndex = index;
     }

     public function resultListHospede(e:ResultEvent):void{
       var array:Array = new Array(&quot;Selecione&quot;);
       var ho:Array = e.result as Array;
       var index:int = 0;

       for each(var hospede:Hospede in ho){
         if(reserva != null &amp;&amp; reserva.codHospede == hospede.codHospede){
           index =  ho.indexOf(hospede)+1;
         }
         array.push(hospede);
       }

       comboHospede.dataProvider =  array;
       comboHospede.selectedIndex = index;
     }

     public function resultListHotelQuarto(e:ResultEvent = null):void{
       var array:Array = new Array(&quot;Selecione&quot;);
       var index:int = 0;
       if(e != null){
         var quartos:Array = e.result as Array;
         for each(var hotelQuarto:HotelQuarto in quartos){
           if(!hotelQuarto.sitQuarto){
             array.push(hotelQuarto);
           }
           if(reserva != null &amp;&amp; reserva.numQuarto == hotelQuarto.numQuarto){
             index = quartos.indexOf(hotelQuarto)+1;
           }
         }
       }
       comboQuarto.dataProvider = array;
       comboQuarto.selectedIndex = index;
     }

     public function resultRetrieveHotelQuarto(e:ResultEvent):void{
       hotelQuarto = e.result as HotelQuarto;
       var remote:RemoteObjectController = new RemoteObjectController(&quot;HotelService&quot;);
       remote.setResultFunction(resultListHotel);
       remote.getOperation(&quot;executeList&quot;).send();

       var remote1:RemoteObjectController = new RemoteObjectController(&quot;HospedeService&quot;);
       remote1.setResultFunction(resultListHospede);
       remote1.getOperation(&quot;executeList&quot;).send();

       var remote3:RemoteObjectController = new RemoteObjectController(&quot;HotelQuartoService&quot;);
       remote3.setResultFunction(resultListHotelQuarto);
       remote3.getOperation(&quot;executeList&quot;).send(hotelQuarto.codHotel);
     }

     public function resultListReserva(e:ResultEvent):void{
       tableReserva.dataProvider = e.result as Array;
     }

     public function getQuartos():void{
       if(comboHotel.selectedIndex &gt; 0){
         var hotel:Hotel = comboHotel.selectedItem as Hotel;
         var remote:RemoteObjectController = new RemoteObjectController(&quot;HotelQuartoService&quot;);
         remote.setResultFunction(resultListHotelQuarto);
         remote.getOperation(&quot;executeList&quot;).send(hotel);
       }else{
         comboQuarto.dataProvider = &quot;Selecione&quot;;
       }
     }

     public function save():void{
        var go:Boolean = true;

        if(comboHospede.selectedIndex &lt;= 0){
          comboHospede.errorString = &quot;Campo obrigatório&quot;;
          go = false;
        }else{
          comboHospede.errorString = &quot;&quot;;
        }

        if(comboQuarto.selectedIndex &lt;= 0){
          comboQuarto.errorString = &quot;Campo obrigatório&quot;;
          go = false;
        }else{
          comboQuarto.errorString = &quot;&quot;;
        }

        if(comboHotel.selectedIndex &lt;= 0){
          comboHotel.errorString = &quot;Campo obrigatório&quot;;
          go = false;
        }else{
          comboHotel.errorString = &quot;&quot;;
        }

        if(data.text == &quot;&quot;){
          data.errorString = &quot;Campo obrigatório&quot;;
          go = false;
        }else{
          data.errorString = &quot;&quot;;
        }

        if(dias.text == &quot;&quot;){
          dias.errorString = &quot;Campo obrigatório&quot;;
          go = false;
        }else{
          dias.errorString = &quot;&quot;;
        }

        if(go){
          if(reserva == null){
            var remote:RemoteObjectController = new RemoteObjectController(&quot;ReservaService&quot;);
            remote.setResultFunction(resultSave);
            remote.getOperation(&quot;executeSave&quot;).send(getData());
          }else{
            this.edit();
          }
        }
      }

      public function edit():void{
        if(tableReserva.selectedItem != null){
          var remote:RemoteObjectController = new RemoteObjectController(&quot;ReservaService&quot;);
          remote.setResultFunction(resultEdit);
          remote.getOperation(&quot;executeUpdate&quot;).send(getData(reserva));
        }else{
          Alert.show(&quot;Selecione um item da tabela para excluir&quot;);
        }
      }

      public function _delete():void{
        if(tableReserva.selectedItem != null){
          var remote:RemoteObjectController = new RemoteObjectController(&quot;ReservaService&quot;);
          remote.setResultFunction(resultDelete);
          remote.getOperation(&quot;executeDelete&quot;).send(tableReserva.selectedItem as Reserva);
        }else{
          Alert.show(&quot;Selecione um item da tabela para excluir&quot;);
        }
      }

      public function getData(r:Reserva = null):Reserva{
        if(r == null){
          r = new Reserva();
        }

        r.codHospede = (comboHospede.selectedItem as Hospede).codHospede;
        var c:HotelQuarto =  comboQuarto.selectedItem as HotelQuarto;
        r.codHotelQuarto = c.codHotelQuarto;
        r.numQuarto = (comboQuarto.selectedItem as HotelQuarto).numQuarto;
        r.datReserva = data.text;
        r.qtdDias = parseInt(dias.text);
        r.sitReserva = true;
        return r;
      }

      public function resultDelete(e:ResultEvent):void{
        if(e.result){
          Alert.show(&quot;Reserva excluído com sucesso.&quot;);
          listAll();
        }
      }

      public function resultEdit(e:ResultEvent):void{
        if(e.result){
          Alert.show(&quot;Reserva alterada com sucesso.&quot;);
          listAll();
        }else{
          Alert.show(&quot;Ocorreu um erro ao realizar a operação.&quot;);
        }
      }

      public function resultSave(e:ResultEvent):void{
        if(e.result != null){
          Alert.show(&quot;Reserva salva com sucesso.&quot;);
          listAll();
        }
      }

      public function listAll():void{

        data.text = &quot;&quot;;
        dias.text = &quot;&quot;;
        reserva = null;
        hotelQuarto = null;

        var remote:RemoteObjectController = new RemoteObjectController(&quot;HotelService&quot;);
        remote.setResultFunction(resultListHotel);
        remote.getOperation(&quot;executeList&quot;).send();

        var remote1:RemoteObjectController = new RemoteObjectController(&quot;HospedeService&quot;);
        remote1.setResultFunction(resultListHospede);
        remote1.getOperation(&quot;executeList&quot;).send();

        var remote2:RemoteObjectController = new RemoteObjectController(&quot;ReservaService&quot;);
        remote2.setResultFunction(resultListReserva);
        remote2.getOperation(&quot;executeList&quot;).send();

        resultListHotelQuarto();
      }

      public function setDataToEdit():void{
        if(tableReserva.selectedItem != null){
          reserva = tableReserva.selectedItem as Reserva;
          var remote2:RemoteObjectController = new RemoteObjectController(&quot;HotelQuartoService&quot;);
          remote2.setResultFunction(resultRetrieveHotelQuarto);
          remote2.getOperation(&quot;executeRetrieve&quot;).send(reserva.codHotelQuarto);

          data.text = reserva.datReserva;
          dias.text = reserva.qtdDias.toString();
        }else{
          Alert.show(&quot;Selecione um item da tabela para excluir&quot;);
        }
      }
 ]]&gt;
 &lt;/mx:Script&gt;
   &lt;mx:DataGrid x=&quot;10&quot; y=&quot;210&quot; width=&quot;669&quot; height=&quot;145&quot; id=&quot;tableReserva&quot;&gt;
     &lt;mx:columns&gt;
       &lt;mx:DataGridColumn headerText=&quot;Nome Hospede&quot; dataField=&quot;nomHospede&quot;/&gt;
       &lt;mx:DataGridColumn headerText=&quot;Data Reserva&quot; dataField=&quot;datReserva&quot;/&gt;
       &lt;mx:DataGridColumn headerText=&quot;Quantidade de dias&quot; dataField=&quot;qtdDias&quot;/&gt;
       &lt;mx:DataGridColumn headerText=&quot;Hotel&quot; dataField=&quot;nomHotel&quot;/&gt;
       &lt;mx:DataGridColumn headerText=&quot;Nº Quarto&quot; dataField=&quot;numQuarto&quot;/&gt;
     &lt;/mx:columns&gt;
   &lt;/mx:DataGrid&gt;
   &lt;mx:Label x=&quot;10&quot; y=&quot;12&quot; text=&quot;Hotel:&quot;/&gt;
   &lt;mx:ComboBox x=&quot;138&quot; y=&quot;10&quot; width=&quot;230&quot; id=&quot;comboHotel&quot; labelField=&quot;nomHotel&quot; change=&quot;getQuartos()&quot;&gt;&lt;/mx:ComboBox&gt;

   &lt;mx:Label x=&quot;10&quot; y=&quot;42&quot; text=&quot;Quarto:&quot;/&gt;
   &lt;mx:ComboBox x=&quot;138&quot; y=&quot;40&quot; width=&quot;230&quot; id=&quot;comboQuarto&quot; labelField=&quot;numQuarto&quot;&gt;&lt;/mx:ComboBox&gt;

   &lt;mx:Label x=&quot;10&quot; y=&quot;72&quot; text=&quot;Hospede:&quot;/&gt;
   &lt;mx:ComboBox x=&quot;138&quot; y=&quot;70&quot; width=&quot;230&quot; id=&quot;comboHospede&quot; labelField=&quot;nomHospede&quot;&gt;&lt;/mx:ComboBox&gt;

   &lt;mx:Label x=&quot;10&quot; y=&quot;102&quot; text=&quot;Data Reserva:&quot;/&gt;
   &lt;mx:DateField x=&quot;138&quot; y=&quot;100&quot; width=&quot;230&quot; id=&quot;data&quot; formatString=&quot;DD/MM/YYYY&quot;/&gt;

   &lt;mx:Label x=&quot;10&quot; y=&quot;132&quot; text=&quot;Quantidade de dias:&quot;/&gt;
   &lt;mx:TextInput x=&quot;138&quot; y=&quot;130&quot; width=&quot;230&quot; restrict=&quot;[0-9]&quot; id=&quot;dias&quot;/&gt;

   &lt;mx:Button x=&quot;296&quot; y=&quot;160&quot; label=&quot;Salvar&quot; width=&quot;72&quot; click=&quot;save()&quot;/&gt;
   &lt;mx:Button x=&quot;255&quot; y=&quot;363&quot; label=&quot;Alterar&quot; width=&quot;72&quot; click=&quot;setDataToEdit()&quot;/&gt;
   &lt;mx:Button x=&quot;335&quot; y=&quot;363&quot; label=&quot;Excluir&quot; width=&quot;72&quot; click=&quot;_delete()&quot;/&gt;
&lt;/mx:Application&gt;
</pre>
<p>Abaixo a descrição de cada &#8220;function&#8221; do projeto.</p>
<p>1 &#8211; Função ( init ), será chamada quando o sistema for carregado. Dentro desta função encontra-se a chamada para outra função que realiza as listagens para o sistema.</p>
<p>2 &#8211; Função ( resultListHotel ), esta função recebe o resultado que retorna do service apos ser requisitado a listagem de hotéis, seu retorno que neste caso é o parâmetro entre os parênteses contêm um array com os hotéis que foram listados. O laço criado na função serve para verificar se o código do hotel da listagem é igual ao código do hotel da reserva, este caso é abordado quando for necessário realizar a alteração dos dados da reserva, colocando assim o nome do hotel no index correto do combobox.</p>
<p>3 &#8211; Função ( resultListHospede ), realiza as mesmas funcionalidades da função anterior só que agora para os dados referentes ao hospede.</p>
<p>4 &#8211; Função ( resultListHotelQuarto ), este realiza as mesmas funcionalidades das anteriores, porem existe uma verificação à mais no seu laço que verifica qual a condição do quarto, se está reservado ou não, caso o quarto esteja reservado não o adiciona no combobox.</p>
<p>5 &#8211; Função ( resultRetrieveHotelQuarto ), recebe o valor retornado da chamada ao service que retorna o objeto &#8220;HotelQuarto&#8221;, este objeto é solicitado pelo sistema quando é necessário alterar a reserva. Apos receber o objeto é realizado a chamada das listagens novamente, e com os dados referentes à reserva será posicionada o valor correspondente nos campos para que seja realizada a alteração.</p>
<p>6 &#8211; Função ( resultListReserva ), apenas recebe um array que retorna do service, este array contêm todas as reservas cadastradas no banco de dados. Apos receber os valores adiciona os mesmos ao &#8220;dataprovider&#8221; da tabela.</p>
<p>7 &#8211; Função ( getQuartos ), cada vez que o usuário escolher um hotel no combobox do sistema esta ação é acionada e requisita ao service uma lista de quartos cadastrados para aquele hotel selecionado.</p>
<p>8 &#8211; Função ( save ), ao clicar no botão para salvar esta função é chamada e então é realizado anteriormente uma verificação se todos os campos foram preenchidos corretamente. Caso todos os campos estiverem de acordo com o necessário então é requisitada a funcionalidade para salvar o objeto no banco, enviando os dados para o service correspondente que realiza esta funcionalidade. Outra informação que podemos destacar desta função é que antes mesmo de enviar um objeto para ser salvo é verificado se o mesmo é nulo, caso seja então um novo objeto é criado e salvo, caso contrário o objeto tem a necessidade de ser editado então outra função é acionada para realizar esta tarefa.</p>
<p>9 &#8211; Função ( edit ), quando o usuário salvar um objeto editado será esta função chamada para realizar a tarefa.</p>
<p>10 &#8211; Função ( _delete ), esta função é acionada quando o usuário seleciona uma reserva que está listada na tabela e clica no botão para excluir o objeto.</p>
<p>11 &#8211; Função ( getData ), função chamada ao salvar ou alterar uma reserva, adiciona ao objeto reserva os dados dos campos de cadastro, apos adicionar todos os dados referentes à reserva retorna o objeto para realizar a operação de salvar ou alterar.</p>
<p>12 &#8211; Função ( resultDelete ), recebe o resultado de exclusão do objeto e mostra a mensagem de sucesso.</p>
<p>13 &#8211; Função ( resultEdit ), recebe o resultado da alteração do objeto e mostra a mensagem de sucesso.</p>
<p>14 &#8211; Função ( resultSave ), recebe o resultado da criação do objeto e mostra a mensagem de sucesso.</p>
<p>15 &#8211; Função ( listAll ), funcionalidade do sistema que requisita aos services na parte Zend do projeto todas as listagens necessárias, listagem de hotéis, hospedes e reserva.</p>
<p>16 &#8211; Função ( setDataToEdit ), quando o usuário seleciona uma reserva na tabela e clica no botão para alterar esta reserva, esta função é acionada adicionando os dados da reserva nos campos para que possa ser realizada a alteração dos mesmos.</p>
<p>Aqui está detalhado cara funcionalidade do sistema na parte Flex do projeto mas ainda existe um detalhe importante para ser explicado. Qual é o método que faz as chamadas aos services para realizar as tarefas de listar, salvar, alterar e excluir?</p>
<p>Conforme explicado na segunda parte deste tutorial foi criado uma classe que extende a classe ( RemoteObject ), e é esta classe que realiza a função de chamar o servidor e realizar a função desejada. Mas como isto é feito?</p>
<p>Verifique o código a seguir.</p>
<pre class="brush: as3;">
 var remote:RemoteObjectController = new RemoteObjectController(&quot;HotelService&quot;);
 remote.setResultFunction(resultListHotel);
 remote.getOperation(&quot;executeList&quot;).send();
</pre>
<p>Uma instancia da classe de requisições criada para o projeto é declarada, passando como valor inicial de seu construtor o service que será chamado quando a requisição for enviada. Em seguida com o objeto já criado é necessário setar para o mesmo qual a função ou método receberá o retorno da requisição, no caso do exemplo descrito o retorno é a função que recebe a lista de hotéis. Por ultimo é chamado a operação que envia a requisição para o servidor passando qual método do service deve ser chamado para realizar a operação desejada, podemos verificar que o método ( send ) desta parte do código está vazio, isto acontece pois não é necessário passar nenhum parâmetro para realizar esta operação, no entanto caso o service declarado lá no Zend tenha algum parâmetro declarado então o parâmetro deve ser adicionado ao ( send ) para que o mesmo seja enviado junto da requisição.</p>
<p>Esta desta forma que as operações da parte Flex do projeto são realizadas, lógico que existem outras metodologias para realizar esta tarefa, porem eu abordei esta forma para que não fique tão complicado o entendimento desta funcionalidade do projeto.</p>
<p>Antes de passar para a explicação das alterações realizadas no Zend Framework gostaria de mostrar uma alteração que realizei em uma das classes que representam a classe do lado Zend, verifique o código a seguir.</p>
<pre class="brush: as3;">
package models
{
  [Bindable]
  [RemoteClass(alias=&quot;Reserva&quot;)]

  public class Reserva
  {

    public var codReserva:int;
    public var codHotelQuarto:int;
    public var numQuarto:int;
    public var codHospede:int;
    public var datReserva:String;
    public var qtdDias:int;
    public var sitReserva:Boolean;

    public var nomHospede:String;
    public var nomHotel:String;
  }
}
</pre>
<p>Conforme explicado no post anterior é necessário que os atributos das classes que representam o objeto tanto no php quanto no actionscript tem a necessidade de ter os mesmos atributos. Então eu adicionei dois atributos novos à classe “Reserva”, estes dois atributos adicionais serão utilizados para que possa visualizar o nome do hospede e do hotel na tabela de listagem de reservas. Na programação orientada a objetos não seria melhor método a aplicar, pois instancias dos objetos hospedes e hotel deveriam ser aplicados a esta classe.</p>
<p>Mas explicando o motivo desta abordagem. Em casos como o abordado aqui poderia ser utilizado a instancia de objetos na classe, mas em casos onde se trabalha com uma grande quantidade de dados, criar instancias tantos objetos pode se tornar um esforço computacional desnecessário, inclusive neste caso onde era necessário apenas os nomes para mostrar na tabela. Por este motivo abordei este método para o projeto, a forma correta de aplicar fica a sua escolha.</p>
<p>Agora vamos ver como realizar as tarefas do projeto no Zend Framework, até agora foi abordado como montar a tela do projeto no Flex, como requisitar os serviços para o servidor e como utilizar o retorno dos mesmos. Veremos como fica o código que realiza as tarefas solicitadas, como por exemplo, criar uma listagem, salvar um objeto, excluir um objeto, obter apenas um objeto em especifico e até alterá-lo.</p>
<p>No post anterior quando foi criado um service para cada classe de modelo gerada pelo Doctrine foi mostrado três métodos básicos para o mesmo, estes métodos não serão utilizados por todos os services, pois não estou abordando todo o projeto, porem fica como sugestão caso queira implementar todo o projeto em seu treinamento a seguir mostrarei apenas os métodos utilizados dos services que são requisitados e abordarei mais o service referente a reserva que é o objetivo principal deste tutorial.</p>
<p>Services &#8220;HospedeService&#8221; e &#8220;HotelService&#8221;. Nestes dois services o único método implementado foi o &#8220;executeList&#8221;.</p>
<pre class="brush: php;">
 public function executeList(){
   $list = HospedeTable::getInstance();
   return $list-&gt;findAll()-&gt;getData();
 }
</pre>
<p>Como pode ser visto anteriormente três classes de modelo foram criadas ao gerar o comando de criação com o Doctrine, a primeira é a classe base que contêm os atributos referentes às tabelas do banco de dados, a segunda a classe a ser utilizada no projeto e que deve ser instanciada quando necessário esta classe estende a classe base e por ultimo a classe table. As classes table como a &#8220;HospedeTable&#8221; estendem a classe &#8220;Doctrine_Table&#8221;, esta classe é responsável por realizar algumas consultas sql, como por exemplo o código anterior.</p>
<p>No código pode ser verificado que uma instancia da classe &#8220;HospedeTable&#8221; é adicionado, e ao chamarmos o método da classe instanciada, ( findAll() ) o Doctrine solicitará ao banco de dados todos os registros da tabela hospede, é como realizar um comando de Sql no banco de dados &#8220;SELECT * FROM hospede&#8221;, mas com a vantagem de ter as informações já em forma de objetos e não apenas registros em um array. Porem é necessário deixar claro que este método retorna um objeto da classe &#8220;HospedeTable&#8221; e não os objetos &#8220;Hospede&#8221; como desejamos. Por isso é chamado outro método da classe, o ( getData() ), este método retorna um array que contêm todos os registros da tabela hospede em forma de objetos &#8220;Hospede&#8221;, e assim podendo retornar a requisição para o Flex com uma lista de todos os objetos.</p>
<p>Para realizar a listagem de hotéis o mesmo método pode ser utilizado apenas deve-se instanciar o objeto &#8220;HotelTable&#8221;.</p>
<p>Service &#8220;HotelQuartoService&#8221;. Este service é provido de um método de listagem diferente do descrito anteriormente a diferença fica no parâmetro passado pelo Flex ao requisitar o método deste service e o método de listagem de objetos realiza a busca comparando um determinado valor.</p>
<pre class="brush: php;">
 public function executeList($hotel){
   $cod = 0;
   if($hotel instanceof Hotel){
     $cod = $hotel-&gt;codHotel;
   }else{
     $cod = $hotel;
   }

   $list = HotelQuartoTable::getInstance();
   return $list-&gt;findBy('cod_hotel', $cod)-&gt;getData();
 }
</pre>
<p>Um parâmetro é passado para este método porem sem definição alguma, então dentro do método é realizado a verificação se o valor recebido é uma instancia do objeto Hotel, caso seja adiciona o código do hotel ao atributo &#8220;$cod&#8221; do método caso contrário o valor passado é apenas o código mesmo. Este atributo que recebe o código do hotel será utilizado como parâmetro de comparação para realizar a consulta de listagem da tabela &#8220;hotel_quarto&#8221;. Apos instanciar a classe referente à tabela desejada o método utilizado é o ( findBy() ), este método busca as informações necessárias adicionando um valor de comparação à consulta que neste caso é o código do hotel, seria o mesmo que realizar o seguinte comando Sql &#8220;SELECT * FROM hotel_quarto WHERE cod_hotel = 1&#8243;. Desta forma todos os registros da tabela &#8220;hotel_quarto&#8221; que o código do hotel é igual a 1 é obtido. E da mesma forma que as listagens anteriores utiliza-se do método ( getData() ) para obter apenas os objetos referentes a tabela aqui citada.</p>
<p>Outro método utilizado deste service é o ( executeRetrieve ), este método ao ser solicitado retorna apena um registro da tabela &#8220;hotel_quarto&#8221;, e recebe como parâmetro o código do registro que se deseja buscar.</p>
<pre class="brush: php;">
 public function executeRetrieve($cod_hotel_quarto){
   $hq = HotelQuartoTable::getInstance();
   return $hq-&gt;findOneBy('cod_hotel_quarto', $cod_hotel_quarto);
 }
</pre>
<p>Aqui o método utilizado da classe &#8220;HotelQuartoTable&#8221; é o ( findOneBy () ), este método quando chamado obtêm o primeiro registro encontrado aplicando a clausula passada como parâmetro. Com este método encontramos o registro que necessário conforme a regra no projeto.</p>
<p>Service &#8220;QuartoService&#8221;. Neste service nenhuma ação foi aplicada, portanto não há a necessidade de abordarmos aqui.</p>
<p>Service &#8220;ReservaService&#8221;. Este service é o solicitado para realizar a maioria das funcionalidades referentes ao projeto abordado. Neste service é realizada a listagem, alteração, exclusão e criação de reservas. Vejam o código a seguir.</p>
<pre class="brush: php;">
class ReservaService {

  public function executeSave(Reserva $object){
    $itemToSave = new Reserva();

    $itemToSave-&gt;codHotelQuarto = $object-&gt;codHotelQuarto;
    $itemToSave-&gt;numQuarto = $object-&gt;numQuarto;
    $itemToSave-&gt;codHospede = $object-&gt;codHospede;
    $itemToSave-&gt;datReserva = $object-&gt;datReserva;
    $itemToSave-&gt;qtdDias = $object-&gt;qtdDias;
    $itemToSave-&gt;sitReserva = $object-&gt;sitReserva;
    $itemToSave-&gt;save();

    return $itemToSave;
  }

  public function executeDelete(Reserva $object){
    $q = Doctrine_Query::create()-&gt;delete('Reserva')-&gt;whereIn('cod_reserva', $object-&gt;codReserva);
    $delete = $q-&gt;execute();

    if($delete &gt; 0){
      return  true;
    }else{
      return  false;
    }
  }

  public function executeList(){
    $reservas =  ReservaTable::getInstance();
    $list = $reservas-&gt;findAll()-&gt;GetData();
    $l = array();
    foreach($list as $reserva){
      $reserva-&gt;datReserva = $this-&gt;dataDbToSystem($reserva-&gt;datReserva);
      $reserva-&gt;addData();
      $l[] = $reserva;
    }
    return  $l;
  }

  public function executeUpdate(Reserva $reserva){
    try {
      $q = Doctrine_Query::create()-&gt;update('Reserva')
        -&gt;set('cod_hotel_quarto', $reserva-&gt;codHotelQuarto)
        -&gt;set('num_quarto', $reserva-&gt;numQuarto)
        -&gt;set('cod_hospede', $reserva-&gt;codHospede)
        -&gt;set('dat_reserva ', '?', $reserva-&gt;datReserva)
        -&gt;set('qtd_dias', $reserva-&gt;qtdDias)
        -&gt;set('sit_reserva', $reserva-&gt;sitReserva == 1 ? 'true' : 'false')
        -&gt;where('cod_reserva = '.$reserva-&gt;codReserva);

      $q-&gt;execute();
    } catch (Exception $e) {
       return false;
    }

    return true;
  }

  public function dataSystemToDb($data){
    $dt = spliti(&quot;/&quot;, $data);
    return $dt[2].&quot;-&quot;.$dt[1].&quot;-&quot;.$dt[0];
  }

  public function dataDbToSystem($data){
    $t = spliti(&quot; &quot;, $data);
    $dt = spliti(&quot;-&quot;, $t[0]);
    return $dt[2].&quot;/&quot;.$dt[1].&quot;/&quot;.$dt[0];
  }
}
</pre>
<p>Explicarei cada método desta classe.</p>
<p>Método &#8220;executeSave&#8221;, este método salva um novo objeto no banco de dados na tabela &#8220;reserva&#8221;. Recebe como parâmetro um objeto do tipo &#8220;Reserva&#8221; enviado pelo Flex ao realizar a requisição. Em seguida cria-se um novo objeto para receber os dados que serão salvos e finalmente executa a operação para salvar o objeto chamando o método ( save() ) da classe reserva. Uma observação aqui deve ser avaliada.</p>
<p>Por que não salvar direto o objeto passado por parâmetro?</p>
<p>Diferente do php os atributos do actionscript são tipados e quando um objeto é enviado ao service o mesmo chegará com todos os atributos com algum valor, o objeto reserva tem um atributo que é o código da reserva e este atributo é do tipo integer, portanto não tem como salvar com valor zero que é o valor default para atributos do tipo int no Flex, o objeto que vem por parâmetro no método já vem com o atributo &#8220;codReserva&#8221; atribuído o valor zero, isto por ser um tipo primitivo no actionscript que obriga ter um valor atribuído nem que este valor seja o zero. Em outros atributos como o tipo &#8220;string&#8221; o valor seria &#8220;null&#8221; e não haveria problema algum, claro isso dependendo da regra criada para o campo no banco de dados.</p>
<p>Por este motivo é criado um novo objeto e adicionado ao mesmo os valores correspondentes e em seguida é chamado o método ( save() ) deste objeto que realizará a tarefa de inserir os valores na tabela &#8220;reserva&#8221; no banco de dados.</p>
<p>Método &#8220;executeDelete&#8221;, realiza a exclusão do objeto na tabela &#8220;reserva&#8221; no banco de dados. O método que foi abordado aqui para excluir um objeto é meio primitivo, ele parece muito com um Sql normal pois a instancia do objeto cria uma conexão com o banco de dados e através de métodos parecidos com comandos de Sql geram o comando para realizar a exclusão do objeto. No Doctrine é possível também excluir um objeto com o próprio método ( delete() ) da classe do mesmo, por exemplo, &#8220;$object-&gt;delete()&#8221;, porem não consegui aplicar esta abordagem aqui, pois simplesmente este método não funcionou e não encontrei solução pelo menos até o momento que escrevo este post.</p>
<p>Método &#8220;executeList&#8221;, este método tem a mesma funcionalidade dos métodos de listagem já explicados anteriormente, apenas com uma pequena diferença, apos receber a lista de reserva percorro todo o array de objetos formatando a data que vem do banco de dados para o formato utilizado no sistema, para esta atividade criei uma função que realiza esta conversão ( dataDbToSystem ) passando como parâmetro o valor da data do banco de dados. E no mesmo laço chamo um método que criei para a classe &#8220;Reserva&#8221; ( addData() ), este método que explicarei a sua funcionalidade mais adiante adiciona dois valores á mais no objeto &#8220;Reserva&#8221;.</p>
<p>Método &#8220;executeUpdate&#8221;, tem como finalidade alterar o objeto no banco de dados, como no método &#8220;executeSave&#8221; ele recebe como parâmetro um objeto &#8220;Reserva&#8221;, enviado pelo Flex com os dados para serem alterados, e neste também abordei um método primitivo para realizar esta operação bem como aconteceu na no método de exclusão. E pelo mesmo motivo o método da classe que deveria realizar esta tarefa não funcionou, apenas para esclarecer o método que realiza a função de alterar o objeto é o mesmo utilizado para criar, ( save() ), este método consegue diferenciar quando é necessário salvar ou alterar um objeto através do &#8220;id&#8221; do mesmo. Neste caso o código da reserva, explico, quando o método é chamado se o objeto tiver o &#8220;id&#8221;, ou seja, o código da reserva nula o mesmo identifica que é necessário criar um  novo registro na tabela reserva no banco de dados, caso o código tenha algum valor atribuído como por exemplo 2 ele identifica que é necessário alterar o registro da tabela quando o código for igual a 2. Porem como disse não conseguiu fazer com que esta funcionalidade funcionasse no caso aqui abordado.</p>
<p>E por fim os outros dois métodos &#8220;dateSystemToDb&#8221; e &#8220;dateDbToSystem&#8221; foram usados para converter a data do banco para o sistema e do sistema para o banco de dados.</p>
<p>Anteriormente falei sobre a adição de dois atributos na classe &#8220;Reserva&#8221; do lado Flex da aplicação, como já devem saber para ter acesso aos atributos é necessário adicionar os mesmos para a classe representante do lado do php neste caso do Zend, então os dois atributos serão adicionados à classe.</p>
<pre class="brush: php;">
  public $nomHospede;
  public $nomHotel;
</pre>
<p>Também como citado anteriormente um método novo foi adicionado para esta classe.</p>
<p>Existe um motivo interessante para adicionar este método à classe. Como já explicado neste tutorial a comunicação entre as o Flex e o Zend Framework ocorre através do ZendAmf e o mesmo converte os dados de um para o outro através dos atributos declarados nas classes que aqui chamou-se de classes de modelo. Porem no caso aqui abordado devido a abstração dos objetos criados pela ferramenta Doctrine quando chamamos uma classe como a &#8220;Reserva&#8221; a mesma não contêm apenas os atributos que representam a tabela do banco de dados e sim toda uma classe com as funcionalidades necessárias para realizar diversas tarefas. Com esta abstração os dados dos atributos ficam encapsulados em um array chamado &#8220;$_data&#8221; e somente os dados que estão dentro deste array é que serão enviados do Zend para o Flex e recebidos do Flex pelo Zend. Por este motivo os atributos adicionais não serão reconhecidos quando a requisição retornar para o Flex e os dados retornados para os mesmos serão nulos. Por isso criei o método ( addData() ), que insere dentro do array de dados os atributos adicionais &#8220;$nomHospede&#8221; e &#8220;$nomHotel&#8221;, para que os mesmos sejam reconhecidos como atributos da classe na parte Flex do projeto. A seguir como ficou a criação deste método.</p>
<pre class="brush: php;">
 public function addData(){
   $this-&gt;setNomHospede();
   $this-&gt;setNomeHotel();
   $this-&gt;_data['nomHospede'] = $this-&gt;getNomHospede();
   $this-&gt;_data['nomHotel'] = $this-&gt;getNomHotel();
 }
</pre>
<p>Este método que abordei aqui talvez não seja o correto a ser aplicado, apesar das pesquisas que realizei sobre este problema como podemos chamá-lo, não encontrei outra solução para o &#8220;problema&#8221; se é que pode ser considerado como sendo realmente um problema. Mas agora adotando este método não será necessário nos preocuparmos se terá ou não acesso aos dados adicionais do projeto.</p>
<p>Alem de adicionar o método que insere os novos atributos no array ( $_data ), foi criado os métodos set e get dos atributos adicionais, no método set de cada atributo foi adicionado uma verificação, caso não seja passado nenhum valor por parâmetro é realizado uma consulta para obter o valor do atributo correspondente. A classe com os novos métodos que foram adicionados pode ser visualizada no código abaixo.</p>
<pre class="brush: php;">
&lt;?php

/**
 * Reserva
 *
 * This class has been auto-generated by the Doctrine ORM Framework
 *
 * @property integer $codReserva
 * @property integer $codHotelQuarto
 * @property integer $numQuarto
 * @property integer $codHospede
 * @property timestamp $datReserva
 * @property integer $qtdDias
 * @property boolean $sitReserva
 *
 * @package    ##PACKAGE##
 * @subpackage ##SUBPACKAGE##
 * @author     ##NAME## &lt;##EMAIL##&gt;
 * @version    SVN: $Id: Builder.php 7490 2010-03-29 19:53:27Z jwage $
 */
class Reserva extends Base_Reserva
{

  public $_explicitType = &quot;Reserva&quot;;
  public $nomHospede;
  public $nomHotel;

  public function setTableDefinition(){
    parent::setTableDefinition();
    $this-&gt;hasColumn('cod_reserva as codReserva');
    $this-&gt;hasColumn('cod_hotel_quarto as codHotelQuarto');
    $this-&gt;hasColumn('num_quarto as numQuarto');
    $this-&gt;hasColumn('cod_hospede as codHospede');
    $this-&gt;hasColumn('dat_reserva as datReserva');
    $this-&gt;hasColumn('qtd_dias as qtdDias');
    $this-&gt;hasColumn('sit_reserva as sitReserva');
  }

  public function addData(){
    $this-&gt;setNomHospede();
    $this-&gt;setNomeHotel();
    $this-&gt;_data['nomHospede'] = $this-&gt;getNomHospede();
    $this-&gt;_data['nomHotel'] = $this-&gt;getNomHotel();
  }

  public function setNomHospede($value = null){
    if(is_null($value)){
      $n = HospedeTable::getInstance();
      $value = $n-&gt;findOneBy('cod_hospede', $this-&gt;codHospede);
      $this-&gt;nomHospede = $value-&gt;nomHospede;
    }else{
      $this-&gt;nomHospede = $value;
    }
  }

  public function getNomHospede(){
    return $this-&gt;nomHospede;
  }

  public function setNomeHotel($value = null){
    if(is_null($value)){
      $q = Doctrine_Query::create()
       -&gt;select('q.nom_hotel, h.cod_hotel_quarto')
       -&gt;from('Hotel q')
       -&gt;leftJoin('q.HotelQuarto h on h.cod_hotel = q.cod_hotel')
       -&gt;where('h.cod_hotel_quarto = '.$this-&gt;codHotelQuarto);
      $result = $q-&gt;execute();
      $v = $result-&gt;getData();
      $this-&gt;nomHotel = $v[0]-&gt;nomHotel;
    }else{
      $this-&gt;nomHotel = $value;
    }
  }

  public function getNomHotel(){
    return $this-&gt;nomHotel;
  }

}
</pre>
<p>Apos realizar todo este processo para a criação do projeto o sistema pode ser utilizado executando as operações básicas, salvar, alterar, obter e excluir um objeto, no caso aqui abordado a reserva. A seguir pode a imagem com a cara do sistema criado até agora.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/09/system.png"><img class="alignnone size-full wp-image-117" title="system" src="http://tiagozis.files.wordpress.com/2010/09/system.png?w=640&#038;h=409" alt="" width="640" height="409" /></a></p>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                            &lt;![endif]--> Como pode ser visto todos os campos que representam os dados da reserva está na parte superior da tela, o botão salvar pode ser utilizado tanto na criação de uma nova reserva como para a alteração de uma já existente, em seguida a tabela listando as reservas já cadastradas. Ao selecionar uma reserva na tabela e clicar no botão alterar o objeto será carregando nos campos superiores com cada valor no local correto para que possa ser realizada a alteração do mesmo, e para excluir uma reserva basta apenas selecionar uma na tabela e clicar no botão excluir.</p>
<p>Bom aqui termina o exemplo deste tutorial sobre a integração das ferramentas Flez, Zend Framework e Doctrine. Espero que tenha ficado mais claro como integrar e utilizar estas ferramentas. E como falei muito durante o tutorial os métodos aqui utilizados foram desenvolvidos seguindo uma linha de raciocínio para a aplicação, mas nada impede de ser criado ou adaptado utilizando outros métodos.</p>
<p>Pessoal qualquer dúvida ou sugestão sobre o tema abordado aqui fiquem a vontade de comentar aqui no blog. E obrigado a todos que acompanham este tutorial. Até o próximo post.</p>
<p>A baixo o link com a aplicação para download.</p>
<p><a href="http://www.megaupload.com/?d=BXGMBLHC" target="_blank">http://www.megaupload.com/?d=BXGMBLHC</a></p>
<div id="_mcePaste" style="position:absolute;left:-10000px;top:11217px;width:1px;height:1px;overflow:hidden;"><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                            &lt;![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:0 0 0 0 0 0 0 0 0 0; 	mso-font-charset:1; 	mso-generic-font-family:roman; 	mso-font-format:other; 	mso-font-pitch:variable; 	mso-font-signature:0 0 0 0 0 0;} @font-face 	{font-family:Calibri; 	panose-1:2 15 5 2 2 2 4 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-520092929 1073786111 9 0 415 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin-top:0cm; 	margin-right:0cm; 	margin-bottom:10.0pt; 	margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-fareast-language:EN-US;} p 	{mso-style-priority:99; 	mso-margin-top-alt:auto; 	margin-right:0cm; 	mso-margin-bottom-alt:auto; 	margin-left:0cm; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:"Times New Roman";} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-fareast-language:EN-US;} .MsoPapDefault 	{mso-style-type:export-only; 	margin-bottom:10.0pt; 	line-height:115%;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 3.0cm 70.85pt 3.0cm; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:&quot;Tabela normal&quot;; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin-top:0cm; 	mso-para-margin-right:0cm; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:&quot;Times New Roman&quot;; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:&quot;Times New Roman&quot;; 	mso-bidi-theme-font:minor-bidi;} --> <!--[endif]-->Este método que abordei aqui talvez não seja o correto a ser aplicado, apesar das pesquisas que realizei sobre este problema como podemos chamá-lo, não encontrei outra solução para o &#8220;problema&#8221; se é que pode ser considerado como sendo realmente um problema. Mas agora adotando este método não será necessário nos preocuparmos se terá ou não acesso aos dados adicionais do projeto.&nbsp;</p>
<p>Alem de adicionar o método que insere os novos atributos no array ( $_data ), foi criado os métodos set e get dos atributos adicionais, no método set de cada atributo foi adicionado uma verificação, caso não seja passado nenhum valor por parâmetro é realizado uma consulta para obter o valor do atributo correspondente. A classe com os novos métodos que foram adicionados pode ser visualizada no código abaixo.</p>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagozis.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagozis.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagozis.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagozis.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tiagozis.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tiagozis.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tiagozis.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tiagozis.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagozis.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagozis.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagozis.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagozis.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagozis.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagozis.wordpress.com/108/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagozis.wordpress.com&amp;blog=14385764&amp;post=108&amp;subd=tiagozis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tiagozis.wordpress.com/2010/09/21/integracao-flex-zend-framework-doctrine-parte-3/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a1446e0154d18fe1bcd7376e4f660f2b?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tiagozis</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/09/system.png" medium="image">
			<media:title type="html">system</media:title>
		</media:content>
	</item>
		<item>
		<title>Integração Flex + Zend Framework + Doctrine Parte 2</title>
		<link>http://tiagozis.wordpress.com/2010/08/24/integracao-flex-zend-framework-doctrine-parte-2/</link>
		<comments>http://tiagozis.wordpress.com/2010/08/24/integracao-flex-zend-framework-doctrine-parte-2/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 17:03:25 +0000</pubDate>
		<dc:creator>Tiago Zis</dc:creator>
				<category><![CDATA[Desenvolvimento de Software]]></category>
		<category><![CDATA[Amf]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex Builder]]></category>
		<category><![CDATA[Integração]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://tiagozis.wordpress.com/?p=91</guid>
		<description><![CDATA[Olá pessoal apos um longo tempo devido à falta de tempo estou postando a segunda parte do tutorial, me desculpem por demorar em postar a segunda parte, mas então vamos lá, daremos seqüência à aplicação. Primeira parte do tutorial : http://tiagozis.wordpress.com/2010/07/12/flex-zend-framework-doctrine/ Continuando o desenvolvimento  será necessário criar um arquivo xml com as configurações necessárias para [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagozis.wordpress.com&amp;blog=14385764&amp;post=91&amp;subd=tiagozis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span id="more-91"></span>Olá pessoal apos um longo tempo devido à falta de tempo estou postando a segunda parte do tutorial, me desculpem por demorar em postar a segunda parte, mas então vamos lá, daremos seqüência à aplicação.</p>
<p>Primeira parte do tutorial : <a href="http://tiagozis.wordpress.com/2010/07/12/flex-zend-framework-doctrine/" target="_blank">http://tiagozis.wordpress.com/2010/07/12/flex-zend-framework-doctrine/</a></p>
<p>Continuando o desenvolvimento  será necessário criar um arquivo xml com as configurações necessárias para a comunicação do projeto flex com o prjeto Zend, esta comunicação ocorrerá atravez do AMF que já está embutido nas bibliotecas do Zend Framework. Então no projeto flex crie um novo arquivo chamado “services-config.xml” e configure conforme mostrado a seguir.</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;services-config&gt;
  &lt;services&gt;
    &lt;service id=&quot;flextest-service&quot; class=&quot;flex.messaging.services.RemotingService&quot; messageTypes=&quot;flex.messaging.messages.RemotingMessage&quot;&gt;
        &lt;destination id=&quot;flextest&quot;&gt;
          &lt;channels&gt;
            &lt;channel ref=&quot;flextest-channel&quot;/&gt;
          &lt;/channels&gt;
          &lt;properties&gt;
            &lt;source&gt;*&lt;/source&gt;
          &lt;/properties&gt;
        &lt;/destination&gt;
        &lt;destination id=&quot;flex&quot;&gt;
          &lt;channels&gt;
            &lt;channel ref=&quot;flex-channel&quot;/&gt;
          &lt;/channels&gt;
          &lt;properties&gt;
            &lt;source&gt;*&lt;/source&gt;
          &lt;/properties&gt;
        &lt;/destination&gt;
    &lt;/service&gt;
  &lt;/services&gt;
    &lt;channels&gt;
      &lt;channel-definition id=&quot;flextest-channel&quot; class=&quot;mx.messaging.channels.AMFChannel&quot;&gt;
        &lt;endpoint uri=&quot;http://project/gateway/amf&quot; class=&quot;flex.messaging.endpoints.AMFEndpoint&quot;/&gt;
      &lt;/channel-definition&gt;
      &lt;channel-definition id=&quot;flex-channel&quot; class=&quot;mx.messaging.channels.AMFChannel&quot;&gt;
		&lt;endpoint uri=&quot;http://project/gateway/amf&quot; class=&quot;flex.messaging.endpoints.AMFEndpoint&quot;/&gt;
      &lt;/channel-definition&gt;
    &lt;/channels&gt;
&lt;/services-config&gt;
</pre>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                               &lt;![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:0 0 0 0 0 0 0 0 0 0; 	mso-font-charset:1; 	mso-generic-font-family:roman; 	mso-font-format:other; 	mso-font-pitch:variable; 	mso-font-signature:0 0 0 0 0 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:"Times New Roman";} p 	{mso-style-unhide:no; 	mso-margin-top-alt:auto; 	margin-right:0cm; 	mso-margin-bottom-alt:auto; 	margin-left:0cm; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:"Times New Roman";} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	font-size:10.0pt; 	mso-ansi-font-size:10.0pt; 	mso-bidi-font-size:10.0pt;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 3.0cm 70.85pt 3.0cm; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:&quot;Tabela normal&quot;; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:&quot;Times New Roman&quot;; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:&quot;Times New Roman&quot;; 	mso-bidi-theme-font:minor-bidi;} --> <!--[endif]--></p>
<p>Como podemos ver aqui é definido os canais de comunicação do flex com o PHP ou neste caso o projeto Zend, canais estes que se comunicam como já havia falado através do AMF. Outro detalhe que podemos verificar nesta configuração é a tag que define o “end point” da aplicação, ou seja o local que vai receber as requisições geradas pelo flex quando for solicitado. Explicando a URL do “endpoint”, o “project” refere-se ao nome definido para o projeto o mesmo usado na url de teste ao criarmos o projeto Zend, “gateway” é como vamos chamar a classe “controller” que servirá como o ponto de referencia para a comunicação, esta classe será criada  e explicada a seguir, pro fim “amf” o nome do método que refere-se a uma ação criada na classe “controler gateway”.</p>
<p>Já definimos as configurações de comunicação à parte flex do nosso projeto agora é necessário adicionar o parâmetro “service” ao compilador do flex para que o mesmo reconheça esta configuração. Então na ferramenta de desenvolvimento flex clique com o botão direito na aplicação e selecione “propriedades”, em seguida vá a opção “Flex Compiler” e no campo “Additional compiler argumenst” adicione a seguinte configuração ao campo texto existente, ( -services “services-config.xml” ). Click em “OK” e pronto o services-config do projeto já está definido como um argumento do compilador do flex.</p>
<p><strong><a href="http://tiagozis.files.wordpress.com/2010/07/add-arguments-services.jpg"><img class="alignnone size-full wp-image-52" title="add-arguments-services" src="http://tiagozis.files.wordpress.com/2010/07/add-arguments-services.jpg?w=640&#038;h=457" alt="" width="640" height="457" /></a><br />
</strong></p>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                               &lt;![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:0 0 0 0 0 0 0 0 0 0; 	mso-font-charset:1; 	mso-generic-font-family:roman; 	mso-font-format:other; 	mso-font-pitch:variable; 	mso-font-signature:0 0 0 0 0 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:"Times New Roman";} p 	{mso-style-unhide:no; 	mso-margin-top-alt:auto; 	margin-right:0cm; 	mso-margin-bottom-alt:auto; 	margin-left:0cm; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:"Times New Roman";} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	font-size:10.0pt; 	mso-ansi-font-size:10.0pt; 	mso-bidi-font-size:10.0pt;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 3.0cm 70.85pt 3.0cm; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:&quot;Tabela normal&quot;; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:&quot;Times New Roman&quot;; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:&quot;Times New Roman&quot;; 	mso-bidi-theme-font:minor-bidi;} --> <!--[endif]--></p>
<p>Agora que o meio de comunicação do lado Flex do projeto já está devidamente configurado vamos criar a classe que recebe as requisições para repassar as ações para as classes services que serão criadas. No projeto Zend crie uma classe chamada “GatewayController” dentro do diretório “controllers”. As classes controllers do Zend Framework tem como objetivo controlar a aplicação executando as ações e redirecionando para as páginas referentes às ações definidas. Estas ações são declaradas como métodos que levam em sua nomenclatura o que a ação faz adicionado à palavra “Action” exemplo: ( public function indexAction() {} ). Este é o método padrão de uma classe controller do Zend Framework, e executa uma ação que inicializa a tela index de um módulo, poderíamos ter como base uma tela de cadastro de pessoas e um controller que poderíamos  chamar de “CadastroPessoasController” ao chamarmos uma url “http://meu_site/cadastroPessoas/index”, automaticamente o método do controller indexAction será chamado e iniciando a tela index que será um arquivo que fica no diretório “view” do projeto Zend Framework.</p>
<p>Porem no caso que estamos abordando aqui isto será necessário somente para a classe “GatewayController” que terá o método “amfAction” este método é responsável pelo envio dos das ações a serem executadas para as classes services do projeto. As classes services servirão como as classes de controle do nosso projeto. Observe que usarei este método para controlar a aplicação, mas outras formas podem ser abordadas, você poderá escolher o método que desejar. Na seqüência o código da classe.</p>
<pre class="brush: php;">
class GatewayController extends Zend_Controller_Action {

public function init() {
    $this-&gt;getHelper('viewRenderer')-&gt;setNoRender();
  }

  public function indexAction() {

  }

  public function amfAction() {
    $server =  new Zend_Amf_Server();
    $server-&gt;addDirectory(APPLICATION_PATH. &quot;/services/&quot;);
    echo ($server-&gt;handle());
  }

}
</pre>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                               &lt;![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:0 0 0 0 0 0 0 0 0 0; 	mso-font-charset:1; 	mso-generic-font-family:roman; 	mso-font-format:other; 	mso-font-pitch:variable; 	mso-font-signature:0 0 0 0 0 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:"Times New Roman";} p 	{mso-style-unhide:no; 	mso-margin-top-alt:auto; 	margin-right:0cm; 	mso-margin-bottom-alt:auto; 	margin-left:0cm; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:"Times New Roman";} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	font-size:10.0pt; 	mso-ansi-font-size:10.0pt; 	mso-bidi-font-size:10.0pt;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 3.0cm 70.85pt 3.0cm; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:&quot;Tabela normal&quot;; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:&quot;Times New Roman&quot;; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:&quot;Times New Roman&quot;; 	mso-bidi-theme-font:minor-bidi;} --> <!--[endif]--></p>
<p>Então vamos lá crie uma classe no projeto na parte do Flex, onde desejar e com o nome que desejar, e estenda classe “RemoteObject” para essa nova classe criada. Abaixo a classe com o código necessário para a aplicação.</p>
<pre class="brush: as3;">
package controller
{
  import mx.controls.Alert;
  import mx.rpc.events.FaultEvent;
  import mx.rpc.events.ResultEvent;
  import mx.rpc.remoting.mxml.RemoteObject;

  public class RemoteObjectController extends RemoteObject {

      /*Construtor da classe definindo ações e configurações da classe.*/
      public function RemoteObjectController(serviceName:String=null) {
          /*Definindo o canal de comunicação*/
          super(&quot;flextest&quot;);
          /*Adicionando a ação que mostra a animação do cursor enquanto espera
          a resposta de retorno do servidor.*/
          super.showBusyCursor = true;
          /*Adicionando um evento que será disparado caso ocorra um erro.*/
          super.addEventListener(FaultEvent.FAULT, onFault);
          /*Adicionando o nome do service no projeto Zend que será chamado.*/
          if(serviceName is String){
              super.source = serviceName;
          }
      }

      /*Método que define qual função chamar quando servidor retorna com sucesso.*/
      public function setResultFunction(resultFunction:Function=null):void {
          if(resultFunction is Function){
	      super.addEventListener(ResultEvent.RESULT, resultFunction);
	  }
      }

      /*Método que exibe a mensagem de erro caso ocorra algum durante a requisição.*/
      public function onFault(e:FaultEvent):void{
          Alert.show(e.fault.faultString+&quot;\n&quot;+e.fault.faultDetail, e.fault.faultCode.toString());
      }
  }
}
</pre>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                               &lt;![endif]-->Como podemos observar defini dois métodos alem do construtor um que mandará o retorno em casso de sucesso para uma função que será informada ao usar o objeto e outro dentro da própria classe, esse mostrará a mensagem de erro caso ocorra algum  problema durante a requisição.</p>
<p>Agora já temos o processo de comunicação do projeto definido, como usar essa classe que criamos irei explicar mais a frente, agora vamos criar o modelo do nosso projeto para colocá-lo em funcionamento. Vamos criar o modelo do banco de dados e em seguida as classes de modelo do projeto no lado Zend usando o doctrine e as classes do lado Flex que se comunicará com as classes de modelo. A próxima imagem descreve o modelo relacional para o projeto então fiquem a vontade de criar usando as ferramentas que desejar crie um banco de dados com este modelo e em seguida vamos criar as classes de modelo no projeto.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/07/relational-database1.jpg"><img class="alignnone size-full wp-image-61" title="relational-database" src="http://tiagozis.files.wordpress.com/2010/07/relational-database1.jpg?w=640&#038;h=496" alt="" width="640" height="496" /></a></p>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                               &lt;![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:0 0 0 0 0 0 0 0 0 0; 	mso-font-charset:1; 	mso-generic-font-family:roman; 	mso-font-format:other; 	mso-font-pitch:variable; 	mso-font-signature:0 0 0 0 0 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:"Times New Roman";} p 	{mso-style-unhide:no; 	mso-margin-top-alt:auto; 	margin-right:0cm; 	mso-margin-bottom-alt:auto; 	margin-left:0cm; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:"Times New Roman";} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	font-size:10.0pt; 	mso-ansi-font-size:10.0pt; 	mso-bidi-font-size:10.0pt;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 3.0cm 70.85pt 3.0cm; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:&quot;Tabela normal&quot;; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:&quot;Times New Roman&quot;; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:&quot;Times New Roman&quot;; 	mso-bidi-theme-font:minor-bidi;} --> <!--[endif]--></p>
<p>Para criar as classes de modelo do lado Zend do projeto vá ao prompt de comando percorra o caminho até o local onde se encontra o doctrine.bat e digite a seguinte linha de comando ( doctrine generate-models-db ), com este comando o Doctrine irá gerar as classes de modelo para o projeto.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/07/generate-class-model.jpg"><img class="alignnone size-full wp-image-62" title="generate-class-model" src="http://tiagozis.files.wordpress.com/2010/07/generate-class-model.jpg?w=640&#038;h=324" alt="" width="640" height="324" /></a></p>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                               &lt;![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:0 0 0 0 0 0 0 0 0 0; 	mso-font-charset:1; 	mso-generic-font-family:roman; 	mso-font-format:other; 	mso-font-pitch:variable; 	mso-font-signature:0 0 0 0 0 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:"Times New Roman";} p 	{mso-style-unhide:no; 	mso-margin-top-alt:auto; 	margin-right:0cm; 	mso-margin-bottom-alt:auto; 	margin-left:0cm; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:"Times New Roman";} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	font-size:10.0pt; 	mso-ansi-font-size:10.0pt; 	mso-bidi-font-size:10.0pt;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 3.0cm 70.85pt 3.0cm; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:&quot;Tabela normal&quot;; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:&quot;Times New Roman&quot;; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:&quot;Times New Roman&quot;; 	mso-bidi-theme-font:minor-bidi;} --> <!--[endif]--></p>
<p>As classes criadas mostrando na estrutura do projeto:</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/08/model-classes.jpg"><img class="alignnone size-full wp-image-103" title="model-classes" src="http://tiagozis.files.wordpress.com/2010/08/model-classes.jpg?w=266&#038;h=592" alt="" width="266" height="592" /></a></p>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                               &lt;![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:0 0 0 0 0 0 0 0 0 0; 	mso-font-charset:1; 	mso-generic-font-family:roman; 	mso-font-format:other; 	mso-font-pitch:variable; 	mso-font-signature:0 0 0 0 0 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:"Times New Roman";} p 	{mso-style-unhide:no; 	mso-margin-top-alt:auto; 	margin-right:0cm; 	mso-margin-bottom-alt:auto; 	margin-left:0cm; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:"Times New Roman";} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	font-size:10.0pt; 	mso-ansi-font-size:10.0pt; 	mso-bidi-font-size:10.0pt;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 3.0cm 70.85pt 3.0cm; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:&quot;Tabela normal&quot;; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:&quot;Times New Roman&quot;; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:&quot;Times New Roman&quot;; 	mso-bidi-theme-font:minor-bidi;} --> <!--[endif]--></p>
<p>Bom agora que as classes do lado Zend do projeto já estão criadas e com o mapeamento para o banco de dados definido pelo Doctrine é necessário criar as classes espelho que representaram os objetos do lado flex do projeto. Mas antes quero destacar que ao criarmos essas classes de representação elas terão os seus atributos com o mesmo nome usado ao criar as classes php com o Doctrine, já que ao criar o banco de dados os atributos criados usou-se underline na nomenclatura naturalmente o doctrine também criou os atributos da mesma forma.</p>
<pre class="brush: php;">
&lt;?php
// Connection Component Binding
Doctrine_Manager::getInstance()-&gt;bindComponent('Hotel', 'doctrine');

/**
* Base_Hotel
*
* This class has been auto-generated by the Doctrine ORM Framework
*
* @property integer $cod_hotel
* @property string $nom_hotel
* @property integer $qtd_quartos
* @property Doctrine_Collection $HotelQuarto
*
* @package    ##PACKAGE##
* @subpackage ##SUBPACKAGE##
* @author     ##NAME## &lt;##EMAIL##&gt;
* @version    SVN: $Id: Builder.php 7490 2010-03-29 19:53:27Z jwage $
*/
abstract class Base_Hotel extends Doctrine_Record
{
    public function setTableDefinition()
    {
	$this-&gt;setTableName('hotel');
	$this-&gt;hasColumn('cod_hotel', 'integer', 4, array(
	'type' =&gt; 'integer',
	'length' =&gt; 4,
	'fixed' =&gt; false,
	'unsigned' =&gt; false,
	'primary' =&gt; true,
	'sequence' =&gt; 'hotel_cod_hotel',
	));
	$this-&gt;hasColumn('nom_hotel', 'string', null, array(
	'type' =&gt; 'string',
	'fixed' =&gt; false,
	'unsigned' =&gt; false,
	'notnull' =&gt; true,
	'primary' =&gt; false,
	));
	$this-&gt;hasColumn('qtd_quartos', 'integer', 4, array(
	'type' =&gt; 'integer',
	'length' =&gt; 4,
	'fixed' =&gt; false,
	'unsigned' =&gt; false,
	'notnull' =&gt; true,
	'primary' =&gt; false,
	));
    }

    public function setUp()
    {
	parent::setUp();
	$this-&gt;hasMany('HotelQuarto', array(
	'local' =&gt; 'cod_hotel',
	'foreign' =&gt; 'cod_hotel'));
    }
}
</pre>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                             &lt;![endif]--> Como pode ser analisada em uma das classes (Base) gerada pelo Doctrine, a forma que se usou para nomear os atributos ficou da mesma forma que está no banco de dados e serão desta mesma forma que terá que ser criado as classes no lado Flex. Pessoalmente eu não gosto de usar os atributos desta forma então o que podemos fazer é alterar os atributos da classe da forma que desejarmos. Para realizar esta tarefa abra a classe de modelo que estende a classe base referente e altere o nome do atributo usando o método “hasColumn” e nos comentários no inicio do arquivo podemos definir o “@property” com o mesmo nome do atributo. No código abaixo o exemplo usando a classe modelo “Hotel”.</p>
<pre class="brush: php;">
&lt;?php

/**
 * Hotel
 *
 * This class has been auto-generated by the Doctrine ORM Framework
 *
 * @property integer codHotel
 * @property string nomHotel
 * @property integer qtdQuartos
 *
 * @package    ##PACKAGE##
 * @subpackage ##SUBPACKAGE##
 * @author     ##NAME## &lt;##EMAIL##&gt;
 * @version    SVN: $Id: Builder.php 7490 2010-03-29 19:53:27Z jwage $
 */
class Hotel extends Base_Hotel
{

    public $_explicitType = &quot;Hotel&quot;;

    public function setTableDefinition(){
        parent::setTableDefinition();
	$this-&gt;hasColumn('cod_hotel as codHotel');
	$this-&gt;hasColumn('nom_hotel as nomHotel');
	$this-&gt;hasColumn('qtd_quartos as qtdQuartos');
    }
}
</pre>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                             &lt;![endif]--> Sobrescrevendo o método (setTableDefinition) podemos alterar a nomenclatura do nosso atributo nos comentários definimos os novos nomes dos atributos esta tarefa não é obrigatória pois o novo atributo será reconhecido apenas definindo no método descrito anteriormente. Mas quem usa a o auto-complete de uma IDE poderá ver o atributo na lista ao usar este recurso, sem definir a nova propriedade esse o atributo não aparece na lista ao usar o recurso da IDE. Então se caso optar por alterar a nomenclatura dos atributos da classe podes realizar em todas as classes criadas pelo Doctrine.</p>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                             &lt;![endif]--> Agora criaremos as classes espelho na aplicação flex a seguir um modelo de como deve ser a classe no Flex.</p>
<pre class="brush: as3;">
package models
{
    /*Mapeamento da classe Hotel existente no projeto Zend.*/
    [Bindable]
    [RemoteClass(alias=&quot;Hotel&quot;)]

    public class Hotel
    {
	public var codHotel:int;
	public var nomHotel:String;
	public var qtdQuartos:int;

    }
}
</pre>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                             &lt;![endif]--> Ai esta a classe do lado flex nela contêm todos os atributos referentes à mesma classe na parte Zend do projeto e no topo a definição para o mapeamento da mesma. No projeto utilizando o zend não será necessário definir o diretório onde encontra-se a classe no Zend. O processo para as outras classes é o mesmo então você pode criar as demais para o projeto.</p>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                             &lt;![endif]--> Com todas as classes criadas e definidas há uma definição exencial para o funcionamento do projeto, faltou o mapeamento das classes criadas no flex na parte Zend do projeto. Para fazer este mapeamento eu encontrei em minhas pesquisas na web três maneiras de realizar este mapeamento das classes. A primeira delas é dentro da classe “GatewayController” dentro do método “amfAction ()” usar esta definição para o mapeamento “$server-&gt;setClassMap(“Hotel”, “model.Hotel”);” , as outras duas formas são definidas dentro da classe de modelo referente a classe que será mapeada no Flex, neste casso usando a classe Hotel as definições ficam desta forma:</p>
<pre class="brush: php;">
public function construct(){
    $this-&gt;mapValue('_explicitType', 'model.Hotel');
}
</pre>
<pre class="brush: php;">
public $_explicitType = &quot;Hotel&quot;;
</pre>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                             &lt;![endif]--> Na primeira forma usamos dentro do construtor da classe o método “mapValue” para realizar o mapeamento porem vai um alerta e também uma sugestão para quem quiser pesquisar, com este método de declaração ocorre que em alguns casos o objeto retornado torna-se um objeto comum assim não dando para realizar o cast do objeto no lado Flex. Pode existir uma forma de resolver este problema mas não encontrei nada a respeito ainda. Já segunda forma é a mesma usada para mapear classes quando desenvolvemos utilizando apenas o php e o AMF desta forma também funcionam nada mais é que criar um novo atributo para a classe que é interpretado pelo AMF ao realizar o mapeamento. O método usado fica a sua escolha. Só para explicar, a palavra “model” que vem antes do nome da classe refere-se ao nome do diretório onde se encontra a classe “Hotel” do lado Flex. Esta declaração do diretório é necessária ao mapeamento no primeiro, mas não necessário usando o segundo método. O código abaixo mostra a forma que adotei para mapear as classes.</p>
<pre class="brush: php;">
&lt;?php

/**
 * Hotel
 *
 * This class has been auto-generated by the Doctrine ORM Framework
 *
 * @property integer codHotel
 * @property string nomHotel
 * @property integer qtdQuartos
 *
 * @package    ##PACKAGE##
 * @subpackage ##SUBPACKAGE##
 * @author     ##NAME## &lt;##EMAIL##&gt;
 * @version    SVN: $Id: Builder.php 7490 2010-03-29 19:53:27Z jwage $
 */
class Hotel extends Base_Hotel
{

    public $_explicitType = &quot;Hotel&quot;;

    public function setTableDefinition(){
        parent::setTableDefinition();
	$this-&gt;hasColumn('cod_hotel as codHotel');
	$this-&gt;hasColumn('nom_hotel as nomHotel');
	$this-&gt;hasColumn('qtd_quartos as qtdQuartos');
    }
}
</pre>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                             &lt;![endif]--> Outras classes que tem a necessidade de ser criada nesta etapa do desenvolvimento são as classes “services” do projeto, as classes “services” vão ser chamadas quando o servidor receber a requisição que vem do Flex. No projeto que estamos criando vou usar estas classes também como as classes de controle, claro que não é a forma correta de utilizar este tipo de classe, mas não entrarei neste conceito neste post pois ainda estou estudando outras formas de criar classes de controle para ser utilizada nas classes “services”. Então crie uma classe service para cada classe que foi criada no nosso modelo do projeto. Classe service:</p>
<pre class="brush: php;">
&lt;?php
class HotelService {

    public function executeSave(Hotel $object){

    }

    public function executeDelete(Hotel $object){

    }

    public function executeList(){

    }
}
</pre>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                             &lt;![endif]--> Agora vamos criar a tela para o projeto, neste post não abordarei a criação de views ou qualquer outro método, o arquivo main irá realizar a função de cadastrar, alterar, excluir uma reserva e listar as mesmas então abra o arquivo principal do projeto Flex, que no meu caso é o “Main.mxml” e crie a tela conforme o código mostrado a seguir.</p>
<pre class="brush: as3;">

&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; layout=&quot;absolute&quot; creationComplete=&quot;init()&quot;&gt;
    &lt;mx:Script&gt;
    &lt;![CDATA[

	public function init():void{ }

	public function getQuartos():void{ }

        public function save():void{ }

	public function edit():void{ }

	public function _delete():void{ }
    ]]&gt;
    &lt;/mx:Script&gt;
    &lt;mx:DataGrid x=&quot;10&quot; y=&quot;210&quot; width=&quot;669&quot; height=&quot;145&quot;&gt;
	&lt;mx:columns&gt;
	    &lt;mx:DataGridColumn headerText=&quot;Nome Hospede&quot; dataField=&quot;nomHospede&quot;/&gt;
	    &lt;mx:DataGridColumn headerText=&quot;Data Reserva&quot; dataField=&quot;datReserva&quot;/&gt;
	    &lt;mx:DataGridColumn headerText=&quot;Quantidade de dias&quot; dataField=&quot;qtdDias&quot;/&gt;
	    &lt;mx:DataGridColumn headerText=&quot;Hotel&quot; dataField=&quot;nomHotel&quot;/&gt;
	    &lt;mx:DataGridColumn headerText=&quot;Nº Quarto&quot; dataField=&quot;numQuarto&quot;/&gt;
	&lt;/mx:columns&gt;
    &lt;/mx:DataGrid&gt;
    &lt;mx:Label x=&quot;10&quot; y=&quot;12&quot; text=&quot;Hotel:&quot;/&gt;
    &lt;mx:ComboBox x=&quot;138&quot; y=&quot;10&quot; width=&quot;230&quot; id=&quot;comboHotel&quot; labelField=&quot;nomHotel&quot; change=&quot;getQuartos()&quot;&gt;&lt;/mx:ComboBox&gt;

    &lt;mx:Label x=&quot;10&quot; y=&quot;42&quot; text=&quot;Quarto:&quot;/&gt;
    &lt;mx:ComboBox x=&quot;138&quot; y=&quot;40&quot; width=&quot;230&quot; id=&quot;comboQuarto&quot; labelField=&quot;numQuarto&quot;&gt;&lt;/mx:ComboBox&gt;

    &lt;mx:Label x=&quot;10&quot; y=&quot;72&quot; text=&quot;Hospede:&quot;/&gt;
    &lt;mx:ComboBox x=&quot;138&quot; y=&quot;70&quot; width=&quot;230&quot; id=&quot;comboHospede&quot; labelField=&quot;nomHospede&quot;&gt;&lt;/mx:ComboBox&gt;

    &lt;mx:Label x=&quot;10&quot; y=&quot;102&quot; text=&quot;Data Reserva:&quot;/&gt;
    &lt;mx:DateField x=&quot;138&quot; y=&quot;100&quot; width=&quot;230&quot; id=&quot;data&quot;/&gt;

    &lt;mx:Label x=&quot;10&quot; y=&quot;132&quot; text=&quot;Quantidade de dias:&quot;/&gt;
    &lt;mx:TextInput x=&quot;138&quot; y=&quot;130&quot; width=&quot;230&quot; restrict=&quot;[0-9]&quot; id=&quot;dias&quot;/&gt;

    &lt;mx:Button x=&quot;296&quot; y=&quot;160&quot; label=&quot;Salvar&quot; width=&quot;72&quot;/&gt;
    &lt;mx:Button x=&quot;255&quot; y=&quot;363&quot; label=&quot;Alterar&quot; width=&quot;72&quot; click=&quot;edit()&quot;/&gt;
    &lt;mx:Button x=&quot;335&quot; y=&quot;363&quot; label=&quot;Excluir&quot; width=&quot;72&quot; click=&quot;_delete()&quot;/&gt;

&lt;/mx:Application&gt;
</pre>
<p><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                              &lt;![endif]--> Explicando rapidamente as funções existentes aqui, a primeira “init()” é a função chamada quando a tela é criada aqui será feita as chamadas de dados que serão necessários ao carregar a tela, a declaração que chama esta função fica na tag “application” do documento que dispara uma ação ao carregar a tela do projeto (<code><span style="font-size:10pt;">creationComplete="init()")</span></code>, dados estes como a lista de Hoteis e Hospedes para os componentes “comboBox” e a listagem de reservas do sistema, apenas para esclarecem que o nome da função fica a sua escolha e que nem sempre precisamos carregar algo ao iniciarmos uma tela está é apenas uma abordagem realizada no exemplo. A segunda função “getQuartos()” será chamada quando a ação “change” do comboBox hotel ativar, essa função irá buscar a lista de quartos existentes para aquele hotel selecionado. Por fim as funções ( save(), edit(), _delete() ) que realizarão as operações básicas do projeto, funções estas que serão executadas ao acionar a funcionalidade &#8220;click&#8221; adicionada aos botões.</p>
<p>Pessoal por enquanto a segunda parte do post se encerra por aqui, na próxima parte e ultima vou mostrar como aplicar as funções e realizar as operações entre o Flex e o Zend Framework. Espero que estejam gostando do tutorial e qualquer dúvida ou sugestão sobre o post é só deixar um comentário. Até o próximo post e obrigado a todos.</p>
<div id="_mcePaste" style="position:absolute;left:-10000px;top:114px;width:1px;height:1px;overflow:hidden;"><!--[if gte mso 9]&gt;  Normal 0   21   false false false  PT-BR X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                               &lt;![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:0 0 0 0 0 0 0 0 0 0; 	mso-font-charset:1; 	mso-generic-font-family:roman; 	mso-font-format:other; 	mso-font-pitch:variable; 	mso-font-signature:0 0 0 0 0 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:"Times New Roman";} a:link, span.MsoHyperlink 	{mso-style-unhide:no; 	color:blue; 	text-decoration:underline; 	text-underline:single;} a:visited, span.MsoHyperlinkFollowed 	{mso-style-noshow:yes; 	mso-style-priority:99; 	color:purple; 	mso-themecolor:followedhyperlink; 	text-decoration:underline; 	text-underline:single;} code 	{mso-style-unhide:no; 	font-family:"Courier New"; 	mso-ascii-font-family:"Courier New"; 	mso-fareast-font-family:"Times New Roman"; 	mso-hansi-font-family:"Courier New"; 	mso-bidi-font-family:"Courier New";} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	font-size:10.0pt; 	mso-ansi-font-size:10.0pt; 	mso-bidi-font-size:10.0pt;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 3.0cm 70.85pt 3.0cm; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:&quot;Tabela normal&quot;; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:&quot;Times New Roman&quot;; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:&quot;Times New Roman&quot;; 	mso-bidi-theme-font:minor-bidi;} --> <!--[endif]-->&nbsp;</p>
<table class="MsoNormalTable" border="0" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">01</span></code></p>
</td>
<td style="padding:.75pt;" colspan="2">
<p class="MsoNormal"><code><span style="font-size:10pt;">&lt;?xml</span></code> <code><span style="font-size:10pt;">version="1.0"</span></code> <code><span style="font-size:10pt;">encoding="UTF-8"?&gt;</span></code></p>
</td>
</tr>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">02</span></code></p>
</td>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;services-config&gt;</span></code></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="display:none;"> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">03</span></code></p>
</td>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;services&gt;</span></code></p>
</td>
</tr>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">04</span></code></p>
</td>
<td style="padding:.75pt;" colspan="2">
<p class="MsoNormal"><code><span style="font-size:10pt;" lang="EN-US"> &lt;service</span></code> <code><span style="font-size:10pt;" lang="EN-US">id="flextest-service"</span></code> <code><span style="font-size:10pt;" lang="EN-US">messageTypes="flex.messaging.messages.RemotingMessage"&gt;</span></code></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="display:none;"> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">05</span></code></p>
</td>
<td style="padding:.75pt;" colspan="2">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;destination</span></code> <code><span style="font-size:10pt;">id="flextest"&gt;</span></code></p>
</td>
</tr>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">06</span></code></p>
</td>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;channels&gt;</span></code></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="display:none;"> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">07</span></code></p>
</td>
<td style="padding:.75pt;" colspan="2">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;channel</span></code> <code><span style="font-size:10pt;">ref="flextest-channel"/&gt;</span></code></p>
</td>
</tr>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">08</span></code></p>
</td>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;/channels&gt;</span></code></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="display:none;"> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">09</span></code></p>
</td>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;properties&gt;</span></code></p>
</td>
</tr>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">10</span></code></p>
</td>
<td style="padding:.75pt;" colspan="2">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;source&gt;*&lt;/source&gt;</span></code></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="display:none;"> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">11</span></code></p>
</td>
<td style="padding:.75pt;" colspan="2">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;/properties&gt;</span></code></p>
</td>
</tr>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">12</span></code></p>
</td>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;/destination&gt;</span></code></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="display:none;"> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">13</span></code></p>
</td>
<td style="padding:.75pt;" colspan="2">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;destination</span></code> <code><span style="font-size:10pt;">id="flex"&gt;</span></code></p>
</td>
</tr>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">14</span></code></p>
</td>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;channels&gt;</span></code></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="display:none;"> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">15</span></code></p>
</td>
<td style="padding:.75pt;" colspan="2">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;channel</span></code> <code><span style="font-size:10pt;">ref="flex-channel"/&gt;</span></code></p>
</td>
</tr>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">16</span></code></p>
</td>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;/channels&gt;</span></code></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="display:none;"> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">17</span></code></p>
</td>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;properties&gt;</span></code></p>
</td>
</tr>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">18</span></code></p>
</td>
<td style="padding:.75pt;" colspan="2">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;source&gt;*&lt;/source&gt;</span></code></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="display:none;"> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">19</span></code></p>
</td>
<td style="padding:.75pt;" colspan="2">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;/properties&gt;</span></code></p>
</td>
</tr>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">20</span></code></p>
</td>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;/destination&gt;</span></code></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="display:none;"> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">21</span></code></p>
</td>
<td style="padding:.75pt;" colspan="2">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;/service&gt;</span></code></p>
</td>
</tr>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">22</span></code></p>
</td>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;/services&gt;</span></code></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="display:none;"> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">23</span></code></p>
</td>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;channels&gt;</span></code></p>
</td>
</tr>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">24</span></code></p>
</td>
<td style="padding:.75pt;" colspan="2">
<p class="MsoNormal"><code><span style="font-size:10pt;" lang="EN-US"> &lt;channel-definition</span></code> <code><span style="font-size:10pt;" lang="EN-US">id="flextest-channel"&gt;</span></code></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="display:none;"> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">25</span></code></p>
</td>
<td style="padding:.75pt;" colspan="2">
<p class="MsoNormal"><code><span style="font-size:10pt;" lang="EN-US"> &lt;endpoint</span></code> <code><span style="font-size:10pt;" lang="EN-US">uri="</span></code><code><span style="font-size:10pt;"><a href="http://project/gateway/amf">http://project/gateway/amf</a></span></code><code><span style="font-size:10pt;" lang="EN-US">"/&gt;</span></code></p>
</td>
</tr>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">26</span></code></p>
</td>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;/channel-definition&gt;</span></code></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="display:none;"> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">27</span></code></p>
</td>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;" lang="EN-US"> &lt;channel-definition</span></code> <code><span style="font-size:10pt;" lang="EN-US">id="flex-channel"&gt;</span></code></p>
</td>
</tr>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">28</span></code></p>
</td>
<td style="padding:.75pt;" colspan="2">
<p class="MsoNormal"><code><span style="font-size:10pt;" lang="EN-US"> &lt;endpoint</span></code> <code><span style="font-size:10pt;" lang="EN-US">uri="</span></code><code><span style="font-size:10pt;"><a href="http://project/gateway/amf">http://project/gateway/amf</a></span></code><code><span style="font-size:10pt;" lang="EN-US">"/&gt;</span></code></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="display:none;"> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">29</span></code></p>
</td>
<td style="padding:.75pt;" colspan="2">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;/channel-definition&gt;</span></code></p>
</td>
</tr>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">30</span></code></p>
</td>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;/channels&gt;</span></code></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="display:none;"> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;">31</span></code></p>
</td>
<td style="padding:.75pt;">
<p class="MsoNormal"><code><span style="font-size:10pt;"> &lt;/services-config&gt;</span></code></p>
</td>
</tr>
</tbody>
</table>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagozis.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagozis.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagozis.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagozis.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tiagozis.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tiagozis.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tiagozis.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tiagozis.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagozis.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagozis.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagozis.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagozis.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagozis.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagozis.wordpress.com/91/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagozis.wordpress.com&amp;blog=14385764&amp;post=91&amp;subd=tiagozis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tiagozis.wordpress.com/2010/08/24/integracao-flex-zend-framework-doctrine-parte-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a1446e0154d18fe1bcd7376e4f660f2b?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tiagozis</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/07/add-arguments-services.jpg" medium="image">
			<media:title type="html">add-arguments-services</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/07/relational-database1.jpg" medium="image">
			<media:title type="html">relational-database</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/07/generate-class-model.jpg" medium="image">
			<media:title type="html">generate-class-model</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/08/model-classes.jpg" medium="image">
			<media:title type="html">model-classes</media:title>
		</media:content>
	</item>
		<item>
		<title>Integração Flex + Zend Framework + Doctrine Parte 1</title>
		<link>http://tiagozis.wordpress.com/2010/07/12/flex-zend-framework-doctrine/</link>
		<comments>http://tiagozis.wordpress.com/2010/07/12/flex-zend-framework-doctrine/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 20:00:07 +0000</pubDate>
		<dc:creator>Tiago Zis</dc:creator>
				<category><![CDATA[Desenvolvimento de Software]]></category>
		<category><![CDATA[Amf]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex Builder]]></category>
		<category><![CDATA[Integração]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://tiagozis.wordpress.com/?p=17</guid>
		<description><![CDATA[O primeiro Post de integração das ferramentas Adobe Flex, Zend Framework e Doctrine mostra a instalação e criação de um projeto utilizando estas ferramentas de desenvolvimento.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagozis.wordpress.com&amp;blog=14385764&amp;post=17&amp;subd=tiagozis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span id="more-17"></span>Olá pessoal neste post trarei um tutorial que aborda a integração das ferramentas de desenvolvimento Adobe Flex, Zend Framework e Doctrine. Há mais ou menos um ano, trabalho com o desenvolvimento de software e como todo iniciante na área estou em constante aprendizado, e há pouco tempo estou desenvolvendo usando a ferramenta da Adobe, então decidi fazer uma pesquisa sobre Zend Framework que ainda não tinha utilizado apenas tive conhecimento da ferramenta devido a palestras na universidade que estudo.</p>
<p>Realizando algumas pesquisas de integração entre a ferramenta do Adobe e o framework encontrou-se vários tutoriais e dicas na web muitos deles incompletos ou confusos. Por isso decidi criar este Post para tentar mostrar de forma clara o processo de criação de um projeto integrando estas ferramentas. Espero que este post ajude a esclarecer dúvidas e que de alguma forma possa servir como referencia tanto para quem tem conhecimento e utiliza estas ferramentas como para quem está começando na área de desenvolvimento.</p>
<p>O Post será dividido em partes nesta primeira parte explicarei como instalar o Zend Framework e como criar um projeto com o mesmo, também abordarei a instalação do Doctrine no framework e a criação de um projeto no Flex.</p>
<p>Para começar é necessário estar de posse das seguintes ferramentas para o desenvolvimento deste projeto:</p>
<p>Ter instalado um servidor como, por exemplo, o Apache, ter o PHP também instalado em sua máquina e um banco de dados de sua escolha neste caso eu usarei o Postgre, pois é o banco de dados que uso onde trabalho. E o que estou mais acostumado.</p>
<p>Também será necessário estar de posse da ferramenta de desenvolvimento da Adobe ou qualquer outro tipo de instalação como plugin para eclipse etc. Esta ferramenta pode ser obtida neste link <a href="http://www.adobe.com/products/flex/" target="_blank">http://www.adobe.com/products/flex/</a> , onde pode ser baixado o SDK da ferramenta que é distribuído de forma gratuita, ou a ferramenta Flash Builder da Adobe esta ferramenta é paga mas pode ser realizado o download trial para testes que possibilita utilizar a ferramenta durante 60 dias.</p>
<p>Outra ferramenta utilizada neste tutorial é o Zend Framework, este framework para desenvolvimento de softwares em PHP é de distribuição gratuita e licença livre para uso, apenas em caso de criação de código especifico para o framework como, por exemplo, novas funcionalidades para as bibliotecas do mesmo, nestes casos será necessário assinar um termo onde o especifica que o código que será desenvolvido será de propriedade da Zend. Esta ferramenta pode ser obtida neste link <a href="http://framework.zend.com/" target="_blank">http://framework.zend.com/</a>.</p>
<p>Por ultimo a ferramenta Doctrine, esta ferramenta serve para mapeamento de objetos relacionais de um banco de dados ou ORM (Object Relational Mapper), ferramenta também de distribuição e uso gratuito que será usado para mapear as tabelas do banco de dados. A ferramenta pode ser obtida no seguinte link <a href="http://www.doctrine-project.org/" target="_blank">http://www.doctrine-project.org/</a>.</p>
<p>Neste tutorial usarei as seguintes versões dessas ferramentas:</p>
<p>Adobe Flash Builder 3</p>
<p>Zend Framework versão 1.10.6</p>
<p>Doctrine versão 1.2.2</p>
<p>Para o Apache e php a distribuição do MS4W.</p>
<p>PostgreSQL versão 8.4</p>
<p>Porem nada impede de ser utilizado versões mais atualizadas destas ferramentas apenas pode ser que tenha a necessidade de algumas alterações, mas isto fica para outros post ou conforme seguir a linha de aprendizado e estudos que você realizará, mas para este tutorial abordarei as versões descritas.</p>
<p>Para iniciarmos explicarei como realizar a instalação do Zend Framework, no meu caso a instalação foi realizada no sistema operacional Windows, mas nada impede de ser realizado em outro sistema operacional apenas optei por este, pois é o que uso no momento. Apos o download da ferramenta  descompacte o arquivo na pasta que desejar no meu caso adicionou a pasta junto aos arquivos do meu servidor Apache instalado na máquina se sentir a necessidade pode alterar o nome da pasta como desejar, eu alterei o nome da mesma como “zf”, caminho da instalação (C:\ms4w\Apache\zf ). O próximo passo é dizer para o framework o caminho onde está localizado o php.exe e o inicializador de scripts do framework para realizar os comandos de ações que framework disponibiliza utilizando o pronpt de comando, então entre na pasta que acabou de descompactar e em seguida na pasta bin abra o arquivo (zf.bat) em um editor de texto e altere seguinte linha:</p>
<pre class="brush: php;">
SET PHP_BIN=php.exe
</pre>
<p>Substituindo pelo caminho onde o PHP está instalado, no meu caso ficou desta forma:</p>
<pre class="brush: php;">
SET PHP_BIN=C:\ms4w\Apache\cgi-bin\php.exe
</pre>
<p>E também altere estas linhas:</p>
<pre class="brush: php;">
SET ZF_SCRIPT=%PHP_DIR%\zf.php
</pre>
<pre class="brush: php;">
SET ZF_SCRIPT=C:\ms4w\Apache\zf\bin\zf.php
</pre>
<p>Salve o arquivo. Pronto agora podemos testar se o framework já esta funcionando, abra o prompt de comando e caminhe até a pasta onde está o zf.bat e digite o seguinte comando “zf show version” se estiver correto a instalação ele mostrará a versão do seu framework no prompt de comando.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/06/zend-show-version.jpg"><img class="size-full wp-image-28 alignnone" title="zend-show-version" src="http://tiagozis.files.wordpress.com/2010/06/zend-show-version.jpg?w=640&#038;h=323" alt="" width="640" height="323" /></a></p>
<p>Agora já pode ser criado um novo projeto zend por comando no prompt, mas antes de explicar esta parte é necessário uma observação, a alteração do arquivo “zf.bat” faz com que os comando digitados funcionem apenas na pasta de origem, para ter flexibilidade de criar os projetos onde desejar é necessário fazer uma cópia do “zf.bat” e coloca-lo na pasta (system32) do windows, assim  copie o arquivo e coloque no diretório, no meu casso o arquivo ficou neste caminho (C:\Windows\System32). Apos realizar esta tarefa vá ao prompt de comando e digite o comando “zf” em qualquer caminho especificado no prompt, ao digitar este comando vai aparecer à lista de comandos do framework na tela do prompt. Vamos criar um novo projeto usando o comando ( zf create project nome_do_projeto ) com este comando o framework criará o projeto no arquivo onde estiver o caminho do prompt de comando, para especificar qual do diretório que deseja criar o peojeto pode seguir este exemplo ( zf create project c:/zf_projects/nome_do_projeto ).</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/06/zend-create-peoject.jpg"><img class="size-full wp-image-27 alignnone" title="zend-create-peoject" src="http://tiagozis.files.wordpress.com/2010/06/zend-create-peoject.jpg?w=640&#038;h=323" alt="" width="640" height="323" /></a></p>
<p>Abaixo está a imagem da estrutura de diretórios criada pelo framework:</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/06/directory-structure.jpg"><img class="size-full wp-image-30 alignnone" title="directory-structure" src="http://tiagozis.files.wordpress.com/2010/06/directory-structure.jpg?w=214&#038;h=360" alt="" width="214" height="360" /></a></p>
<p>Explicando rapidamente, o diretório “aplication” é onde ficará todo o conteúdo desenvolvido para o sistema como classes de controle, de domínio, configurações etc. O diretório “docs” destinado as documentações caso necessário, diretório “library” é o local que ficará as bibliotecas do Zend Framework, Doctrine (explicado a seguir) e outras que desejar para o sistema, o diretório “public” é a pasta que é acessada pelo servidor ou no caso do usuário quando acessar o sistema pelo browser os itens contidos nesta pasta poderão ser visualizados e finalmente o diretório “tests” usado para testes está ainda não cheguei a utilizar então não tenho conhecimento sobre a mesma. Agora com o projeto criado o próximo passo é adicionar as bibliotecas do Zend Framework ao seu projeto. Para fazer isso vá até o diretório que onde está o Zend Framework entre no diretório “library” e copie a pasta “Zend” para a pasta “library” do projeto que foi criado. Esta pasta contêm todas as bibliotecas do Zend Framework.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/06/library-zend.jpg"><img class="size-full wp-image-31 alignnone" title="library-zend" src="http://tiagozis.files.wordpress.com/2010/06/library-zend.jpg?w=201&#038;h=390" alt="" width="201" height="390" /></a></p>
<p>Antes de testarmos a nossa aplicação vamos realizar algumas configurações no sistema para rodar o projeto dinamicamente e certificando-se que outras pastas do seu projeto alem da (public) não possam ser acessadas pelo bowser. Primeiramente vá até o diretório (System32\drivers\etc) do Windows, procure e abra em um editor o arquivo chamado “hosts” e adicione a seguinte linha.</p>
<pre class="brush: php;">
127.0.0.1       project
</pre>
<p>Neste caso “project” é o nome do arquivo onde está o projeto Zend Framework. Salve o arquivo.</p>
<p>Em seguida vá até o diretório onde está instalado o servidor apache entre na pasta (conf) e encontre o arquivo chamado (httpd.conf) e remova os comentários (#) destas linhas:</p>
<pre class="brush: php;">
#Include conf/extra/httpd-vhosts.conf
</pre>
<pre class="brush: php;">
#LoadModule rewrite_module modules/mod_rewrite.so
</pre>
<p>Agora o mode-rewrite do apache está habilitado e incluiu o arquivo “httpd-vhosts.conf” na leitura do apache, em seguida encontre o arquivo (httpd-vhosts.conf), no meu caso ele encontra-se em ( C:\ms4w\Apache\conf\extra ), abra o arquivo no editor e adicione as linhas a seguir.</p>
<pre class="brush: php;">
&lt;VirtualHost *:80&gt;
  ServerName project
  DocumentRoot C:/zend_projects/project/public
  SetEnv APPLICATION_ENV &quot;development&quot;
  &lt;Directory  C:/zend_projects/project/public&gt;
    DirectoryIndex index.php
    AllowOverride All
    Order allow,deny
    Allow from all
  &lt;/Directory&gt;
&lt;/VirtualHost&gt;
</pre>
<p>Estas linhas definem o acesso para o projeto especificando para o servidor onde realizar o seu trabalho independente de onde estiver o projeto em seu computador não sendo necessário aloca-lo no diretório root do servidor. Agora de um restart no servidor e vamos testar se o projeto já está em funcionamento. Acesse a url no navegador desta forma ( http://project/), no lugar de “project” use o nome que destinou ao seu projeto, a imagem a seguir mostra o que deverá aparecer na tela.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/06/index-window.jpg"><img class="alignnone size-full wp-image-37" title="index-window" src="http://tiagozis.files.wordpress.com/2010/06/index-window.jpg?w=640&#038;h=533" alt="" width="640" height="533" /></a></p>
<p>O próximo passo a ser realizado é a inclusão do Doctrine na aplicação, descompacte o Doctrine onde desejar entre no diretório “lib” e copie os arquivos existentes ali para o diretório “library” do projeto. A imagem a seguir mostra como ficou o diretório “library” do projeto.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/06/library-doctrine.jpg"><img class="alignnone size-full wp-image-39" title="library-doctrine" src="http://tiagozis.files.wordpress.com/2010/06/library-doctrine.jpg?w=256&#038;h=257" alt="" width="256" height="257" /></a></p>
<p>Estes arquivos que foram copiados para o projeto contêm todas as bibliotecas necessárias para a criação das classes de mapeamento do banco de dados que será implementado mais a frente, mas antes será necessário realizar algumas alterações e implementar algumas configurações no projeto para poder usar o Doctrine.</p>
<p>Agora é necessário criar uma estrutura de diretórios para os arquivos que o Doctrine pode gerar. Dentro do diretório (aplication/configs) do seu projeto crie os diretórios “data” e “migrations”, dentro do diretório “data” crie os diretórios “fixtures” e “sql”. Apos fazer isso ficara da forma mostrada abaixo:</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/06/directory-paths.jpg"><img class="alignnone size-full wp-image-40" title="directory-paths" src="http://tiagozis.files.wordpress.com/2010/06/directory-paths.jpg?w=232&#038;h=366" alt="" width="232" height="366" /></a></p>
<p>Vamos configurar os caminhos para o Docrine no projeto. Abra o arquivo “application.ini” que está com as configurações padrão de quando foi criado o projeto.</p>
<p>[production]<br />
phpSettings.display_startup_errors = 0<br />
phpSettings.display_errors = 0<br />
includePaths.library = APPLICATION_PATH &quot;/../library&quot;<br />
bootstrap.path = APPLICATION_PATH &quot;/Bootstrap.php&quot;<br />
bootstrap.class = &quot;Bootstrap&quot;<br />
appnamespace = &quot;Application&quot;<br />
resources.frontController.controllerDirectory = APPLICATION_PATH &quot;/controllers&quot;<br />
resources.frontController.params.displayExceptions = 0</p>
<p>[staging : production]</p>
<p>[testing : production]<br />
phpSettings.display_startup_errors = 1<br />
phpSettings.display_errors = 1</p>
<p>[development : production]<br />
phpSettings.display_startup_errors = 1<br />
phpSettings.display_errors = 1<br />
resources.frontController.params.displayExceptions = 1</p>
<p>Adicione as linhas como é mostrado a seguir.</p>
<pre class="brush: php;">
[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH &quot;/../library&quot;
bootstrap.path = APPLICATION_PATH &quot;/Bootstrap.php&quot;
bootstrap.class = &quot;Bootstrap&quot;
appnamespace = &quot;Application&quot;
resources.frontController.controllerDirectory = APPLICATION_PATH &quot;/controllers&quot;
resources.frontController.params.displayExceptions = 0

;----------------------------------------------------------------------------------------
;  Auto load do doctrine.
;----------------------------------------------------------------------------------------
autoloaderNamespaces[] = &quot;Doctrine&quot;

;----------------------------------------------------------------------------------------
;  Configuração da string de conexão com o banco de dados.
;----------------------------------------------------------------------------------------
doctrine.dsn = &quot;pgsql://postgres:123456@localhost/db_reserva_hotel&quot;

;----------------------------------------------------------------------------------------
;  Configuração dos diretórios usados pelo Doctrine apos criar alguns arquivos quando
;  for necessário.
;----------------------------------------------------------------------------------------
doctrine.data_fixtures_path = APPLICATION_PATH &quot;/configs/data/fixtures&quot;
doctrine.sql_path           = APPLICATION_PATH &quot;/configs/data/sql&quot;
doctrine.migrations_path    = APPLICATION_PATH &quot;/configs/migrations&quot;
doctrine.yaml_schema_path   = APPLICATION_PATH &quot;/configs/schema.yml&quot;
doctrine.models_path        = APPLICATION_PATH &quot;/models/&quot;

;----------------------------------------------------------------------------------------
;  Parametros de configuração de algumas opções do Doctrine.
;----------------------------------------------------------------------------------------
doctrine.generate_models_options.pearStyle = true
doctrine.generate_models_options.generateTableClasses = false
doctrine.generate_models_options.generateBaseClasses = true
doctrine.generate_models_options.baseClassPrefix = &quot;Base_&quot;
doctrine.generate_models_options.baseClassesDirectory =
doctrine.generate_models_options.classPrefixFiles = false
doctrine.generate_models_options.classPrefix = &quot;&quot;

;----------------------------------------------------------------------------------------
;  Configuração de autoloading do Doctrine, necessário para o CLI ao gerar os models
;  do sistema aproriadamente.
;  MODEL AUTOLOADING: 1 = aggressive, 2 = conservative
;----------------------------------------------------------------------------------------
doctrine.model_autoloading = 1

[doctrineCLI : production ]
doctrine.model_autoloading = 1

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

;----------------------------------------------------------------------------------------
;  Configuração da string de conexão com o banco de dados para o ambiente de teste.
;----------------------------------------------------------------------------------------
doctrine.dsn = &quot;pgsql://postgres:123456@localhost/db_reserva_hotel&quot;

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1
</pre>
<p>Então como podemos ver, várias configurações foram criadas para o funcionamento do Doctrine as mais importantes como a string de conexão com o banco de dados, as configurações (doctrine.generate_models_options.generateTableClasses = false,<br />
doctrine.generate_models_options.generateBaseClasses = true, doctrine.generate_models_options.generateTableClasses = true) que servem para gerar as classes de domínio e mapeamento das tabelas do banco para o sistema, e duas configurações de como será o prefixo das classes de domínio do sistema que são:</p>
<ul>
<li>doctrine.generate_models_options.baseClassPrefix      = “Base_”</li>
</ul>
<ul>
<li>doctrine.generate_models_options.classPrefix      = “”</li>
</ul>
<p>Em alguns tutoriais na web podemos encontrar a seguinte configuração para esta ultima (doctrine.generate_models_options.classPrefix = “Model_”), pessoalmente eu não gosto desta forma por que ao gerar as classes para o sistema a nomenclatura delas será desta forma:</p>
<ul>
<li>Model_Base_NomeDaClasse      para a classe base do sistema onde fica as informações sobre a tabela do      banco de dados do sistema.</li>
</ul>
<ul>
<li>Model_NomeDaClasse para a      classe que estende a classe base do sistema.</li>
</ul>
<p>Nada impede de ser feito desta maneira, mas quando for criar um novo objeto durante a aplicação em vez de declarar pelo nome que representa este objeto, por exemplo, o objeto “Carro”, será necessário declarar o objeto desta forma “Model_Carro” então estas configurações ficam a critério de quem implementa, no meu caso coloquei a configuração vazia sem prefixo para declarar o objeto conforme o nome que lhe foi concedido.</p>
<p>Prosseguindo no diretório “aplication” do projeto crie um diretório chamado de “scripts” dentro deste diretório crie dois novos arquivos que serão necessários para rodar o Doctrine na aplicação, “doctrine.php” e “doctrine.bat” abra o arquivo “doctrine.php” e insira as seguintes linhas de código.</p>
<pre class="brush: php;">
&lt;?php
   // Define o caminho do diretório para a aplicação.
   defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) .'/..'));

   // Define onde será o ambiente da aplicação.
   defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'doctrineCLI'));

   // Certifica-se se a biblioteca foi incluído no pacorte da aplicação.
   set_include_path(implode(PATH_SEPARATOR, array(realpath(APPLICATION_PATH . '/../library'),get_include_path())));

   // Zend_Application
   require_once 'Zend/Application.php';

   //Cria a aplicação, o bootstrap, e inicia os mesmos.
   $application = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini');

   $application-&gt;getBootstrap()-&gt;bootstrap('doctrine');

   $config = $application-&gt;getOption('doctrine');
   $cli = new Doctrine_Cli($config);
   $cli-&gt;run($_SERVER['argv']);
?&gt;
</pre>
<p>Nestas linhas de código estão as configurações necessárias para rodar o doctrine dentro da aplicação, assim esta ferramenta poderá encontrar suas bibliotecas quando necessário e iniciar seus serviços quando solicitado. Abra no editor o arquivo “doctrine.bat” e insira as linhas a seguir.</p>
<pre class="brush: php;">
  @echo off
  echo Running Doctrine CLI.
  &quot;C:\ms4w\Apache\cgi-bin\php.exe&quot; -f C:\zend_projects\project\application\scripts\doctrine.php %1 %2 %3 %4 %5 %6 %7 %8 %9
</pre>
<p>Bom aqui neste arquivo bat configuramos o caminho onde encontra-se o “php.exe” e o arquivo que acabamos de criar “doctrine.php” este bat servirá para utilizarmos os comandos do Doctrine no prompt de comando, comandos estes que geram por exemplo as classes de domínio do nosso sistema. Configure estes caminhos conforme a sua necessidade.</p>
<p>Para finalizar as configurações necessárias para rodar o Doctrine na aplicação, dentro do diretório “aplications” do projeto existe um arquivo chamado “Bootstrap.php” abra o mesmo no editor, aqui podemos analisar que ao abrir este arquivo ele não possui métodos implementados, então vamos adicionar os seguintes métodos a ele.</p>
<pre class="brush: php;">&lt;?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

    /*Metodo para autoload da aplicação*/
    protected function _initAppAutoload() {
        $moduleLoader = new Zend_Application_Module_Autoloader(array('namespace' =&gt; '','basePath' =&gt; APPLICATION_PATH));
    }

    /*Metodo de inicialização do doctrine*/
    protected function _initDoctrine()
    {
        $this-&gt;getApplication()-&gt;getAutoloader()-&gt;pushAutoloader(array('Doctrine', 'autoload'));
        spl_autoload_register(array('Doctrine', 'modelsAutoload'));

        $doctrineConfig = $this-&gt;getOption('doctrine');

        $manager = Doctrine_Manager::getInstance();
        $manager-&gt;setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
        $manager-&gt;setAttribute(Doctrine::ATTR_MODEL_LOADING,$doctrineConfig['model_autoloading']);

        Doctrine_Core::loadModels($doctrineConfig['models_path']);

        $conn = Doctrine_Manager::connection($doctrineConfig['dsn'],'doctrine');
        $conn-&gt;setAttribute(Doctrine::ATTR_USE_NATIVE_ENUM, true);
        return $conn;
 }
}
</pre>
<p>Estes métodos são mais algumas configurações necessárias para iniciar e colocar o Doctrine em  funcionamento. Pronto o Doctrine já está configurado, para testar se está funcionando abra o prompt de comando e prossiga pelo caminho até o diretório onde se encontra o arquivo (doctrine.bat), então digite o comando “doctrine”. Se todas as configurações foram feitas corretamente à lista de comandos do Doctrine será mostrada no prompt de comando.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/06/doctrine-command.jpg"><img class="alignnone size-full wp-image-42" title="doctrine-command" src="http://tiagozis.files.wordpress.com/2010/06/doctrine-command.jpg?w=640&#038;h=493" alt="" width="640" height="493" /></a></p>
<p>Agora com o Doctrine instalado e funcionando vamos criar um novo projeto flex. Na ferramenta de desenvolvimento Flex, vá a File-&gt;New-&gt;Flex Project para criar o projeto.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/07/new-flex-project.jpg"><img class="alignnone size-full wp-image-47" title="new-flex-project" src="http://tiagozis.files.wordpress.com/2010/07/new-flex-project.jpg?w=551&#038;h=605" alt="" width="551" height="605" /></a></p>
<p>Uma tela semelhante à imagem a seguir abrirá então, de um nome ao seu projeto Flex e no campo “Project location” selecione o diretório “public” do projeto Zend para deixar a parte Flex do projeto, pois lembrando que o diretório “public” é a que poderá ser acessada pelo browser. Recomendo criar um novo diretório dentro do “public” para que os arquivos do projeto Flex não fiquem espalhados dentro do diretório “public”.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/07/project-flex-parameters.jpg"><img class="alignnone size-full wp-image-48" title="project-flex-parameters" src="http://tiagozis.files.wordpress.com/2010/07/project-flex-parameters.jpg?w=640&#038;h=556" alt="" width="640" height="556" /></a></p>
<p>Defina onde serão criados os arquivos SWF e HTML do projeto. Por padrão o flex cria um diretório chamado “bin-debug”, mas nada impede de ser renomeado ou redefinido conforme desejar.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/07/bin-debug-location.jpg"><img class="alignnone size-full wp-image-49" title="bin-debug-location" src="http://tiagozis.files.wordpress.com/2010/07/bin-debug-location.jpg?w=640&#038;h=556" alt="" width="640" height="556" /></a></p>
<p>E por fim pode ser alterado o nome do arquivo principal do seu projeto neste caso a página “index” que será carregada durante a execução do sistema e também pode ser adicionado algumas bibliotecas se caso tenhas alguma para adicionar. Conclua a criação do projeto.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/07/define-flex-options.jpg"><img class="alignnone size-full wp-image-50" title="define-flex-options" src="http://tiagozis.files.wordpress.com/2010/07/define-flex-options.jpg?w=640&#038;h=677" alt="" width="640" height="677" /></a></p>
<p>Agora que o projeto está criado vamos ver como ficou o esquema de diretórios do projeto. A imagem seguinte mostra a estrutura dos diretórios no projeto.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/07/flex-project-structure.jpg"><img class="alignnone size-full wp-image-51" title="flex-project-structure" src="http://tiagozis.files.wordpress.com/2010/07/flex-project-structure.jpg?w=269&#038;h=385" alt="" width="269" height="385" /></a></p>
<p>Pessoal por enquanto vai ficando por aqui mesmo, lembrando que em breve continuarei o Post com a integração destas ferramentas. Continuem acompanhando, pois ao final deste tutorial irei postar os arquivos criados com todo o código fonte do projeto.</p>
<p>Em caso de dúvidas ou sugestões, postem seus comentários aqui BLZ&#8230;</p>
<p>Valeu até o próximo Post.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagozis.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagozis.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagozis.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagozis.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tiagozis.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tiagozis.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tiagozis.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tiagozis.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagozis.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagozis.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagozis.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagozis.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagozis.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagozis.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagozis.wordpress.com&amp;blog=14385764&amp;post=17&amp;subd=tiagozis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tiagozis.wordpress.com/2010/07/12/flex-zend-framework-doctrine/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a1446e0154d18fe1bcd7376e4f660f2b?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tiagozis</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/06/zend-show-version.jpg" medium="image">
			<media:title type="html">zend-show-version</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/06/zend-create-peoject.jpg" medium="image">
			<media:title type="html">zend-create-peoject</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/06/directory-structure.jpg" medium="image">
			<media:title type="html">directory-structure</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/06/library-zend.jpg" medium="image">
			<media:title type="html">library-zend</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/06/index-window.jpg" medium="image">
			<media:title type="html">index-window</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/06/library-doctrine.jpg" medium="image">
			<media:title type="html">library-doctrine</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/06/directory-paths.jpg" medium="image">
			<media:title type="html">directory-paths</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/06/doctrine-command.jpg" medium="image">
			<media:title type="html">doctrine-command</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/07/new-flex-project.jpg" medium="image">
			<media:title type="html">new-flex-project</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/07/project-flex-parameters.jpg" medium="image">
			<media:title type="html">project-flex-parameters</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/07/bin-debug-location.jpg" medium="image">
			<media:title type="html">bin-debug-location</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/07/define-flex-options.jpg" medium="image">
			<media:title type="html">define-flex-options</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/07/flex-project-structure.jpg" medium="image">
			<media:title type="html">flex-project-structure</media:title>
		</media:content>
	</item>
		<item>
		<title>PHPSC Conf 2010</title>
		<link>http://tiagozis.wordpress.com/2010/06/28/phpsc-2010/</link>
		<comments>http://tiagozis.wordpress.com/2010/06/28/phpsc-2010/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 17:26:11 +0000</pubDate>
		<dc:creator>Tiago Zis</dc:creator>
				<category><![CDATA[Eventos]]></category>

		<guid isPermaLink="false">http://tiagozis.wordpress.com/?p=6</guid>
		<description><![CDATA[Neste primeiro post convido a todos que de alguma forma trabalham ou estão envolvidos na área de desenvolvimento de software a participar do PHPSC Conf 2010 que ocorrerá na cidade de Joinville/SC durante os dias 27 e 28 de Agosto de 2010 para maiores informações acessem o site oficial da PHPSC  http://www.phpsc.com.br/.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagozis.wordpress.com&amp;blog=14385764&amp;post=6&amp;subd=tiagozis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Neste primeiro post convido a todos que de alguma forma trabalham ou estão envolvidos na área de desenvolvimento de software a participar do PHPSC Conf 2010 que ocorrerá na cidade de Joinville/SC durante os dias 27 e 28 de Agosto de 2010 para maiores informações acessem o site oficial da PHPSC <strong> </strong><a href="http://www.phpsc.com.br/">http://www.phpsc.com.br/</a>.</p>
<p><a href="http://tiagozis.files.wordpress.com/2010/06/phpsc-270x175_exp.png"><img class="alignleft size-full wp-image-7" title="phpsc-270x175_exp" src="http://tiagozis.files.wordpress.com/2010/06/phpsc-270x175_exp.png?w=270&#038;h=175" alt="" width="270" height="175" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tiagozis.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tiagozis.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tiagozis.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tiagozis.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tiagozis.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tiagozis.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tiagozis.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tiagozis.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tiagozis.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tiagozis.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tiagozis.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tiagozis.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tiagozis.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tiagozis.wordpress.com/6/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tiagozis.wordpress.com&amp;blog=14385764&amp;post=6&amp;subd=tiagozis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tiagozis.wordpress.com/2010/06/28/phpsc-2010/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a1446e0154d18fe1bcd7376e4f660f2b?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tiagozis</media:title>
		</media:content>

		<media:content url="http://tiagozis.files.wordpress.com/2010/06/phpsc-270x175_exp.png" medium="image">
			<media:title type="html">phpsc-270x175_exp</media:title>
		</media:content>
	</item>
	</channel>
</rss>
