Macete !
Estou em fase de teste aqui, criando já o segundo site e servindo como aprendizado.
Alguns problemas em aprender Apache2(instalar/configurar) para funcionar o harbour... já venho fazendo isso há algum tempo.
O problema que apareceu aqui agora é:
Como mostrar no HTML um campo TEXT/Character com caracteres especiais ?
cDescrição := " Maria Da Silva "XYZ" "
O comando/tag em HTML <input type="text" name="cDescricao" value="Maria Da Silva "XYZ" " > isso ai não mostra corretamente em HTML "XYZ" está entre aspas.
Depois de algumas horas, criei esta função.
Function Main
cDescricao := HtmlEncode(cDescricao)
FUNCTION HtmlEncode( cString )
LOCAL cRet := hb_StrReplace( cString, { ;
"&" => "&", ;
'"' => """ , ;
"'" => "'" })
Return cRet
Simples!
Onde tem " (aspas) é convertido para ", que é mostrado corretamente no HTML.
#!/usr/local/bin/hbrun
#xcommand TEXT TO VAR <var> => #pragma __stream|<var>:=%s
#xcommand ENDTEXT => #pragma __endtext
MemVar cEscolha, cUsuario, cIdUsuario, cCRUD, cConta, cDescricao, cGrau, cTipo, cReduzida, cCurDir
MemVar nAnterior, nRazao, nDebito, nCredito, nSaldo, cSelA, cSelB, cDig, cBrwPlano
Function Main(...)
LOCAL cEOL := + hb_eol() + hb_eol(), cHtml
PRIVATE cEscolha:="", cUsuario:="", cIdUsuario:="", cCRUD:="", cConta := "", cDescricao:="", cCurDir:="", cGrau:=""
PRIVATE cTipo:="", cReduzida:="", nAnterior:="0,00", nRazao:="0,00", nDebito:="0,00", nCredito:="0,00", nSaldo:="0,00"
PRIVATE cSelA:="", cSelB:="", cDig:="X", cBrwPlano:=""
OutStd("Content-type: text/html" + cEOL )
/*Pegar as variáveis*/
PegaVar()
RddSetDefault( "DBFCDX" )
Set autopen On
hb_cdpSelect( "UTF8" )
IF cEscolha="Achar"
cCRUD := Procura_PC()
ELSEIF cEscolha="Gravar"
If empty(cConta)
return ErrorHTML( "Conta não informada." )
EndIf
cCRUD := PC_Gravar()
ENDIF
cCurDir := curdir()
cDescricao := HtmlEncode(cDescricao)
cBrwPlano := BrowsePlano()
TEXT TO VAR cHtml
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<style> body {font-family: Arial, Helvetica, sans-serif;} </style>
<script src="/javascript/jquery-1.2.6.pack.js" type="text/javascript"></script>
<script src="/javascript/jquery.maskedinput-1.1.4.pack.js" type="text/javascript" /></script>
<style>
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
td, th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
tr:nth-child(even) {
background-color: #dddddd;
}
</style>
</head>
<body>
<h2>Plano de Contas</h2>
<form id="myForm" action="PlanoCta.prg" method="POST">
<input type="hidden" name="cIdUsuario" value="&cIdUsuario" />
<input type="hidden" name="cUsuario" value="&cUsuario" />
&cDescricao
<fieldset>
Conta:<br>
<input type="text" style="text-align:left;" name="cConta" value="&cConta" size="16" id="cConta" required onkeypress="mascaraConta()" maxlength="12" />
<button type="submit" name="cEscolha" value="Achar" formaction="PlanoCta.prg">Procurar</button>
<br><br>
Descrição:<br>
<input type="" style="text-align:left;" name="cDescricao" value='&cDescricao' size="40" id="cDescricao"><br><br>
Grau:<br>
<input type="text" name="cGrau" value="&cGrau" size="1" id="cGrau"><br>
<br>
Tipo:<br>
<select name="cTipo">
<option value="A" &cSelA >Analítica</option>
<option value="S" &cSelB >Sintética</option>
</select>
<br><br>
<label>Reduzida:</label> <br>
<input type="text" name="cReduzida" maxlength="5" value="&cReduzida" size="6" id="cReduzida">
<input type="text" name="cDig" maxlength="1" value="&cDig" id="cDig" size="1" >
<br>
</fieldset>
<fieldset>
Crédito:<br>
<input type="text" style="text-align:right;" name="nCredito" value="&nCredito" size="14" id="nCredito"><br>
Débito:<br>
<input type="text" style="text-align:right;" name="nDebito" value="&nDebito" size="14" id="nDebito"><br>
Saldo:<br>
<input type="text" style="text-align:right;" name="nSaldo" value="&nSaldo" size="14" id="nSaldo"><br>
</fieldset><br>
<input type="submit" name="cEscolha" value="Gravar">
</form>
<hr>
<label> STATUS: &cCRUD</label>
<script> document.getElementById(“cConta”).focus(); </script>
<script type="text/javascript">
$(document).ready(function(){
$("#cCta").mask("9.99.99.99999");
});
</script>
<script type="text/javascript">
function mascaraConta(){
var cta= document.getElementById('cConta').value;
if(cta.length==1){
document.getElementById('cConta').value = cta +'.';
}
else if (cta.length==4){
document.getElementById('cConta').value = cta +'.';
}
else if (cta.length==7){
document.getElementById('cConta').value = cta +'.';
}
}
</script>
&cBrwPlano
</body>
</html>
ENDTEXT
OutStd( cHtml )
/*
<!--
<script type="text/javascript">
function myReset() {
document.getElementById("myForm").reset();
}
MyReset();
</script>
--->
*/
Return ""
*******************
Function Procura_PC
*******************
*
*
LOCAL lShared := .F., cOrd, cAchou:="", cCta
IF !AbreDb('../dados/planocta.dbf','pc',lShared)
Return ErrorHTML( "Erro abrindo arquivo: planocta.dbf" )
ENDIF
cCta := strtran(cConta,".","")
cOrd := pc->(OrdSetFocus(2)) //conta
IF pc->(DbSeeK( pad(cCta,16) ))
//cConta := alltrim(pc->conta)
cDescricao := alltrim(pc->nome)
cGrau := alltrim(pc->grau)
cTipo := alltrim(pc->tipo)
cReduzida := alltrim(str(val(substr(pc->reduzida,1,5))))
nAnterior := str(pc->anterior,2)
nRazao := str(pc->razao,2)
nDebito := str(pc->debito,2)
nCredito := str(pc->credito,2)
nSaldo := str( ( val(nCredito) - val(nDebito) ) + val(nAnterior) , 2 )
cSelA := Iif(cTipo=="A","selected","")
cSelB := Iif(cTipo=="S","selected","")
cAchou := "Conta localizada " + cConta
cDig := substr(pc->reduzida,6,1)
ELSE
If len(cCta) == 9
cTipo := "A"
cGrau := "4"
Else
cGrau := ""
cTipo := ""
EndIf
If cTipo == "A"
cDig := mod10( strzero(val(cReduzida),5) )
Else
cDig := ""
EndIf
cDescricao := ""
cReduzida := ""
nAnterior := "0,00"
nRazao := "0,00"
nDebito := "0,00"
nCredito := "0,00"
nSaldo := "0,00"
cSelA := ""
cSelB := ""
cAchou := "Conta não foi localizada " + cConta + " ---- " + str(len(cCta))
ENDIF
FechaDb('pc')
Return cAchou
***********************
Function PC_Gravar(...)
***********************
*
*
LOCAL lShared := .T., lIncluir, cTxt := "", cCta, cReduz
IF !AbreDb('../dados/planocta.dbf','pc',lShared)
Return ErrorHTML( "Erro abrindo arquivo: planocta.dbf" )
ENDIF
cCta := strtran(cConta,".","")
If len(cCta) == 9
cTipo := "A"
cGrau := "4"
EndIf
If cTipo == "A"
cDig := mod10( strzero(val(cReduzida),5) )
cReduz := strzero(val(cReduzida),5)+cDig
Else
cDig := ""
cReduz := ""
EndIf
pc->(OrdSetFocus(2)) //conta
lIncluir := !pc->(DbSeek(pad(cCta,16)))
IF lIncluir
IF Incluir('pc')
cTxt := "Incluido a"
Else
Return ErrorHTML( "Erro na inclusão, planocta.dbf" )
ENDIF
ELSE
cTxt := "Alteração da"
TravaRegistro('pc')
ENDIF
pc->conta := cCta
pc->nome := cDescricao
pc->grau := cGrau
pc->tipo := cTipo
pc->reduzida := cReduz
pc->anterior := val(nAnterior)
pc->razao := val(nRazao)
pc->debito := val(ndebito)
pc->credito := val(nCredito)
cSelA := Iif(cTipo=="A","selected","")
cSelB := Iif(cTipo=="S","selected","")
cReduzida := iif(cReduz == "","",str(val(cReduzida)) )
FechaDb('pc')
Return cTxt + " Conta: " + cConta + " -- " + cDescricao
********************
Function BrowsePlano
********************
*
*
LOCAL cHtml:="", lShared := .T.
cHtml := '<table>'
cHtml += '<tr>'
cHtml += '<th>Conta</th>'
cHtml += '<th>Descrição</th>'
cHtml += '<th>Grau</th>'
cHtml += '<th>Tipo</th>'
cHtml += '<th>Reduzida</th>'
cHtml += '</tr>'
IF !AbreDb('../dados/planocta.dbf','pc',lShared)
Return ErrorHTML( "Erro abrindo arquivo: planocta.dbf" )
ENDIF
pc->(DbGoTop())
Do While pc->(!eof())
cHtml += '<tr>'
cHtml += '<td>' + pc->conta + '</td>'
cHtml += '<td>' + pc->nome + '</td>'
cHtml += '<td>' + pc->grau + '</td>'
cHtml += '<td>' + pc->tipo + '</td>'
cHtml += '<td>' + pc->reduzida + '</td></tr>'
pc->(DbSkip())
EndDo
cHtml += '</table>'
Return cHtml
SET PROCEDURE TO "funcoes.prg"
Fonte completo para verem a intergração do Harbour com HTML, tudo misturado no .PRG e rodando no Ubuntu/Apache2
Aos poucos vamos abstraindo da linguagem, e entendendo os processos...Podendo depois mudar para PHP/Java/C/Perl/Python...
O importante é entender os programas que estão envolvidos e os problemas que existem e já solicionados por outros (desde muito tempo) independente de qualquer linguagem.
Saudações,
Itamar M. Lins Jr.