DWR com href do html

17 respostas
anderson.bonavides

Olá pesso venho encarecidamente pedir a ajuda de vocês para uma duvida que dura 2 dias e não consigo encontrar uma solução na internet para o meu problema. Gostaria de pedir a alguem que tenha conhecimentos na tecnologia para que possa me ajudar ou disponibilizar um material que contenha a solução para o meu problema. Estou usando JSF + DWR e por motivos que não precisam ser citados aqui não estou podendo usar Richfaces ou ajax4.

Tenho uma tabela em HTML que é preenchida dinâmicamente pelo meu DWR e preciso criar um HREF para que possa realizar uma chamada a uma classe Java e faz o download de um arquivo pelo nome. O grande problema é que não consigo criar esse hiperlink com HREF na minha tabela JavaScript.

Vou postar o código e pedir pra que me ajudem se possível:

Meu html:

<table>
	<tr>
		<td class="title" align="center">Máscara</td>
		<td class="title" align="center">NSA</td>
		<td class="title" align="center">Órgão Arrecadador</td>
		<td class="title" align="center">Status</td>
		<td class="title" align="center">Data de Recepção </td>
		<td class="title" align="center">Tempo de Gasto</td>
		<td class="title" align="center">Q.L</td>
		<td class="title" align="center">Q.C.E</td>
		<td class="title" align="center">Q.O.S</td>
		<td class="title" align="center">Q.O.I </td>
	</tr>	
	<tbody align="center" id="tabela"></tbody>
	<tr>
		<td colspan="100%"></td>
	</tr>
</table>

Minha função em DWR que tem a responsabilidade de montar a tabela:

function montarTabela(arquivoMonitoracaoTO){
		limbaTabela("tabela");
		
		var cellFuncs = [
					function(arquivoMonitoracaoTO) { 
						//DOWNLOAD DO ARQUIVO AQUI PELO NOME!
						return arquivoMonitoracaoTO.nome;
					},
					
					function(arquivoMonitoracaoTO) { 
						return arquivoMonitoracaoTO.NSA; 
					},
						
					function(arquivoMonitoracaoTO) { 
						return arquivoMonitoracaoTO.orgaoArrecadador; 
					},
							
					function(arquivoMonitoracaoTO) {
						return arquivoMonitoracaoTO.status;						
					},
						
					function(arquivoMonitoracaoTO) { 						
						return arquivoMonitoracaoTO.dataRecepcao;
						
					},
							
					function(arquivoMonitoracaoTO) { 
						return arquivoMonitoracaoTO.tempoProcessamento;
					},
						
					function(arquivoMonitoracaoTO) { 
						return arquivoMonitoracaoTO.qtdRegistros; 
					},
						
					function(arquivoMonitoracaoTO) { 
						return arquivoMonitoracaoTO.qtdRegistrosErro; 
					},
						
					function(arquivoMonitoracaoTO) { 
						return arquivoMonitoracaoTO.qtdOcorrenciasSuspensivas; 
					},
							
					function(arquivoMonitoracaoTO) { 
						return arquivoMonitoracaoTO.qtdOcorrenciasInformativas; 
					}
		];

	dwr.util.addRows("tabela", arquivoMonitoracaoTO, cellFuncs);

17 Respostas

Diego_Marinho

Cara, tipo, tu tens que passar como parâmetro para uma “EntidadeAction” por exemplo, a ID do registro que é exibido no grid.

assim vc pode criar uma função javascript que redireciona para uma outra pagina, isso vai depender como vc vai quere que seja esse “detalhe” do registro.

[]´s.

anderson.bonavides

Diego Marinho:
Cara, tipo, tu tens que passar como parâmetro para uma “EntidadeAction” por exemplo, a ID do registro que é exibido no grid.

assim vc pode criar uma função javascript que redireciona para uma outra pagina, isso vai depender como vc vai quere que seja esse “detalhe” do registro.

[]´s.

Isso eu já tenho o que to precisando é alguma forma de fazer o nome do arquivo ficar como um hiperlink para que possa abrir um arquivo.

handersonbf

Fala Anderson blz…

Tem isso exatamente no artigo no meu site:

http://www.handersonfrota.com.br/artigos-tutoriais/dwr/

4.Grids(addRows) personalizadas

dwr.util.addRows( "tabela", arquivoMonitoracaoTO, cellFuncs, {

rowCreator:function(options) {             

                 var row = document.createElement("tr");

                 row.bgColor = "#CCCC99";
                  //aqui testa se é IE ou FF, se tiver usando jQuery nem precisa disso...
                  if(validaBrowser()){
                         //adiciona a funcionalidade de onclick
                         row.attachEvent("onclick", function(e){setColor(row)});
                 }else{
                        row.addEventListener("click", function(e){setColor(row)}, false);
                 }

                           

         return row;

                   }
         });

O ROW passa a ser um objeto DOM do tipo TR, e nele vc pode fazer o que quiser… mas se for mesmo colocar um HREF terá que adicionar no TR(ROW) um “objeto A (tag HTML A)” e depois dentro dele um href e assim por diante…aconselho a ler mais sobre isso e a utilizar jQuery ou outro framewor javascript com o DWR, para evitar crossbroswer, pois dessa forma que esta no exemplo vc precisara ficar validando o browser.

Abraços

anderson.bonavides

Cara só você mesmo pra me ajudar com DWR, depois de tantas ajudas ainda se prontifica a me ajudar novamente. Espero retribuir esse favorzão com alguem da mesma forma.
Como dizem no Ceará: VALEU MACHO!
HAHA
Abraços…

handersonbf

Compartilhar conhecimento sempre :wink:

rsrs de nada :wink:

Abraços

anderson.bonavides

Olá Handerson, eu fiz as alterações para a seguinte maneira:

dwr.util.addRows("tabela", arquivoMonitoracaoTO, cellFuncs,{
				rowCreator:function(options) { 
				var row = document.createElement("tr");
		    	row.bgColor = "#FFFFFF";
		    	row.style.cursor = "pointer";
		
				return row;
			},
			cellCreator:function(options) {
				var td = document.createElement("td");
				if(validaBrowser()){
		    		td.attachEvent("onclick", function(e){downloadArquivo(arquivoMonitoracaoTO);});
		    	}else{
		    		td.addEventListener("click", function(e){downloadArquivo(arquivoMonitoracaoTO);}, false);
		    	}
				td.align = "center";
				return td;
			}
		});

Mas queria que ficasse como link apenas as informações da coluna nome e da coluna status. Dessa forma está todos e sinceramente ainda está obscuro para mim. Espero que não compreenda minha dificuldades.

=]

Grato!

handersonbf

Teste

handersonbf

Estranho, estou logado, mas quando clico em responder ele fica pedindo o login e a senha, já fiz logout e loguei novamente e nada…só está funcionando o Resposta Rápida…

Bem, cara para fazer da forma como você quer e sem um framework javascript, é muito -trabalhoso-.

Então o melhor e como você quer somente na coluna…faz da forma “tradicional”.

Pega o cellFuncs da sua coluna e altera…

function(arquivoMonitoracaoTO) {

return <a>“arquivoMonitoracaoTO.NSA”</a>”;

},

Pronto só isso.

Flw

anderson.bonavides

handersonbf:
Estranho, estou logado, mas quando clico em responder ele fica pedindo o login e a senha, já fiz logout e loguei novamente e nada…só está funcionando o Resposta Rápida…

Bem, cara para fazer da forma como você quer e sem um framework javascript, é muito -trabalhoso-.

Então o melhor e como você quer somente na coluna…faz da forma “tradicional”.

Pega o cellFuncs da sua coluna e altera…

function(arquivoMonitoracaoTO) {

return <a>“arquivoMonitoracaoTO.NSA”</a>”;

},

Pronto só isso.

Flw

Olá Handerson, realmente não funciona desta sua maneira, ele vai criar um string qualquer sem ser um hiperlink e já arrumei uma solução mas não é desta mesma forma. Sobre o responder é por conta do chach. Quando vc logar dar um crtl + F5 que fica normal.

Agradeço pela força.

Grato!

handersonbf

anderson.bonavides:
handersonbf:
Estranho, estou logado, mas quando clico em responder ele fica pedindo o login e a senha, já fiz logout e loguei novamente e nada…só está funcionando o Resposta Rápida…

Bem, cara para fazer da forma como você quer e sem um framework javascript, é muito -trabalhoso-.

Então o melhor e como você quer somente na coluna…faz da forma “tradicional”.

Pega o cellFuncs da sua coluna e altera…

function(arquivoMonitoracaoTO) {

return <a>“arquivoMonitoracaoTO.NSA”</a>”;

},

Pronto só isso.

Flw

Olá Handerson, realmente não funciona desta sua maneira, ele vai criar um string qualquer sem ser um hiperlink e já arrumei uma solução mas não é desta mesma forma. Sobre o responder é por conta do chach. Quando vc logar dar um crtl + F5 que fica normal.

Agradeço pela força.

Grato!

Não cara ele não irá criar uma string aleatória, você não viu nos meus artigos o escapeHtml ? Tem exatamente isso no artigo que te passei, e ele serve exatamente para não mostrar o código html.

