Ajax e Javascript
29/09/2010 00:00
0
Estou a tentar fazer uma query à base de dados dependendo do valor de um g:select, mas por enquanto ainda estou a testar a conexão. A conexão falha. No evento onChange tenho:


onchange="test()"


A function teste:
Como resultado obtenho a alertbox "mysql".
(Não sei se a query da function teste está bem formulada. Sei que o SQL está correcto, não sei é se valor tem de ser inserido na query como ${valor})

function test(){
var mysql = try_mysql();
if(mysql==1){
alert("Conexao efetuada");
} else alert("mysql");
}
function consulta(){
var valor = document.getElementById("teste").value
var sql = $("select pessoa.contribuinte from pessoa where pessoa.id = valor").value;
query = mysql_query(sql);
alert(query);
}


No cabeçalho do documento está a ligação para o ficheiro javaScript:

<script src=&quot;${resource(dir&#58;'js',file&#58;'query.js')}&quot; type=&quot;text/javascript&quot;></script>


O ficheiro query.js:


function $(id) {
return document.getElementById(id);
}
function $tag(t){
return document.getElementsByTagName(t);
}
function addEvent(obj, evType, fn){
if (obj.addEventListener)
obj.addEventListener(evType, fn, true)
if (obj.attachEvent)
obj.attachEvent(&quot;on&quot;+evType, fn)
}
// -----------------------------------------------------------------------------------
// AJAX
fsAjax = {
xmlHttp&#58;null,
init &#58; function(url){
this.xmlHttp=this.getXmlHttpObject();
if (this.xmlHttp==null){
fsAjax.error(&quot;Your browser does not support AJAX!&quot;);
return;
}
this.xmlHttp.open(&quot;GET&quot;,url,false); // we have to block scripts execution to work
this.xmlHttp.send(null);
return this.xmlHttp.responseText;
},
error &#58; function(errDescription){
return errDescription;
},
getXmlHttpObject &#58; function(){
this.xmlHttp=null;
try { this.xmlHttp=new XMLHttpRequest(); // Firefox, Opera 8+, Safari
} catch (e){
// Internet Explorer
try{ this.xmlHttp=new ActiveXObject(&quot;Msxml2.XMLHTTP&quot;);
} catch (e){
this.xmlHttp=new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);
}
}
return this.xmlHttp;
}
}
/* END AJAX */

// Elements
function createElem(){
var objBody=document.getElementsByTagName(&quot;body&quot;).item(0);
var objReturn = document.createElement(&quot;div&quot;);
objReturn.setAttribute(&quot;id&quot;,&quot;FS_returnDiv&quot;);
//objReturn.style.display=&quot;none&quot;;
objBody.appendChild(objReturn);
}
// Global variables
var phpPage = &quot;http&#58;//localhost&#58;8080/fsql.php&quot;;
//=================
function try_mysql(){
return fsAjax.init(phpPage+&quot;?o=try&quot;);
}
function mysql_query(sql){
var catcher = fsAjax.init(phpPage+&quot;?o=query&amp;i=&quot;+sql);
catcher = catcher.split(&quot;,&quot;);
var total = catcher.length-2;
if(catcher[0]==&quot;select&quot;){
var response = &quot;Encontrados&#58; &quot;+total+&quot; resultados\n&quot;;
for(i=1;i<=total;i++){
response+=(i)+&quot; - &quot;+catcher[i]+&quot;\n&quot;;
}
} else response=catcher[0]+&quot; não suportado&quot;;
return response;
}
addEvent(window,&quot;load&quot;,createElem);


E o SCript php:


<?php
header(&quot;Content-Type&#58; text/html; charset=ISO-8859-1&quot;,true);
$gmtDate = gmdate(&quot;D, d M Y H&#58;i&#58;s&quot;);
header(&quot;Expires&#58; {$gmtDate} GMT&quot;);
header(&quot;Last-Modified&#58; {$gmtDate} GMT&quot;);
header(&quot;Cache-Control&#58; no-cache, must-revalidate&quot;);
header(&quot;Pragma&#58; no-cache&quot;);

// configuration
// you have to change the values below

define('DB_NAME', 'livedb3'); // database name
define('DB_ADDRESS', 'mysql&#58;//localhost/'); // database host address
define('DB_USER', 'root'); // database username
define('DB_PASS', '98989898'); // database password

// end of editable area
// ===================================
// ===================================
// DB =======================
class conection{
var $link = &quot;&quot;;
function makeConection(){

$this->link = mysql_connect(DB_ADDRESS, DB_USER, DB_PASS);;
if (!$this->link){
die(&quot;Error&#58; Impossible to connect with database&quot;);
}elseif (!mysql_select_db(DB_NAME,$this->link)){
die(&quot;Error&#58; Impossible to select the schema&quot;);
}
return 1;
}
function makeQuery($s_query){
if ($result = mysql_query($s_query,$this->link)){
return $result;
} else {
return mysql_error();
}
}
}
$obj_conection = new conection();
switch($_GET[o]){
case &quot;try&quot;&#58;
$try2Connect = $obj_conection->makeConection();
if($try2Connect) echo true;
else echo mysql_error();
break;
case &quot;query&quot;&#58;
$connect = $obj_conection->makeConection();
if($connect==1){
$sql = str_replace(&quot;\&quot;,&quot;&quot;,($_GET[i]));
$foundType = explode(&quot; &quot;,$sql);
$foundType[0]=strtoupper($foundType[0]);
if($foundType[0]==&quot;SELECT&quot;){
$makeQuery = $obj_conection->makeQuery($sql);
if(mysql_num_rows($makeQuery)>0){
$string=&quot;select,&quot;;
while($row = mysql_fetch_assoc($makeQuery)){
$string.=$row[Nome].&quot;,&quot;;
}
}
echo $string;
} else echo $foundType[0].&quot;,&quot;;
} else echo mysql_error();
break;
}
?>


Porque está a falhar a conexão?
Tags: Tópicos avançados


0
Encontrei uma outra solução. Mas não consigo verificar se a conexão tem sucesso. É possível utilizar o php com o Grails? Não consigo perceber como se utiliza o Ajax no Grails.
30/09/2010 00:00


0
Acabei de descobrir que as páginas gsp não suportam php. Onde posso encontrar um exemplo simples de Ajax em que a mudança de um campo muda outro campo de um ficheiro gsp?
30/09/2010 00:00


0
Oi amrac,

nestes casos, eu costumo adotar um padrão bem simples que talvez te dê alguma luz.

1. Eu implemento uma função em javascript dentro do meu gsp (preferencialmente em um arquivo .js externo) que não receba parâmetro algum, mas que sim obtenha o valor do meu select, tal como no exemplo abaixo:


function mudaEstadoSelect() {
var novo_id = document.getElementByid(&quot;id_do_meu_select&quot;).value
// Faço todo o processamento necessário daqui pra baixo
}


E no meu select, eu simplesmente incluo uma chamada a esta função dentro do evento onchange, tal como no exemplo abaixo:


<g&#58;select bla bla bla onchange=&quot;mudaEstadoSelect()&quot;/>


Até ai tudo bem. Com relação à chamada Ajax, eu uso o jQuery, porque facilita D+ da conta a minha vida. E eu recomendo D+ da conta que você instale o plugin jquery na sua aplicação também, porque eu já tive muitos problemas com o prototype.

No jQuery, fazer consultas assíncronas é fácil demais da conta. Da uma olhada neste link: <!-- m --><a class="postlink" href="http://api.jquery.com/category/ajax/">http://api.jquery.com/category/ajax/</a><!-- m -->

Ai, com base no que eu vou receber do Ajax, eu escolho. Se for algo que eu quero expor direto na tela, por exemplo, eu escrevo um código super simples como este aqui:


$(&quot;#id_do_meu_div&quot;).load(&quot;sua_url_de_destino&quot;)


Aliás, agora que percebi, a gente já não discutiu sobre isto antes?


0
opa, continuando.

Vi que seu script exposto é em php né? No caso, tem de ver no código php mesmo. A falha de conexão pode ser por n motivos: url errada de conexão, servidor fora do ar, etc.

Ai tem de ver como é que é. Agora, com relação a executar o php junto com Grails, dentro da mesma aplicação não há como. Mas sei que há algumas gambiarras que possibilitam executar o php dentro do Tomcat (mas nunca vi algum caso real desta técnica)


0
Obrigada pela resposta. Já consegui avançar na minha primeira aplicação Ajax. Utilizei <g:javascript library=&quot;prototype&quot; /> e funciona se fizer render &quot;Olá&quot;. Mas agora tenho outro problema que não se prende directamente com o Ajax. Tem a ver com a passagem de valores. Não sei se o controlador está a receber o valor correcto. A situação é a seguinte. No select eu tenho a remoteFunction onde quero passar com parâmetro o id. Ai tenho o código:


<g&#58;select id =&quot;teste&quot; optionKey=&quot;id&quot; from=&quot;${ipss.Pessoa.findAllWhere(tipo&#58;'Sócio')}&quot; name=&quot;pessoa.id&quot; value=&quot;${socioInstance?.pessoa?.id}&quot; noSelection=&quot;${['null'&#58;'']}&quot;, onchange=&quot;${remoteFunction(action&#58;'search',update&#58;'message1', params&#58;'\'id=\' + escape(this.value)')}&quot; ></g&#58;select>


Depois no controlador tenho o código:


def search = {

def ide = params.id
def res = Pessoa.findByContribuinte(&quot;from Pessoa p where p.id = ${ide}&quot;)
render res
}


A query pretende ir à classe Pessoa e devolver o contribuinte da pessoa com um determinado id, que é passado como parâmetro. Mas não sei se o parâmetro está a ser bem recebido e não sei se a variável ${ide} está a ser bem introduzida dentro da query.
Também não sei se neste controlador, da classe Socio, posso fazer uma query na classe Pessoa, ou se tenho de fazer a action na classe Pessoa.

Quanto ao php já descobri na documentação em grails.org, que as páginas gsp não suportam php.
01/10/2010 00:00


0
Esqueci-me de dizer que esse código dá-me o erro:


Error 500: Executing action [search] of controller [ipss.SocioController] caused exception: groovy.lang.MissingMethodException: No signature of method: ipss.SocioController.render() is applicable for argument types: (null) values: [null] Possible solutions: render(org.codehaus.groovy.grails.web.converters.Converter), render(java.lang.Object), render(java.lang.String), render(groovy.lang.Closure), render(java.util.Map), render(java.util.Map, groovy.lang.Closure)
Servlet: grails
URI: /ipss/grails/socio/search.dispatch
Exception Message: No signature of method: ipss.SocioController.render() is applicable for argument types: (null) values: [null] Possible solutions: render(org.codehaus.groovy.grails.web.converters.Converter), render(java.lang.Object), render(java.lang.String), render(groovy.lang.Closure), render(java.util.Map), render(java.util.Map, groovy.lang.Closure)
Caused by: No signature of method: ipss.SocioController.render() is applicable for argument types: (null) values: [null] Possible solutions: render(org.codehaus.groovy.grails.web.converters.Converter), render(java.lang.Object), render(java.lang.String), render(groovy.lang.Closure), render(java.util.Map), render(java.util.Map, groovy.lang.Closure)
Class: SocioController
At Line: [26]
01/10/2010 00:00



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto