Mandar variável da view para o Conrtroller via jQuery / Ajax

1,027 views
Skip to first unread message

ari613

unread,
Sep 17, 2013, 4:16:08 PM9/17/13
to web2py-us...@googlegroups.com
Ola A todos
Novamente uma questão a princípio simples.

A pergunta seria como fazer pra simplesmente mandar uma variável para o controller via JS (especificamente jQuery)?

Nao consigo fazer isso.

O exemplo abaixo mostra mais ou menos o que eu quero.

mas o problema é que quero gravar apenas um campo numa tabela que possui muitos campos. Se eu mandar isso num SQLFORM normal e tratar com form.accepts ele vai dar erro que está faltando os campos obrigatórios.
Por isso quero mandar aenas uma variável com o valor que quero gravar nesse meu campo e fazer :

db.mytable[id] = dict(myfield='somevalue')

onde esse 'somevalue'  seria a variavel que trago da minha view via jQuery/ajax.

Só que a minha def no controller não está reconhecendo/lendo a variável.

na minha view tenho

            <form id="form_textopdf">
               <textarea class="editor" id="texto_do_pdf" style="width: 80%; height: 375px;" >
                   {{=message}}
	       </textarea>
               <input type="submit" value="Grava Texto PDF" />
            </form>
            <div id="target">bla</div>

<script>
jQuery('#form_textopdf').submit(function() {
  var html_do_pdf = $('#texto_do_pdf').val();
  ajax('../grava_txt_pdf', [ html_do_pdf ], 'target');
  return false;
});
</script>

no meu controller

def grava_txt_pdf():
    id_orcamento = request.args(0)
    try:
        db.t_orcamento[id_orcamento] = dict(f_texto_proposta=html_do_pdf)
        return DIV("Message posted")
    except:
        return TABLE(*[TR(k, v) for k, v in form.errors.items()])


Diogo Munaro

unread,
Sep 17, 2013, 4:39:35 PM9/17/13
to web2py-us...@googlegroups.com
Oi ari613! No trecho

ajax('../grava_txt_pdf', [ html_do_pdf ], 'target');

por que existe o ../grava_txt_pdf? Acho que seria somente assim:

ajax('grava_txt_pdf', [ html_do_pdf ], 'target');
e aqui:

var html_do_pdf = $('#texto_do_pdf').val();

quando você pega o valor do campo html_to_pdf é meio inútil porque na verdade quando você coloca na função ajax que quer o html_to_pdf ele já pega o campo que tem aquele nome, ou seja, precisa colocar o parâmetro name="html_to_pdf" aqui ao invés do id, assim:
<textarea class="editor" name="texto_do_pdf" style="width: 80%; height: 375px;" >

Outro problema é que você usou o .submit do jquery aqui:

jQuery('#form_textopdf').submit(function() {
com isso, ele vai enviar o formulário. Precisa trocar por click, assim:
jQuery('#form_textopdf').click(function() {
e alterar o botão de submit por button, porque senão vai enviar de qualquer forma:

<input type="button" value="Grava Texto PDF" />
Acho que é só isso.

Depois posta o resultado aqui! Abraços!!


--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-br...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você está recebendo esta mensagem porque se inscreveu no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para web2py-users-br...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

Diogo Munaro

unread,
Sep 17, 2013, 4:41:25 PM9/17/13
to web2py-us...@googlegroups.com
Na verdade aqui coloca html_do_pdf ao invés de texto_do_pdf:


<textarea class="editor" name="html_do_pdf" style="width: 80%; height: 375px;" >

Ari Sobel

unread,
Sep 17, 2013, 4:57:06 PM9/17/13
to web2py-us...@googlegroups.com
Grande Diogo, muito obrigado pela atenção..! vou testar já!

Diogo Munaro

unread,
Sep 17, 2013, 5:10:30 PM9/17/13
to web2py-us...@googlegroups.com
Boa garoto! Não esquece de voltar com o resultado :D

Ari Sobel

unread,
Sep 17, 2013, 5:32:06 PM9/17/13
to web2py-us...@googlegroups.com
Opa, deu quase  tudo certo. Mas parece que nao estou conseguindo passar o valor da variável ali para a Def.
Será que é por que meu camppo é um textArea?

Diogo Munaro

unread,
Sep 17, 2013, 5:40:24 PM9/17/13
to web2py-us...@googlegroups.com
Testa com input normal, mas acho que não deveria ser um problema

Vinicius Assef

unread,
Sep 17, 2013, 6:53:41 PM9/17/13
to web2py-us...@googlegroups.com
Eu não consegui identificar de onde vem a variável html_do_pdf dentro
do seu controller.

Que dados você quer passar para o controller, exatamente?

Uma dica: sempre explicite qual exception você está interceptando. Não
trate exceptions genéricas, como você fez no controller. ;-)




2013/9/17 Ari Sobel <arieh...@gmail.com>:

Ari Sobel

unread,
Sep 17, 2013, 9:45:08 PM9/17/13
to web2py-us...@googlegroups.com
Ola Diogo, Grande Vinicius...

seguinte: to usando um textArea, pois to usando uma Wysiwyg -  que é um editor de richText/Html (http://jhollingworth.github.io/bootstrap-wysihtml5/) - o qual quero usar ara formar o Html que vou mandar num email.

A prncipio, ele funciona m cima de textarea, conforme o link acima:
  1. $('.textarea').wysihtml5();

O que eu quero é pegar esse Html que ele gera, gravar num campo dentro 'text' dentro ada minha tabela, no caso 'Orçamento' e mas pra frente egar esse campo e manda-lo como e-mail, ou renderizar um PDF em cima dele.

Respondendo a sua pergunta Diogo se  eu usar um input, nao acredito que o componete iria funcionar.

Vinicius, para responder a tua pergunta:
  var html_do_pdf = $('#texto_do_pdf').val();
  ajax('../grava_txt_pdf', [ html_do_pdf ], 'target');


no ajax pensei que dava pra jogar o valor do campo em uma variável,  e mandar a variável pra a def no controller. Mas acho que nao é bem assim, né?

Teria que se referir a request.vars, certo?
Esse request.vars poderia pegar o valor de qqer variável?

parece que request.vars.html_do_pdf nao funciona no controller, conforme testei.
Só daria passar o valor para o controller se fosse via input?

Abraços!

Vinicius Assef

unread,
Sep 18, 2013, 4:21:28 AM9/18/13
to web2py-us...@googlegroups.com
2013/9/17 Ari Sobel <arieh...@gmail.com>:
>
> O que eu quero é pegar esse Html que ele gera, gravar num campo dentro
> 'text' dentro ada minha tabela, no caso 'Orçamento' e mas pra frente egar
> esse campo e manda-lo como e-mail, ou renderizar um PDF em cima dele.

Bom, se você quer enviar um campo para o backend para alterar um
estado do seu sistema, por definição você precisa fazer um POST.

Sim, estou sendo purista nesse caso. hehehe

>
> no ajax pensei que dava pra jogar o valor do campo em uma variável, e
> mandar a variável pra a def no controller. Mas acho que nao é bem assim, né?

É assim, mas veja a separação entre client side e server side.
O javascript roda no browser, enquanto o web2py roda no servidor.
Então, o client precisa enviar os argumentos de modo que o server
entenda.

>
> Teria que se referir a request.vars, certo?

Sim, desde que seu client envie uma requisição no formato de query string.
Mas, sendo purista novamente, uma query string envia requisição como
GET, o que não seria indicado para mudar estado da sua aplicação.

> Esse request.vars poderia pegar o valor de qqer variável?

Sim, desde que ela seja passada pelo cliente assim:
http://meusite.com/meucontroller?var1=conteudo&var2=conteudo

>
> parece que request.vars.html_do_pdf nao funciona no controller, conforme
> testei.
> Só daria passar o valor para o controller se fosse via input?

Não, o campo não precisar ser renderizado como um <input> no html. Até
porque nem precisa de um form html para enviar dados para o
controller, basta ser uma URL.

O que eu recomendaria:
1) Faça seu controller recebendo dado via POST a partir de um
formulário comum, sem usar FORM ou SQLFORM.
2) Depois que isso funcionar, faça seu ajax enviar uma requisição de
POST passando os mesmos parâmetros.

Outra dica:
Lembre-se que uma requisição ajax é uma chamada normal de URL e pode
ser testada diretamente pela barra de endereço do seu navegador.
Então, para facilitar seu teste, faça-a funcionar, primeiro, como uma
URL normal (o que ela realmente é), informando os parâmetros na URL
(quando for um GET) ou enviando um formulário (quando for um POST).
Assim fica mais fácil ter controle sobre o que está acontecendo.

Diogo

unread,
Sep 18, 2013, 5:56:18 AM9/18/13
to web2py-us...@googlegroups.com
Desculpe, mas Já verificou no console do navegador o que está sendo enviado?


Vinicius Assef <vinic...@gmail.com> escreveu:

Ari Sobel

unread,
Sep 18, 2013, 7:01:30 AM9/18/13
to web2py-us...@googlegroups.com
Ola, Diogo, 
Vou trabalhar as idéias do Vinicius ainda, quando chegar ao escritorio.

Olhei no console e nao ta sendo enviado nada (volta 'None').

Abs

Enviado via iPhone

Ari Sobel

unread,
Sep 18, 2013, 10:19:49 AM9/18/13
to web2py-us...@googlegroups.com
Opa, Pessoal.. sucesso  !

Deu tudo certo.

Seguindo as recomendações do VInicius testei passo a passo (manualmente via URL também) a maneira que o controller recebia as variáveis, e que a view as mandava.

O mais importante foi que entendi que, exatamente como no PHP (no qual sou cru, mas vim dali), a forma que se envia variáveis GET para a função (no caso aqui a Def dentro do controller) é:

e o controller as recebe embaixo da variável
request.vars.var

Outra consideração que devo fazer é que, por enquanto, abandonei a função customizada do w2p ajax  e usei a post nativa do jQuery.

No final das contas ficou assim:

na view:

    $.post("../grava_txt_pdf",{id:id, html:html}, function(result){
         $("target").html(result);
    });
onde nas variáveis id e html carreguei com o conseúdo que bem entendi (no caso o id do orcamento e o texto a modificar) - mas trabalhando com $.post ou $.get posso siimular envio de um form nos métodos POST e GET, sem necessáriamente possuir um formulário.


no controller:
def grava_txt_pdf():
    id_orcamento = request.post_vars.id
    try:
        db.t_orcamento[id_orcamento] = dict(f_texto_proposta=request.post_vars.html)
        return DIV("sucesso")
    except:
        return DIV("algum Erro" )

o detalhe aqui é que o segmento de código não está funcionando:

$("target").html(result);

ele nao coloca o retorno (return da def) dentro da div "target" que eu criei... mas isso é meio que de menos (mas aceito ajuda aqui tb..)...

Obrigado Diogo,  obrigado Vinicius!!

Abcs
Ari
330.gif

Diogo Munaro

unread,
Sep 18, 2013, 10:39:31 AM9/18/13
to web2py-us...@googlegroups.com

$("#target").html(result);
330.gif

Ari Sobel

unread,
Sep 18, 2013, 10:43:05 AM9/18/13
to web2py-us...@googlegroups.com
Tem razão Diogo!!!
Era isso mesmo..!

Pra quem nao notou, a falta do "#"

Agora Sucesso total! 100%!

Thanks!
330.gif

Ari Sobel

unread,
Sep 18, 2013, 2:05:09 PM9/18/13
to web2py-us...@googlegroups.com
Obrigado, patrao

Enviado via iPhone

Em 18/09/2013, às 13:11, Vinicius Assef <vinic...@gmail.com> escreveu:

Às ordens, chefe. :-)


2013/9/18 Ari Sobel <arieh...@gmail.com>
Opa, Pessoal.. sucesso <330.gif> !

Vinicius Assef

unread,
Sep 18, 2013, 12:10:46 PM9/18/13
to web2py-us...@googlegroups.com
Às ordens, chefe. :-)


2013/9/18 Ari Sobel <arieh...@gmail.com>
Opa, Pessoal.. sucesso  !
330.gif
Reply all
Reply to author
Forward
0 new messages