O ctrl+f5 não funcionou…mas hoje já esta normal.

handersonbf

anderson.bonavides:
handersonbf:
Estranho, estou logado, mas quando clico em responder ele fica pedindo o login e a senha, já fiz logout e loguei novamente e nada…só está funcionando o Resposta Rápida…

Bem, cara para fazer da forma como você quer e sem um framework javascript, é muito -trabalhoso-.

Então o melhor e como você quer somente na coluna…faz da forma “tradicional”.

Pega o cellFuncs da sua coluna e altera…

function(arquivoMonitoracaoTO) {

return <a>“arquivoMonitoracaoTO.NSA”</a>”;

},

Pronto só isso.

Flw

Olá Handerson, realmente não funciona desta sua maneira, ele vai criar um string qualquer sem ser um hiperlink e já arrumei uma solução mas não é desta mesma forma. Sobre o responder é por conta do chach. Quando vc logar dar um crtl + F5 que fica normal.

Agradeço pela força.

Grato!

Não cara ele não irá criar uma string aleatória, você não viu nos meus artigos o escapeHtml ? Tem exatamente isso no artigo que te passei, e ele serve exatamente para não mostrar o código html.

O ctrl+f5 não funcionou…mas hoje já esta normal.

anderson.bonavides

Estranho isso sempre acontece comigo e o crtl+f5 sempre resolve. Mas voltando as modificações, as suas dicas : return “”+ listaArquivoMonitoracaoTO.nome +""; ou return ““listaArquivoMonitoracaoTO.nome””; não rola em JSF.

handersonbf

Como não rola em JSF ? Isso é HTML O_o

anderson.bonavides

Estranho não é Handerson? Mais é isto mesmo, ele cria uma String qualquer, um texo, e fica estático, sem ação nenhuma. Mas eu encontrei uma forma muito legal de criar tabelas com DWR através da documentação. Vou postar aqui quando chegar no trabalho para ficar publicado no guj. Acredito que você já saiba pela experiência que me mostrou.

=)

anderson.bonavides

Isto é um arquivo único e vou comentar apenas as partes mais importantes:

function init() {
  fillTable();
}

var peopleCache = { };
var viewed = -1;
var listaArquivoMonitoracaoTO = new Object();
function preencheTabela() {
	//obtem as informações do html.
	var dataInicial = dwr.util.getValue('form:dataInicial');
	var dataFinal = dwr.util.getValue('form:dataFinal');
	var orgaoArrecadador =  dwr.util.getValue('form:orgaoArrecadador');
	var tipoEnvio = dwr.util.getValue('form:tipoEnvio');
	
	if(dataInicial != "" && dataFinal != ""){
		monitorarRemessaRetornoBean.obterListaArquivoMonitoracao(dataInicial, dataFinal, orgaoArrecadador, tipoEnvio, montarTabela);
		setTimeout("preencheTabela()",1000);
	}
}
A função preenche tabela realiza uma consulta no banco de dados e returna uma lista qu é passado pra função montarTabela
function montarTabela(arquivoMonitoracaoTO){
	
		listaArquivoMonitoracaoTO = arquivoMonitoracaoTO;
		var arquivoMonitoracao = new Object();
		var id = 1;
		
	    dwr.util.removeAllRows("tabela", { filter:function(tr) {
	      return (tr.id != "listaArquivoMonitoracaoTO");
	    }});

	    arquivoMonitoracaoTO.sort(function(p1, p2) { return p1.nome.localeCompare(p2.nome); });

	    for (var i = 0; i <= arquivoMonitoracaoTO.length; i++) {
	    	
	    	arquivoMonitoracao = arquivoMonitoracaoTO[i];
	    	dwr.util.cloneNode("listaArquivoMonitoracaoTO", { idSuffix:id });
		    dwr.util.setValue("campoNome" + id, arquivoMonitoracao.nome);
		    dwr.util.setValue("campoNsa" + id, arquivoMonitoracao.NSA);
		    dwr.util.setValue("campoOrgaoArrecadador" + id, arquivoMonitoracao.orgaoArrecadador);
		    dwr.util.setValue("campoStatus" + id, obterTipoStatus(arquivoMonitoracao.status));
		    dwr.util.setValue("campoDataRecepcao" + id, formatarData(arquivoMonitoracao.dataRecepcao));
		    dwr.util.setValue("campoTempoProcessamento" + id, arquivoMonitoracao.tempoProcessamento);
		    dwr.util.setValue("campoQtdRegistros" + id, arquivoMonitoracao.qtdRegistros);
		    dwr.util.setValue("campoQtdRegistrosErro" + id, arquivoMonitoracao.qtdRegistrosErro);
		    dwr.util.setValue("campoQtdOcorrenciasSuspensivas" + id, arquivoMonitoracao.qtdOcorrenciasSuspensivas);
		    dwr.util.setValue("campoQtdOcorrenciasInformativas" + id, arquivoMonitoracao.qtdOcorrenciasInformativas);
		    $("listaArquivoMonitoracaoTO" + id).style.display = "table-row";
		    peopleCache[id] = arquivoMonitoracao;
		    
		    id++;
	    }
}
A função monta tabela irá interagir sobre o html inserindo as informações. Já a variável ID é responsável por criar id´s diferentes dentro da tabela. Ex: campoNome1, campoNome2, campoNome3... concatenando o nome do campo mais o valor do incremento. A função dwr.util.removeAllRows limpa a tabela antes de add novamente.
function obterTipoStatus(status){
	var result;
	switch(status){
		case 0:
			result = "P"; 
			break;
		case 1:
			result = "R";
			break;
		case 2:
			result = "S";
			break;
		case 3:
			result = "DDP";
			break;
		case 4:
			result = "R";
			break;
		case 5:
			result = "AR";
			break;
		case 6:
			result = "RE";
			break;
		case 7:
			result = "DDR";
			break;
		case 8:
			result = "E";
			break;
		case 999:
			result = "D";
			break;
	}
	return result;
}

