<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-29133774</id><updated>2012-01-28T21:28:24.054-08:00</updated><category term='apache'/><category term='Google Maps'/><category term='Api Picasa'/><category term='Doctrine_Table'/><category term='GWT'/><category term='Relaciones'/><category term='dhtmlxWindows'/><category term='php'/><category term='Ingenieria Inversa'/><category term='multiple acceso'/><category term='GWT Designer'/><category term='multiples modelos'/><category term='AppEngine'/><category term='ListGrid'/><category term='MVP'/><category term='UIBinder'/><category term='depuracion'/><category term='Modelos'/><category term='Doctrine ORM'/><category term='Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES'/><category term='SOA'/><category term='jquery'/><category term='dhtmlx'/><category term='dhtmlxTabbar'/><category term='instalacion'/><category term='multiples base de datos'/><category term='SmartGWT'/><category term='WCF'/><category term='ORM'/><category term='Eclipse'/><category term='dhtmlxAccordion'/><category term='mutiples conexiones'/><category term='dhtmlxGrid'/><title type='text'>FIEL Y LEAL COMPAÑERA, MI PC</title><subtitle type='html'>Programacion con: C++,Java,C#,Delphi,PHP,JavaScript,Perl,GWT</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>23</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-29133774.post-1864992237492659480</id><published>2012-01-06T12:32:00.000-08:00</published><updated>2012-01-28T21:28:24.066-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT Designer'/><category scheme='http://www.blogger.com/atom/ns#' term='UIBinder'/><title type='text'>MI PRIMER WEB SITE CON GWT ( PARA NOVATOS )</title><content type='html'>UIBinder sin GWT Designer era realmente horrible, la curva de aprendizaje era muy empinada, con GWT Designer la cosa cambia radicalmente y ahora estoy convencido que si es posible realizar páginas web con GWT.&lt;br /&gt;&lt;br /&gt;UIBinder &amp;nbsp;es una herramienta poderosa &amp;nbsp;que te permite dividir pedazos de código HTML de tu “Plantilla CSS” &amp;nbsp;para después insertar estos pedazos de código dinámicamente a través de Javascript (GWT) en tu “Plantilla CSS”. &amp;nbsp;Si vienes de PHP la inserción de los pedazos de código lo realizas dinámicamente a través de PHP en el Servidor, si te has percatado es prácticamente la misma lógica de desarrollo con la diferencia que ahora trabajas en el Cliente.&lt;br /&gt;&lt;br /&gt;Los programadores Javascript podrían argumentar que pueden realizar lo anteriormente mencionado sin necesidad de UIBinder ; sin embargo, no olviden que UIBinder es en esencia Java y además tienes la opción de visualizar el diseño con GWT Designer, además UIBinder &amp;nbsp;te permite separar el código de la IU (XML) del código de implementación (Java). Esto implica que puedes tener un UIBinder incrustado dentro de un UIBinder y en fin todo el poder de un lenguaje como Java (odio y maldigo el manejo de eventos de Java, amo C# no me digan hereje).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="ES"&gt;&lt;b&gt;EJEMPLO:&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="ES"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="ES"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="ES"&gt;Este ejemplo esbastante básico, hay temas de optimización y rendimiento como: ClientBunde, CodeSplit entre otros &amp;nbsp;que intencionalmente nose muestran aquí.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="ES" style="text-indent: -0.25in;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;span lang="ES" style="text-indent: -0.25in;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ES" style="text-indent: -0.25in;"&gt;Tenemosla plantilla inicial.&lt;/span&gt;&lt;br /&gt;&lt;div align="center"&gt;Codigo: Index.html&lt;/div&gt;&lt;pre class="brush: html"&gt;&amp;lt;div id="header" class="container"&amp;gt;&lt;br /&gt; &amp;lt;div id="logo"&amp;gt;&lt;br /&gt;  &amp;lt;h1&amp;gt;&amp;lt;a href="#"&amp;gt;Rock Castle&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Begin Menu --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div id="menu"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;ul&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;li class="current_page_item"&amp;gt;&amp;lt;a href="#"&amp;gt;Homepage&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;   &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;Blog&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;   &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;Photos&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;   &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;   &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!-- End Menu --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div id="splash-wrapper"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div id="splash"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;h2&amp;gt;Nullam pretium nibh u turpis&amp;lt;/h2&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;p&amp;gt;Lorem ipsum daolor sit amet, consectetur adipiscing elit. Nulla quis orci ut erat iaculis posuere in consequat nulla. Cras vel nisl ipsum, nec tincidunt nunc. Sed egestas lorem nisl, sed dignissim quam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce tristique dui sit amet mauris.&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- end #header --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div id="wrapper"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div id="wrapper2"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;div id="wrapper-bgtop"&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;div id="page"&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;div id="content"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;     &amp;lt;!-- Beging Post --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class="post"&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;h2 class="title"&amp;gt;&amp;lt;a href="#"&amp;gt;Welcome to Rock Castle&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;p class="meta"&amp;gt;&amp;lt;span class="date"&amp;gt;December 12, 2011&amp;lt;/span&amp;gt;&amp;lt;span class="posted"&amp;gt;Posted by &amp;lt;a href="#"&amp;gt;Someone&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;div style="clear: both;"&amp;gt;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;div class="entry"&amp;gt;&lt;br /&gt;&lt;br /&gt;       &amp;lt;p&amp;gt;This is &amp;lt;strong&amp;gt;Rock Castle&amp;lt;/strong&amp;gt;, a free, fully standards-compliant CSS template designed by FreeCssTemplates&amp;lt;a href="http://www.nodethirtythree.com/"&amp;gt;&amp;lt;/a&amp;gt; for &amp;lt;a href="http://www.freecsstemplates.org/"&amp;gt;Free CSS Templates&amp;lt;/a&amp;gt;.&amp;nbsp;&amp;nbsp;This free template is released under a &amp;lt;a href="http://creativecommons.org/licenses/by/3.0/"&amp;gt;Creative Commons Attribution 3.0&amp;lt;/a&amp;gt; license, so you’re pretty much free to do whatever you want with it (even use it commercially) provided you keep the links in the footer intact. Aside from that, have fun with it :)&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;       &amp;lt;p&amp;gt;Sed lacus. Donec lectus. Nullam pretium nibh ut turpis. Nam bibendum. In nulla tortor, elementum ipsum. Proin imperdiet est. Phasellus dapibus semper urna. Pellentesque ornare, orci in felis. Donec ut . In id eros. Suspendisse&amp;nbsp;&amp;nbsp;turpis, cursus egestas at sem.&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;       &amp;lt;p class="links"&amp;gt;&amp;lt;a href="#" class="more"&amp;gt;Read More&amp;lt;/a&amp;gt;&amp;lt;a href="#" title="b0x" class="comments"&amp;gt;Comments&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;     &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!-- End Post --&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="text-indent: -0.25in;"&gt;Creamosun Widget “Menu” y un Widget “Post” como puede observar se ha copiado el códigocorrespondiente de la plantilla a los Widgets esto es lo interesante; ya que,puede ejecutar el GWT Designer y visualizar el diseño &lt;/span&gt;&lt;span style="text-indent: -0.25in;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="text-indent: -0.25in;"&gt;de cada Widget.&lt;/span&gt;&lt;br /&gt;&lt;div align="center"&gt;Codigo: Menu.ui.xml&lt;/div&gt;&lt;pre class="brush: html"&gt;&amp;lt;!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"&lt;br /&gt;&lt;br /&gt; xmlns:g="urn:import:com.google.gwt.user.client.ui"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;ui:style&amp;gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt; &amp;lt;/ui:style&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;g:HTMLPanel&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div id="menu"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;ul&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;Homepage&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;   &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;Blog&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;   &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;Photos&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;   &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;   &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;/g:HTMLPanel&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/ui:UiBinder&amp;gt; &lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="text-indent: -0.25in;"&gt;En laPlantilla inicial ahora declaramos &amp;nbsp;elementos“div” &amp;nbsp;con los identificadores "wmenu" y "wpost",mediante GWT insertaremos dinámicamente los Widgets creados en los &amp;nbsp;elementos “div” a traves de los identificadores.&lt;/span&gt;&lt;br /&gt;&lt;div align="center"&gt;Codigo: Index.html&lt;/div&gt;&lt;pre class="brush: html"&gt;&amp;lt;div id="header" class="container"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div id="logo"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;h1&amp;gt;&amp;lt;a href="#"&amp;gt;Rock Castle&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Begin Menu --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div id="wmenu"&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!-- ACA INSERTAMOS EL WIDGET MENU --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!-- End Menu --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div id="splash-wrapper"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div id="splash"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;h2&amp;gt;Nullam pretium nibh u turpis&amp;lt;/h2&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;p&amp;gt;Lorem ipsum daolor sit amet, consectetur adipiscing elit. Nulla quis orci ut erat iaculis posuere in consequat nulla. Cras vel nisl ipsum, nec tincidunt nunc. Sed egestas lorem nisl, sed dignissim quam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce tristique dui sit amet mauris.&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- end #header --&amp;gt;&lt;br /&gt;&amp;lt;div id="wrapper"&amp;gt;&lt;br /&gt; &amp;lt;div id="wrapper2"&amp;gt;&lt;br /&gt;  &amp;lt;div id="wrapper-bgtop"&amp;gt;&lt;br /&gt;   &amp;lt;div id="page"&amp;gt;&lt;br /&gt;    &amp;lt;div id="content"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;     &amp;lt;!-- Beging Post --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div id="wpost"&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!-- ACA INSERTAMOS EL WIDGET POST --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- End Post --&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="text-indent: -0.25in;"&gt;Ahora&amp;nbsp; cuando se haga click sobre cada elemento delMenu se insertara&amp;nbsp; el Widget “Post” haciendoreferencia al elemento &amp;nbsp;“div” cuyoidentificado es “wpost”.&lt;/span&gt;&lt;br /&gt;&lt;div align="center"&gt;Codigo: Menu.java&lt;/div&gt;&lt;pre class="brush: java"&gt;@UiHandler("labelHomepage")&lt;br /&gt; void onLabelHomepageClick(ClickEvent event) {&lt;br /&gt;  RootPanel.get("wpost").clear();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @UiHandler("labelBlog")&lt;br /&gt; void onLabelBlogClick(ClickEvent event) {&lt;br /&gt;  Post post=new Post();&lt;br /&gt;  RootPanel.get("wpost").add(post);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @UiHandler("labelPhotos")&lt;br /&gt; void onLabelPhotosClick(ClickEvent event) {&lt;br /&gt;  Post post=new Post();&lt;br /&gt;  post.setWidgetPanel(new Formulario());&lt;br /&gt;  RootPanel.get("wpost").add(post);&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="MsoNormal" style="margin-left: .25in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoListParagraph"&gt;&lt;span lang="ES"&gt;Debo de mencionar que la mayoría del código del proyecto es generado automáticamente por GWT Designer, el ejemplo lo puede ver &lt;a href="http://websitegwt.appspot.com/"&gt;http://websitegwt.appspot.com/&lt;/a&gt; y el código fuente de proyecto &lt;a href="http://websitegwt.appspot.com/Blog.zip" target="_blank"&gt;aquí.&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="360" src="http://www.youtube.com/embed/videoseries?list=PL363D3493B8650FB6&amp;amp;hl=es_MX" width="640"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-1864992237492659480?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/1864992237492659480/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=1864992237492659480&amp;isPopup=true' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/1864992237492659480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/1864992237492659480'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2012/01/mi-primer-web-site-con-gwt-para-novatos.html' title='MI PRIMER WEB SITE CON GWT ( PARA NOVATOS )'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/videoseries/default.jpg' height='72' width='72'/><thr:total>0</thr:total><georss:featurename>Tacna, Perú</georss:featurename><georss:point>-18.01757 -70.250969</georss:point><georss:box>-18.0779705 -70.329933 -17.9571695 -70.172005</georss:box></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-4551789890909302953</id><published>2011-11-29T20:24:00.001-08:00</published><updated>2012-01-28T20:51:20.101-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT Designer'/><category scheme='http://www.blogger.com/atom/ns#' term='UIBinder'/><title type='text'>UIBINDER EL PUENTE ENTRE GWT Y LOS DISEÑADORES WEB TRADICIONALES (HTML+CSS)</title><content type='html'>La mayoría de losmejores diseñadores web que conozco no tienen la lógica de un programador yesto es una traba&amp;nbsp; para engancharlos aGWT (aunque con HTML 5 necesariamente van a tener que aprender); sin embargo,con UIBInder veo la posibilidad de usar ese talento en beneficio de las AplicacionesGWT.&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="ES"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang="ES"&gt;&lt;b&gt;PROBLEMA &amp;nbsp;1:&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span lang="ES"&gt;Como atraer&amp;nbsp;a ese mi Amigo, experto&amp;nbsp; enmaquetación y diseño CSS, &amp;nbsp;al mundo deGWT sin que muera de&amp;nbsp; pánico?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="ES"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang="ES"&gt;&lt;b&gt;SOLUCIÓN &amp;nbsp;1:&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="ES"&gt;Copiar ese códigobonito (html + csss) y pegarlo en UIBinder enseguida UIBinder lo transformaraen un Widget y podremos utilizarlo&amp;nbsp; comosi se tratase de un Widget Nativo, entonces insertar el Widget recién creado enuna Layer, Grid, Panel, etc.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="ES"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang="ES"&gt;&lt;b&gt;CONCLUSIÓN 1:&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo2; text-indent: -.25in;"&gt;&lt;span lang="ES"&gt;1)&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ES"&gt;Estopermite tomar trozos de código (html + css) y utilizarlo con GWT, entoncesestos pedazos de códigos están elegantemente encapsulados en Widgets GWT.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpLast" style="mso-list: l0 level1 lfo2; text-indent: -.25in;"&gt;&lt;span lang="ES"&gt;2)&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ES"&gt;AunqueGW T ayuda desmesuradamente a realizar Aplicación Web, con UIBinder podrás construirWeb Sites&amp;nbsp; sin necesidad de encontrartecon los fastidiosos refrescos totales de página que se originan después derealizar un requerimiento al Servidor y&amp;nbsp;además como para completar la historia subir tu Web Site a AppEngine.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="ES"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang="ES"&gt;&lt;b&gt;PROBLEMA 2: &lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span lang="ES"&gt;Como podemos implementar los eventos&amp;nbsp; JavaScript del código bonito de mi Amigo enel UIBinder ?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="ES"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang="ES"&gt;&lt;b&gt;SOLUCIÓN 2:&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpFirst" style="mso-list: l1 level1 lfo1; text-indent: -.25in;"&gt;&lt;span lang="ES"&gt;1)&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ES"&gt;Podemosdejar los el código JavaScript tal cual dentro de UIBinder&amp;nbsp; y a través de JSNI (JavaScript NativeInterface) utilizarlo en GWT.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="mso-list: l1 level1 lfo1; text-indent: -.25in;"&gt;&lt;span lang="ES"&gt;2)&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ES"&gt;&amp;nbsp;Eliminar todo el código Javascript y enseguidacrear los eventos a través de los Widgets GWT&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpLast"&gt;&lt;span lang="ES"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang="ES"&gt;Ejemplo:&lt;/span&gt;&lt;br /&gt;&lt;span lang="ES"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;br /&gt;&lt;div align="center" class="MsoNormal"&gt;&lt;span lang="ES"&gt;Código fuente Menu.ui.xml &amp;nbsp;(UIBINDER)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class="brush: java"&gt;&amp;lt;div id="menuv"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ul&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href="#menuv"&amp;gt;&amp;lt;g:Label ui:field="menu1" text="Importante" /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href="#menuv"&amp;gt;Comentarios&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href="#menuv"&amp;gt;Noticias&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href="#menuv"&amp;gt;Contacto&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href="#menuv"&amp;gt;Acerca de nosotros&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Código fuente Menu.java &amp;nbsp;(UIBINDER)&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;@UiField Label menu1; &lt;br /&gt;@UiHandler("menu1")&lt;br /&gt;void onClick(ClickEvent e) {&lt;br /&gt;  Window.alert("saludo");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Comopuedes ver solo estamos insertando el &amp;lt; tag &amp;gt; del Widget Label en el “Menu.ui.xml”&amp;nbsp;después&amp;nbsp;en el “Menu.java” &amp;nbsp;podemosreferenciar al &amp;lt; tag &amp;gt; creado &amp;nbsp;que es un Widget Label y crear los eventos asociadosrespectivos.&lt;br /&gt;&lt;div class="MsoListParagraph"&gt;&lt;div class="MsoListParagraphCxSpFirst"&gt;&lt;span lang="ES"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoListParagraphCxSpLast"&gt;&lt;span lang="ES"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;Ahora elWidget “Menu” que se creó a partir de código HTML y CSS lo podemos agregar alWidget “HTMLPanel” y visualizar su funcionamiento tal como se muestra en el códigode abajo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center" class="MsoListParagraph" style="text-align: center;"&gt;&lt;span lang="ES"&gt;Código fuente WEB.java&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="MsoListParagraph"&gt;&lt;span lang="ES"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;pre class="brush: java"&gt;HTMLPanel panelIzquierdo = new HTMLPanel("");&lt;br /&gt;&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;Menu menu=new Menu(panelDerecho);&lt;br /&gt;&lt;br /&gt;panelIzquierdo.add(menu);/* Insertamos el Widget Menu*/&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;CONCLUSIÓN 2:&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoListParagraph" style="mso-list: l0 level1 lfo1; text-indent: -.25in;"&gt;&lt;span lang="ES"&gt;1)&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ES"&gt;ConUIBinder separamos el diseño de la lógica de programación incrementandosignificativamente la Productividad.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="ES"&gt;Para una mejorcomprensión del asunto te invito a ver el siguiente video – tutorial.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang="ES"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang="ES"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="505" src="http://www.youtube.com/embed/FRns9TVJIN0?hd=1" width="640"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-4551789890909302953?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/4551789890909302953/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=4551789890909302953&amp;isPopup=true' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/4551789890909302953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/4551789890909302953'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2011/11/uibinder-para-disenadores-web.html' title='UIBINDER EL PUENTE ENTRE GWT Y LOS DISEÑADORES WEB TRADICIONALES (HTML+CSS)'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/FRns9TVJIN0/default.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-802840842970018977</id><published>2011-09-30T17:31:00.000-07:00</published><updated>2012-01-28T20:52:23.091-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SmartGWT'/><title type='text'>PROGRAMITA (SMARTGWT LGPL + PHP)</title><content type='html'>Estuve buscando viejos programitas y encontré&amp;nbsp; un programita bastante sencillo cuyo objetivo era registrar la cantidad&amp;nbsp; de votos procesados para las elecciones municipales y así determinar ,antes que el Jurado&amp;nbsp; Nacional de Elecciones diera el resultado oficial,&amp;nbsp; si el candidato había ganado (En mi País todavía no hay voto electrónico ).&lt;br /&gt;Muestro el&amp;nbsp; video para que vean la sencillez del asunto, mencionar que se construyó con SmartGWT LGPL + PHP + MYSQL.&amp;nbsp; Espero que este post sea el reinicio de mi etapa&amp;nbsp; bloguera.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/Z-wXEWMCkZU/0.jpg" height="640" width="505"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Z-wXEWMCkZU?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="640" height="505"  src="http://www.youtube.com/v/Z-wXEWMCkZU?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-802840842970018977?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/802840842970018977/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=802840842970018977&amp;isPopup=true' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/802840842970018977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/802840842970018977'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2011/09/programita-smartgwt-lgpl-php.html' title='PROGRAMITA (SMARTGWT LGPL + PHP)'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-3845939087626954995</id><published>2010-12-26T08:25:00.000-08:00</published><updated>2010-12-26T15:38:18.610-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppEngine'/><category scheme='http://www.blogger.com/atom/ns#' term='SmartGWT'/><title type='text'>PRIMEROS PASOS CON: SMARTGWT LGPL+APP ENGINE</title><content type='html'>&lt;b&gt;ACLAREMOS EL PANORAMA&lt;/b&gt;&lt;br /&gt;SMARTGWT EE (Enterprise Edition) hace uso del protocolo GWT-RPC; por lo tanto, &amp;nbsp;el Servidor (contenedor de Servlets) debe entender Java. &amp;nbsp;Sin embargo, existe un proyecto denominado &amp;nbsp;GWTPPHP que intenta implementar GWT-RPC para usarlo con PHP (lamentablemente la actividad del proyecto es bastante baja, casi nula) .&lt;br /&gt;&lt;br /&gt;SMARTGWT LGPL (FREE) puede recuperar los datos en formato JSON o XML vía HTTP (como se ha mostrado a lo largo de este Blog). Sin embargo, en el foro de SmartGWT encontraran una librería llamada GwtRpcDataSource (desarrollada por marbot) &amp;nbsp;que nos permite utilizar GWT-RPC, pero todavía no está lo bastante madura.&lt;br /&gt;&lt;br /&gt;Debido a lo anteriormente mencionado en este post nos comunicaremos con Appengine a través de scripts jsp(java server page), es decir JSON vía HTTP.&lt;br /&gt;&lt;br /&gt;Aunque he conseguido realizar &amp;nbsp;pequeños proyectos con SmartGWT &amp;nbsp;LGPL con PHP usando &amp;nbsp;MVP . Seguir con la misma filosofía &amp;nbsp;con un Servidor Java (contenedor de Servlets) es factible, aunque tendría que construir un framework MVP (similar al construido con PHP), &amp;nbsp;en el corto plazo no está en mis planes.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EL EJEMPLO&lt;/b&gt;&lt;br /&gt;El ejemplo mostrado tiene el mismo funcionamiento de de la entrada: &lt;a href="http://jumanor.blogspot.com/2010/11/primeros-pasos-con-gwt-designer.html"&gt;“PRIMEROS PASOS CON: GWT DESIGNER&amp;nbsp; + SMARTGWT + PHP”&lt;/a&gt;. Solo se ha migrado la aplicación, que inicialmente corría sobre el Servidor Web Apache, para que ahora se ejecute sobre el Almacén de Datos de Appengine.&lt;br /&gt;En esta dirección podrás ver la ejecución del ejemplo:&amp;nbsp; &lt;a href="http://gwtdesigner2010.appspot.com/"&gt;http://gwtdesigner2010.appspot.com&lt;/a&gt;&amp;nbsp; , la librería SmartGwt es bastante pesada, así que, tendrás que tener un poco de paciencia.&lt;br /&gt;La entrada “PRIMEROS PASOS CON: GWT DESIGNER&amp;nbsp; + SMARTGWT + PHP” genero un proyecto que lo llamamos “gwtdesigner” es conveniente que habrás este proyecto para completar el ejemplo; ya que, haremos uso del código ahí mostrado.&lt;br /&gt;&lt;br /&gt;Los pasos que se muestran en el video-tutorial se pueden resumir como sigue:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Creamos un nuevo proyecto nombrándolo como “gwtdesignerAppEngine“.&lt;/li&gt;&lt;li&gt;Borramos el código generado, por el Asistente, convenientemente (ver el video).&lt;/li&gt;&lt;li&gt;Copiamos “DSDesigner.java” y “gwtdesigner.java” del proyecto “gwtdesigner” a nuestro paquete “pck.client”.&lt;/li&gt;&lt;li&gt;Modificamos&amp;nbsp; el archivo de configuración (gwt.xml) para que el punto de entrada (entry point) del proyecto sea “gwtdesigner.java”; ya que, el asistente creo&amp;nbsp; por defecto el “gwtdesignerappengine.java” como punto de entrada.&lt;/li&gt;&lt;li&gt;Eliminamos “gwtdesignerappengine.java”.&lt;/li&gt;&lt;li&gt;Creamos los archivo “add.jsp”,” remove.jsp” y “update.jsp”.&lt;/li&gt;&lt;li&gt;Creamos el archivo “Empleados.java” y “PMF.java”, enseguida los añadimos en “pck.server”.&lt;/li&gt;&lt;li&gt;Modificamos “DSDesigner.java” para que se direccionen a:&amp;nbsp; “add.jsp”,” remove.jsp” y “update.jsp”.&lt;/li&gt;&lt;li&gt;Subimos la proyecto a AppEngine.&amp;nbsp;    &lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;&lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;Esta entrada se continuara actualizando… en el breve plazo.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;/*&lt;br /&gt; * Codigo Fuente PMF.java&lt;br /&gt; */&lt;br /&gt;package pck.server;&lt;br /&gt;&lt;br /&gt;import javax.jdo.JDOHelper;&lt;br /&gt;import javax.jdo.PersistenceManagerFactory;&lt;br /&gt;&lt;br /&gt;public final class PMF {&lt;br /&gt;    private static final PersistenceManagerFactory pmfInstance =&lt;br /&gt;        JDOHelper.getPersistenceManagerFactory("transactions-optional");&lt;br /&gt;&lt;br /&gt;    private PMF() {}&lt;br /&gt;&lt;br /&gt;    public static PersistenceManagerFactory get() {&lt;br /&gt;        return pmfInstance;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: java"&gt;/*&lt;br /&gt; * Codigo Fuente Empleado.java&lt;br /&gt; */&lt;br /&gt;package pck.server;&lt;br /&gt;&lt;br /&gt;import javax.jdo.annotations.IdGeneratorStrategy;&lt;br /&gt;import javax.jdo.annotations.IdentityType;&lt;br /&gt;import javax.jdo.annotations.PersistenceCapable;&lt;br /&gt;import javax.jdo.annotations.Persistent;&lt;br /&gt;import javax.jdo.annotations.PrimaryKey;&lt;br /&gt;&lt;br /&gt;@PersistenceCapable(identityType = IdentityType.APPLICATION)&lt;br /&gt;public class Empleado {&lt;br /&gt; &lt;br /&gt; @PrimaryKey&lt;br /&gt;    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)&lt;br /&gt;    private Long id;&lt;br /&gt; @Persistent&lt;br /&gt; private String nombres;&lt;br /&gt; @Persistent&lt;br /&gt; private String dni;&lt;br /&gt; @Persistent&lt;br /&gt; private String email;&lt;br /&gt; &lt;br /&gt; public Empleado(String Nombres, String Dni,String Email) {&lt;br /&gt;  this.nombres=Nombres;&lt;br /&gt;        this.dni=Dni;&lt;br /&gt;        this.email=Email;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; public void setNombres(String nombres) {&lt;br /&gt;  this.nombres = nombres;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getNombres() {&lt;br /&gt;  return nombres;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setDni(String dni) {&lt;br /&gt;  this.dni = dni;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getDni() {&lt;br /&gt;  return dni;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setEmail(String email) {&lt;br /&gt;  this.email = email;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getEmail() {&lt;br /&gt;  return email;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setId(Long id) {&lt;br /&gt;  this.id = id;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Long getId() {&lt;br /&gt;  return id;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: plain"&gt;&amp;lt;%&lt;br /&gt;/*&lt;br /&gt;* Codigo Fuente add.jsp&lt;br /&gt;*/&lt;br /&gt;%&amp;gt;&lt;br /&gt;&amp;lt;%@ page import= "pck.server.*" %&amp;gt;&lt;br /&gt;&amp;lt;%@ page import= "java.util.List" %&amp;gt;&lt;br /&gt;&amp;lt;%@ page import= "javax.jdo.PersistenceManager" %&amp;gt;&lt;br /&gt;&amp;lt;%@ page import= "com.google.appengine.repackaged.org.json.JSONArray" %&amp;gt;&lt;br /&gt;&amp;lt;%@ page import= "com.google.appengine.repackaged.org.json.JSONObject" %&amp;gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;  String nombres=request.getParameter("nombres");&lt;br /&gt;  String dni=request.getParameter("dni");&lt;br /&gt;  String email=request.getParameter("email");&lt;br /&gt;  &lt;br /&gt;  Empleado employee = new Empleado(nombres, dni,email);&lt;br /&gt;  PersistenceManager pm = PMF.get().getPersistenceManager();&lt;br /&gt;&lt;br /&gt;  JSONObject enviar=new JSONObject();&lt;br /&gt;  JSONObject resp=new JSONObject();&lt;br /&gt;  JSONArray data=new JSONArray(); &lt;br /&gt;&lt;br /&gt;  try {   &lt;br /&gt;    employee=pm.makePersistent(employee);&lt;br /&gt;             &lt;br /&gt;    JSONObject reg= new  JSONObject();&lt;br /&gt;    reg.put("id", employee.getId());&lt;br /&gt;    reg.put("nombres", nombres);&lt;br /&gt;    reg.put("dni", dni);&lt;br /&gt;    reg.put("email", email);&lt;br /&gt;    data.put(0, new JSONObject(reg.toString()));&lt;br /&gt;    pm.close();&lt;br /&gt;   resp.put("status",0);&lt;br /&gt;   resp.put("data",new JSONArray(data.toString())); &lt;br /&gt;   enviar.put("response", new JSONObject(resp.toString()));&lt;br /&gt;   &lt;br /&gt;  } catch (Exception e) {&lt;br /&gt;   pm.close();&lt;br /&gt;   response.setContentType("text/plain");&lt;br /&gt;   response.getWriter().println(e.toString());&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  response.setContentType("text/plain");&lt;br /&gt;  response.getWriter().println(enviar.toString());&lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: plain"&gt;&amp;lt;%&lt;br /&gt;/*&lt;br /&gt;* Codigo Fuente fetch.jsp&lt;br /&gt;*/&lt;br /&gt;%&amp;gt;&lt;br /&gt;&amp;lt;%@ page import= "pck.server.*" %&amp;gt;&lt;br /&gt;&amp;lt;%@ page import= "java.util.List" %&amp;gt;&lt;br /&gt;&amp;lt;%@ page import= "javax.jdo.PersistenceManager" %&amp;gt;&lt;br /&gt;&amp;lt;%@ page import= "com.google.appengine.repackaged.org.json.JSONArray" %&amp;gt;&lt;br /&gt;&amp;lt;%@ page import= "com.google.appengine.repackaged.org.json.JSONObject" %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;  JSONObject enviar=new JSONObject();&lt;br /&gt;  JSONObject resp=new JSONObject();&lt;br /&gt;  JSONArray data=new JSONArray(); &lt;br /&gt;  &lt;br /&gt;  PersistenceManager pm = PMF.get().getPersistenceManager();&lt;br /&gt;   &lt;br /&gt;  try {&lt;br /&gt;   &lt;br /&gt;   String query = "select from " + Empleado.class.getName();&lt;br /&gt;   &lt;br /&gt;      List&amp;lt;Empleado&amp;gt; employees = (List&amp;lt;Empleado&amp;gt;) pm.newQuery(query).execute();   &lt;br /&gt;   &lt;br /&gt;   for(int i=0;i&amp;lt;employees.size();i++){&lt;br /&gt;    &lt;br /&gt;    JSONObject reg= new  JSONObject();&lt;br /&gt;    reg.put("id", employees.get(i).getId());&lt;br /&gt;    reg.put("nombres", employees.get(i).getNombres());&lt;br /&gt;    reg.put("dni", employees.get(i).getDni());&lt;br /&gt;    reg.put("email", employees.get(i).getEmail());&lt;br /&gt;    &lt;br /&gt;    data.put(i, new JSONObject(reg.toString()));&lt;br /&gt;   }&lt;br /&gt;   pm.close();&lt;br /&gt;   resp.put("status",0);&lt;br /&gt;   resp.put("data",new JSONArray(data.toString())); &lt;br /&gt;   enviar.put("response", new JSONObject(resp.toString()));&lt;br /&gt;   &lt;br /&gt;  } catch (Exception e) {&lt;br /&gt;   pm.close();&lt;br /&gt;   response.setContentType("text/plain");&lt;br /&gt;   response.getWriter().println(e.toString());&lt;br /&gt;  }&lt;br /&gt;  response.setContentType("text/plain");&lt;br /&gt;  response.getWriter().println(enviar.toString());&lt;br /&gt;  &lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: plain"&gt;&amp;lt;%&lt;br /&gt;/*&lt;br /&gt;* Codigo Fuente update.jsp&lt;br /&gt;*/&lt;br /&gt;%&amp;gt;&amp;lt;%@ page import= "pck.server.*" %&amp;gt;&lt;br /&gt;&amp;lt;%@ page import= "java.util.List" %&amp;gt;&lt;br /&gt;&amp;lt;%@ page import= "javax.jdo.PersistenceManager" %&amp;gt;&lt;br /&gt;&amp;lt;%@ page import= "com.google.appengine.repackaged.org.json.JSONArray" %&amp;gt;&lt;br /&gt;&amp;lt;%@ page import= "com.google.appengine.repackaged.org.json.JSONObject" %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;  String id=request.getParameter("id");&lt;br /&gt;  String nombres=request.getParameter("nombres");&lt;br /&gt;  String dni=request.getParameter("dni");&lt;br /&gt;  String email=request.getParameter("email");&lt;br /&gt;  &lt;br /&gt;  JSONObject enviar=new JSONObject();&lt;br /&gt;  JSONObject resp=new JSONObject();&lt;br /&gt;  JSONArray data=new JSONArray(); &lt;br /&gt;  &lt;br /&gt;  PersistenceManager pm = PMF.get().getPersistenceManager();&lt;br /&gt;    &lt;br /&gt;  try {&lt;br /&gt;    Empleado e = pm.getObjectById(Empleado.class, Long.parseLong(id));&lt;br /&gt;    &lt;br /&gt;    e.setDni(dni);&lt;br /&gt;    e.setNombres(nombres);&lt;br /&gt;    e.setEmail(email);&lt;br /&gt;    &lt;br /&gt;    pm.close();&lt;br /&gt;    &lt;br /&gt;    JSONObject reg= new  JSONObject();&lt;br /&gt;    reg.put("id", Integer.parseInt(id));&lt;br /&gt;    reg.put("nombres", nombres);&lt;br /&gt;    reg.put("dni", dni);&lt;br /&gt;    reg.put("email", email);&lt;br /&gt;    data.put(0, new JSONObject(reg.toString()));&lt;br /&gt;   &lt;br /&gt;   resp.put("status",0);&lt;br /&gt;   resp.put("data",new JSONArray(data.toString())); &lt;br /&gt;   enviar.put("response", new JSONObject(resp.toString()));&lt;br /&gt;   &lt;br /&gt;  } catch (Exception e) {&lt;br /&gt;   &lt;br /&gt;   pm.close();&lt;br /&gt;   response.setContentType("text/plain");&lt;br /&gt;   response.getWriter().println(e.toString());&lt;br /&gt;  }&lt;br /&gt;  response.setContentType("text/plain");&lt;br /&gt;  response.getWriter().println(enviar.toString());&lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div alingn="center"&gt;&lt;object height="505" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/XIfeLaYxNts?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/XIfeLaYxNts?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-3845939087626954995?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/3845939087626954995/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=3845939087626954995&amp;isPopup=true' title='11 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/3845939087626954995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/3845939087626954995'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2010/12/primeros-pasos-con-smartgwt.html' title='PRIMEROS PASOS CON: SMARTGWT LGPL+APP ENGINE'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-1580767387883150413</id><published>2010-11-02T07:42:00.000-07:00</published><updated>2010-11-08T13:19:10.838-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT Designer'/><category scheme='http://www.blogger.com/atom/ns#' term='SmartGWT'/><title type='text'>PRIMEROS PASOS CON: GWT DESIGNER + SMARTGWT + PHP</title><content type='html'>GWT Designer todavía no soporta ampliamente a SmartGWT, como consecuencia de esto se siente desesperadamente lento el IDE (contrariamente a GWT que se siente más rápido).&lt;br /&gt;Sin embargo, aun con sus carencias puede ayudar considerablemente en el Diseño de una Interfaz.&lt;br /&gt;&lt;br /&gt;El ejemplo simplemente mostrara, añadirá y editara Empleados de una gran Empresa (encargada de construir un framework al estilo de Spring Roo), para conseguir con el objetivo haremos uso de”DynamicForm” una clase de SmartGwt que reducirá significativamente el código de las operaciones.&lt;br /&gt;&lt;br /&gt;Hasta la línea 116 del código fuente (gwtDesigner.java) lo genera GWT Designer salvo la línea 49 y 116&amp;nbsp; que se añaden programáticamente “BeginGrid” y “Begin”, respectivamente. Teniendo en claro lo anterior proceda a realizar el ejemplo como se muestran en los videos-tutoriales sin olvidar las Variables Locales que deben ser convertidos en Atributos de la Clase.(dependiendo de su configuracion, por defecto GWT Designer crea los Widgets como Variables Locales)&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Nota:&lt;/b&gt; Este ejemplo se ejecuta con: GWT 2.1, GWT Designer 8.1, SmartGWT 2.2 y&amp;nbsp; PHP 5.2.3&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="505" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Cq0UNdBwbYY?fs=1&amp;amp;hl=es_ES&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Cq0UNdBwbYY?fs=1&amp;amp;hl=es_ES&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Qué realiza DynamicForm?&lt;/b&gt;&lt;br /&gt;DynamicForm nos permite crear y editar un registro muy rápidamente, simplemente hay que asignarle un DataSource&amp;nbsp; al DynamicForm. DynamicForm automáticamente reconocerá los campos del DataSource asignado y se verán reflejados en un Formulario. En nuestro ejemplo creamos los Formularios “dynamicFormNuevo” y “dynamicFormEditar”&lt;br /&gt;&lt;pre class="brush: java"&gt;public void Begin(){&lt;br /&gt;    ...&lt;br /&gt;    dynamicFormNuevo.setDataSource(DSDesigner.getInstance());&lt;br /&gt;    dynamicFormEditar.setDataSource(DSDesigner.getInstance());&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Cómo creamos un Empleado?&lt;/b&gt;&lt;br /&gt;Antes de poder crear un Empleado será necesario validar el ingreso de datos. El método “saveData” de DynamicForm llamara automáticamente a “fetch.php”.&lt;br /&gt;&lt;pre class="brush: java"&gt;public void OnClickNuevo_Guardar(){&lt;br /&gt;    if(dynamicFormNuevo.validate()){&lt;br /&gt;     dynamicFormNuevo.saveData();&lt;br /&gt;     ...&lt;br /&gt;     ...&lt;br /&gt;    }&lt;br /&gt;   }&lt;/pre&gt;&lt;b&gt;Cómo editamos un Empleado?&lt;/b&gt;&lt;br /&gt;En nuestro ejemplo para poder editar un Empleado necesitamos implementar el evento “onRecordClick” de la grilla “listgrid”.&lt;br /&gt;&lt;pre class="brush: java"&gt;public void OnClickRecordGrid(){&lt;br /&gt;    dynamicFormEditar.reset();&lt;br /&gt;    dynamicFormEditar.editSelectedData(listGrid);&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;Enseguida procedemos a validar el ingreso de datos con el método “validate”, después guardamos los cambios realizados con el método “saveData”que automáticamente llamara a “update.php”.&lt;br /&gt;&lt;pre class="brush: java"&gt;public void OnClickEditar_Guardar(){&lt;br /&gt;    if(dynamicFormEditar.validate()){&lt;br /&gt;     dynamicFormEditar.saveData();&lt;br /&gt;     ...&lt;br /&gt;     ...&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;object height="505" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/UgxUVwAsiaA?fs=1&amp;amp;hl=es_ES&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/UgxUVwAsiaA?fs=1&amp;amp;hl=es_ES&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;/**&lt;br /&gt; * Codigo Fuente GWTDesigner&lt;br /&gt; */&lt;br /&gt;public class gwtdesigner implements EntryPoint {&lt;br /&gt; private DynamicForm dynamicFormEditar;&lt;br /&gt; private Tab tabEditar;&lt;br /&gt; private Tab tabNuevo;&lt;br /&gt; private DynamicForm dynamicFormNuevo;&lt;br /&gt; private Tab tabGrilla;&lt;br /&gt; private ListGrid listGrid;&lt;br /&gt; private TabSet tabSet;&lt;br /&gt; &lt;br /&gt; public void onModuleLoad() {&lt;br /&gt;  RootPanel rootPanel = RootPanel.get();&lt;br /&gt;  &lt;br /&gt;  tabSet = new TabSet();&lt;br /&gt;  tabGrilla=new Tab("Empleados");&lt;br /&gt;  &lt;br /&gt;  VLayout layout = new VLayout();&lt;br /&gt;  &lt;br /&gt;  ToolStrip toolStrip = new ToolStrip();&lt;br /&gt;  toolStrip.setSize("100%", "25px");&lt;br /&gt;  &lt;br /&gt;  ToolStripButton btnGrillaNuevo = new ToolStripButton("Nuevo");&lt;br /&gt;  btnGrillaNuevo.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {&lt;br /&gt;   public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {&lt;br /&gt;    OnClickGrilla_Nuevo();&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt;  btnGrillaNuevo.setIcon("icons/16/new.gif");&lt;br /&gt;  toolStrip.addButton(btnGrillaNuevo);&lt;br /&gt;  &lt;br /&gt;  ToolStripButton btnGrillaEditar = new ToolStripButton("Editar");&lt;br /&gt;  btnGrillaEditar.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {&lt;br /&gt;   public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {&lt;br /&gt;    OnClickGrilla_Editar();&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt;  btnGrillaEditar.setIcon("icons/16/edit.png");&lt;br /&gt;  toolStrip.addButton(btnGrillaEditar);&lt;br /&gt;  layout.addMember(toolStrip);&lt;br /&gt;  &lt;br /&gt;  listGrid = new ListGrid();&lt;br /&gt;  listGrid.addRecordClickHandler(new RecordClickHandler() {&lt;br /&gt;   public void onRecordClick(RecordClickEvent event) {&lt;br /&gt;    OnClickRecordGrid();&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt;  BeginGrid();&lt;br /&gt;  layout.addMember(listGrid);&lt;br /&gt;  tabGrilla.setPane(layout);&lt;br /&gt;  tabNuevo=new Tab("Nuevo");&lt;br /&gt;  &lt;br /&gt;  VLayout layout_1 = new VLayout();&lt;br /&gt;  &lt;br /&gt;  ToolStrip toolStrip_1 = new ToolStrip();&lt;br /&gt;  toolStrip_1.setSize("100%", "25px");&lt;br /&gt;  &lt;br /&gt;  ToolStripButton btnNuevoGuardar = new ToolStripButton("Guardar");&lt;br /&gt;  btnNuevoGuardar.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {&lt;br /&gt;   public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {&lt;br /&gt;    OnClickNuevo_Guardar();&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt;  btnNuevoGuardar.setIcon("icons/16/disk_blue.png");&lt;br /&gt;  toolStrip_1.addButton(btnNuevoGuardar);&lt;br /&gt;  &lt;br /&gt;  ToolStripButton btnNuevoSalir = new ToolStripButton("Salir");&lt;br /&gt;  btnNuevoSalir.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {&lt;br /&gt;   public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {&lt;br /&gt;    OnClickNuevo_Salir();&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt;  btnNuevoSalir.setIcon("icons/16/salir.png");&lt;br /&gt;  toolStrip_1.addButton(btnNuevoSalir);&lt;br /&gt;  layout_1.addMember(toolStrip_1);&lt;br /&gt;  &lt;br /&gt;  dynamicFormNuevo = new DynamicForm();&lt;br /&gt;  layout_1.addMember(dynamicFormNuevo);&lt;br /&gt;  tabNuevo.setPane(layout_1);&lt;br /&gt;  tabEditar=new Tab("Editar");&lt;br /&gt;  &lt;br /&gt;  VLayout layout_2 = new VLayout();&lt;br /&gt;  &lt;br /&gt;  ToolStrip toolStrip_2 = new ToolStrip();&lt;br /&gt;  toolStrip_2.setSize("100%", "25px");&lt;br /&gt;  &lt;br /&gt;  ToolStripButton btnEditarGuardar = new ToolStripButton("Guardar");&lt;br /&gt;  btnEditarGuardar.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {&lt;br /&gt;   public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {&lt;br /&gt;    OnClickEditar_Guardar();&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt;  btnEditarGuardar.setIcon("icons/16/disk_blue.png");&lt;br /&gt;  toolStrip_2.addButton(btnEditarGuardar);&lt;br /&gt;  &lt;br /&gt;  ToolStripButton btnEditarSalir = new ToolStripButton("Salir");&lt;br /&gt;  btnEditarSalir.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {&lt;br /&gt;   public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {&lt;br /&gt;    OnClickEditar_Salir();&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt;  btnEditarSalir.setIcon("icons/16/salir.png");&lt;br /&gt;  toolStrip_2.addButton(btnEditarSalir);&lt;br /&gt;  layout_2.addMember(toolStrip_2);&lt;br /&gt;  &lt;br /&gt;  dynamicFormEditar = new DynamicForm();&lt;br /&gt;  layout_2.addMember(dynamicFormEditar);&lt;br /&gt;  tabEditar.setPane(layout_2);&lt;br /&gt;  tabSet.addTab(tabGrilla);&lt;br /&gt;  tabSet.addTab(tabNuevo);&lt;br /&gt;  tabSet.addTab(tabEditar);&lt;br /&gt;  tabSet.setSize("430px", "299px");&lt;br /&gt;  rootPanel.add(tabSet, 10, 10);&lt;br /&gt;  &lt;br /&gt;  Begin();&lt;br /&gt; }&lt;br /&gt; /*&lt;br /&gt;    * Inicio de Eventos&lt;br /&gt;    */&lt;br /&gt;   public void OnClickGrilla_Nuevo(){&lt;br /&gt;    tabNuevo.setDisabled(false);&lt;br /&gt;    tabSet.selectTab(1);&lt;br /&gt;    dynamicFormNuevo.reset();&lt;br /&gt;   }&lt;br /&gt;   public void OnClickGrilla_Editar(){&lt;br /&gt;    tabEditar.setDisabled(false);&lt;br /&gt;    tabSet.selectTab(2);&lt;br /&gt;   }&lt;br /&gt;   public void OnClickNuevo_Guardar(){&lt;br /&gt;    if(dynamicFormNuevo.validate()){&lt;br /&gt;     dynamicFormNuevo.saveData();&lt;br /&gt;     tabNuevo.setDisabled(true);&lt;br /&gt;     tabSet.selectTab(0); &lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   public void OnClickNuevo_Salir(){&lt;br /&gt;    tabNuevo.setDisabled(true);&lt;br /&gt;    tabSet.selectTab(0);&lt;br /&gt;   }&lt;br /&gt;   public void OnClickEditar_Guardar(){&lt;br /&gt;    if(dynamicFormEditar.validate()){&lt;br /&gt;     dynamicFormEditar.saveData();&lt;br /&gt;     tabEditar.setDisabled(true);&lt;br /&gt;     tabSet.selectTab(0);&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   public void OnClickEditar_Salir(){&lt;br /&gt;    tabEditar.setDisabled(true);&lt;br /&gt;    tabSet.selectTab(0);&lt;br /&gt;   }&lt;br /&gt;   public void OnClickRecordGrid(){&lt;br /&gt;    dynamicFormEditar.reset();&lt;br /&gt;    dynamicFormEditar.editSelectedData(listGrid);&lt;br /&gt;   }&lt;br /&gt;   public void BeginGrid(){&lt;br /&gt;       &lt;br /&gt;    listGrid.setDataSource(DSDesigner.getInstance());&lt;br /&gt;    //$hide&amp;gt;&amp;gt;$&lt;br /&gt;    listGrid.setAutoFetchData(true);&lt;br /&gt;    //$hide&amp;lt;&amp;lt;$&lt;br /&gt;    ListGridField  id = new ListGridField ("id", "ID",20);&lt;br /&gt;    ListGridField  nombres = new ListGridField ("nombres", "NOMBRES",100);&lt;br /&gt;    ListGridField  dni = new ListGridField ("dni", "DNI",60);&lt;br /&gt;    ListGridField  telefono = new ListGridField ("email", "E-MAIL");&lt;br /&gt;    listGrid.setFields(id,nombres,dni,telefono);&lt;br /&gt;   }&lt;br /&gt;   public void Begin(){&lt;br /&gt;    //$hide&amp;gt;&amp;gt;$&lt;br /&gt;    tabNuevo.setDisabled(true);&lt;br /&gt;    tabEditar.setDisabled(true);&lt;br /&gt;    //$hide&amp;lt;&amp;lt;$&lt;br /&gt;    dynamicFormNuevo.setDataSource(DSDesigner.getInstance());&lt;br /&gt;    dynamicFormEditar.setDataSource(DSDesigner.getInstance());&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: java"&gt;/**&lt;br /&gt; * Codigo Fuente DSDesigner&lt;br /&gt; */&lt;br /&gt;public class DSDesigner extends RestDataSource{&lt;br /&gt;&lt;br /&gt; private static DSDesigner instance = null;&lt;br /&gt; &lt;br /&gt; public static DSDesigner getInstance() {&lt;br /&gt;  if (instance == null) {&lt;br /&gt;   instance = new DSDesigner();&lt;br /&gt;  }&lt;br /&gt;  return instance;&lt;br /&gt; }//end function&lt;br /&gt; &lt;br /&gt; private DSDesigner()&lt;br /&gt; {&lt;br /&gt;  OperationBinding fetch = new OperationBinding();&lt;br /&gt;  fetch.setOperationType(DSOperationType.FETCH);&lt;br /&gt;  fetch.setDataProtocol(DSProtocol.POSTPARAMS);&lt;br /&gt;&lt;br /&gt;  OperationBinding add = new OperationBinding();&lt;br /&gt;  add.setOperationType(DSOperationType.ADD);&lt;br /&gt;  add.setDataProtocol(DSProtocol.POSTPARAMS);&lt;br /&gt;&lt;br /&gt;  OperationBinding remove = new OperationBinding();&lt;br /&gt;  remove.setOperationType(DSOperationType.REMOVE);&lt;br /&gt;  remove.setDataProtocol(DSProtocol.POSTPARAMS);&lt;br /&gt;&lt;br /&gt;  OperationBinding update = new OperationBinding();&lt;br /&gt;  update.setOperationType(DSOperationType.UPDATE);&lt;br /&gt;  update.setDataProtocol(DSProtocol.POSTPARAMS);&lt;br /&gt;&lt;br /&gt;  this.setOperationBindings(fetch, add, remove, update);&lt;br /&gt;  this.setDataFormat(DSDataFormat.JSON);&lt;br /&gt;  &lt;br /&gt;  this.setFetchDataURL("fetch.php");&lt;br /&gt;  this.setAddDataURL("add.php");&lt;br /&gt;  this.setUpdateDataURL("update.php");&lt;br /&gt;  &lt;br /&gt;  DataSourceIntegerField id = new DataSourceIntegerField("id");&lt;br /&gt;  id.setPrimaryKey(true); &lt;br /&gt; &lt;br /&gt;  DataSourceTextField nombres = new DataSourceTextField("nombres");&lt;br /&gt;  &lt;br /&gt;  RegExpValidator maskDni=new RegExpValidator();&lt;br /&gt;  maskDni.setErrorMessage("dni es invalido");  &lt;br /&gt;  maskDni.setExpression("[0-9]{8}");  &lt;br /&gt;        &lt;br /&gt;  DataSourceTextField dni = new DataSourceTextField("dni");&lt;br /&gt;  dni.setValidators(maskDni);&lt;br /&gt;  dni.setLength(8);&lt;br /&gt;  &lt;br /&gt;  RegExpValidator maskEmail=new RegExpValidator();&lt;br /&gt;  maskEmail.setErrorMessage("e-mail es invalido");  &lt;br /&gt;     maskEmail.setExpression("^([a-zA-Z0-9_.\-+])+@(([a-zA-Z0-9\-])+\.)+[a-zA-Z0-9]{2,4}$");  &lt;br /&gt;           &lt;br /&gt;  DataSourceTextField email = new DataSourceTextField("email");&lt;br /&gt;  email.setValidators(maskEmail);&lt;br /&gt;  &lt;br /&gt;  this.setFields(id,nombres,dni,email);&lt;br /&gt;  &lt;br /&gt; }//end functiono&lt;br /&gt; &lt;br /&gt;}//end class&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: php"&gt;&amp;lt;?php&lt;br /&gt;/*&lt;br /&gt;* Codigo fuente de add.php&lt;br /&gt;*/&lt;br /&gt;$data=array();&lt;br /&gt;$data[0]["id"]=$_POST["id"];&lt;br /&gt;$data[0]["nombres"]=$_POST["nombres"];&lt;br /&gt;$data[0]["dni"]=$_POST["dni"];&lt;br /&gt;$data[0]["email"]=$_POST["email"];&lt;br /&gt; &lt;br /&gt;$mensaje=array();&lt;br /&gt;$mensaje["response"]["status"]=0;&lt;br /&gt;$mensaje["response"]["data"]=$data;&lt;br /&gt; &lt;br /&gt;echo json_encode($mensaje);&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: php"&gt;&amp;lt;?php&lt;br /&gt;/*&lt;br /&gt;* Codigo fuente de fetch.php&lt;br /&gt;*/&lt;br /&gt;$data=array();&lt;br /&gt;$data[0]["id"]=1;&lt;br /&gt;$data[0]["nombres"]="Sanjiv Jivans";&lt;br /&gt;$data[0]["dni"]="86763232";&lt;br /&gt;$data[0]["email"]="sanjiv@smartgwt.com";&lt;br /&gt; &lt;br /&gt;$data[1]["id"]=2;&lt;br /&gt;$data[1]["nombres"]="Eric Clayberg";&lt;br /&gt;$data[1]["dni"]="89328745";&lt;br /&gt;$data[1]["email"]="eric@gwtdesigner.com";&lt;br /&gt; &lt;br /&gt;$data[2]["id"]=3;&lt;br /&gt;$data[2]["nombres"]="Fabien Potencier";&lt;br /&gt;$data[2]["dni"]="84563245";&lt;br /&gt;$data[2]["email"]="fabien@symfony.com";&lt;br /&gt; &lt;br /&gt;$mensaje=array();&lt;br /&gt;$mensaje["response"]["status"]=0;&lt;br /&gt;$mensaje["response"]["data"]=$data;&lt;br /&gt; &lt;br /&gt;echo json_encode($mensaje);&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: php"&gt;&amp;lt;?php&lt;br /&gt;/*&lt;br /&gt;* Codigo fuente de update.php&lt;br /&gt;*/&lt;br /&gt;$data=array();&lt;br /&gt;$data[0]["id"]=$_POST["id"];&lt;br /&gt;$data[0]["nombres"]=$_POST["nombres"];&lt;br /&gt;$data[0]["dni"]=$_POST["dni"];&lt;br /&gt;$data[0]["email"]=$_POST["email"];&lt;br /&gt; &lt;br /&gt;$mensaje=array();&lt;br /&gt;$mensaje["response"]["status"]=0;&lt;br /&gt;$mensaje["response"]["data"]=$data;&lt;br /&gt; &lt;br /&gt;echo json_encode($mensaje);&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-1580767387883150413?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/1580767387883150413/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=1580767387883150413&amp;isPopup=true' title='14 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/1580767387883150413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/1580767387883150413'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2010/11/primeros-pasos-con-gwt-designer.html' title='PRIMEROS PASOS CON: GWT DESIGNER + SMARTGWT + PHP'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-4644430953861352654</id><published>2010-10-13T16:52:00.000-07:00</published><updated>2010-10-27T14:14:19.049-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><title type='text'>MI PRIMER WEB-SITE CONSTRUIDO CON GOOGLE WEB TOOLKIT</title><content type='html'>Acá le muestro el web-site que realicé con Google Web Toolkit, aunque obviamente tiene sus deficiencias sentía la necesidad de realizar un web-site con este extraordinario framework y aunque con Symfony lo hubiera terminado en la decima parte del tiempo (debido a la curva de aprendizaje) con la ayuda de un experimentado diseñador, maqueteador, etc.&lt;br /&gt;&lt;br /&gt;Este web-site está construido casi en su totalidad con GWT (la cabecera de presentación se hizo con flash).&amp;nbsp; Se utiliza la Api de datos de Youtube , la Api de datos de Picasa,&amp;nbsp; Google Ajax Feed (RSS), corriendo sobre el Servidor Web Apache con Php.&lt;br /&gt;&lt;br /&gt;Inicialmente funcionaba la Api de Google Maps; sin embargo, la última vez que actualice el web-site me sale el molestoso mensaje: “&lt;u&gt;&lt;i&gt;Este sitio web requiere una clave diferente del API de Google Maps. Puedes generar una clave nueva en http://code.google.com/apis/maps&lt;/i&gt;&lt;/u&gt;”, después de darle vueltas al asunto decide poner una simple imagen, y si hay alguien que me pueda dar una mano le agradecería infinitamente.&lt;br /&gt;&lt;br /&gt;Para los aun escépticos &lt;a href="http://willymendez.com/"&gt;aqui&lt;/a&gt; el site, tambien vean este de &lt;a href="http://victorcabrerazolla.com/"&gt;aqui&lt;/a&gt; ambos se realizaron practicamente al mismo tiempo. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Actualizado:&lt;/b&gt;Después de depurar, me percato que a pesar que le envió un Key valido este no lo reconoce, entonces opte por colocar en el "index" lo siguiente:&lt;br /&gt;&lt;pre&gt;&amp;lt;script type="text/javascript" src="http://www.google.com/jsapi?key=TUCLAVE"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;Es extraño porque en ningún momento se menciona en la &lt;a href="http://code.google.com/p/gwt-google-apis/wiki/MapsGettingStarted"&gt;guía de inicio de Google Maps Api para GWT&lt;/a&gt; la necesidad de lo anterior.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-4644430953861352654?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/4644430953861352654/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=4644430953861352654&amp;isPopup=true' title='4 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/4644430953861352654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/4644430953861352654'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2010/10/mi-primer-web-site-construido-con.html' title='MI PRIMER WEB-SITE CONSTRUIDO CON GOOGLE WEB TOOLKIT'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-5254232736878097617</id><published>2010-08-13T11:08:00.000-07:00</published><updated>2010-08-15T17:24:35.286-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Api Picasa'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><title type='text'>Primeros Pasos con la API de datos de  Picasa con Google Web Toolkit</title><content type='html'>Este post debió ser el doble del tamaño que se muestra, pero debido a que me presentaron a la clase JsonpRequestBuilder se disminuyo considerablemente.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Qué puedo hacer con&amp;nbsp; la Api de Datos de Picasa?&lt;/b&gt;&lt;br /&gt;La Api de datos de Picasa te permite modificar, añadir o eliminar álbumes o fotos de Picasa utilizando el Google Data Protocol.&lt;br /&gt;Google Data Protocol, es utilizado&amp;nbsp; por muchas Apis de Google (Youtube, Reader, Calendar,Picasa etc ).&amp;nbsp; &lt;br /&gt;El esfuerzo que imprimas en aprender Google Data Protocol te permitirá utilizar los múltiples servicios que Google pone a tu disposición. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Cómo realizo consultas con la Api de Datos de Picasa?&lt;/b&gt;&lt;br /&gt;Las consultas las realizaremos con requerimientos HTTP, dichos requerimientos devolverán la respuesta en formato XML o JSON según indiquemos. Para probar su funcionamiento puedes usar cualquier navegador y enviar el siguiente requerimiento:&lt;br /&gt;&lt;pre&gt;http://picasaweb.google.com/data/feed/api/user/tombrad2/album&lt;br /&gt;/LaLisera?prettyprint=true&amp;amp;alt=json&lt;br /&gt;&lt;/pre&gt;“tombrad2” es el usuario de Picasa.&lt;br /&gt;“LaLisera” es el álbum del usuario sobre el cual realizamos la consulta.&lt;br /&gt;&amp;nbsp;“prettyprint=true” nos muestra la consulta en un formato legible. &lt;br /&gt;“alt=json” le decimos que la respuesta sea en formato JSON.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Algunos ejemplos de consultas a la Api de Datos de Picasa&lt;/b&gt;&lt;br /&gt;No está de más hacerles recordar que las consultas que se muestran las pueden realizar en cualquier navegador de su preferencia.&lt;br /&gt;Teniendo como referencia el documento de &lt;a href="http://code.google.com/intl/es/apis/picasaweb/docs/2.0/developers_guide_protocol.html"&gt;acá&lt;/a&gt;, aquí brindo algunas consultas de las múltiples que se pueden realizar.&lt;br /&gt;&lt;pre&gt;http://picasaweb.google.com/data/feed/api/user/tombrad2/album/ParquePeru?prettyprint=true&lt;br /&gt;&amp;amp;alt=json&amp;amp;fields=title,subtitle,icon&lt;/pre&gt;Muestra&amp;nbsp; los campos del album "ParquePeru":”title”,”subtitle” y “icon”.&lt;br /&gt;&lt;pre&gt;http://picasaweb.google.com/data/feed/api/user/&lt;br /&gt;tombrad2?prettyprint=true&lt;br /&gt;&lt;/pre&gt;Muestra los datos de los álbumes del usuario “tombrad2”&lt;br /&gt;&lt;pre&gt;http://picasaweb.google.com/data/feed/api/user/&lt;br /&gt;tombrad2/album/ParquePeru?alt=json&lt;br /&gt;&amp;amp;fields=entry/media:group/media:description,entry/media:group/media:thumbnail&amp;amp;kind=photo&amp;amp;thumbsize=640&lt;br /&gt;&lt;/pre&gt;Muestra las fotos asociadas al álbum “ParquePeru”, con los campos “description” y “thumbanail”. Para una mejor visualización en tu navegador, no te olvides agregar “prettyprint=true”.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Cómo utilizar la Api de Datos de Picasa con Google Web Toolkit?&lt;/b&gt;&lt;br /&gt;Antes de responder la pregunta permítanme presentarles a la Clase JavaScriptObject. La Clase&amp;nbsp; JavaScriptObject es normalmente declarado como el tipo de retorno en un método JSNI (los métodos JSNI pueden declarar tipo de dato retornado a diferencia de los métodos JavaScript nativos). Lamentablemente a la instancia de la Clase (Objeto) JavaScriptObject no podemos utilizarlo directamente en GWT. Para acceder a la data de un Objeto JavascriptObject tenemos dos alternativas. La primera alternativa es descrita en &lt;a href="http://googlewebtoolkit.blogspot.com/2008/08/getting-to-really-know-gwt-part-2.html"&gt;este artículo&lt;/a&gt;, la segunda alternativa es utilizar el Objeto JSONObject que recibe en su constructor al Objeto JavaScriptObject. En este post usaremos JSONObject.&lt;br /&gt;GWT permite acceder a requerimientos cross domain mediante la clase JsonpRequestBuilder del siquiente modo: &lt;br /&gt;&lt;pre class="brush: java"&gt;public void onModuleLoad() {&lt;br /&gt;  &lt;br /&gt;  String url ="http://picasaweb.google.com/data/feed/api/user/tombrad2/album/ParquePeru?alt=json-in-script&amp;amp;fields=entry/media:group/media:description,entry/media:group/media:thumbnail&amp;amp;kind=photo&amp;amp;thumbsize=640";  &lt;br /&gt;  JsonpRequestBuilder jsonp = new JsonpRequestBuilder();&lt;br /&gt;   jsonp.requestObject(url,  new AsyncCallback&amp;lt;JavaScriptObject&amp;gt;(){&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void onFailure(Throwable caught) {&lt;br /&gt;   &lt;br /&gt;     Window.alert(caught.getMessage());&lt;br /&gt;    }&lt;br /&gt;    @Override&lt;br /&gt;    public void onSuccess(JavaScriptObject object) {&lt;br /&gt;&lt;br /&gt;     JSONObject obj=new JSONObject(object);&lt;br /&gt;     &lt;br /&gt;     Ejecutar(obj);&lt;br /&gt;     &lt;br /&gt;    }});&lt;br /&gt;  &lt;br /&gt; }//end function&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Mostrando el Ejemplo&lt;/b&gt;&lt;br /&gt;En la línea 35 pueden observar cómo se declara la instancia de la clase JSONObject y como se le pasa en el constructor la instancia de la clase JavaScriptObject.&lt;br /&gt;En la líneas&amp;nbsp; 10 y 11 se puede observar la recuperación de los datos almacenados en la instancia de la clase JSONObject. No te dejes intimidar por la aparente complejidad de recuperación de datos!. &lt;br /&gt;&lt;pre class="brush: java"&gt;public class Apipicasa implements EntryPoint {&lt;br /&gt; &lt;br /&gt; VerticalPanel vp=new VerticalPanel();&lt;br /&gt; &lt;br /&gt; public void Ejecutar(JSONObject obj){&lt;br /&gt;  int size=(int)obj.get("feed").isObject().get("entry").isArray().size();&lt;br /&gt;  &lt;br /&gt;  for(int i=0;i&amp;lt;size;i++)&lt;br /&gt;  {&lt;br /&gt;   String url=obj.get("feed").isObject().get("entry").isArray().get(i).isObject().get("media$group").isObject().get("media$thumbnail").isArray().get(0).isObject().get("url").isString().stringValue();&lt;br /&gt;   String descripcion=obj.get("feed").isObject().get("entry").isArray().get(i).isObject().get("media$group").isObject().get("media$description").isObject().get("$t").isString().stringValue();&lt;br /&gt;   &lt;br /&gt;   vp.add(new Image(url));&lt;br /&gt;   vp.add(new HTML(descripcion));&lt;br /&gt;   &lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  RootPanel.get().add(vp);&lt;br /&gt; }//end function&lt;br /&gt; &lt;br /&gt; public void onModuleLoad() {&lt;br /&gt;  &lt;br /&gt;  String url ="http://picasaweb.google.com/data/feed/api/user/tombrad2/album/ParquePeru?alt=json-in-script&amp;amp;fields=entry/media:group/media:description,entry/media:group/media:thumbnail&amp;amp;kind=photo&amp;amp;thumbsize=640";  &lt;br /&gt;  JsonpRequestBuilder jsonp = new JsonpRequestBuilder();&lt;br /&gt;   jsonp.requestObject(url,  new AsyncCallback&amp;lt;JavaScriptObject&amp;gt;(){&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void onFailure(Throwable caught) {&lt;br /&gt;   &lt;br /&gt;     Window.alert(caught.getMessage());&lt;br /&gt;    }&lt;br /&gt;    @Override&lt;br /&gt;    public void onSuccess(JavaScriptObject object) {&lt;br /&gt;&lt;br /&gt;     JSONObject obj=new JSONObject(object);&lt;br /&gt;     &lt;br /&gt;     Ejecutar(obj);&lt;br /&gt;     &lt;br /&gt;    }});&lt;br /&gt;  &lt;br /&gt; }//end function&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;object width="640" height="505"&gt;&lt;param name="movie" value="http://www.youtube.com/v/jh2T9V81eL0?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/jh2T9V81eL0?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-5254232736878097617?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/5254232736878097617/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=5254232736878097617&amp;isPopup=true' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/5254232736878097617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/5254232736878097617'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2010/08/primeros-pasos-con-la-api-de-datos-de.html' title='Primeros Pasos con la API de datos de  Picasa con Google Web Toolkit'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-2998124905969898549</id><published>2010-07-23T19:54:00.000-07:00</published><updated>2010-07-23T20:02:46.366-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ListGrid'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='SmartGWT'/><title type='text'>Conociendo la Grilla de SmartGWT (PARTE I)</title><content type='html'>Uno de los motivos por la que use este framework fue su Grilla (ListGrid y TreeGrid) su potencia lo pueden ver en el &lt;a href="http://www.smartclient.com/smartgwt/showcase/"&gt;showcase &lt;/a&gt;pero hay una característica que no se muestra muy claro en el &lt;a href="http://www.smartclient.com/smartgwt/showcase/"&gt;showcase&lt;/a&gt; de ejemplos (debido a que los ejemplos corren solo en el lado del cliente) que es lo que se denomina: “live grid”. &lt;i&gt;El término “live grid”&lt;b&gt; hace referencia a la capacidad que tiene la grilla de capturar datos del servidor conforme deslizamos la barra de desplazamiento&lt;/b&gt;&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;En el ejemplo que muestro a continuación la Grilla (listgrid) captura 15 registros cada vez que deslizamos la barra de desplazamiento. El total de registros a capturar será de 5000, debes de notar que puedes desplazarte a los últimos registros sin necesidad de mostrar todos los anteriores (te sugiero que veas el video al final del post para mayor entendimiento)&lt;br /&gt;&lt;br /&gt;ListGrid solicita los primeros 15 registros al Servidor mediante las variables “startRow” y “endRow” con los valores 0 y 15 respectivamente (la asignación de estas variables se realizan automáticamente y sirven para controlar el envió de registros del lado del Servidor), una vez recibidos los registros solicitados por ListGrid este procede a solicitar los siguiente 15 registros modificando las variables “startRow=15” y “endRow=30” y así sucesivamente, esto se ve claramente en el video-guía.&lt;br /&gt;&lt;br /&gt;Ahora explicaremos algo del código fuente: “Blogspot.java”, en la línea&amp;nbsp; 27 se le dice a la Grilla que capture 15 registros por requerimiento, además en la línea 29 le decimos a la grilla que&amp;nbsp; auto capture la data conforme deslizamos la barra de desplazamiento. &lt;br /&gt;&lt;pre class="brush: java"&gt;/*&lt;br /&gt;*Codigo Fuente Blogspot.java&lt;br /&gt;*/&lt;br /&gt;public class Blogspot implements EntryPoint {&lt;br /&gt; &lt;br /&gt; public void onModuleLoad() {&lt;br /&gt;  &lt;br /&gt; DataSourceIntegerField id = new DataSourceIntegerField("id","id",20);&lt;br /&gt;    id.setPrimaryKey(true); &lt;br /&gt;    DataSourceTextField descripcion = new DataSourceTextField("descripcion");&lt;br /&gt;   &lt;br /&gt;    //preparamos para la captura de la data&lt;br /&gt;    OperationBinding fetch = new OperationBinding();&lt;br /&gt;    fetch.setOperationType(DSOperationType.FETCH);&lt;br /&gt;    fetch.setDataProtocol(DSProtocol.POSTPARAMS);&lt;br /&gt;    &lt;br /&gt;    RestDataSource data=new RestDataSource();  &lt;br /&gt;    data.setOperationBindings(fetch);&lt;br /&gt;    data.setDataFormat(DSDataFormat.JSON);&lt;br /&gt;    data.setFetchDataURL("fetch.php");&lt;br /&gt;    data.setFields(id,descripcion);&lt;br /&gt;    &lt;br /&gt;        ListGrid lg=new ListGrid();&lt;br /&gt;     lg.setCanFreezeFields(true);&lt;br /&gt;     lg.setHeight(200);&lt;br /&gt;     //capturamos 15 registros por pagina&lt;br /&gt;     lg.setDataPageSize(15);&lt;br /&gt;   &lt;br /&gt;     lg.setAutoFetchData(true);&lt;br /&gt;     lg.setDataSource(data);&lt;br /&gt;     lg.setShowAllRecords(false);&lt;br /&gt;     &lt;br /&gt;     RootPanel.get("idImgVertical").add(lg);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: php"&gt;/*&lt;br /&gt;* Codigo fuente de fetch.php&lt;br /&gt;*/&lt;br /&gt;$st=$_POST["_startRow"];&lt;br /&gt;$en=$_POST["_endRow"];&lt;br /&gt;&lt;br /&gt;$data=array();&lt;br /&gt;&lt;br /&gt;for($i=0;$i&amp;lt;15;$i++)&lt;br /&gt;{&lt;br /&gt; $data[$i]['id']=$st+$i;&lt;br /&gt; $data[$i]['descripcion']='descricion de :'.$i; &lt;br /&gt;}&lt;br /&gt;$mensaje=array();&lt;br /&gt;$mensaje['response']['status']=0;&lt;br /&gt;$mensaje['response']['startRow']=$st;&lt;br /&gt;$mensaje['response']['endRow']=$en;&lt;br /&gt;$mensaje['response']['totalRows']=5000;&lt;br /&gt;$mensaje['response']['data']=$data;&lt;br /&gt;&lt;br /&gt;echo json_encode($mensaje);&lt;br /&gt;&lt;/pre&gt;&lt;object height="505" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/iUmCixNcKLw&amp;amp;hl=es_ES&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/iUmCixNcKLw&amp;amp;hl=es_ES&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-2998124905969898549?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/2998124905969898549/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=2998124905969898549&amp;isPopup=true' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/2998124905969898549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/2998124905969898549'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2010/07/conociendo-la-grilla-de-smartgwt-parte.html' title='Conociendo la Grilla de SmartGWT (PARTE I)'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-7146496123016493760</id><published>2010-07-12T15:09:00.000-07:00</published><updated>2010-07-26T14:57:46.806-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='SmartGWT'/><title type='text'>Integrando jQuery, Gwt y Php</title><content type='html'>La idea de este Post no es realizar un &amp;nbsp;tutorial, sino una guía de introducción que permitan al programador de una manera rápida ver de qué trata el asunto. Al final se muestra un pequeño ejemplo junto con su respectivo video-guía de implementación para que cualquiera con algo de entusiasmo pueda realizarlo.&lt;br /&gt;&lt;br /&gt;La integración &amp;nbsp;de jQuery a GWT se consigue a través de JSNI(JavaScript Native Interfaze) y la integración de GWT con PHP lo realizaremos a través de RestDataSource (librería de SmartGWT).&lt;br /&gt;&lt;a href="http://www.scribd.com/doc/7470980/Refcardz-01-GWT-Style-Configuration-and-JSNI-Reference" style="display: block; font: 14px Helvetica,Arial,Sans-serif; margin: 12px auto 6px; text-decoration: underline;" title="View Refcardz #01: GWT Style, Configuration and JSNI Reference on Scribd"&gt;Lectura Obligada:  GWT Style, Configuration and JSNI Reference&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Introducción&lt;/b&gt;&lt;br /&gt;El JSNI nos brinda la posibilidad de utilizar métodos Java que contengan código JavaScript, estos métodos de Java deberán de tener el modificador &amp;nbsp;“native”, con este modificador le comunicamos al compilador que no valide su contenido. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Llamado métodos JavaScript de Java&lt;/b&gt;&lt;br /&gt;Llamar métodos JavaScript de Java es bastante sencillo, solo tienes que tener en cuenta los alias de los objetos JavaScript: &amp;nbsp;“window” y “document”, &amp;nbsp;que son: &amp;nbsp;“$wnd” y “$doc” respectivamente.&lt;br /&gt;&lt;pre class="brush: plain"&gt;//Capturamos la imagen snapshot del video&lt;br /&gt; public native String getImageUrl(String cad)/*-{ &lt;br /&gt;  //aca llamamos a JavaScript de Java&lt;br /&gt;  return $wnd.$.jYoutube(cad);  &lt;br /&gt; }-*/;&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Llamando métodos Java de JavaScript&lt;/b&gt;&lt;br /&gt;Llamar métodos Java de JavaScript implica el manejo de una sintaxis especial.&lt;br /&gt;&lt;pre class="brush: plain"&gt;[instance-expr.]@class-name::method-name(param-signature)(arguments)&lt;br /&gt;&lt;/pre&gt;La explicación de esta sintaxis la encuentran &amp;nbsp;&lt;a href="http://code.google.com/intl/es-ES/webtoolkit/doc/1.6/DevGuideCodingBasics.html#DevGuideJavaScriptNativeInterface"&gt;acá&lt;/a&gt;. (Para encontrar el “class-name” use el autocompletado &amp;nbsp;de Eclipse, y no se hagan tanto rollo con eso de “fully qualified name”).&lt;br /&gt;&lt;pre class="brush: plain"&gt;//Mostramos la imagen sin efecto &lt;br /&gt; public void ShowImage(String url)&lt;br /&gt; {&lt;br /&gt;  ImgPrincipal.setUrl(url);&lt;br /&gt; }&lt;br /&gt;  &lt;br /&gt;   //Ocultamos la imagen con efecto SLOW &lt;br /&gt; public native void HideImage(String url)/*-{ &lt;br /&gt;  var tempThis=this;  &lt;br /&gt;  $wnd.$("#idImgPrincipal").hide('slow',function(){          &lt;br /&gt;    //aca llamamos a Java de JavaScript&lt;br /&gt;    tempThis.@jsni.pck.client.Jsni::ShowImage(Ljava/lang/String;)(url);&lt;br /&gt;    $wnd.$("#idImgPrincipal").show('fast');&lt;br /&gt;  });    &lt;br /&gt; }-*/;&lt;br /&gt;&lt;/pre&gt;No está de más mencionar que “ShowImage” y “HideImage” pueden ser llamados desde cualquier parte de nuestra aplicación Java.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Pasando valores entre Java y JavaScript y viceversa&lt;/b&gt;&lt;br /&gt;Este tema no es complicado, pero en el documento del inicio del Post&lt;a href="http://www.scribd.com/doc/7470980/Refcardz-01-GWT-Style-Configuration-and-JSNI-Reference"&gt; &lt;/a&gt;hay una muy buena guía sobre este tema.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Integración con PHP&lt;/b&gt;&lt;br /&gt;Se puede utilizar la integración con php a través de RequestBuilder, pero nosotros utilizaremos RestDataSource que como verán en el ejemplo nos brinda la data ya formateada, de modo tal que su utilización se hace mucho más fácil; ya que, no tenemos que lidear con el formato JSON directamente.&lt;br /&gt;&lt;pre class="brush: java"&gt;//preparamos para la captura de la data&lt;br /&gt;  OperationBinding fetch = new OperationBinding();&lt;br /&gt;  fetch.setOperationType(DSOperationType.FETCH);&lt;br /&gt;  fetch.setDataProtocol(DSProtocol.POSTPARAMS);&lt;br /&gt;   &lt;br /&gt;  RestDataSource data=new RestDataSource();  &lt;br /&gt;  data.setOperationBindings(fetch);&lt;br /&gt;  data.setDataFormat(DSDataFormat.JSON);&lt;br /&gt;  data.setFetchDataURL("fetch.php");&lt;br /&gt;  //capturamos la data asincronamente&lt;br /&gt;  data.fetchData(null, new DSCallback(){&lt;br /&gt;   @Override&lt;br /&gt;   public void execute(DSResponse response, Object rawData,&lt;br /&gt;     DSRequest request) {&lt;br /&gt;     &lt;br /&gt;     OnExecuteFetch(response.getData());  &lt;br /&gt;   } &lt;br /&gt;  });&amp;nbsp;&lt;/pre&gt;&lt;b&gt;Integración con JQUERY&lt;/b&gt;&lt;br /&gt;La integración es bastante sencilla sola haga referencia a los scripts deseados&lt;br /&gt;&lt;pre class="brush: html"&gt;&lt;script language="javascript" src="jsni/jsni.nocache.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;    &lt;script language="javascript" src="scripts/jquery-1.4.2.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;    &lt;script language="javascript" src="scripts/jyoutube.min.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;El Ejemplo&lt;/b&gt;&lt;br /&gt;Normalmente los métodos de Jquery &amp;nbsp;tienen una función de Callback(Retrollamada) al concluir alguna operación :&lt;br /&gt;&lt;pre class="brush: plain"&gt;$('.tag').hide(“slow”,function(){&lt;br /&gt;  &lt;br /&gt;  alert(‘el tag fue ocultado’)&lt;br /&gt;&lt;br /&gt; });&lt;br /&gt;&lt;/pre&gt;La idea del ejemplo es mostrar como mediante JSNI podemos llamar al método “hide” y como implementar la función de Callback (Retrollamada) todo dentro de GWT.&lt;br /&gt;&lt;br /&gt;Ahora explicaremos algo del código fuente "Jsni.java". En la línea 9 el método “ShowImage” muestra una imagen dada una url, en la línea 16 el método “HideImage” oculta una imagen dada una url , para cumplir con su objetivo hace uso de Jquery con su método “hide” (creando el efecto de ocultamiento)que a su vez realiza una retrollamada (Callback) al ocultar la imagen, al ocultar la imagen lanza la nueva imagen por mostrar llamando al método “ShowImage”.&lt;br /&gt;&lt;br /&gt;La integración con PHP podemos verlo en la línea 83, donde se le brinda la ubicación de: “fetch.php”. La data se captura asíncronamente, una vez que la data llega al cliente se lanza el evento “OnExecuteFetch” (en la línea 90).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;//Codigo fuente Jsni.java&lt;br /&gt; &lt;br /&gt;public class Jsni implements EntryPoint {&lt;br /&gt;&lt;br /&gt; private  Image ImgPrincipal=null;&lt;br /&gt; private VerticalPanel ImgVertical=null;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;   //Mostramos la imagen sin efecto &lt;br /&gt; public void ShowImage(String url)&lt;br /&gt; {&lt;br /&gt;  ImgPrincipal.setUrl(url);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;   //Ocultamos la imagen con efecto SLOW &lt;br /&gt; public native void HideImage(String url)/*-{ &lt;br /&gt;  var tempThis=this;  &lt;br /&gt;  $wnd.$("#idImgPrincipal").hide('slow',function(){          &lt;br /&gt;    //aca llamamos a Java de JavaScript&lt;br /&gt;    tempThis.@jsni.pck.client.Jsni::ShowImage(Ljava/lang/String;)(url);&lt;br /&gt;    $wnd.$("#idImgPrincipal").show('fast');&lt;br /&gt;  });    &lt;br /&gt; }-*/;&lt;br /&gt; &lt;br /&gt;   //Capturamos la imagen snapshot del video&lt;br /&gt; public native String getImageUrl(String cad)/*-{ &lt;br /&gt;  //aca llamamos a JavaScript de Java&lt;br /&gt;  return $wnd.$.jYoutube(cad);  &lt;br /&gt; }-*/;&lt;br /&gt;&lt;br /&gt;   //Evento lanzado cuando se ejecuta la Fetch&lt;br /&gt; public void OnExecuteFetch(Record[] row)&lt;br /&gt; {&lt;br /&gt;  for(Record tempRow:row){&lt;br /&gt;   &lt;br /&gt;   final String url=tempRow.getAttributeAsString("url");&lt;br /&gt;   String titulo=tempRow.getAttributeAsString("titulo");&lt;br /&gt;   &lt;br /&gt;   HorizontalPanel hp=new HorizontalPanel();&lt;br /&gt;   Image img=new Image(getImageUrl(url));&lt;br /&gt;   img.setSize("50px", "50px");&lt;br /&gt;   &lt;br /&gt;   HTML label=new HTML(titulo);&lt;br /&gt;    label.addClickHandler(new ClickHandler(){ &lt;br /&gt;     @Override&lt;br /&gt;     public void onClick(ClickEvent event) {&lt;br /&gt;     &lt;br /&gt;      HideImage(getImageUrl(url));&lt;br /&gt;      &lt;br /&gt;     }});&lt;br /&gt;  &lt;br /&gt;   hp.add(img);&lt;br /&gt;   hp.add(label);&lt;br /&gt;   &lt;br /&gt;   ImgVertical.add(hp);&lt;br /&gt;  } &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;  // Enlaza los Widgets a la Interfaz &lt;br /&gt; public void EnlazaInterfaz()&lt;br /&gt; {&lt;br /&gt;  ImgPrincipal=new Image();&lt;br /&gt;  ImgPrincipal.setSize("250px", "250px");&lt;br /&gt;  &lt;br /&gt;  ImgVertical=new VerticalPanel();&lt;br /&gt;  &lt;br /&gt;  RootPanel.get("idImgPrincipal").add(ImgPrincipal);&lt;br /&gt;  RootPanel.get("idImgVertical").add(ImgVertical);&lt;br /&gt; }&lt;br /&gt; public void onModuleLoad() {&lt;br /&gt;  &lt;br /&gt;  //Enlazamos al HTML&lt;br /&gt;  EnlazaInterfaz();&lt;br /&gt;  &lt;br /&gt;  //preparamos para la captura de la data&lt;br /&gt;  OperationBinding fetch = new OperationBinding();&lt;br /&gt;  fetch.setOperationType(DSOperationType.FETCH);&lt;br /&gt;  fetch.setDataProtocol(DSProtocol.POSTPARAMS);&lt;br /&gt;  &lt;br /&gt;  RestDataSource data=new RestDataSource();  &lt;br /&gt;  data.setOperationBindings(fetch);&lt;br /&gt;  data.setDataFormat(DSDataFormat.JSON);&lt;br /&gt;  data.setFetchDataURL("fetch.php");&lt;br /&gt;  //capturamos la data asincronamente&lt;br /&gt;  data.fetchData(null, new DSCallback(){&lt;br /&gt;   @Override&lt;br /&gt;   public void execute(DSResponse response, Object rawData,&lt;br /&gt;     DSRequest request) {&lt;br /&gt;    &lt;br /&gt;     OnExecuteFetch(response.getData());  &lt;br /&gt;   } &lt;br /&gt;  }); &lt;br /&gt; &lt;br /&gt; }//end function&lt;br /&gt;}//end class&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: php"&gt;/*&lt;br /&gt;* Codigo fuente de fetch.php&lt;br /&gt;*/&lt;br /&gt;$data=array();&lt;br /&gt;$data[0]['id']=1;&lt;br /&gt;$data[0]['descripcion']='inaguracion en el año 3000';&lt;br /&gt;$data[0]['url']='http://www.youtube.com/watch?v=dz1GpyU6YKQ';&lt;br /&gt;$data[0]['titulo']='INAGURACION SAN FRANK';&lt;br /&gt;&lt;br /&gt;$data[1]['id']=2;&lt;br /&gt;$data[1]['descripcion']='inaguracion en el año 2009';&lt;br /&gt;$data[1]['url']='http://www.youtube.com/watch?v=9-FQly3ETP8';&lt;br /&gt;$data[1]['titulo']='INAGURACION SAN JOSE';&lt;br /&gt;&lt;br /&gt;$data[2]['id']=3;&lt;br /&gt;$data[2]['descripcion']='inaguracion en el año 2010';&lt;br /&gt;$data[2]['url']='http://www.youtube.com/watch?v=wqE4SdrIu1E';&lt;br /&gt;$data[2]['titulo']='INAGURACION SAN JUMANOR';&lt;br /&gt;&lt;br /&gt;$mensaje=array();&lt;br /&gt;$mensaje['response']['status']=0;&lt;br /&gt;$mensaje['response']['data']=$data;&lt;br /&gt;&lt;br /&gt;echo json_encode($mensaje);&lt;br /&gt;&lt;/pre&gt;Los Widgets serán enlazados a los ids: “idImgVertical” y  “idImgPrincipal”, como se muestra en el código fuente “Jsni.html”&lt;br /&gt;&lt;pre class="brush: html"&gt;&amp;lt;!--Codigo fuente Jsni.html--&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Aplicando JSNI con PHP&amp;lt;/h1&amp;gt;&amp;lt;table style="width: 605px;" border="1" height="343"&amp;gt;&amp;lt;tbody&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td height="160" width="166"&amp;gt;&amp;lt;div id="idImgVertical" style="height: 250px;"&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td width="127"&amp;gt;&amp;lt;/td&amp;gt;      &amp;lt;td width="290"&amp;gt;&amp;lt;div id="idImgPrincipal" style="height: 250px; width: 250px;"&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;   &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/tbody&amp;gt; &amp;lt;/table&amp;gt;&lt;br /&gt;&lt;/pre&gt;En este video-guía&amp;nbsp; se asume que ha creado un proyecto con el nombre “jsni” y paquete “jsni.pck”. Adicionalmente debe de tener instalado GWT 2.0.3 y SmartGWT 2.2. En la carpeta war del proyecto tendrá que crear una carpeta nombrándola como “Scripts” en donde deberá de colocar los archivos “JQuery&amp;nbsp; 1.4.2.js” y “JYouTube.js”.&lt;br /&gt;&lt;br /&gt;&lt;object height="505" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/1f91RplZP1g&amp;amp;hl=es_ES&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/1f91RplZP1g&amp;amp;hl=es_ES&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-7146496123016493760?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/7146496123016493760/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=7146496123016493760&amp;isPopup=true' title='9 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/7146496123016493760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/7146496123016493760'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2010/07/integrando-jquery-gwt-y-php.html' title='Integrando jQuery, Gwt y Php'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-658164095691037880</id><published>2010-06-26T18:43:00.000-07:00</published><updated>2010-06-26T18:55:36.950-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Maps'/><title type='text'>Primeros Pasos con Google Maps Api para GWT</title><content type='html'>Hoy tratare de mostrar un poco del Api de Google Maps para GWT, en realidad los ejemplos que vienen con la Api son bastante explicativos, pero acá mostrare un pequeño vistazo. El ejemplo que muestro lo realice íntegramente con GWT  nativo.  &lt;br /&gt;&lt;br /&gt;&lt;b&gt;¿Cómo muestro un mapa con Google Maps Api para GWT?&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Para insertar un mapa de Google Maps tienes que solicitar un&lt;a href="http://code.google.com/intl/es-ES/apis/maps/signup.html"&gt; API Key&lt;/a&gt; (solo si la aplicación se encuentra en un servidor público); sin embargo, podrás usar la Google Maps Api&amp;nbsp; sin necesidad de la API Key, siempre que ejecutes localmente (localhost). &lt;br /&gt;&lt;pre class="brush: java"&gt;/**** Codigo fuente GoogleMapsExample.java *****/&lt;br /&gt;public class GoogleMapsExample implements EntryPoint {&lt;br /&gt;&lt;br /&gt; public void onModuleLoad() {&lt;br /&gt;  /*&lt;br /&gt;   * En el primer parametro se debe de colocar&lt;br /&gt;   * el Api Key en caso sea necesario  &lt;br /&gt;  */&lt;br /&gt; Maps.loadMapsApi("", "2", false, new Runnable() {&lt;br /&gt;  public void run() {&lt;br /&gt;          buildUi();&lt;br /&gt;        }&lt;br /&gt;  });      &lt;br /&gt; }&lt;br /&gt; private void buildUi()&lt;br /&gt; {  &lt;br /&gt;  final MapWidget map = new MapWidget();&lt;br /&gt; map.setWidth("500px");&lt;br /&gt;  map.setHeight("500px");&lt;br /&gt; final LatLng coordenadas = LatLng.newInstance(-18.0376, -70.2506);&lt;br /&gt; //mostramos el mapa centrado con las coordenas (-18.0376, -70.2506)&lt;br /&gt; map.setCenter(coordenadas);&lt;br /&gt; //establecemos en nivel de zoom&lt;br /&gt; map.setZoomLevel(18);      &lt;br /&gt; RootPanel.get().add(map);    &lt;br /&gt; }&lt;br /&gt;}   &lt;br /&gt;&lt;/pre&gt;&lt;b&gt;¿Cómo añadir controles?&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Se pueden añadir muchos tipos de controles de zoom y navegación &lt;a href="http://code.google.com/intl/es-ES/apis/maps/documentation/javascript/v2/reference.html#GControlImpl"&gt;aquí &lt;/a&gt;la documentación.&lt;br /&gt;&lt;pre class="brush: java"&gt;private void buildUi()&lt;br /&gt; {&lt;br /&gt;  final MapWidget map = new MapWidget();&lt;br /&gt;  map.setWidth("500px");&lt;br /&gt;  map.setHeight("500px");&lt;br /&gt;  final LatLng coordenadas = LatLng.newInstance(-18.0376, -70.2506);&lt;br /&gt;  //mostramos el mapa centrado con las coordenas (-18.0376, -70.2506)&lt;br /&gt;  map.setCenter(coordenadas);&lt;br /&gt;  //establecemos en nivel de zoom&lt;br /&gt;  map.setZoomLevel(18);&lt;br /&gt;  //añadimos control selector de tipo de mapa&lt;br /&gt;  map.addControl(new MapTypeControl());&lt;br /&gt;  //añadimos control de desplazmiento con zoom&lt;br /&gt;  map.addControl(new LargeMapControl());&lt;br /&gt;  //añadimos control escala de mapa&lt;br /&gt;  map.addControl(new ScaleControl());&lt;br /&gt;  RootPanel.get().add(map);        &lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;¿Cómo cambiar el tipo de mapa y añadir marcas?&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Podemos escoger el tipo de mapa que deseamos (satelital, hibrido, normal, etc.), además de poder añadir marcar a nuestro mapa.&lt;br /&gt;&lt;pre class="brush: java"&gt;private void buildUi()&lt;br /&gt; {&lt;br /&gt;  final MapWidget map = new MapWidget();&lt;br /&gt;  map.setWidth("500px");&lt;br /&gt;  map.setHeight("500px");&lt;br /&gt;  final LatLng coordenadas = LatLng.newInstance(-18.0376, -70.2506);&lt;br /&gt;  //mostramos el mapa centrado con las coordenas (-18.0376, -70.2506)&lt;br /&gt;  map.setCenter(coordenadas);&lt;br /&gt;  //establecemos en nivel de zoom&lt;br /&gt;  map.setZoomLevel(18);&lt;br /&gt;  //añadimos control selector de tipo de mapa&lt;br /&gt;  map.addControl(new MapTypeControl());&lt;br /&gt;  //añadimos control de desplazamiento con zoom&lt;br /&gt;  map.addControl(new LargeMapControl());&lt;br /&gt;  //añadimos control escala de mapa&lt;br /&gt;  map.addControl(new ScaleControl());&lt;br /&gt;  //cambiamos a vista mapa satelital&lt;br /&gt;  map.setCurrentMapType(MapType.getSatelliteMap());&lt;br /&gt;  //creamos un marcador en la coordenadas (-18.0376, -70.2506)&lt;br /&gt;  Marker mrk=new Marker(coordenadas);&lt;br /&gt;  map.addOverlay(mrk);&lt;br /&gt;  RootPanel.get().add(map);        &lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;¿Cómo lanzar una Ventana de Información (InfoWindow) al hacer un click sobre un Marcador?&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Al hacer un click sobre un Marcador se puede levantar una Ventana de Información que viene por defecto; sin embargo, esta Ventana de Información puede contener contenido html como Widgets.&lt;br /&gt;&lt;pre class="brush: java"&gt;private void buildUi()&lt;br /&gt;&lt;br /&gt; {&lt;br /&gt;&lt;br /&gt;  final MapWidget map = new MapWidget();&lt;br /&gt;&lt;br /&gt;  map.setWidth("500px");&lt;br /&gt;&lt;br /&gt;  map.setHeight("500px");&lt;br /&gt;&lt;br /&gt;  final LatLng coordenadas = LatLng.newInstance(-18.0376, -70.2506);&lt;br /&gt;&lt;br /&gt;  //mostramos el mapa centrado con las coordenas (-18.0376, -70.2506)&lt;br /&gt;&lt;br /&gt;  map.setCenter(coordenadas);&lt;br /&gt;&lt;br /&gt;  //establecemos en nivel de zoom&lt;br /&gt;&lt;br /&gt;  map.setZoomLevel(18);&lt;br /&gt;&lt;br /&gt;  //añadimos control selector de tipo de mapa&lt;br /&gt;&lt;br /&gt;  map.addControl(new MapTypeControl());&lt;br /&gt;&lt;br /&gt;  //añadimos control de desplazamiento con zoom&lt;br /&gt;&lt;br /&gt;  map.addControl(new LargeMapControl());&lt;br /&gt;&lt;br /&gt;  //añadimos control escala de mapa&lt;br /&gt;&lt;br /&gt;  map.addControl(new ScaleControl());&lt;br /&gt;&lt;br /&gt;  //cambiamos a vista mapa satelital&lt;br /&gt;&lt;br /&gt;  map.setCurrentMapType(MapType.getSatelliteMap());&lt;br /&gt;&lt;br /&gt;  //creamos un marcador en la coordenadas (-18.0376, -70.2506)&lt;br /&gt;&lt;br /&gt;  final Marker mrk=new Marker(coordenadas);&lt;br /&gt;&lt;br /&gt;  map.addOverlay(mrk);  &lt;br /&gt;&lt;br /&gt;  mrk.addMarkerClickHandler(new MarkerClickHandler(){&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;&lt;br /&gt;   public void onClick(MarkerClickEvent event) {&lt;br /&gt;&lt;br /&gt;    //Widget en InfoWindow Normal&lt;br /&gt;&lt;br /&gt;    Image img=new Image();&lt;br /&gt;&lt;br /&gt;    img.setUrl("http://lh6.ggpht.com/_oxEB1W000Zc/S5sCOsecjdI/AAAAAAAAAGg/_CDb-vUE7gs/s800/13%20DE%20SET.%20%20PLAZA%20ATMAT.JPG");&lt;br /&gt;&lt;br /&gt;    img.setWidth("235px");&lt;br /&gt;&lt;br /&gt;    img.setHeight("267px");&lt;br /&gt;&lt;br /&gt;    //Widget en InfoWindow Maximizado&lt;br /&gt;&lt;br /&gt;    HTML video= new HTML("&amp;lt;object width='180' height='160'&amp;gt;&amp;lt;param name='movie' value='http://www.youtube.com/v/8qp_VSmV17I&amp;amp;hl=es_ES&amp;amp;fs=1&amp;amp;rel=0'&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;param name='allowFullScreen' value='true'&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;param name='allowscriptaccess' value='always'&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;embed src='http://www.youtube.com/v/8qp_VSmV17I&amp;amp;hl=es_ES&amp;amp;fs=1&amp;amp;rel=0' type='application/x-shockwave-flash' allowscriptaccess='always' allowfullscreen='false' width='180' height='160'&amp;gt;&amp;lt;/embed&amp;gt;&amp;lt;/object&amp;gt;");&lt;br /&gt;&lt;br /&gt;    HTML album= new HTML("&amp;lt;embed type='application/x-shockwave-flash' src='http://picasaweb.google.com/s/c/bin/slideshow.swf' width='180' height='160' flashvars='host=picasaweb.google.com&amp;amp;hl=es&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FVictorCabreraZolla%2Falbumid%2F5447950544182068785%3Falt%3Drss%26kind%3Dphoto%26hl%3Des' pluginspage='http://www.macromedia.com/go/getflashplayer'&amp;gt;&amp;lt;/embed&amp;gt;");    &lt;br /&gt;&lt;br /&gt;    HorizontalPanel hp=new HorizontalPanel();&lt;br /&gt;&lt;br /&gt;    hp.setSpacing(20);&lt;br /&gt;&lt;br /&gt;    VerticalPanel vp=new VerticalPanel();&lt;br /&gt;&lt;br /&gt;    vp.add(new HTML("video"));&lt;br /&gt;&lt;br /&gt;    vp.add(video);&lt;br /&gt;&lt;br /&gt;    vp.add(new HTML("diapositiva"));&lt;br /&gt;&lt;br /&gt;    vp.add(album);&lt;br /&gt;&lt;br /&gt;    hp.add(new HTML("&amp;lt;p style=\"text-align: justify;\"&amp;gt;Este parque se construyo como un esfuerzo mancomunado del Sr. Alcalde&amp;nbsp;&amp;nbsp;Jorge Jumanor&amp;nbsp;&amp;nbsp;con los vecinos, haciendo realidad un sueño muchas veces&amp;nbsp;&amp;nbsp;postergado por las anteriores autoridadede de Turno&amp;lt;/p&amp;gt;&amp;lt;p style=\"text-align: justify;\"&amp;gt;La Obra se empezo&amp;nbsp;&amp;nbsp;a contruir a inicios del año 2009 culminandose satisfactoriamente a&amp;nbsp;&amp;nbsp;mediados del&amp;nbsp;&amp;nbsp;2009 en el aniversario del Distrito Gregorio&amp;nbsp;&amp;nbsp;Albarracion&amp;nbsp;&amp;nbsp;Lanchipa&amp;lt;/p&amp;gt;"));&lt;br /&gt;&lt;br /&gt;    hp.add(vp);&lt;br /&gt;&lt;br /&gt;    //creamos la Ventana de Informacion&lt;br /&gt;&lt;br /&gt;    InfoWindowContent info=new InfoWindowContent(img);    &lt;br /&gt;&lt;br /&gt;    info.setMaxTitle("Parque Perez Gamboa");&lt;br /&gt;&lt;br /&gt;    info.setMaxContent(hp);&lt;br /&gt;&lt;br /&gt;    map.getInfoWindow().open(mrk.getLatLng(),info);&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;  }); &lt;br /&gt;&lt;br /&gt;  RootPanel.get().add(map);        &lt;br /&gt;&lt;br /&gt; } &lt;br /&gt;&lt;/pre&gt;&amp;nbsp;En en siguiente video se muestra la ejecución del ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;object height="505" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/JzJGbLhW6c8&amp;hl=es_ES&amp;fs=1&amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/JzJGbLhW6c8&amp;hl=es_ES&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-658164095691037880?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/658164095691037880/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=658164095691037880&amp;isPopup=true' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/658164095691037880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/658164095691037880'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2010/06/primeros-pasos-con-google-maps-api-para.html' title='Primeros Pasos con Google Maps Api para GWT'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-6662515009165436889</id><published>2010-06-19T16:06:00.000-07:00</published><updated>2010-06-28T10:35:44.951-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='SmartGWT'/><title type='text'>Cómo integrar SmartGWT con PHP usando DataSource?</title><content type='html'>SmartGwt no es otro tradicional framework Ajax que solo presenta y muestra datos via XML/Json u otro mecanismo (de estos hay bastantes!!!).&amp;nbsp; SmartGwt fue concebido para la administración del estado del lado del cliente y la propagación de cambios en el servidor. Por ejemplo, cuando tenemos varias grillas mostrando datos de una tabla y hemos añadido un registro por medio de un formulario, en ese instante deben de actualizarse las grillas automáticamente. Lo anterior se consigue con un mecanismo denominado databinding, lo cual significa que todas las grillas(widgets) se han enlazado al DataSource. Todas las operaciones CRUD se reflejaran automáticamente a todos los widgets enlazados.&lt;br /&gt;A continuación implementaremos un ejemplo bastante básico de como SmartGwt se integra con PHP:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;/*&lt;br /&gt;* Codigo fuente de DataSourceCountry.java&lt;br /&gt;*/&lt;br /&gt;public class DataSourceCountry extends RestDataSource{&lt;br /&gt;&lt;br /&gt; private static DataSourceCountry instance = null;    &lt;br /&gt; &lt;br /&gt; public static DataSourceCountry getInstance() {  &lt;br /&gt;       &lt;br /&gt;     if (instance == null) {  &lt;br /&gt;            &lt;br /&gt;            instance = new DataSourceCountry();&lt;br /&gt;            &lt;br /&gt;        }  &lt;br /&gt;        return instance;  &lt;br /&gt;    }//fin de funcion&lt;br /&gt; static void AddData(Record record)&lt;br /&gt;    {&lt;br /&gt;     instance.addData(record);   &lt;br /&gt;    }//fin de funcion &lt;br /&gt;    static void RemoveData(Record record)&lt;br /&gt;    {&lt;br /&gt;     instance.removeData(record);     &lt;br /&gt;    }//fin de funcion&lt;br /&gt;//public DataSourceCountry() Corregido por el amigo anonimo&lt;br /&gt;    private DataSourceCountry()&lt;br /&gt;    {&lt;br /&gt;      DataSourceIntegerField id = new DataSourceIntegerField("id", "CATEGORIA ID"); &lt;br /&gt;   id.setPrimaryKey(true);  &lt;br /&gt;   &lt;br /&gt;   DataSourceTextField idcategoria = new DataSourceTextField("idcategoria", "PERTENECE A");  &lt;br /&gt;   idcategoria.setForeignKey("id");  &lt;br /&gt;   idcategoria.setRootValue("");  &lt;br /&gt; &lt;br /&gt;   DataSourceTextField descripcion = new DataSourceTextField("descripcion", "DESCRIPCION");   &lt;br /&gt;   DataSourceTextField categoria = new DataSourceTextField("categoria", "CATEGORIA");&lt;br /&gt;&lt;br /&gt;   this.setFields(id,idcategoria,descripcion,categoria);  &lt;br /&gt;   &lt;br /&gt;   OperationBinding fetch = new OperationBinding();&lt;br /&gt;   fetch.setOperationType(DSOperationType.FETCH);&lt;br /&gt;   fetch.setDataProtocol(DSProtocol.POSTPARAMS);&lt;br /&gt;   &lt;br /&gt;   OperationBinding add = new OperationBinding();&lt;br /&gt;   add.setOperationType(DSOperationType.ADD);&lt;br /&gt;   add.setDataProtocol(DSProtocol.POSTPARAMS);&lt;br /&gt;           &lt;br /&gt;   OperationBinding remove = new OperationBinding();&lt;br /&gt;   remove.setOperationType(DSOperationType.REMOVE);&lt;br /&gt;   remove.setDataProtocol(DSProtocol.POSTPARAMS);&lt;br /&gt;            &lt;br /&gt;   this.setOperationBindings(fetch,add,remove);&lt;br /&gt;   this.setDataFormat(DSDataFormat.JSON); &lt;br /&gt;  &lt;br /&gt;   this.setFetchDataURL("fetch.php");  //integracion con PHP&lt;br /&gt;   this.setAddDataURL("add.php");      //integracion con PHP&lt;br /&gt;   this.setRemoveDataURL("remove.php");//integracion con PHP&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: php"&gt;&amp;lt;?php&lt;br /&gt;/*&lt;br /&gt;* Codigo fuente de fetch.php&lt;br /&gt;*/&lt;br /&gt;$data=array();&lt;br /&gt;$data[0]['id']=1;&lt;br /&gt;$data[0]['descripcion']='descripcin plazas';&lt;br /&gt;$data[0]['categoria']='plazas';&lt;br /&gt;$data[0]['idcategoria']='';&lt;br /&gt;&lt;br /&gt;$data[1]['id']=2;&lt;br /&gt;$data[1]['descripcion']='descripcin comedores';&lt;br /&gt;$data[1]['categoria']='comedores';&lt;br /&gt;$data[1]['idcategoria']='';&lt;br /&gt;&lt;br /&gt;$mensaje=array();&lt;br /&gt;$mensaje['response']['status']=0;&lt;br /&gt;$mensaje['response']['data']=$data;&lt;br /&gt;&lt;br /&gt;echo json_encode($mensaje);&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;En el archivo "remove.php" podemos notar que al remover un registro el DataSource envía el "id" del registro a eliminar, entonces el Servidor debe de responder con el "id" y un "status=0".&lt;br /&gt;&lt;pre class="brush: php"&gt;&amp;lt;?php&lt;br /&gt;/*&lt;br /&gt;* Codigo fuente de remove.php&lt;br /&gt;*/&lt;br /&gt;$data=array();&lt;br /&gt;$data[0]['id']=$_POST['id'];&lt;br /&gt;&lt;br /&gt;$mensaje=array();&lt;br /&gt;$mensaje['response']['status']=0;&lt;br /&gt;$mensaje['response']['data']=$data;&lt;br /&gt;&lt;br /&gt;echo json_encode($mensaje);&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;En el archivo "add.php" el DataSource envía el campo "descripción" y "categoria" enseguida el Servidor le devuelve los campos pero aumentando los campos "id" y "idcategoria".&lt;br /&gt;&lt;pre class="brush: php"&gt;&amp;lt;?php&lt;br /&gt;/*&lt;br /&gt;* Codigo fuente de add.php&lt;br /&gt;*/&lt;br /&gt;$data=array();&lt;br /&gt;$data[0]['id']=3;&lt;br /&gt;$data[0]['descripcion']=$_POST['descripcion'];&lt;br /&gt;$data[0]['categoria']=$_POST['categoria'];&lt;br /&gt;$data[0]['idcategoria']='';&lt;br /&gt;&lt;br /&gt;$mensaje=array();&lt;br /&gt;$mensaje['response']['status']=0;&lt;br /&gt;$mensaje['response']['data']=$data;&lt;br /&gt;&lt;br /&gt;echo json_encode($mensaje);&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;Explicare un poco el archivo "Probandatasource.java". En la linea 21,37,41 realizamos el databinding con el DataSource con los Widgets TreeGrid,ListGrid y SelectItem respectivamente. En la linea 50 creamos un registro y lo enviamos al DataSource (al pulsar el botón añadir). En la linea 65 capturamos el "id" del registro seleccionado y lo enviamos al DataSource(al pulsar el botón eliminar)&lt;br /&gt;&lt;pre class="brush: java"&gt;/*&lt;br /&gt;* Codigo fuente de Probandodatasource.java&lt;br /&gt;*/&lt;br /&gt;public class Probandodatasource implements EntryPoint {&lt;br /&gt;&lt;br /&gt; public void onModuleLoad() {&lt;br /&gt;  final TreeGrid  countryGrid = new TreeGrid ();&lt;br /&gt;        countryGrid.setCanFreezeFields(true);         &lt;br /&gt;        countryGrid.setWidth("100%");  &lt;br /&gt;        countryGrid.setHeight("100%");  &lt;br /&gt;        countryGrid.setShowAllRecords(true);&lt;br /&gt;        countryGrid.setLoadDataOnDemand(false);&lt;br /&gt;       &lt;br /&gt;        TreeGridField  descripcion = new TreeGridField ("descripcion", "Descripcion", 200);  &lt;br /&gt;        TreeGridField  categoria = new TreeGridField ("categoria", "Categoria",200);  &lt;br /&gt;  &lt;br /&gt;        countryGrid.setFields(categoria, descripcion);  &lt;br /&gt;        countryGrid.setCanResizeFields(true); &lt;br /&gt;        countryGrid.setAutoFetchData(true);&lt;br /&gt;&lt;br /&gt;        countryGrid.setDataSource(DataSourceCountry.getInstance());&lt;br /&gt;         &lt;br /&gt;        final ListGrid  countryGridList = new ListGrid ();&lt;br /&gt;        countryGridList.setCanFreezeFields(true);         &lt;br /&gt;        countryGridList.setWidth("100%");  &lt;br /&gt;        countryGridList.setHeight("100%");  &lt;br /&gt;        countryGridList.setShowAllRecords(true);&lt;br /&gt;        //countryGridList.setLoadDataOnDemand(false);&lt;br /&gt;       &lt;br /&gt;        ListGridField  descripcionList = new ListGridField ("descripcion", "Descripcion", 200);  &lt;br /&gt;        ListGridField  categoriaList = new ListGridField ("categoria", "Categoria",200);  &lt;br /&gt;  &lt;br /&gt;        countryGridList.setFields(categoriaList, descripcionList);  &lt;br /&gt;        countryGridList.setCanResizeFields(true); &lt;br /&gt;        countryGridList.setAutoFetchData(true);&lt;br /&gt;&lt;br /&gt;        countryGridList.setDataSource(DataSourceCountry.getInstance());&lt;br /&gt;        &lt;br /&gt;        final SelectItem combobox = new SelectItem("ComboBox");  &lt;br /&gt;    combobox.setWidth(240);  &lt;br /&gt;    combobox.setOptionDataSource(DataSourceCountry.getInstance());  &lt;br /&gt;    combobox.setDisplayField("categoria");  &lt;br /&gt;    combobox.setPickListWidth(450);  &lt;br /&gt;    combobox.setPickListFields(categoriaList, descripcionList); &lt;br /&gt;        &lt;br /&gt; &lt;br /&gt;        IButton btnAnadir=new IButton("Añadir");&lt;br /&gt;        btnAnadir.addClickHandler(new ClickHandler(){&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   public void onClick(ClickEvent event) {&lt;br /&gt;    ListGridRecord rec = new ListGridRecord();    &lt;br /&gt;    rec.setAttribute("idcategoria","");                          &lt;br /&gt;                                rec.setAttribute("descripcion","descripcion de jardines");  &lt;br /&gt;                                rec.setAttribute("categoria","jardines");  &lt;br /&gt;    &lt;br /&gt;    DataSourceCountry.AddData(rec);&lt;br /&gt;   }&lt;br /&gt;         &lt;br /&gt;        });&lt;br /&gt;        &lt;br /&gt;        IButton btnRemove=new IButton("Remover");&lt;br /&gt;        btnRemove.addClickHandler(new ClickHandler(){&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   public void onClick(ClickEvent event) {&lt;br /&gt;    ListGridRecord id=countryGrid.getSelectedRecord();&lt;br /&gt;    &lt;br /&gt;    DataSourceCountry.RemoveData(id);&lt;br /&gt;    }&lt;br /&gt;         &lt;br /&gt;        });&lt;br /&gt;        &lt;br /&gt;        VLayout vl=new VLayout();&lt;br /&gt;        vl.setWidth100();&lt;br /&gt;        vl.setHeight100();&lt;br /&gt;        vl.addMember(countryGrid);&lt;br /&gt;        vl.addMember(countryGridList);&lt;br /&gt;        &lt;br /&gt;        DynamicForm df=new DynamicForm();&lt;br /&gt;        df.setItems(combobox);&lt;br /&gt;        vl.addMember(df);&lt;br /&gt;        &lt;br /&gt;        vl.addMember(btnAnadir);&lt;br /&gt;        vl.addMember(btnRemove);&lt;br /&gt;        vl.draw();&lt;br /&gt;        &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;La implementación de este pequeñísimo ejemplo lo pueden ver en el video, cabe mencionar que copio y pego el código fuente de este blog a Eclipse; tal que, cualquiera con algo de entusiasmo y ganas lo pueda ejecutar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="505" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/BMYxM9SrdS8&amp;hl=es_ES&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/BMYxM9SrdS8&amp;hl=es_ES&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Nota: &lt;/i&gt;&lt;/b&gt;&lt;i&gt;Tengo la terrible costumbre de enfocarme en el &lt;b&gt;funcionamiento&lt;/b&gt;, en lo próximos posts tratare de hacer ejemplos mucho mas estéticos!&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-6662515009165436889?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/6662515009165436889/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=6662515009165436889&amp;isPopup=true' title='18 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/6662515009165436889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/6662515009165436889'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2010/06/como-integrar-smartgwt-con-php-usando.html' title='Cómo integrar SmartGWT con PHP usando DataSource?'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-9081854728401241641</id><published>2010-05-29T09:48:00.000-07:00</published><updated>2011-12-08T20:44:57.375-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='depuracion'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Ejecutar y Depurar GWT sobre el Servidor Web Apache (PHP) con Eclipse</title><content type='html'>Compilar GWT 2.0.3 toma un tiempo que no es despreciable (bastante tiempo, para los que venimos de aplicaciones de escritorio), además de no poder depurar la aplicación (del lado del cliente) .GWT permite depurar tu aplicación del lado del cliente aun cuando la aplicación del lado del servidor este corriente sobre el Servidor Web Apache.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Debes crear un host virtual (&lt;a href="http://www.bithoy.com/index.php/servidor-http-apache/71-virtual-host-en-apache-22" target="_blank"&gt;aca esta el como&lt;/a&gt;) en mi caso cree “http://prublogspot” que direcciona a la carpeta ”war” que tiene como ruta “D:\workspace_jumanor\prublogspot\war”, esta carpeta es la que me genera por defecto al crear un proyecto GWT con Eclipse.&lt;/li&gt;&lt;li&gt;En la carpeta “war” deberan de ubicarse los archivos php en mi caso: "data.php".&lt;/li&gt;&lt;li&gt;En Eclipse no dirigimos a “Run-&amp;gt;Run Configuration” luego a la opción “Arguments” y modificamos “-startupUrl” y agregamos “-noserver” quedando asi:&lt;/li&gt;&lt;pre class="brush: java"&gt;-remoteUI "${gwt_remote_ui_server_port}:${unique_id}" &lt;br /&gt;-startupUrl http://prublogspot/Prublogspot.html&lt;br /&gt;-logLevel INFO &lt;br /&gt;-war D:\workspace_jumanor\prublogspot\war prublogspot.pck.Prublogspot &lt;br /&gt;-noserver prublogspot.pck.Prublogspot&lt;br /&gt;&lt;/pre&gt;&lt;li&gt;Del mismo modo “Run-&amp;gt;Debug Configuration” luego a la opción “Arguments” y modificamos como en el paso anterior.&lt;/li&gt;&lt;/ol&gt;Para probar el funcionamiento ejecutamos un codigo similar al siguiente:&lt;br /&gt;&lt;pre class="brush: java"&gt;try{ &lt;br /&gt;  RequestBuilder req= new RequestBuilder(RequestBuilder.POST, URL.encode("http://prublogspost/data.php");&lt;br /&gt;  req.setHeader("Content-Type", "application/x-www-form-urlencoded"); &lt;br /&gt;  req.sendRequest(null, new RequestCallback()&lt;br /&gt;  {&lt;br /&gt;   @Override&lt;br /&gt;   public void onError(Request request, Throwable exception)&lt;br /&gt;   {&lt;br /&gt;    Window.alert("Error en Requerimiento");&lt;br /&gt;   }&lt;br /&gt;   @Override&lt;br /&gt;   public void onResponseReceived(Request request, Response response)&lt;br /&gt;   {&lt;br /&gt;    Window.alert(response.getText());&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;catch(RequestException e)&lt;br /&gt;{ &lt;br /&gt; Window.alert("Exception");&lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ahora solo queda depurar la Aplicación!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-9081854728401241641?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/9081854728401241641/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=9081854728401241641&amp;isPopup=true' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/9081854728401241641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/9081854728401241641'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2010/05/ejecutar-y-depurar-gwt-sobre-el.html' title='Ejecutar y Depurar GWT sobre el Servidor Web Apache (PHP) con Eclipse'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-2051439296317064658</id><published>2010-05-25T12:03:00.000-07:00</published><updated>2010-05-26T07:00:35.043-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='SmartGWT'/><title type='text'>GWT, un primer vistazo con SmartGWT</title><content type='html'>&lt;div class="MsoNormal"&gt;En este Post mostrare un sencillo(básico) ejemplo utilizando &lt;a href="http://es.wikipedia.org/wiki/GWT"&gt;GWT&lt;/a&gt; (Google Web Toolkit) específicamente &lt;a href="http://www.smartclient.com/smartgwt/showcase/#grid_cell_widgets"&gt;SmartGWT &lt;/a&gt;todo sobre el IDE de Eclipse. SmartGWT &amp;nbsp;me ha dejado hasta el momento satisfecho pero aun no lo ponga al límite. GWT es una idea maravillosa que aquí muestro para que se animen a probarlo. La curva de aprendizaje toma su tiempo, pero tenemos una extensa y sustanciosa documentación.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;object height="505" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/PGclMpUbmeQ&amp;hl=es_ES&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/PGclMpUbmeQ&amp;hl=es_ES&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;La idea del video es hacer la migración de &lt;a href="http://jumanor.blogspot.com/2009/12/dhtmlx-en-accion.html"&gt;DHTMLX &lt;/a&gt;a GWT. &lt;i&gt;Quisiera que noten como se separa la&amp;nbsp;lógica&amp;nbsp;de cada&amp;nbsp;opción&amp;nbsp;del&amp;nbsp;menú&amp;nbsp;en una forma&amp;nbsp;decente, osea en Clases (PrimeroMenu, SegundoMenu, TercerMenu),&amp;nbsp;&lt;/i&gt;todos los que viene de programar Aplicaciones de Escritorio saltaran de&amp;nbsp;alegría, hacer eso con Javascript&amp;nbsp;suponía&amp;nbsp;una complejidad enorme(no soy experto en Javascript ), y desde luego&amp;nbsp;acá&amp;nbsp;si&amp;nbsp;podrán&amp;nbsp;hacer las Pruebas Unitarias con todo las consecuencias positivas de su uso.&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;br /&gt;En los siguientes Posts iré contando como GWT se fusiona con PHP y desde luego con Doctrine ORM.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Nota: Edite el archivo "Prublogspot.html" para que desaparezca esa aparente marca de agua.&amp;nbsp;&lt;a href="http://jumanor.webcindario.com/smartgwt/prublogspot.rar"&gt;Acá&amp;nbsp;&lt;/a&gt;les dejo el&amp;nbsp;código&amp;nbsp;fuente de la&amp;nbsp;aplicación&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-2051439296317064658?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/2051439296317064658/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=2051439296317064658&amp;isPopup=true' title='9 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/2051439296317064658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/2051439296317064658'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2010/05/gwt-un-primer-vistazo-con-smartgwt.html' title='GWT, un primer vistazo con SmartGWT'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-9081243236848119409</id><published>2010-04-09T10:32:00.000-07:00</published><updated>2010-04-10T14:31:49.880-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Windows Communication Foundation una Vision Practica</title><content type='html'>En este pequeño ejemplo mostraremos como se consume un servicio WCF  el libro de referencia que estoy utilizando es “Microsoft&amp;nbsp; .NET  Framework 3.5 Windows Communication Foundation” del kit de  entrenamiento, hay bastante teoría sobre este tema pero mi intención es  mostrar la parte practica del asunto (mas que practica diria incentivadora!!! ).&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Primero crearemos una clase en c# le agregaremos algunas atributos  ([servicecontract],[operationcontract], entre otros) y esta clase ya es  un servicio.&lt;/li&gt;&lt;li&gt;&amp;nbsp;Este servicio debe estar alojado en algún lugar, para que el  cliente pueda consumir el servicio.&amp;nbsp; Hay varias formas de hospedar un  servicio, yo usare la más sencilla que es utilizando una aplicación de  consola (normalmente utilizado en la fase de desarrollo), acá caí la  primera vez y se explicara con mayor detenimiento en las próximas  entradas!!!&lt;/li&gt;&lt;li&gt;&amp;nbsp;El Cliente tiene que consumir el servicio (mediante clases  proxyes) .NET hace el consumo de un servicio extremadamente sencillo  sola haciendo uso de una sencilla referencia al servicio y listo  utilizamos un servicio como de una clase se tratara.&lt;/li&gt;&lt;/ol&gt;Debido que explicar esto en modo texto sería bastante complicado; ya  que,&amp;nbsp; hago uso intensivo de las herramientas que me proporciona Visual  Studio es que he decido colocarlo en un video este primer ejemplo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="505" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/85Ax8w3fZ_U&amp;hl=es_ES&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/85Ax8w3fZ_U&amp;hl=es_ES&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Bueno tengo en mi libreria digital los siguiente libros electronicos WCF:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="b24-booktitle"&gt;"Inside Microsoft Windows  Communication  Foundation", Justin Smith, Ed. Microsoft Press.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="b24-booktitle"&gt;"Microsoft .NET Framework 3.5 Windows Communication Foundation (MCTS 70-503 Training Kit)"&lt;/span&gt;&lt;span class="b24-booktitle"&gt;, Ed. Microsoft Press.&lt;/span&gt;&lt;span class="b24-booktitle"&gt;&amp;nbsp; &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="b24-booktitle"&gt;&amp;nbsp;&lt;/span&gt;"Essential Windows Communication Foundation", Steve Resnick,Richard Crane, Ed. Addison Wesley&lt;/li&gt;&lt;li&gt;"Pro WCF: Practical Microsoft SOA Implementation", Chris Peiris and Dennis Mulder, Ed. Apress&lt;/li&gt;&lt;li&gt;"Microsoft Windows Communication Foundation Step by Step", Jhon Sharp, Ed. Microsoft Press.&lt;/li&gt;&lt;li&gt;"Windows Communication Foundation Unleashed", Craig McMurty, Marc Mercuri, Nigel Waitling Matt Winklet, Ed. Sams Publishing.&lt;/li&gt;&lt;li&gt;"Programming WCF Services". Juval Lowy, Ed. O'Really.&lt;/li&gt;&lt;li&gt;"Professional WCF Programming: .NET Development with the Windows Communication Foundation", Scott Klein, Ed. Wiley Publishing, Inc.&lt;/li&gt;&lt;li&gt;"Microsoft Windows Communication Foundation Hand On Beta Edition", Craig McMurty, Marc Mercuri, Nigel Watling, Ed. Sams&lt;/li&gt;&lt;/ol&gt;Desde luego que si necesitan alguno solo enviar a mi e-mail el respectivo requerimiento.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-9081243236848119409?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/9081243236848119409/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=9081243236848119409&amp;isPopup=true' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/9081243236848119409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/9081243236848119409'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2010/04/windows-communication-foundation.html' title='Windows Communication Foundation una Vision Practica'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-2688508718624575987</id><published>2010-02-03T15:07:00.000-08:00</published><updated>2010-05-29T21:08:23.682-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Doctrine ORM'/><category scheme='http://www.blogger.com/atom/ns#' term='multiples modelos'/><title type='text'>Cargar múltiples modelos con Doctrine</title><content type='html'>Doctrine nos brinda la posibilidad de partir nuestro “modelo” en varios “sub-modelos” consiguiente con esto separar la lógica del negocio.&lt;br /&gt;&lt;pre class="brush: php"&gt;/******** Archivo bootstrap.php **********************/&lt;br /&gt;require_once(dirname(__FILE__) . '/doctrine-1.2.1/Doctrine.php');&lt;br /&gt;spl_autoload_register(array('Doctrine', 'autoload'));&lt;br /&gt;&lt;br /&gt;$pathmodels=array();&lt;br /&gt;array_push($pathmodels,dirname(__FILE__)."/models/cayetano");&lt;br /&gt;array_push($pathmodels,dirname(__FILE__)."/models/plantillas");&lt;br /&gt;&lt;br /&gt;Doctrine::loadModels($pathmodels);&lt;br /&gt;&lt;br /&gt;$dsn = 'pgsql:dbname=cayetano;host=127.0.0.1';&lt;br /&gt;$user='postgres';&lt;br /&gt;$password='123456';&lt;br /&gt;&lt;br /&gt;//$dbh = new PDO($dsn, $user, $password);&lt;br /&gt;$conn = Doctrine_Manager::connection(array($dsn, $user, $password));&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;En el ejemplo anterior dentro de la carpeta "models” se ha creado la carpeta “cayetano” y la carpeta “plantillas”.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-2688508718624575987?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/2688508718624575987/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=2688508718624575987&amp;isPopup=true' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/2688508718624575987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/2688508718624575987'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2010/02/cargar-multiples-modelos-con-doctrine.html' title='Cargar múltiples modelos con Doctrine'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-3473195289989082309</id><published>2010-02-02T10:12:00.000-08:00</published><updated>2010-05-29T21:07:49.967-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='multiples base de datos'/><category scheme='http://www.blogger.com/atom/ns#' term='Doctrine ORM'/><category scheme='http://www.blogger.com/atom/ns#' term='multiple acceso'/><category scheme='http://www.blogger.com/atom/ns#' term='mutiples conexiones'/><title type='text'>Multiples Base de Datos con Doctrine</title><content type='html'>Cuando queremos intercambiar la conexión entre dos o más base de datos en la misma aplicación, lo podemos realizar modificando el archivo bootstrap.php:&lt;br /&gt;&lt;pre class="brush: php"&gt;/************** Archivo bootstrap.php **********************/&lt;br /&gt;require_once(dirname(__FILE__) . '/doctrine-1.2.1/Doctrine.php');&lt;br /&gt;spl_autoload_register(array('Doctrine', 'autoload'));&lt;br /&gt;&lt;br /&gt;Doctrine::loadModels('models');&lt;br /&gt;&lt;br /&gt;$manager = Doctrine_Manager::getInstance();&lt;br /&gt;$manager-&amp;gt;setAttribute(Doctrine::ATTR_VALIDATE, Doctrine::VALIDATE_ALL); &lt;br /&gt;$manager-&amp;gt;setAttribute(Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, true);&lt;br /&gt;&lt;br /&gt;$dsn = 'pgsql:dbname=cayetano;host=127.0.0.1';&lt;br /&gt;$user='postgres';&lt;br /&gt;$password='123456';&lt;br /&gt;//nombramos a esta conexion como 'cayetano'&lt;br /&gt;$conn = Doctrine_Manager::connection(array($dsn, $user, $password),'cayetano');&lt;br /&gt;&lt;br /&gt;$dsn = 'pgsql:dbname=documentacion;host=127.0.0.1';&lt;br /&gt;$user='postgres';&lt;br /&gt;$password='123456';&lt;br /&gt;//nombramos a esta conexion como 'documentacion'&lt;br /&gt;$conn = Doctrine_Manager::connection(array($dsn, $user, $password)),'documentacion');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para probar el uso lo podemos hacer del siguiento modo:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;/************** archivo prueba.php **********************/&lt;br /&gt;require_once('bootstrap.php');&lt;br /&gt;&lt;br /&gt;$manager = Doctrine_Manager::getInstance();&lt;br /&gt;$manager-&amp;gt;setCurrentConnection('cayetano');&lt;br /&gt; //Accedemos a la BD cayetano&lt;br /&gt; $q = Doctrine_Query::create()&lt;br /&gt;  -&amp;gt;select('t.*,u.log_usu,u.pass_usu')&lt;br /&gt;  -&amp;gt;from('Trabajador t')&lt;br /&gt;  -&amp;gt;innerJoin('t.UsuIntranet u');&lt;br /&gt;    &lt;br /&gt; print_r($q-&amp;gt;execute(array(),Doctrine::HYDRATE_ARRAY));&lt;br /&gt; &lt;br /&gt;$manager = Doctrine_Manager::getInstance();&lt;br /&gt;$manager-&amp;gt;setCurrentConnection('documentacion');&lt;br /&gt; //Accedemos a la BD documentacion&lt;br /&gt; $q = Doctrine_Query::create()&lt;br /&gt;    -&amp;gt;from('Empleado d')&lt;br /&gt;    -&amp;gt;leftJoin('d.EmpleadoCargo g')    &lt;br /&gt;    -&amp;gt;leftJoin('g.Cargo h')&lt;br /&gt;    -&amp;gt;leftJoin('h.Oficina w')    &lt;br /&gt;    -&amp;gt;where('d.idusuario = ?', $idUsuario)&lt;br /&gt;    -&amp;gt;orderBy('w.descripcion,h.descripcion,g.id');&lt;br /&gt; &lt;br /&gt; print_r($q-&amp;gt;execute(array(),Doctrine::HYDRATE_ARRAY));&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-3473195289989082309?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/3473195289989082309/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=3473195289989082309&amp;isPopup=true' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/3473195289989082309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/3473195289989082309'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2010/02/multiples-base-de-datos-con-doctrine.html' title='Multiples Base de Datos con Doctrine'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-7745534891781084908</id><published>2010-01-28T11:17:00.000-08:00</published><updated>2010-05-29T21:07:16.589-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVP'/><category scheme='http://www.blogger.com/atom/ns#' term='Doctrine ORM'/><category scheme='http://www.blogger.com/atom/ns#' term='Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES'/><category scheme='http://www.blogger.com/atom/ns#' term='Doctrine_Table'/><title type='text'>Modelando con Doctrine parte III</title><content type='html'>Teniendo el modelo de clases del post anterior procederemos a construir los métodos modificando el bootstrap.php y quedando del siguiente modo:&lt;br /&gt;&lt;pre class="brush: php"&gt;/***** bootstrap.php **********/&lt;br /&gt;require_once(dirname(__FILE__) . '/doctrine-1.2.1/Doctrine.php');&lt;br /&gt;spl_autoload_register(array('Doctrine', 'autoload'));&lt;br /&gt;&lt;br /&gt;Doctrine::loadModels('models');&lt;br /&gt;&lt;br /&gt;$manager = Doctrine_Manager::getInstance();&lt;br /&gt;$manager-&amp;gt;setAttribute(Doctrine::ATTR_VALIDATE, Doctrine::VALIDATE_ALL); //ACTIVAMOS LAS VALIDACIONES DE DOCTRINE&lt;br /&gt;$manager-&amp;gt;setAttribute(Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, true);//PARA LA CREACION DE LOS METODOS&lt;br /&gt;&lt;br /&gt;$dsn = 'mysql:dbname=comercial;host=127.0.0.1';&lt;br /&gt;$user='root';&lt;br /&gt;$password='123456';&lt;br /&gt;&lt;br /&gt;$conn = Doctrine_Manager::connection(array($dsn, $user, $password));&lt;/pre&gt;&lt;br /&gt;La línea 9 le dice a Doctrine que cargué unas clases que vamos a crear en donde implementaremos los métodos. Estas clases deben de tener la siguiente forma [nombreClase]Table y las colocaremos dentro de la carpeta “models”.&lt;br /&gt;En nuestro ejemplo en particular  crearemos la clase UsuarioTable.&lt;br /&gt;&lt;pre class="brush: php"&gt;/**** UsuarioTable.php *******/&lt;br /&gt;class UsuarioTable extends Doctrine_Table&lt;br /&gt;{&lt;br /&gt;public function GetAllUsuarios()&lt;br /&gt;{&lt;br /&gt;$q=Doctrine_Query::create()&lt;br /&gt;-&amp;gt;from('Usuario u')&lt;br /&gt;-&amp;gt;execute();&lt;br /&gt;return $q-&amp;gt;toArray();&lt;br /&gt;}&lt;br /&gt;public function GetAllCargosByOficina($idUsuario,$idOficina)&lt;br /&gt;{&lt;br /&gt;$q=Doctrine_Query::create()&lt;br /&gt;&lt;br /&gt;-&amp;gt;from('Oficina o')&lt;br /&gt;-&amp;gt;leftJoin('o.Cargo c')&lt;br /&gt;-&amp;gt;leftJoin('c.Asignacion a')&lt;br /&gt;-&amp;gt;leftJoin('a.Empleado e')&lt;br /&gt;-&amp;gt;leftJoin('e.Usuario u')&lt;br /&gt;-&amp;gt;where('o.id=?',$idOficina)&lt;br /&gt;-&amp;gt;andWhere('u.id=?',$idUsuario) &lt;br /&gt;-&amp;gt;execute();&lt;br /&gt;&lt;br /&gt;return $q-&amp;gt;toArray(true); &lt;br /&gt;}&lt;br /&gt;public function GetAllCargos($idUsuario)&lt;br /&gt;{&lt;br /&gt;$q=Doctrine_Query::create()&lt;br /&gt;&lt;br /&gt;-&amp;gt;from('Cargo c')&lt;br /&gt;-&amp;gt;leftJoin('c.Asignacion a')&lt;br /&gt;-&amp;gt;leftJoin('a.Empleado e')&lt;br /&gt;-&amp;gt;leftJoin('e.Usuario u')&lt;br /&gt;-&amp;gt;where('u.id=?',$idUsuario)&lt;br /&gt;&lt;br /&gt;-&amp;gt;execute();&lt;br /&gt;return $q-&amp;gt;toArray(true); &lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para probar el funcionamiento crearemos  un archivo pruebaUsuario.php&lt;br /&gt;&lt;pre class="brush: php"&gt;/******** pruebaUsuario.php***********/&lt;br /&gt;require_once("bootstrap.php");&lt;br /&gt;&lt;br /&gt;$obj= Doctrine::getTable("Usuario");&lt;br /&gt;&lt;br /&gt;print_r($obj-&amp;gt;GetAllCargos(1));&lt;br /&gt;&lt;br /&gt;print_r($obj-&amp;gt;GetAllCargosByOficina(1,1));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Haciendo uso de DQL podemos ver que la consultas son bastante sencillas y demandan poco esfuerzo, la clave aquí es el método “toArray()” este método es una forma de serializar  (Hydration, en realidad hay muchas formas de hydration) los datos  en forma de arrays(objetos). El método “toArray()” puede recibir un parámetro booleano si este es false, nos mostrara el resultado teniendo en cuenta los “join” realizados en la consulta DQL. En caso sea true ocurrirá lo contrario.&lt;br /&gt;Si es que estas trabajando por capas  estos resultados hidratados son los que fluyen entre capas.&lt;br /&gt;En mi particular experiencia si estas utilizando el patrón MVP (Model View Presenter)  a estos datos hidratados le pasas la función “encode_json()” y se lo envías  a la Vista (DHTMLX, GWT,FLASH, etc)&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_r5aiCRZu9jE/S2HmljGe9vI/AAAAAAAAAFU/7WVn7jRCQXg/s1600-h/mvp.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5431876158337513202" src="http://4.bp.blogspot.com/_r5aiCRZu9jE/S2HmljGe9vI/AAAAAAAAAFU/7WVn7jRCQXg/s320/mvp.png" style="cursor: pointer; display: block; height: 140px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;figura 1: MVC vs MVP&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;Quiero contarles que ahora esto muy metido en GWT (Google Web Toolkit) espero empezar a postear acerca de esta maravillosa idea de la gente de Google.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-7745534891781084908?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/7745534891781084908/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=7745534891781084908&amp;isPopup=true' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/7745534891781084908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/7745534891781084908'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2010/01/modelando-con-doctrine-parte-iii.html' title='Modelando con Doctrine parte III'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_r5aiCRZu9jE/S2HmljGe9vI/AAAAAAAAAFU/7WVn7jRCQXg/s72-c/mvp.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-8455977314012031469</id><published>2010-01-07T23:01:00.000-08:00</published><updated>2010-05-29T21:06:43.315-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Doctrine ORM'/><title type='text'>Modelando con Doctrine parte II</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_r5aiCRZu9jE/S0dkvfVuP6I/AAAAAAAAADk/LAXb-gdzbQg/s1600-h/blogspot.jpg" style="text-decoration: none;"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 184px;" src="http://1.bp.blogspot.com/_r5aiCRZu9jE/S0dkvfVuP6I/AAAAAAAAADk/LAXb-gdzbQg/s320/blogspot.jpg" alt="" id="BLOGGER_PHOTO_ID_5424415043220291490" border="0" /&gt;&lt;/a&gt;&lt;span class="apple-style-span"&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;figura 1&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="line-height: 115%;font-family:&amp;quot;;font-size:100%;color:black;"   &gt;&lt;span class="Apple-style-span"&gt;El modelo de clases de la figura 1 debemos de traducirlo a un formato YAML (un esquema que te permite administrar tus modelos de mapeo) para que doctrine genere el modelo de mapeo respectivo a partir de este. Pero como la mayoría de las personas (me incluyo) inmediatamente creamos nuestro modelo E/R y lo reflejamos en la BD elegida, a partir de ahí realizamos la ingeniería inversa que nos generara el mapeo respectivo.&lt;br /&gt;Si Uds. se fijaron en el modelo de clases hay una relación de uno a uno (entre Usuario y Empleado) eso evidentemente va a generar proble mas en algunas BD, nosotros queremos que nuestra aplicación sea independiente de la BD, además que también podríamos tener una relación de mucho a muchos. Entonces la solución está en crear un YAML y partir de este generar el modelo de mapeo y como último paso crear la BD que hayamos elegido.&lt;br /&gt;&lt;br /&gt;Para continuar necesitamos definir un estructura de proyecto del siguiente modo:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 115%;font-family:&amp;quot;;color:black;"  &gt;&lt;span class="apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span style="font-size:100%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_r5aiCRZu9jE/S1D4Mv5LvtI/AAAAAAAAAFI/1rEhNkkYECA/s1600-h/estructura.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 135px; height: 155px;" src="http://4.bp.blogspot.com/_r5aiCRZu9jE/S1D4Mv5LvtI/AAAAAAAAAFI/1rEhNkkYECA/s320/estructura.png" alt="" id="BLOGGER_PHOTO_ID_5427110448879877842" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;figura 2&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="line-height: 100%;font-family:&amp;quot;;color:black;"  &gt;&lt;span class="apple-style-span"  style="font-size:100%;"&gt;&lt;span class="Apple-style-span"&gt;En "data" se encontrara la data a llenar a la BD ( te la bajas de &lt;a href="http://jumanor.webcindario.com/data.yml"&gt;aquí&lt;/a&gt; ), en "models" se encuentra el modelo a mapear, en "yaml" se encuentra el esquema(te lo bajas de &lt;a href="http://jumanor.webcindario.com/schema.yml"&gt;aquí&lt;/a&gt;). El archivo cli.php debe de lucir así:&lt;/span&gt;&lt;/span&gt;  &lt;pre class="brush: php"&gt;/***** ARCHIVO CLI.PHP *****/&lt;br /&gt;require_once(dirname(__FILE__) . '/doctrine-1.2.1/Doctrine.php');&lt;br /&gt;spl_autoload_register(array('Doctrine', 'autoload'));&lt;br /&gt;&lt;br /&gt;$dsn = 'mysql:dbname=comercial;host=127.0.0.1';&lt;br /&gt;$user='root';&lt;br /&gt;$password='123456';&lt;br /&gt;&lt;br /&gt;$conn = Doctrine_Manager::connection(array($dsn,$user,$password));&lt;br /&gt;&lt;br /&gt;$config = array('data_fixtures_path' =&gt; 'data',&lt;br /&gt;'models_path' =&gt; 'models',&lt;br /&gt;'migrations_path' =&gt; '',&lt;br /&gt;'sql_path' =&gt; '',&lt;br /&gt;'yaml_schema_path' =&gt; 'yaml');&lt;br /&gt;&lt;br /&gt;$cli = new Doctrine_Cli($config);&lt;br /&gt;$cli-&gt;run($_SERVER['argv']);&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Doctrine brinda una interfaz de línea de comandos (CLI) que nos va a facilitar la creación de la BD, así como la generación del esquema y también los modelos a mapear.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Generamos el modelo: &lt;span style="font-style: italic;"&gt;"c:\appserv\www\blogspot\php cli.php generate-models-yaml"&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Creamos la BD: &lt;span style="font-style: italic;"&gt;"c:\appserv\www\blogspot\php cli.php create-db"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Creamos las Tablas: &lt;/span&gt; &lt;span style="font-style: italic;"&gt;"c:\appserv\www\blogspot\php cli.php create-tables"&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Llenamos con Data:  &lt;span style="font-style: italic;"&gt;"c:\appserv\www\blogspot\php cli.php load-data"&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;OJO: Cuando generes el modelo no te olvides de añadir los "require_once" correspondientes.&lt;/span&gt;&lt;br /&gt;&lt;span style="line-height: 115%;font-family:&amp;quot;;color:black;"  &gt;&lt;pre class="brush: php"&gt;/*** ARCHIVO BOOTSTRAP.PHP *****/&lt;br /&gt;require_once(dirname(__FILE__) . '/doctrine-1.2.1/Doctrine.php');&lt;br /&gt;spl_autoload_register(array('Doctrine', 'autoload'));&lt;br /&gt;&lt;br /&gt;$manager = Doctrine_Manager::getInstance();&lt;br /&gt;$manager-&gt;setAttribute(Doctrine::ATTR_VALIDATE, Doctrine::VALIDATE_ALL); //ACTIVAMOS LAS VALIDACIONES DE DOCTRINE&lt;br /&gt;$manager-&gt;setAttribute(Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, true);//PARA LA CREACION DE LOS METODOS&lt;br /&gt;&lt;br /&gt;$dsn = 'mysql:dbname=comercial;host=127.0.0.1';&lt;br /&gt;$user='root';&lt;br /&gt;$password='123456';&lt;br /&gt;&lt;br /&gt;$dbh = new PDO($dsn, $user, $password);&lt;br /&gt;$conn = Doctrine_Manager::connection($dbh);&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p class="MsoNormal"&gt;&lt;span class="apple-style-span"&gt;&lt;span style="color:black;"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;Los beneficios de generar la BD a partir de YAML son los siguientes:&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul type="disc"&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:100%;color:black;"   &gt;&lt;span class="Apple-style-span"&gt;Independencia de la BD.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Se esquematiza las relaciones uno a      uno y mucho a muchos&lt;span style=";font-family:&amp;quot;;font-size:100%;"  &gt;&lt;span class="Apple-style-span"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:100%;"  &gt;&lt;span class="Apple-style-span"&gt;Se esquematiza la herencia (podemos      escoger como queremos que la herencia, de las múltiples formar que hay,      sea implementada en la BD)&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:100%;"  &gt;&lt;span class="Apple-style-span"&gt;Se esquematiza la jerarquía de      datos.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;span style="line-height: 115%;font-family:&amp;quot;;color:black;"  &gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size:100%;"&gt;Debo de confesar que me da pereza aprender YAML ya me acostumbre a tratar el modelo mapeado directamente (clases php) yo normalmente hago lo siguiente:&lt;/span&gt;&lt;span class="apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="line-height: 115%;font-family:&amp;quot;;color:black;"  &gt;&lt;ul type="disc"&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Genero el Modelo E/R a      partir del modelo de clases.&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Creo la BD con sus respectivas      relaciones y restricciones.&lt;span style=";font-family:&amp;quot;;font-size:100%;"  &gt;&lt;span class="Apple-style-span"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Creo el modelo de mapeado a partir      de la BD.&lt;span style=";font-family:&amp;quot;;font-size:100%;"  &gt;&lt;span class="Apple-style-span"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal;"&gt;Modifico a mano el modelo      mapeado(relaciones one to one, many to many entre otros)&lt;span style=";font-family:&amp;quot;;" &gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;En el siguiente post implementaremos los métodos del modelo de clases &lt;/span&gt;&lt;span style="line-height: 115%;font-family:&amp;quot;;color:black;"  &gt;&lt;span style="line-height: 115%;font-family:Georgia,serif;color:black;"  &gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-8455977314012031469?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/8455977314012031469/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=8455977314012031469&amp;isPopup=true' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/8455977314012031469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/8455977314012031469'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2010/01/modelando-con-doctrine-parte-ii_07.html' title='Modelando con Doctrine parte II'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_r5aiCRZu9jE/S0dkvfVuP6I/AAAAAAAAADk/LAXb-gdzbQg/s72-c/blogspot.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-6551919861541524185</id><published>2009-12-30T07:09:00.000-08:00</published><updated>2009-12-31T09:18:37.088-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dhtmlxWindows'/><category scheme='http://www.blogger.com/atom/ns#' term='dhtmlx'/><category scheme='http://www.blogger.com/atom/ns#' term='dhtmlxTabbar'/><category scheme='http://www.blogger.com/atom/ns#' term='dhtmlxAccordion'/><category scheme='http://www.blogger.com/atom/ns#' term='dhtmlxGrid'/><title type='text'>DHTMLX EN ACCION</title><content type='html'>&lt;div&gt;Cuando programe por primera vez en la web (hasta ese momento solo lo había hecho en ambiente de escritorio) lo realice en una empresa que había hecho su propio framework Web UI, desde luego muy poderosos los componentes, pero esta carecía de documentación y ejemplos, creo que después de esa ingrata experiencia me aterraba programar con componentes Ajax, pero gracias a un amigo (Ivan Yaco) que me presento y convenció que estos componentes eran todo lo contrario y en verdad la experiencia fue muy grata, es por esto que invito a que lo prueben.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Los componentes javascript  &lt;a href="http://www.dhtmlx.com/"&gt;DHTMLX&lt;/a&gt; (&lt;b&gt;la edición Standard tiene licencia GPL&lt;/b&gt;) nos permiten crear aplicaciones RIA bastante interesantes con  muy poco esfuerzo. DHTMLX tiene una extensa &lt;a href="http://www.dhtmlx.com/dhxdocs/doku.php"&gt;documentación&lt;/a&gt; y muchos &lt;a href="http://www.dhtmlx.com/docs/products/docsExplorer/samples.shtml"&gt;ejemplos&lt;/a&gt; en su website, que es lo que realmente necesitamos cuando queremos programar. Les recomiendo bajar toda la documentacion y sobre todo los ejemplos a la Pc. no me cansare de mencionar que los ejemplos son bastante explicativos y junto con&lt;a href="http://jumanor.blogspot.com/2009/10/doctrine-orm.html"&gt; Doctrine&lt;/a&gt; les facilitara la vida enormemente.&lt;div&gt;En mi experiencia personal al cabo de una semana ya tuve dominio de estos componentes.&lt;div&gt;El vídeo mostrado corresponde a una versión de prueba de un sistema de documentación que se realizo con DHMLX junto con Doctrine. En los siguientes posts mostrare un ejemplo completo de una aplicación.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/4ZdLQs5AD2M&amp;amp;hl=es_ES&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/4ZdLQs5AD2M&amp;amp;hl=es_ES&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-6551919861541524185?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/6551919861541524185/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=6551919861541524185&amp;isPopup=true' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/6551919861541524185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/6551919861541524185'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2009/12/dhtmlx-en-accion.html' title='DHTMLX EN ACCION'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-5061318856865383317</id><published>2009-12-09T17:42:00.000-08:00</published><updated>2010-05-29T21:06:09.951-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingenieria Inversa'/><category scheme='http://www.blogger.com/atom/ns#' term='Doctrine ORM'/><category scheme='http://www.blogger.com/atom/ns#' term='instalacion'/><category scheme='http://www.blogger.com/atom/ns#' term='Modelos'/><category scheme='http://www.blogger.com/atom/ns#' term='Relaciones'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>Modelando con Doctrine Parte I</title><content type='html'>Si  tenemos una Base de Datos relacional ya implementada podemos mapear la DB con Doctrine y empezar a utilizar toda su potencia (para verificar la instalacion de Doctrine dirigete &lt;a href="http://jumanor.blogspot.com/2009/12/instalando-doctrine-12.html"&gt;aqui&lt;/a&gt; ).El archivo generarModels.php nos permitirá generar el mapeo correspondiente:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;/*&lt;br /&gt;Archivo generarModels.php&lt;br /&gt;*/&lt;br /&gt;require_once(dirname(__FILE__) . '/Doctrine-1.2.0/lib/Doctrine.php');&lt;br /&gt;spl_autoload_register(array('Doctrine', 'autoload'));&lt;br /&gt;&lt;br /&gt;/* Nos conectamos a la DB*/&lt;br /&gt;$dsn = 'mysql:dbname=comercial;host=127.0.0.1';&lt;br /&gt;$user='root';&lt;br /&gt;$password='123456';&lt;br /&gt;/* Conexion a postgre&lt;br /&gt;$dsn = 'pqsql:dbname=comercial;host=127.0.0.1';&lt;br /&gt;$user='postgres';&lt;br /&gt;$password='123456';&lt;br /&gt;*/&lt;br /&gt;$dbh = new PDO($dsn, $user, $password);&lt;br /&gt;$conn = Doctrine_Manager::connection($dbh);&lt;br /&gt;/* Metodo que nos genera los modelos */&lt;br /&gt;Doctrine_Core::generateModelsFromDb('carpetaDeModelos');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Enseguida procedemos a ejecutar el archivo generarModels.php (http://localhost/generarModels.php) y tendremos en la carpeta "carpetaDeModelos" los modelos para empezar a probar Doctrine.&lt;/div&gt;&lt;div&gt;Ahora procedemos a modificar el archivo bootstrap.php y creamos el archivo dqlTestDoctrine.php. Por Favor, antes de ejecutar dqlTestDoctrine.php dirígete a la clase generada y añade require_once según corresponda, en mi caso, quedo así:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;/**&lt;br /&gt;* Cliente&lt;br /&gt;*&lt;br /&gt;* This class has been auto-generated by the Doctrine ORM Framework&lt;br /&gt;*&lt;br /&gt;* @package    ##PACKAGE##&lt;br /&gt;* @subpackage ##SUBPACKAGE##&lt;br /&gt;* @author     ##NAME## &lt;##EMAIL##&gt;&lt;br /&gt;* @version    SVN: $Id: Builder.php 6820 2009-11-30 17:27:49Z jwage $&lt;br /&gt;*/&lt;br /&gt;require_once('generated/BaseCliente.php');&lt;br /&gt;class Cliente extends BaseCliente {  }  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;/*&lt;br /&gt;Archivo dqlTestDoctrine.php&lt;br /&gt;*/&lt;br /&gt;require_once('bootstrap.php')/*extremadamente importante*/&lt;br /&gt;$q=Doctrine_Query::create()&lt;br /&gt;-&gt;select('u.*')   /*todos los campos*/&lt;br /&gt;-&gt;from('Cliente  u'); /*selecionamos la clase Cliente*/&lt;br /&gt;&lt;br /&gt;print_r($q-&gt;execute()-&gt;toArray()); /*nos muestra el resultado como un array*/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;/*&lt;br /&gt;Archivo bootstrap.php&lt;br /&gt;*/&lt;br /&gt;require_once(dirname(__FILE__) . '/Doctrine-1.2.0/lib/Doctrine.php');&lt;br /&gt;spl_autoload_register(array('Doctrine', 'autoload'))&lt;br /&gt;&lt;br /&gt;Doctrine::loadModels('carpetaDeModelos');&lt;br /&gt;&lt;br /&gt;$dsn = 'mysql:dbname=comercial;host=127.0.0.1';&lt;br /&gt;$user='root';&lt;br /&gt;$password='123456';&lt;br /&gt;&lt;br /&gt;$dbh = new PDO($dsn, $user, $password);&lt;br /&gt;$conn = Doctrine_Manager::connection($dbh);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;En mi particular experiencia esta ingeniería inversa tiene algunos inconveniente(por lo menos en postgreSQL) que son los siguientes:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Cuando se encuentran claves primarias compuestas el modelo generado solo mapea una clave primaria, entonces hay que modificar a mano en el modelo generado colocando como clave primaria la clave que obvio Doctrine.&lt;/li&gt;&lt;li&gt;Si están trabajando con PosgreSql y estas utilizando esquemas entonces tendrás que modificar en el modelo generado el nombre de la tabla mapeada anteponiendo el nombre del esquema.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Lo anteriormente mencionado no significa que Doctrine tenga bugs, lo que ocurre es que Doctrine esta optimizado para crear el &lt;b&gt;modelo &lt;/b&gt;(que cuenta con relaciones de mucho a muchos, uno a mucho y uno a uno, entre otros elementos adicionales) y a partir del modelo crear la BD (Mysql, PostgreSql, Oracle, SqlServer, etc.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En el siguiente post crearemos un &lt;b&gt;modelo &lt;/b&gt;y empezaremos a utilizar  DQL(Doctrine Query Language)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_1453150"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/jwage/doctrine-php-object-relational-mapper" title="Doctrine Php Object Relational Mapper"&gt;Doctrine Php Object Relational Mapper&lt;/a&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=doctrinephpobjectrelationalmapper-090518110827-phpapp01&amp;amp;rel=0&amp;amp;stripped_title=doctrine-php-object-relational-mapper"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=doctrinephpobjectrelationalmapper-090518110827-phpapp01&amp;amp;rel=0&amp;amp;stripped_title=doctrine-php-object-relational-mapper" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View more &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; from &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/jwage"&gt;Jonathan Wage&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-5061318856865383317?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/5061318856865383317/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=5061318856865383317&amp;isPopup=true' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/5061318856865383317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/5061318856865383317'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2009/12/modelando-con-doctrine-parte-i_09.html' title='Modelando con Doctrine Parte I'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-168457992826582572</id><published>2009-12-05T16:31:00.000-08:00</published><updated>2010-05-29T21:03:19.074-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Doctrine ORM'/><category scheme='http://www.blogger.com/atom/ns#' term='instalacion'/><title type='text'>Instalando Doctrine 1.2</title><content type='html'>Instalar Doctrine 1.2  es bastante sencillo.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Bajamos  el &lt;a href="http://www.appservnetwork.com/"&gt;Appserv&lt;/a&gt; 2.5.9. &lt;/li&gt;&lt;li&gt;Ejecutamos el Appserv 2.5.9 (que nos instala apache, php y mysql).&lt;/li&gt;&lt;li&gt;Verificamos que la version de PHP&gt;=5.2.3+&lt;/li&gt;&lt;li&gt;Habilitamos PDO(Php Data Objects), nos dirigimos a php.ini y añadimos las siguientes lineas:&lt;br /&gt;&lt;/li&gt;&lt;pre class="brush: php"&gt;extension=php_pdo.dll&lt;br /&gt;extension=php_pdo_pgsql.dll&lt;br /&gt;extension=php_pdo_mysql.dll&lt;br /&gt;&lt;/pre&gt;&lt;li&gt;Reiniciamos el Servidor Apache.&lt;/li&gt;&lt;li&gt;Bajamos Doctrine 1.2 de &lt;a href="http://www.doctrine-project.org/download"&gt;aquí&lt;/a&gt;&lt;a href="http://www.doctrine-project.org/download"&gt;.&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Descomprimimos Doctrine 1.2 en c:\appserv\www&lt;/li&gt;&lt;/ol&gt;Siguiente los pasos anteriores ya se debió instalar Doctrine 1.2.&lt;br /&gt;Para verificar la instalación creamos un archivo nombrandolo como bootstrap.php  (c:\appserv\www\bootstrap.php)&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;/*&lt;br /&gt;En los siguiente post haremos referencia a este archivo bootstrap.php&lt;br /&gt;*/&lt;br /&gt;require_once(dirname(__FILE__) . '/Doctrine-1.2.0/lib/Doctrine.php');&lt;br /&gt;spl_autoload_register(array('Doctrine', 'autoload'));&lt;br /&gt;$manager = Doctrine_Manager::getInstance();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ahora que ya tenemos bootstrap.php procedemos a crear el archivo TestDoctrine.php  (c:\appserv\www\TestDoctrine.php)&lt;br /&gt;&lt;pre class="brush: php"&gt;/*&lt;br /&gt;Probamos que doctrine se instalo correctamente&lt;br /&gt;*/&lt;br /&gt;require_once('bootstrap.php');&lt;br /&gt;echo Doctrine_Core::getPath();&lt;br /&gt;&lt;/pre&gt;Ahora ejecutamos el archivo TestDoctrine.php &lt;span style="font-weight: bold;"&gt;(http://localhost/TestDoctrine.php) &lt;/span&gt; y nos debe de mostrar la ruta de instalación de Doctrine. La cual significa que Doctrine se instalo satisfactoriamente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-168457992826582572?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/168457992826582572/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=168457992826582572&amp;isPopup=true' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/168457992826582572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/168457992826582572'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2009/12/instalando-doctrine-12.html' title='Instalando Doctrine 1.2'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-1660854588336409423</id><published>2009-10-27T22:04:00.000-07:00</published><updated>2010-05-29T21:01:52.258-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Doctrine ORM'/><title type='text'>Doctrine ORM</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_r5aiCRZu9jE/SxSEwIJIHPI/AAAAAAAAABY/pmmskL-yQKI/s1600/doctrine-layers.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 319px; height: 180px;" src="http://3.bp.blogspot.com/_r5aiCRZu9jE/SxSEwIJIHPI/AAAAAAAAABY/pmmskL-yQKI/s320/doctrine-layers.jpg" alt="" id="BLOGGER_PHOTO_ID_5410095014733159666" border="0" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;meta equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;meta name="ProgId" content="Word.Document"&gt;&lt;meta name="Generator" content="Microsoft Word 11"&gt;&lt;meta name="Originator" content="Microsoft Word 11"&gt;&lt;link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cjorge%5CCONFIG%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:hyphenationzone&gt;21&lt;/w:HyphenationZone&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face 	{font-family:Wingdings; 	panose-1:5 0 0 0 0 0 0 0 0 0; 	mso-font-charset:2; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:0 268435456 0 0 -2147483648 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:"Times New Roman";} span.blsp-spelling-error 	{mso-style-name:blsp-spelling-error;} @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;}  /* List Definitions */  @list l0 	{mso-list-id:2092313789; 	mso-list-template-ids:-1803376152;} @list l0:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	mso-ansi-font-size:10.0pt; 	font-family:Symbol;} ol 	{margin-bottom:0cm;} ul 	{margin-bottom:0cm;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Tabla normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman"; 	mso-ansi-language:#0400; 	mso-fareast-language:#0400; 	mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;&lt;meta equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;meta name="ProgId" content="Word.Document"&gt;&lt;meta name="Generator" content="Microsoft Word 11"&gt;&lt;meta name="Originator" content="Microsoft Word 11"&gt;&lt;link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cjorge%5CCONFIG%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:hyphenationzone&gt;21&lt;/w:HyphenationZone&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face 	{font-family:Wingdings; 	panose-1:5 0 0 0 0 0 0 0 0 0; 	mso-font-charset:2; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:0 268435456 0 0 -2147483648 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:"Times New Roman";} span.blsp-spelling-error 	{mso-style-name:blsp-spelling-error;} @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;}  /* List Definitions */  @list l0 	{mso-list-id:2092313789; 	mso-list-template-ids:-1803376152;} @list l0:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	mso-ansi-font-size:10.0pt; 	font-family:Symbol;} ol 	{margin-bottom:0cm;} ul 	{margin-bottom:0cm;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Tabla normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman"; 	mso-ansi-language:#0400; 	mso-fareast-language:#0400; 	mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class="MsoNormal"&gt;En este post quiero hablar de un extraordinario &lt;span id="SPELLING_ERROR_0"&gt;ORM&lt;/span&gt; para &lt;span id="SPELLING_ERROR_1"&gt;PHP&lt;/span&gt;. &lt;br /&gt;Me estoy refiriendo a Doctrine, los que vienen de .&lt;span id="SPELLING_ERROR_2"&gt;NET&lt;/span&gt; o Java me &lt;span id="SPELLING_ERROR_3"&gt;comprenderán&lt;/span&gt;. &lt;br /&gt;Es que acaso existe la posibilidad de realizar sistemas con &lt;span id="SPELLING_ERROR_4"&gt;PHP&lt;/span&gt;, pues conocemos que &lt;span id="SPELLING_ERROR_5"&gt;PHP&lt;/span&gt; es un lenguaje bastante &lt;span id="SPELLING_ERROR_6"&gt;light&lt;/span&gt; enfocado para &lt;span id="SPELLING_ERROR_7"&gt;web&lt;/span&gt; &lt;span id="SPELLING_ERROR_8"&gt;site&lt;/span&gt;, principalmente. &lt;br /&gt;Pero a medido que conozco Doctrine(&lt;span id="SPELLING_ERROR_9"&gt;object&lt;/span&gt; &lt;span id="SPELLING_ERROR_10"&gt;relational&lt;/span&gt; &lt;span id="SPELLING_ERROR_11"&gt;mapper&lt;/span&gt;) y &lt;span id="SPELLING_ERROR_12"&gt;Symfony&lt;/span&gt;(&lt;span id="SPELLING_ERROR_13"&gt;framework&lt;/span&gt;) puedo asegurar que si, es posible, con sus &lt;span id="SPELLING_ERROR_14"&gt;limitaciones&lt;/span&gt; pero posible. Si amigos no es tan descabellado.!!!! &lt;br /&gt;Algunas cosas por la que elijo Doctrine son, entre otras, las siguientes:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span id="SPELLING_ERROR_16"&gt;DQL&lt;/span&gt; algo similar a &lt;span id="SPELLING_ERROR_17"&gt;HQL&lt;/span&gt;      de &lt;span id="SPELLING_ERROR_18"&gt;Hibernate&lt;/span&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span id="SPELLING_ERROR_19"&gt;&lt;span style="" lang="EN-US"&gt;Zend&lt;/span&gt;&lt;/span&gt;&lt;span style="" lang="EN-US"&gt; &lt;span id="SPELLING_ERROR_20"&gt;Framework&lt;/span&gt;      (&lt;span id="SPELLING_ERROR_21"&gt;Zend&lt;/span&gt;_&lt;span id="SPELLING_ERROR_22"&gt;Entity&lt;/span&gt;)      se &lt;a href="http://www.symfony.es/2009/10/29/zend-framework-se-rinde-ante-doctrine/"&gt;rindio&lt;/a&gt; ante Doctrine.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Una extraordinaria      comunidad de desarrolladores.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Una &lt;a href="http://www.doctrine-project.org/documentation"&gt;&lt;span id="SPELLING_ERROR_23"&gt;documentación&lt;/span&gt;&lt;/a&gt;      bastante completa a libre disponibilidad (&lt;span id="SPELLING_ERROR_24"&gt;free&lt;/span&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;En fin, estoy muy emocionado por haber encontrado algo tan bien pensado que me facilito la vida enormemente en el desarrollo de una aplicación con capas cuyo cliente se desarrollo en JavaScript específicamente utilice &lt;a href="http://www.dhtmlx.com/"&gt;DHTMLX &lt;/a&gt;cuya documentación también esta bastante extensa, luego hablaremos de estos componente Web UI.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;p style="font-weight: bold;" class="MsoNormal"&gt;Nota: Uno de los motivos por los que no posteo es precisamente mi ortografía y la vergüenza de cometer u ofender a algunos lectores &lt;span style=""&gt; &lt;/span&gt;espero su comprensión y desde luego la correcciones son bien acogidas.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-1660854588336409423?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/1660854588336409423/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=1660854588336409423&amp;isPopup=true' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/1660854588336409423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/1660854588336409423'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2009/10/doctrine-orm.html' title='Doctrine ORM'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_r5aiCRZu9jE/SxSEwIJIHPI/AAAAAAAAABY/pmmskL-yQKI/s72-c/doctrine-layers.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29133774.post-114920266683801374</id><published>2006-06-01T15:56:00.000-07:00</published><updated>2006-06-01T15:57:46.846-07:00</updated><title type='text'>Inagurando el Blog</title><content type='html'>Holas gente:&lt;br /&gt;&lt;br /&gt;Espero poner en este blog mis vivencias&lt;br /&gt;&lt;br /&gt;Suerte&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29133774-114920266683801374?l=jumanor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jumanor.blogspot.com/feeds/114920266683801374/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29133774&amp;postID=114920266683801374&amp;isPopup=true' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/114920266683801374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29133774/posts/default/114920266683801374'/><link rel='alternate' type='text/html' href='http://jumanor.blogspot.com/2006/06/inagurando-el-blog.html' title='Inagurando el Blog'/><author><name>Jumanor</name><uri>http://www.blogger.com/profile/01510344968104129692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_r5aiCRZu9jE/SVa6CmvnNpI/AAAAAAAAAAM/Gw3BrYWfmfI/S220/jorge.JPG'/></author><thr:total>0</thr:total></entry></feed>
