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

<channel>
	<title>Jony dos Santos Kostetzer &#187; symfony</title>
	<atom:link href="http://jonysk.net/blog/category/symfony/feed/" rel="self" type="application/rss+xml" />
	<link>http://jonysk.net/blog</link>
	<description>ruby on rails and some other stuffs...</description>
	<lastBuildDate>Sun, 30 Aug 2009 17:03:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Propel, Oracle e nomes de tabelas</title>
		<link>http://jonysk.net/blog/2007/08/19/propel-oracle-e-nomes-de-tabelas/</link>
		<comments>http://jonysk.net/blog/2007/08/19/propel-oracle-e-nomes-de-tabelas/#comments</comments>
		<pubDate>Mon, 20 Aug 2007 01:54:39 +0000</pubDate>
		<dc:creator>Jony dos Santos Kostetzer</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[propel]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://jonysk.net/blog/2007/08/19/propel-oracle-e-nomes-de-tabelas/</guid>
		<description><![CDATA[Nos últimos dias experienciei problemas em utilizar o Symfony com banco de dados Oracle (mais especificamente, em utilizar o Propel com Oracle). O que acontece é que os scripts gerados através do comando propel-build-sql do Symfony, por padrão, ficam da seguinte forma:

CREATE TABLE &#34;estado&#34;
&#40;
&#34;id&#34; NUMBER  NOT NULL,
&#34;nome&#34; VARCHAR2&#40;50&#41;,
&#34;sigla&#34; VARCHAR2&#40;2&#41;
&#41;;

MySQL e PostgreSQL não apresentaram problemas. [...]]]></description>
			<content:encoded><![CDATA[<p>Nos últimos dias experienciei problemas em utilizar o Symfony com banco de dados Oracle (mais especificamente, em utilizar o Propel com Oracle). O que acontece é que os scripts gerados através do comando <strong>propel-build-sql</strong> do Symfony, por padrão, ficam da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;estado&quot;</span>
<span style="color: #66cc66;">&#40;</span>
<span style="color: #ff0000;">&quot;id&quot;</span> NUMBER  <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
<span style="color: #ff0000;">&quot;nome&quot;</span> VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #ff0000;">&quot;sigla&quot;</span> VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>MySQL e PostgreSQL não apresentaram problemas. Porém, a inserção deste SQL no Oracle força que todas as tabelas e campos sejam criados na forma de caracteres minúsculos.</p>
<p><span id="more-10"></span></p>
<p>Ou seja, se você fizer uma consulta diretamente no banco<sup>1</sup> da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> nome <span style="color: #993333; font-weight: bold;">FROM</span> estado;</pre></div></div>

<p>Receberá um erro informando que a tabela não existe! Apenas nesta forma funcionaria:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">&quot;nome&quot;</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">&quot;estado&quot;</span>;</pre></div></div>

<p>Conseqüentemente, <strong>todas </strong>as consultas efetuadas através dos objetos de mapeamento do banco geradas pelo Propel não funcionarão. A solução foi simples: remover as aspas duplas do arquivo SQL gerado (utilizei a ferramente <a href="http://www.laffeycomputer.com/rpl.html" target="_blank" title="Página do RPL">rpl</a> do linux):</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rpl <span style="color: #ff0000;">'&quot;'</span> <span style="color: #ff0000;">''</span> data<span style="color: #000000; font-weight: bold;">/</span>sql<span style="color: #000000; font-weight: bold;">/*</span></pre></div></div>

<p>Uma solução não muito adequada, mas resolveu. Até que resolvi consultar a lista <a href="http://groups.google.com/group/symfony-users" title="Abrir lista de discussão" target="_blank">symfony-users </a> sobre o problema e um integrante, Charley Tiggs, sugeriu a seguinte configuração no propel.ini:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">propel.disableIdentifierQuoting = <span style="color: #c20cb9; font-weight: bold;">true</span></pre></div></div>

<p>Simples e funcional. Fica a referência para consultas futuras <img src='http://jonysk.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><sup>1</sup> Sugiro o <a href="http://www.oracle.com/technology/products/database/sql_developer/index.html" title="Página do Oracle SQL Developer" target="_blank">Oracle SQL Developer</a>, uma ótima ferramenta GUI desenvolvida em Java para acessar bancos em Oracle, MySQL e SQL Server. Sendo uma ferramenta Java, pode ser executada perfeitamente no Linux, como estou utilizando aqui!</p>
]]></content:encoded>
			<wfw:commentRss>http://jonysk.net/blog/2007/08/19/propel-oracle-e-nomes-de-tabelas/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dica rápida: foreign key para tabelas de plugins</title>
		<link>http://jonysk.net/blog/2007/07/27/dica-rapida-foreign-key-para-tabelas-de-plugins/</link>
		<comments>http://jonysk.net/blog/2007/07/27/dica-rapida-foreign-key-para-tabelas-de-plugins/#comments</comments>
		<pubDate>Fri, 27 Jul 2007 20:55:46 +0000</pubDate>
		<dc:creator>Jony dos Santos Kostetzer</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[propel]]></category>

		<guid isPermaLink="false">http://jonysk.net/blog/2007/07/27/dica-rapida-foreign-key-para-tabelas-de-plugins/</guid>
		<description><![CDATA[Se você já tentou criar uma chave estrangeira no seu schema.yml para a tabela de um plugin pode ter esbarrado em um problema: Usar a convenção do Symfony para chaves estrangeiras em plugins não funciona, visto que os namespaces (packages) são gerados em locais diferentes.
Por exemplo:
project:
id:
title: varchar(255)
sf_guard_user_id:
O código acima resultará no seguinte erro:
&#8220;Unable to resolve [...]]]></description>
			<content:encoded><![CDATA[<p>Se você já tentou criar uma chave estrangeira no seu schema.yml para a tabela de um plugin pode ter esbarrado em um problema: <em>Usar a convenção do Symfony para chaves estrangeiras em plugins não funciona</em>, visto que os namespaces (packages) são gerados em locais diferentes.</p>
<p>Por exemplo:</p>
<p><code>project:<br />
id:<br />
title: varchar(255)<br />
sf_guard_user_id:</code></p>
<p>O código acima resultará no seguinte erro:</p>
<blockquote><p>&#8220;Unable to resolve foreign table for column &#8220;sf_guard_user_id&#8221;"</p></blockquote>
<p><span id="more-8"></span><br />
Pesquisando sobre o assunto, <a href="http://www.symfony-project.com/snippets/snippet/170" title="Snippet para alterar o namespace">uma sugestão seria alterar o namespace</a>  onde são gerados os arquivos de ORM do Propel. Particularmente, não achei interessante. Na lista <a href="http://groups.google.com/group/symfony-users" title="Grupo symfony-users">symfony-users</a>, uma referência diz que essa é uma <a href="http://www.mail-archive.com/symfony-users@googlegroups.com/msg00602.html" title="Symfony-users">limitação do Propel. </a></p>
<p>A verdade é que a &#8220;solução&#8221; é extremamente simples:</p>
<p><code>project:<br />
id:<br />
title: varchar(255)<br />
user_id: { type: integer, foreignTable: sf_guard_user, foreignReference: id, required: true, onDelete: cascade }<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://jonysk.net/blog/2007/07/27/dica-rapida-foreign-key-para-tabelas-de-plugins/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How-to: Integrando Symfony e SugarCRM</title>
		<link>http://jonysk.net/blog/2007/07/19/how-to-integrando-symfony-e-sugarcrm/</link>
		<comments>http://jonysk.net/blog/2007/07/19/how-to-integrando-symfony-e-sugarcrm/#comments</comments>
		<pubDate>Fri, 20 Jul 2007 02:11:47 +0000</pubDate>
		<dc:creator>Jony dos Santos Kostetzer</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[sugarcrm]]></category>
		<category><![CDATA[webservices]]></category>

		<guid isPermaLink="false">http://jonysk.net/blog/2007/07/19/how-to-integrando-symfony-e-sugarcrm/</guid>
		<description><![CDATA[O SugarCRM é uma interessante aplicação open source para Gestão de Relacionamento com o Cliente (CRM). Mesmo que muitas características avançadas sejam reservadas às versões pagas (Professional e Enterprise), sua versão livre possui recursos muito completos de customização de módulos, plugins, entre outros, e desempenha muito bem a sua função. Um dos recursos que viabiliza [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://sugarcrm.com" title="Página do SugarCRM">SugarCRM</a> é uma interessante aplicação open source para Gestão de Relacionamento com o Cliente (CRM). Mesmo que muitas características avançadas sejam reservadas às versões pagas (Professional e Enterprise), sua <a href="http://www.sugarcrm.com/crm/download/sugar-suite.html" title="SugarCRM Open Source">versão livre</a> possui recursos muito completos de customização de módulos, <a href="http://www.sugarexchange.com/" title="SugarExchange">plugins</a>, entre outros, e desempenha muito bem a sua função. Um dos recursos que viabiliza grande parte de plugins e integrações é um Webservice construído em NuSOAP, para que outras aplicações interajam com os dados do SugarCRM.</p>
<p><span id="more-6"></span></p>
<p>Supondo um endereço de intranet, o WSDL deste webservice estaria disponível na URL:</p>
<ul>
<li>http://intranet/sugarcrm/soap.php?wsdl</li>
</ul>
<p>Este how-to abrange a integração do SugarCRM com o <a href="http://symfony-project.com" title="Symfony Project">Symfony</a>. Neste cenário, uma aplicação deve manter os mesmos registros de contas (Accounts)  que existem no SugarCRM. Vamos apenas gerar um array onde a chave será o ID da conta e o valor será o nome da conta.</p>
<p>Uma curiosa surpresa ao iniciar a integração foi descobrir que havia um plugin para o Symfony chamado <a href="http://trac.symfony-project.com/trac/wiki/sfSugarCRMPlugin" title="sfSugarCRM">sfSugarCRM</a>, constituído de duas classes:</p>
<ul>
<li><strong>sfSugarCRMSOAPClient</strong>: Classe com um método no padrão Singleton que retorna a instância de <a href="http://www.php.net/manual/pt_BR/function.soap-soapclient-construct.php" title="Informações sobre a classe SoapClient">SoapClient</a> conectada ao WSDL do SugarCRM.</li>
<li><strong>sfSugarCRM</strong>: Classe que abstrai <u>algumas</u> requisições ao Webservice do SugarCRM.</li>
</ul>
<p><u><em>Importante:</em></u> este plugin não utiliza NuSOAP, mas sim as bibliotecas SOAP distribuídas nas versões do PHP5 e posteriores. Certifique-se que a extensão SOAP está instalada.</p>
<p>Inicialmente, seguindo a breve documentação de exemplo do sfSugarCRM, vamos instalar o plugin:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>symfony plugin-install http:<span style="color: #000000; font-weight: bold;">//</span>plugins.symfony-project.com<span style="color: #000000; font-weight: bold;">/</span>sfSugarCRMPlugin
.<span style="color: #000000; font-weight: bold;">/</span>symfony <span style="color: #c20cb9; font-weight: bold;">cc</span></pre></div></div>

<p>Pulemos os passos de criação da aplicação e do módulo no Symfony, o código abaixo conecta ao Webservice:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$sugar</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> sfSugarCRM<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://intranet/sugarcrm/soap.php?wsdl&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$sugar</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setUsername</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;usuario&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$sugar</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setPassword</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;senha&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>O trecho acima armazena o usuário e a senha em variáveis de instância, e as utiliza para a chamada de alguns métodos do servidor SOAP, que são:</p>
<ul>
<li>Localizar contatos pelo nome: <strong>searchContactsByName()</strong></li>
<li>Localizar contatos pelo e-mail: <strong>searchContactsByEmail()</strong></li>
<li>Retornar lista de usuários: <strong>getUserList()</strong></li>
<li>Métodos para criação de registros: <strong>createLead(), createContact(), createAccount(), createOpportunity(), createCase()</strong></li>
</ul>
<p>Um detalhe a importante é que os métodos acima enviam usuário e senha <em>a cada requisição </em>ao Webservice. Alguns métodos do Webservice, entretando, exigem como parâmetro o ID do login, uma string gerada com a chamada ao método login() do Webservice. Como a classe sfSugarCRM não implementa nenhum método para isso, abaixo um patch que cria essa função:</p>
<ul>
<li><a href="http://jonysk.net/blog/files/2007/07/patch.txt" title="Patch sfSugarCRM">Patch sfSugarCRM</a></li>
</ul>
<p>Para aplicar o patch, entre na raiz do projeto e digite:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">patch</span> <span style="color: #660033;">-p0</span> <span style="color: #000000; font-weight: bold;">&lt;</span> patch.txt</pre></div></div>

<p>Após aplicado o patch, você tem os novos métodos na classe sfSugarCRM: <strong>getLoginId()</strong> e <strong>doLogin()</strong> , que facilitam a chamada para diversos métodos do Webservice. Dessa forma, é só criar novos métodos na classe sfSugarCRM! Criei um método chamado getEntryList() (que utiliza o método get_entry_list() do webservice), veja como retornar todos os clientes:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$params</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
  <span style="color: #0000ff;">&quot;module_name&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;Accounts&quot;</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">&quot;order_by&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;name ASC&quot;</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">&quot;offset&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">&quot;select_fields&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;name&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">&quot;max_results&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1000</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$sugar</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getEntryList</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$sugar</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getResponse</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$contas</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">entry_list</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$entry</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$contas</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$entry</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$entry</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name_value_list</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">value</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$contas</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Então é isso! Este material não será de uso constante, mas fica como referência quando um cenário semelhante surgir <img src='http://jonysk.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Referências:</strong></p>
<ul>
<li><a href="http://www.sugarforge.org/frs/download.php/216/SugarCRM_SOAP_Overview.rtf">SugarCRM SOAP Overview (.rtf)</a></li>
<li><a href="http://www.php.net/manual/pt_BR/ref.soap.php">PHP Soap Extension</a></li>
<li><a href="http://trac.symfony-project.com/trac/wiki/sfSugarCRMPlugin">Symfony plugins: sfSugarCRM</a></li>
<li><a href="http://www.sugarcrm.com/wiki/index.php?title=SOAP_Intro_and_Practical_Examples">Soap Intro and pratical examples</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://jonysk.net/blog/2007/07/19/how-to-integrando-symfony-e-sugarcrm/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