function formatarData(dataRecepcao){
	
	var data = dataRecepcao;
	var dia = data.getDate();
	dia = dia + 1;
	var mes = data.getMonth();
	mes = mes + 1;
	var ano = data.getFullYear();   
	
	var hora = data.getHours();
	var minuto = data.getMinutes();
	var segundo = data.getSeconds();
	
	
	var dataformat = dia + '/' + mes + '/' + ano + 
					 ' - ' + 
					 hora + ':'+ minuto + ':' + segundo;

	return dataformat; 
}

As funções formatarData, obterTipoStatus é apenas para formatar campos.

Segue também o html:

<table border="1" class="rowed grey">
		  <thead>
		    <tr>
		      <th>Máscara</th>
		      <th>NSA</th>
		      <th>Órgão Arrecadador</th>
		      <th>Status</th>
		      <th>Data de Recepção</th>
		     <th>Tempo Gasto</th>
		      <th>Q.L</th>
		      <th>Q.C.E</th>
		      <th>Q.O.S</th>
		      <th>Q.O.I</th>
		    </tr>
		  </thead>
		  <tbody id="tabela">
		    <tr id="listaArquivoMonitoracaoTO" style="display:none;">
		      <td>
		        <a id="campoNome" href="#" onclick="download(this.id);"></a>
		      </td>
		      <td>
		      	<span id="campoNsa">campoNsa</span>
		      </td>
		     <td>
		      	<span id="campoOrgaoArrecadador">campoOrgaoArrecadador</span>
		      </td>
		      <td>
		      	<a id="campoStatus" href="#" onclick="tratar(this.id);" >campoStatus</a>
		      </td>
		      <td>
		      	<span id="campoDataRecepcao">campoDataRecepcao</span>
		      </td>
		      <td>
		      	<span id="campoTempoProcessamento">campoTempoProcessamento</span>
		      </td>
		      <td>
		      	<span id="campoQtdRegistros">campoQtdRegistros</span>
		      </td>
		      <td>
		      	<span id="campoQtdRegistrosErro">campoQtdRegistrosErro</span>
		      </td>
		      <td>
		      	<span id="campoQtdOcorrenciasSuspensivas">campoQtdOcorrenciasSuspensivas</span>
		      </td>
		      <td>
		      	<span id="campoQtdOcorrenciasInformativas">campoQtdOcorrenciasInformativas</span>
		      </td>
		    </tr>
		  </tbody>
		</table>

Pessoal ai resolveu meu problema eu posso usar qualquer.
Esta para campos comuns: campoQtdOcorrenciasInformativas
Esta para links:
Posso usar qualque tag passando o id.

Grato Handerson pq aprendi muito com você. Se for olhar com detalhes o início foi todo apartir dos seus materiais e o resto da documentação.

handersonbf

Puts tu complicou pra caramba eim, não precisava disso tudo…mas se resolveu seu problema blz :slight_smile:

handersonbf

Puts tu complicou pra caramba eim, não precisava disso tudo…mas se resolveu seu problema blz :slight_smile:

Criado 10 de março de 2010
Ultima resposta 16 de mar. de 2010
Respostas 17
Participantes 3