Codigo Generico para pegar e atualizar campos do Form

Caros Amigos

Estou iniciando nesta programacao web e apanhando muito com o primeiro programa em PHP, recorrendo a Javascript para tornar os campos dinamicos … peco perdao pelo detalhamento do problema, vamos la:

A ideia é muito simples: listo varios itens que tem no BD, trazendo a quantidade e o usuario digita o valor unitario e aparece o valor total (qtde x unit) em outro campo, na mesma linha.

So que eu nao tenho ideia de quantas linhas eu terei na tela. Um pedido pode ter 1 linha, o outro 20 linhas … entao, no PHP eu usei o while e fui criando as linhas do formulario, onde cada linha tem os 3 campos: qtde (preenchido, disable), unitario (para digitacao) e valor total (que retorna a multiplicacao, disable)

para cada linha, e aqui é importante, eu gerei os nomes de maneira automatica:
cpo_qtde1, cpo_unit1, cpo_tot1 para a primeira linha
cpo_qtde2, cpo_unit2, cpo_tot2 para a segunda linha
cpo_qtde5, cpo_unit5, cpo_tot5 para a quinta linha e assim por diante
usei o tabindex para so passar nos cpo_unitXXX

ao sair do cpo_unit1, temos o evento onBlur=Calcula(variavel);
esta variavel é o numeral que diferencia cada linha, 1, 2 … 5 … etc … tambem gerado la no php

entao tenho
para o item 1 … onBlur=Calcula(1);
para o item 2 … onBlur=Calcula(2);
para o item 5 … onBlur=Calcula(5);

meu formulario tem o nome de frm_itens, e no javascript fiz assim para o primeiro item:

<script type="text/javascript"> function Calcula(linha_controle) { if (linha_controle==1) { wcpo1_qtde = document.frm_itens.cpo_itmqtde1.value; wcpo1_unit = document.frm_itens.cpo_itmvalue1.value; wcpo1_tot = wcpo1_qtde * wcpo1_unit; document.frm_itens.cpo_itmtot1.value=wcpo1_tot; } } </script>

Eis o problema ! Eu nao posso criar um bloco IF para cada registro que eu tiver na tela. Posso ter 2, 10, 50 … posso ate criar 100 blocos de IF e deixar um aviso caso dê o azar de ter 101 (é uma solucao, claro). Mas acho que posso tornar a funcao acima bem generica. Basicamente, eu precisaria tornar inteligentes as 3 linhas que fazem referencia ao imtqtde1, itmvalue1 e itmtot1

Nao consegui automatizar isto e tirar finalmente o if (linha_controle==1) da rotina. Por ser um programador muito velho, risos, estou perdido nesta juncao de HTML, PHP, Javascrit, SQL, CSS e nao sei mais o que vou encontrar pela frente…

Grande Abraco a Todos

Manuel

Sugestão

Faça uma paginação se e isto que eu entendi.

Uma coisa interessante em javascript é que toda propriedade que você acessa com o operador . (ponto) você pode acessar entre [""] (colchete + string)

Por exemplo, no seu caso:

  wcpo1_qtde = document.frm_itens.cpo_itmqtde1.value;  

Também pode ser:

  wcpo1_qtde = document.frm_itens["cpo_itmqtde1"].value;  

Isso sozinho não te ajuda muito, mas daí você pode deixar o indíce variável assim:

  wcpo1_qtde = document.frm_itens["cpo_itmqtde" + linha_controle ].value;  

Algumas observações:

  • Sempre que for usar uma variável, utilize var para criá-la. (E dê nomes claros para elas!)
    No seu caso wcpo1_qtde poderia ser apenas quantidade (sem o 1, pois usará a mesma variável para qualquer linha)

  • Para esse tipo de situação (mesmo evento em vários objetos), o pessoal costuma utilizar delegação de eventos.
    Mas isso você pode deixar para quando tiver mais experiência.