Respuestas de foro creadas
-
AutorEntradas
-
XeviParticipante
Faltaba el envío de SMS con LleidaNet...
sustituir el If...Else por1234567891011121314151617181920212223242526If cSMS = "lleidanet"cUser := "usuario"cPasw := "password"WITH OBJECT CreateObject("msxml2.ServerXMLHTTP"):Open( "POST", "https://api.lleida.net/sms/v2/", .F. ):SetRequestHeader( "Content-Type","application/x-www-form-urlencoded;charset=UTF-8" )If cSMS = "lleidanetSMS":Send( 'xml=<sms>' +;'<user>' + cUser + '</user>' +;'<password>' + cPasw + '</password>' +;'<dst>' + '<num>' + "+34615213232" + '</num>' + '</dst>' +;'<txt>' + "test" + '</txt>' +;'</sms>' )Else:Send( 'xml=<userinfo>' +;'<user>' + cUser + '</user>' +;'<password>' + cPasw + '</password>' +;'</userinfo>' )EndIfcHtml := :ResponseTextEND//OBJECToCGI:Console( cHtml )nAt := At( "<credit>", cHtml ) +8cHtml := AllTrim( Str( Val( SubStr( cHtml, nAt, At( "</credit>", cHtml ) - nAt ) ), 10 ) )cHtml := Tag("script", "alert('" + "Saldo SMSs LleidaNet (" +cUser+ "): " + cHtml + "')" )XeviParticipanteEste és el código al pulsar en un boton...
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778FUNCTION TestSMSsAjax()Local cHtml, nAtLocal cSMS := oCGI:GetCgiValue("lleidanet_descom","")Local aHasRes := {=>}Local cUser, cPaswIf cSMS == "lleidanet"cUser := "usuario"cPasw := "password"WITH OBJECT CreateObject("msxml2.ServerXMLHTTP"):Open( "POST", "https://api.lleida.net/sms/v2/", .F. ):SetRequestHeader( "Content-Type","application/x-www-form-urlencoded;charset=UTF-8" ):Send( 'xml=<userinfo>' +;'<user>' + cUser + '</user>' +;'<password>' + cPasw + '</password>' +;'</userinfo>' )cHtml := :ResponseTextEND//OBJECToCGI:Console( cHtml )nAt := At( "<credit>", cHtml ) +8cHtml := AllTrim( Str( Val( SubStr( cHtml, nAt, At( "</credit>", cHtml ) - nAt ) ), 10 ) )cHtml := Tag("script", "alert('" + "Saldo SMSs LleidaNet (" +cUser+ "): " + cHtml + "')" )ElseIf cSMS = "descom"cUser := "usuario"cPasw := "password"WITH OBJECT CreateObject( "msxml2.ServerXMLHTTP")If cSMS = "descomSMS"*https://www.descomsms.com/api-sms/llamadas/enviar-sms.html:Open( "POST", "https://api.descomsms.com/api/sms/send", .F. )Else*https://www.descomsms.com/api-sms/llamadas/obtener-el-saldo.html:Open( "GET", "https://api.descomsms.com/api/balance", .F. )EndIf:SetRequestHeader( "Content-Type", "application/json" ):SetRequestHeader( "DSMS-User", &('"' + cUser + '"') ):SetRequestHeader( "DSMS-Pass", &('"' + cPasw + '"') )If cSMS = "descomSMS":Send( '{ "dryrun":true,'+; //true simulará un envío sin que se descuente créditos en la cuenta' "messages": ['+;' {'+;' "to": ['+;' "615213232"'+;' ],'+;' "text": "test",'+;' "senderID": "Info"'+;' }'+;' ]'+;'}' )Else:Send()endIfcHtml := :ResponseTextEND//OBJECToCGI:Console( cHtml )* //Json a Hash... http://fivetechsupport.com/forums/viewtopic.php?f=6&t=37056hb_jsondecode(cHtml,@aHasRes) //Parse JSON to hashTRYIf cSMS = "descomSMS"cHtml := "Envio Ok. Saldo SMSs Descom (" +cUser+ "): " + AllTrim(Str(aHasRes["credits_after"]))ElsecHtml := "Saldo SMSs Descom (" +cUser+ "): " + AllTrim(Str(aHasRes["balance"]))EndIfCATCHcHtml := "Error message (" +cUser+ "): " + nfl_AsciiHTML(aHasRes[1]["message"])END//TRYcHtml := Tag("script", "alert('" + cHtml + "')" )ElsecHtml := Tag("script", "alert('No soportado')" )EndIfoCGI:SendScript( cHtml )RETURN NilPuedes solicitar un usuario/password de pruebas en el proveedor LleidaNet o Descom.
XeviParticipanteTengo funcionando mensajes SMS en Xailer y lo porté a Néfele, para comprovar como se comportava, y bien.
https://xevicomas.duckdns.org/cgi-bin/xcmProves_TestSMSs.exe
Aquí puedes ver la petición de Saldo en los proveedores de servicio SMS LleidaNet y Descom, y en Descom, un envio de un mensaje (en modo prueba), con la respuesta recibida por el proveedor.
Se puede ampliar tanto como se quiera, siguiendo las pautas del API del proveedor. A mi por lo que lo estoy utilizando, me sirve como está.
Si necesitas código, te lo puedo pasar, aunque si yo he llegado hasta aquí, facil és, te lo aseguro!!!
XeviParticipanteGabriel
Yo lo estoy utilizando, y lo que no he visto documentado, lo intento con cCss
123456789101112131415WITH OBJECT wTabs():New(:WO):AddItem( "Paginat/Detall", "bevel_1" ):AddItem( "Llistat", "bevel_2" )WITH OBJECT :oStyle:cBackground_color := "transparent":cHeight := "35px"END WITH:Create()END WITH:cCSS += ".tabs .tab a { font-weight: bold;color: white; }" //Texto pestaña no activa:cCSS += ".tabs .tab a:hover, .tabs .tab a.active { color: black !important;}" //Texto pestaña activa:cCSS += ".tabs .tab a:focus, .tabs .tab a:focus.active { background-color: #aaddd6; }" //Fondo pestaña activa:cCSS += ".tabs .indicator { background-color: black; }" //Barra indicadora pestaña activa:cCss += ".tabs .tab { text-transform: initial; }" //Para dejar el texto tal cual, sinó pone el texto de las etiquetas en mayúsculasXeviParticipanteLo acabo de probar, ya desde que lo puse en ejemplos ahí se quedó el código...
Copiar-Pegar el código mismo que tienes en el mensaje anterior, y está funcionando perfectamente.Puedes verlo en...
https://xevicomas.duckdns.org/cgi-bin/xcmProves_ListViewPaginacion.exe
Un detalle que debes de tener en cuenta, si no te está funcionando. Debes de tener enrutado la funció encargada de la paginación
1234567// El RUN anterior entra por aquí y llama al Method correspondienteClass TCgi FROM XCgi// Este es nuestro Router para evitar inyección de código malicioso y aportar la máxima seguridad.// Solo se permite la llamada a los Method de oCgi aquí nombrados que a su vez llaman a Procedure, Function o Method'sMETHOD MainFunction() INLINE Factures()METHOD FacturesAjaxChangePage() INLINE FacturesAjaxChangePage()- Esta respuesta fue modificada 3 años, 7 meses por Xevi.
XeviParticipanteRamon,
lo que pretendes es disponer de una clase TDataSet o TRecordSet de la base de datos o tabla... me da que no está implementada.
Pero te puedes crear una clase y vas añadiendo, ampliando a medida que vayas necesitando... y si finalmente se implementa una clase, pues todo eso que se aprende.
En acceso a DBFs lo veo muy útil, pero para SQL, como lo haces todo en una sentencia Execute o Query... de momento no lo he necesitado
Para modelo de datos para DBFs lo que hago es tener mi clase (modelo) para abrir mi base de datos, tabla y cargo en un hash los datos que voy necesitando de esa tabla.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768//------------------------------------------------------------------------------//------------------------------------------------------------------------------// Classe Model FACTURES DBFs//------------------------------------------------------------------------------//------------------------------------------------------------------------------CLASS FacturesDbfModelDATA cAliasMETHOD New() CONSTRUCTORMETHOD GetId()METHOD Load()ENDCLASS*********METHOD New( cEmp, cnTag ) CLASS FacturesDbfModelLocal cFileDEFAULT cEmp TO oCgi:GetUserData('gwinemp')cFile := oCgi:GetUserData('gwinpath') + cEmp + "\Factu."USE (cFile+"Dbf") SHARED NEW::cAlias := Alias()If cnTag # NilOrdListAdd( (cFile+"Cdx") )OrdSetFocus(cnTag)EndIfRETURN SELF*********METHOD GetId( nId ) CLASS FacturesDbfModelDEFAULT nId TO 0(::cAlias)->( DbGoTo( nId ) )RETURN ::Load()*********METHOD Load() CLASS FacturesDbfModelLocal hRow := {=>}hRow[ 'id' ] := (::cAlias)->( Recno() )hRow[ 'factura' ] := AllTrim( (::cAlias)->FACTURA )hRow[ 'datafac' ] := DtoC( (::cAlias)->datafac )hRow[ 'nom' ] := AllTrim( (::cAlias)->nom )hRow[ 'adreca' ] := AllTrim( (::cAlias)->adreca )hRow[ 'poblacio' ] := AllTrim( (::cAlias)->poblacio )hRow[ 'import' ] := Transform( (::cAlias)->tot, "@E 9,999,999.99" )hRow[ 'codi' ] := AllTrim( (::cAlias)->CODI )hRow[ 'total' ] := Alltrim(Transform( TotalFactura(::cAlias), "@E 999,999,999.99" ))hRow[ 'nif' ] := AllTrim( (::cAlias)->DNI )RETURN hRowse pueden crar más métodos... como seria Add() Replace() Seek()
Igual te puede servir para guiarte en tu implementación de una clase propia.
- Esta respuesta fue modificada 3 años, 8 meses por Xevi.
XeviParticipanteRamon, si no dispones de la versión Enterprise de Xailer, debes de prescindir de incluir la llamada a la clase TMariaDBDataSource()
Si dispones de la versión Enterprise, debes de incluir la lib correspondiente.Si solo quieres utilizar el driver ODBC de Harbour/Néfele...
12345678910111213141516171819202122232425262728293031323334353637383940FUNCTION xcm_MdbConnect( cDataBase, cHost, cUser, cPassword )Local oObjectDEFAULT cHost TO "localhost"DEFAULT cUser TO "miusuario"DEFAULT cPassword TO "mipassword"oCGI:Console( "cHost = " + cHost )If AScan( nfl_GetDriversODBC( xc_MariaDB ), {|x| x = "MariaDB" } ) > 0oCGI:Console( "MariaDB ODBC Driver" )WITH OBJECT oObject := WAdoConnect():New():nEngine := xc_MariaDB:cDriver := "MariaDB ODBC 3.0 Driver":lDisplayErrors := .F.:cHost := cHost:cUser := cUser:cPassword := cPasswordIf cDataBase # Nil:cDataBase := cDataBaseEndIfEND WITHElse/*oCGI:Console( "MariaDB Xailer" )WITH OBJECT oObject := TMariaDBDataSource():Create():lDisplayErrors := .F.:cHost := cHost:cUser := cUser:cPassword := cPasswordIf cDataBase # Nil:cDataBase := cDataBaseEndIfEND WITH*/oCGI:Console( "Driver NO ENCONTRADO o NO INSTALADO" )EndIfRETURN oObjectPrueba así
XeviParticipantePues, por ejemplo...
12345WITH OBJECT xcm_MdbConnect()If :Connect()aBICswift := :QueryArray( "SELECT * FROM gwin.bicswift" ):Disconnect()EndIfo
1234567WITH OBJECT xcm_MdbConnect( "xevi", AppData:cServerMDB )If :Connect()aQuery := :QueryArray( "SELECT registre,codi FROM registresactius" ):Disconnect()ElseReturnEndIfXeviParticipanteYo estoy trabajando PERFECTAMENTE con MariaDB
Tengo mi funcioncilla, la que llamo en cada conexión que quiero realizar.
Si a alguien puede ser de utilidad...
12345678910111213141516171819202122232425262728293031323334353637FUNCTION xcm_MdbConnect( cDataBase, cHost, cUser, cPassword )Local oObjectDEFAULT cHost TO "localhost"DEFAULT cUser TO "miusuario"DEFAULT cPassword TO "mipassword"oCGI:Console( "cHost = " + cHost )If AScan( nfl_GetDriversODBC( xc_MariaDB ), {|x| x = "MariaDB" } ) > 0oCGI:Console( "MariaDB ODBC Driver" )WITH OBJECT oObject := WAdoConnect():New():nEngine := xc_MariaDB:cDriver := "MariaDB ODBC 3.0 Driver":lDisplayErrors := .F.:cHost := cHost:cUser := cUser:cPassword := cPasswordIf cDataBase # Nil:cDataBase := cDataBaseEndIfEND WITHElseoCGI:Console( "MariaDB Xailer" )WITH OBJECT oObject := TMariaDBDataSource():Create():lDisplayErrors := .F.:cHost := cHost:cUser := cUser:cPassword := cPasswordIf cDataBase # Nil:cDataBase := cDataBaseEndIfEND WITHEndIfRETURN oObjectAsí voy probando un u otro conector a MariaDB.
Eso si, para Néfele, se ha de instalar el driver 32bits, como está descrito en el sample.
XeviParticipanteJose,
Copiada... y sigue haciendo lo mismo, no muestra página web alguna.
Un saludo,
Xevi.
- Esta respuesta fue modificada 3 años, 10 meses por Xevi.
XeviParticipanteJose,
El sample WebView de Xailer7, no me muestra ninguna web. No se si es por ser la versión DEMO, pero no funciona el sample.
Un Saludo,
Xevi.
XeviParticipanteFredy,
Teneis previsto alguna actualización próxima y que incluya esta novedad y seguramente más que teneis ya preparadas???
Un Saludo,
Xevi.
XeviParticipantePerfecto!!!
XeviParticipanteBien, esto en cuanto a botones, pero... ¿si quiero poner un Label y seguidamente un Botón, o una imagen ???
Label e Image no disponen de la propiedad :lContainer
Alguna forma???
Un Saludo,
Xevi.
XeviParticipanteGracias, pero con aWidth lo que hace es responder al "responsive" y me "aumenta" el tamaño a lo largo, cuando expando/reduzco el ancho de la ventana.
Lo que busco es que sin caso al responsive, poner los elementos/controles uno seguido del anterior.
Revisando, he visto que con :lContainer := .F. consigo lo que necesito, en este caso.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546WITH OBJECT WPanel():New(:WO)WITH OBJECT WLabel():New(:WO):nFontSize := 5:lBold := .T.:cAlign := xc_Left:cText := "TestSMSs":Create()END WITHWITH OBJECT WButton():New(:WO):cText := "LleidaNet/Saldo":cOnClick := "SMSsSaldoAjax":cAjaxBevel := "nflcargo":aParams := { { "lleidanet_descom", "lleidanet" } }:cPosition := "left":oStyle:cWidth := 120:oStyle:cMargin_left := -4:oStyle:cMargin_bottom := 10:Create()END WITH //WButtonWITH OBJECT WButton():New(:WO):cText := "Descom/Saldo":cOnClick := "SMSsSaldoAjax":cAjaxBevel := "nflcargo":aParams := { { "lleidanet_descom", "descom" } }:oStyle:cWidth := 120:oStyle:cMargin_bottom := 10:lContainer := .F.:Create()END WITH //WButtonWITH OBJECT WButton():New(:WO):cText := "Descom/SMS":cOnClick := "SMSsSaldoAjax":cAjaxBevel := "nflcargo":aParams := { { "lleidanet_descom", "descomSMS" } }:oStyle:cWidth := 120:oStyle:cMargin_left := 10:oStyle:cMargin_bottom := 10:lContainer := .F.:Create()END WITH //WButton:Create()END WITHAsí, pues, un boton, salto de línea y un par de botones uno al ladico del otro.
Gracias.
Un Saludo,
Xevi.
XeviParticipanteRetomando este hilo...
Hace unos días que estoy apartado de mis prubas, y veo que en alguna actualización, algo ha variado al "subir" un fichero.
El tema por lo que concierne a la subida de fichero, al menos en este caso que estoy probando (fichero excel) no termina de funcionar correctamente, pues el fichero original y el recibido en la carpeta cgi-bin/tmp no son "iguales"
Si intento abrir el fichero recibido con excel, encuentra un error y excel informa y "repara"... cosa que no me sirve, pues debo tratar ese archivo sin abrir excel, sinó SOLO utilizando el objeto "Excel.Application"
Comparando los dos archivos, el de origen i el tmp, (con Winmerge), veo que el fichero tmp le añade un retorno de carro al final del fichero.
Anteriormente se le añadía un caracter 1A, pero por lo visto, ahora se le añade ese caracter de retorno de carro
EDITADO ***
Más concretamente, se añaden, actualmente, 2 carácteres de más, Chr(13) y Chr(10). De momento "reescribo" el archivo quitando 2 bytes, y funciona.
12345Local cFileTemp := GetTempFilename( oCgi:cPathTmp )Local cMemo := HB_MemoRead( cFileFullXLS )oCGI:Console( cFileTemp, Len(cMemo) )HB_MemoWrit( cFileTemp, SubStr(cMemo,1,Len(cMemo)-2), .F. )cFileFullXLS := cFileTempUn Saludo,
Xevi.
- Esta respuesta fue modificada 3 años, 10 meses por Xevi.
XeviParticipanteLa ventana Modal, recibe el parámetro de la ventana Inicial, y la ventana Modal retorna el valor a la ventana Inicial
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101PROCEDURE ProvaModal()// Comenzamos instanciando la Página Web que queremos crearWITH OBJECT TWebPage():New():lAlerts := .T. // Como vamos a usar alerts desde ajax, tenemos que indicarlo a webpageCrearModal( :WO ) // Creamos la ventana modalWITH OBJECT WBevel():New( :WO ):cId := "myBevel"WITH object WEdit():New( :WO ):cId := "myEdit1":cTitle := "Mi Edit1":Create()END WITHWITH object WButton():New(:WO):cText := "Prueba abrir ventana Modal":aParams := { { "myEdit1", "#myEdit1"} }:cOnClick := "AbrirModal":cAjaxBevel := "nflcargo":Create()END:Create()ENDoCgi:SendPage(:Create())END WITHRETURN//----------------------------------------------// creamos la ventana modalFUNCTION CrearModal ( o )LOCAL oBevel, oFormWITH OBJECT oBevel := WBevel():New( o ):cId := "modal1":nStyle := xc_Modal:lTrueModal := .f.:aWidth[ xc_S ] := 10:aWidth[ xc_M ] := 8WITH OBJECT WPanel():New( :WO ):cTitle := "Edición de datos":aWidth[ xc_S ] := 12WITH OBJECT oForm := WForm():New( :WO ):cId := "frmModal1":cFunction := "UpdateModal"WITH OBJECT WEdit():New( :WO ):cId := "MyEditModal1":cTitle := "MyEditModal1":Create()END WITHWITH OBJECT WButton():New( :WO ):cId := "submit":cText := "Aceptar":cOnClick := oBevel:Submit( oForm ):Create()END WITH:Create()END WITH //form:Create()END WITH //Panel:Create()END WITH //BevelRETURN NIL//----------------------------------------------FUNCTION AbrirModal()Local cHtml := ""Local cTextEdit1 := oCGI:GetCGIValue( "myEdit1" ) //Capturamos els valor introducido en el Edit1 de la ventana Inicial//En Ajax, los nombres de los Id/Controles, en minúsculascHtml := SetValueById( "myeditmodal1", cTextEdit1 )SendAjaxScript( cHtml, "modal1", "myeditmodal1" ) //Texto, id de la ventana modal a abrir, id del control que tomarᡥl foco )RETURN NIL//----------------------------------------------PROCEDURE UpdateModalLocal cHtml := ""Local cTextEdit1 := oCGI:GetCgiValue( "myEditModal1", "" ) //Capturamos els valor introducido en el Edit1 de la ventana Modal//En Ajax, los nombres de los Id/Controles, en minúsculascHtml := SetValueById( "myedit1", cTextEdit1 )SendAjaxScript( cHtml, "mybevel", .F. ) //Texto, id de la ventana modal a abrir, id del control que tomarᡥl foco )RETURNSimple y con poco código... para poder empezar a manipular datos.
Un Saludo,
Xevi.
- Esta respuesta fue modificada 3 años, 11 meses por Xevi.
XeviParticipantePuestos...
Poder poner un color específico a cada boton/icono Delete/Edit ???
De momento lo pongo así, pero se podría incorporar el Nefelizado ???
123456789101112131415WITH OBJECT :AddItem( 1,, "Registro número 1", {"linea adicional 1"} ) AS wItemListView:lEdit := .T.:cOnClickEdit := "#alert('Modificar???')":lDelete := .T.:cOnClickDelete := "#alert('Borrar???')"END With:cCSS += "#lvw0001_1_icondelete { color: red;}"WITH OBJECT :AddItem( 2,, "Registro número 2", {"linea adicional 2"} ) AS wItemListView:lEdit := .T.:cOnClickEdit := "#alert('Modificar???')":lDelete := .T.:cOnClickDelete := "#alert('Borrar???')"END With:cCSS += "#lvw0001_2_icondelete { color: red;}"Y, recuerdo, hago memoria... poner más de 2 botones. utilizar un array de botones
aButtons := { { <lVisible>, <cOnClick>, <:cAjaxBevel> } } //por ejemploO, de no ser posible en un array, aumentar de 2 a 5 botones, por ejemplo...
:lSpecial, :lOptional, :lSuper //o los nombres que seanUn Saludo,
Xevi.
XeviParticipantePedro,
puedes probar con este ejemplo completo...
123456789101112131415161718192021222324252627282930313233343536373839404142434445PROCEDURE ProvaListView()Local cHtml// Comenzamos instanciando la Página Web que queremos crearWITH OBJECT TWebPage():New()// Instanciamos un Panel para contener los elementos, permite poner un titulo y tiene un efecto sombraWITH OBJECT WPanel():New(:WO)// tenemos que tener un contenedor para recibir la respuesta del AJAXWith Object WBevel():New(:WO)WITH OBJECT WListView():New(:WO):lTitleItem := .T.WITH OBJECT :AddItem( 1,, "Registro número 1", {"linea adicional 1"} ) AS wItemListView:lEdit := .T.:cOnClickEdit := "#alert('Modificar???')":lDelete := .T.:cOnClickDelete := "#alert('Borrar???')"END WithWITH OBJECT :AddItem( 2,, "Registro número 2", {"linea adicional 2"} ) AS wItemListView:lEdit := .T.:cOnClickEdit := "#alert('Modificar???')":lDelete := .T.:cOnClickDelete := "#alert('Borrar???')"END With:Create()end with:Create()End With //Bevel// Como ya no vamos a meter nada más dentro de wPanel lo creamos:Create()end with //Panel ListView// Y listo, ya tenemos nuestra página creada, como el :Create() de un tWebPage nos retorna todo el HTML de la página// sobre la marcha hacemos el envio de dicho HTML al navegador que nos ha realizado la conexiónoCgi:SendPage(:Create())END WITHRETURNLos dos botones lanzan el mensaje Modificar???
Estoy utilizando Néfele libs del 19/11/2020 17:29
Un Saludo,
Xevi.
- Esta respuesta fue modificada 3 años, 11 meses por Xevi.
XeviParticipanteXailer y envios de eCorreos (uso GMail)
Xailer dispone de la clase TBlatMail, TCdoMail, TGmailSend y TMapi
Yo lo estoy utilizando así...
123456789101112131415161718WITH OBJECT TCDOMail():New():cSubject := cSubj:cFrom := cFrom:cUser := cUser:cPassword := cPass:cTO := ::aClient[27]:lHTML := lHTML:lGmailOptions := .T.:cMessage := cMsg:aAttachments := { cFile }:Create()If :Send()xMsgDlg( "Correu enviat a: " + :cTO, "ENVIAMENT", mbOK,, IDI_INFORMATION )ElsexMsgDlg( "No s'ha pogut enviar el correu.", "ERROR", mbOK,, IDI_ERROR )EndIfENDUn Saludo,
Xevi.
XeviParticipantePor mi parte, no hay problema... aunque soy usuario muy novato en este entorno.
- Esta respuesta fue modificada 4 años por Xevi.
XeviParticipantePedro,
Así es como finalmente SI funciona.
No se puede tener este contenido en un .htaccess en la carpeta cgi-bin, sinó que se debe de incluir en el propio httpd.conf
Yo he incluido esto en mi httpd.conf
12345<IfModule mod_rewrite.c>RewriteEngine onRewriteCond %{HTTPS} offRewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]</IfModule>http://xevicomas.duckdns.org/@Soft ya redireccion correctamente a https://xevicomas.duckdns.org/@Soft
Gracias por vuestro tiempo.
Un Saludo,
Xevi.
XeviParticipanteNop... no me funciona!!!
Cualquier entrada en .htaccess
Header...
Lanzan el error 500 Internal Server Error... y no carga la página.
Algun ajuste en httpd.conf se escapa!!!
Un Saludo,
Xevi.
XeviParticipanteNo lo veo muy claro, la cosa está en que el redireccionado de
lo está haciendo correctamente a
con el ficherete .htaccess que he detallado arriba.
En cambio, una aplicación Néfele, que está en la carpeta cgi-bin NO en htdocs no se comporta igual y http://midominio/nefele_samples (con Alias) o http://midominio/cgi-bin/nefele_samples.exe (o sin Alias) NUNCA redirecciona a https://...
No se, seguro que a alguien más le debe de ocurrir, no???
¿O nadie está utilizando SSL para las webs construidas con Néfele???Un Saludo,
Xevi.
XeviParticipanteEs tal como tengo en httpd.conf.
Y puedo acceder desde http o https indistintamente, no me hace el redireccionamiento
Si copio el mismo .htaccess que tengo en htdocs a la carpeta cgi-bin...
12345<IfModule mod_rewrite.c>RewriteEngine onRewriteCond %{HTTPS} offRewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]</IfModule>https://midominio/cgi-bin/miapp.exe o https://midominio/miapp
Error 403
Forbidden
You don't have permission to access this resource.Creo que por ahí puede ser donde hay que hacer algun cambio, tener un .htaccess en cgi-bin, pero con otros parámetros/ajustes
Un Saludo,
Xevi.
XeviParticipantePor lo visto... al cargar el .htaccess que ubico en la carpeta cgi-bin, no carga el módulo rewite
La línea
RewriteEngine on
parece ser que no surte efecto y de ahí que surja el error 403
No se como más averiguar que está pasando y porqué no se carga el módulo rewrite
Problema de algún parámetro en httpd.conf ???
XeviParticipanteBien... NO SOLUCIONADO del todo, diriamos.
Redirecciona TODAS las peticiones que hago a midominio, (ficheros html en carpeta htdocs) pero hace caso omiso a las llamadas que tengo en la carpeta cgi-bin. O sea, no me funciona para los desarrollos en Néfele.
He probado de poner el fichereta .htaccess en la carpeta cgi-bin, pero no funciona correctamente.
Seguro que se trata de una tonteria, algun ajuste o parámetro que tengo que cambiar, pero no lo veo.
Un Saludo,
Xevi.
XeviParticipanteSolucionado!!!
En httpd.conf
entrada <Directory "${SRVROOT}/htdocs">
12# AllowOverride NoneAllowOverride Ally en la entrada <Directory "${SRVROOT}/cgi-bin">
12# AllowOverride NoneAllowOverride AllYa me redirecciona TODAS las llamadas http:// a https://
Un Saludo,
Xevi.
XeviParticipanteDaniel,
no se trata d "comandos" sinó de código html.
El entorno web "no entiende" los caracteres CRLF (Chr(10), Chr(13))
en html, <p> es un cambio/salto de línea, y <br> un salto más alto de línea.No se html, pero los cuatro conceptos básicos de html se te van a grabar rápidamente.
Un Saludo,
Xevi.
XeviParticipanteDaniel,
prueba con...
1cDetalleEx := cDetalleEx + IF(!Empty(articulo->detalleing),"<br>" +StrToXml(OEMToAnsi(AllTrim(articulo->detalleing))) + ' ',' ')XeviParticipantePedro,
no estan las funciones documentadas...
Array2Char( aArray, cSeparator, xCol )
¿Como se utiliza y que és xCol???
Char2Array( cChar, cSeparator, nColumnas, lUpper, lVacios)
¿?¿?
en un ejemplo sencillo...
123456aDatos := { "uno", "dos", "tres" }oCGI:Console( aDatos )cDatos := oCGI:Console( Array2Char( aDatos, "|" ) ) // 1|uno2|dos3|tresoCGI:Console( Char2Array( cDatos, "|" ) ) //NO muestra nadaUn Saludo,
Xevi
XeviParticipanteBien... haciendo pruebas, veo que lo que estoy haciendo es mezclar comillas simples con diéresis...
1:cText := "S" + AsciiHTML("'") + "ha produït un error!!! aäeëiïoöuü"de esta manera obtengo el resultado esperado.
No se si habrá alguna funcioncilla para "despejar" y poder utilizar TODOS los símbolos, se que es una tarea que es complicada. De momento, creo que deberemos de lidiar cada uno con nuestra propia "guerrilla" de simbologia
Un Saludo,
Xevi.
- Esta respuesta fue modificada 4 años por Xevi.
XeviParticipanteNinguna diéresis...
ä => ä
ë => ë
ï => ï
ö => ö
ü => ü
XeviParticipanteCoooorrecto.
El error está en algunos valores al pasar esos parámetros.
De ahí, que no me esta funcionando donde lo necesito.
Por lo visto, si 1 parámetro texto de este contenido...
C:\Apache24\cgi-bin\tmp\tmp~202010276116586217.xlsx
lo envia/recibe/lee como...
C:Apache24cgi-bin mp mp~202010276116586217.xlsx
La '\' la quita, y '\t' lo sustituye por espacio
Así pues... en el sample que has puesto...
cHtml := callAutoForm( "visparam", {{ "midato", "C:\Apache24\cgi-bin\tmp\tmp~202010276116586217.xlsx" }} )
y el dato se trunca en 'visparam'
Tampoco, si ese valor del parámetro es un array...
cHtml := callAutoForm( "visparam", {{ "midato", {"uno","dos","tres"} }} )
'visparam' no muestra los valores del array
Un saludo,
Xevi.
XeviParticipanteDe momento lo solvento utilizando
oCgi:SetUserData( "midato", "mivalor" )
y
oCgi:GetUserData( "midato" )
Y aprovecho para... igual que podemos crear esas "variables" con SetUserData(),
¿se puede eliminar una de estas variables???
Algo así como... oCgi:DelUserData( "midato" )
Lo digo para no dejar "restos" en el cgi y poderlo limpiar/depurar
Aunque, pensándo en web... esas "variables" que se crean, se pueden utilizar SOLAMENTE en la póxima llamada a nuestro cgi, no??? luego, su vida termina y ya no la podemos "recuperar" en otra llamada al cgi a no ser que la volvamos a enviar/crear.
Un Saludo,
Xevi.
- Esta respuesta fue modificada 4 años por Xevi.
XeviParticipanteProbando CallAutoForm...
123456789101112PROCEDURE ProvaAlertScript()Local cHtmlLocal cDato := oCGI:GetCgiValue("MiEdit","")If cDato == "aaa"cHtml := CallAutoForm( "visparam", {{ "midato", "mivalor" }} )ElsecHtml := Tag("script", "alert('Dato NO encontrado')" )EndIfoCGI:SendScript( cHtml )RETURNVisparam no muestra / no recibe el valor aParam pasado por CallAutoForm
Un Saludo,
Xevi.
XeviParticipantePedro,
He puesto lo referente al Shadow en el WForm
123456789WITH OBJECT WForm():New(:WO):cFunction := "Xls2Xml":cAjaxBevel := "nflcargo":aParams := { { "cFileXLS", cFileXLS },;{ "cFileNameXLS", cFileNameXLS} }:lShadowSheet := .T.:cShadowSheetTitle := "Treballant":cShadowSheetSubTitle := "Esperi uns instants":lAjaxWaitON := .T.Y funciona correctamente.
Ahora bien, el circulito en movimiento se muestra SIEMPRE, esté lAjaxWaitON a .T. o a .F.
Un Saludo,
Xevi.
XeviParticipanteY, se podrà cambiar el color de fuente del título/subtítulo del shadow???
Cambiar la imágen del circulito por algun gif???
Un Saludo,
Xevi.
XeviParticipantePedro,
Este botón ejecuta un proceso que puede tardar unos segundos o incluso un minuto...
1234567891011121314151617WITH OBJECT WButton():New(:WO):cId := "submit":cText := "Acceptar":lSubmit := .T.:lLarge := .T.:lCenter := .T.:cIcon := "keyboard_return":cIconAlign := xc_Right:aWidth := {12}*:lAjaxWaitON := .T.:lShadowSheet := .T.:cShadowSheetTitle := "Treballant":cShadowSheetSubTitle := "Esperi uns instants":Create()END WITHLe he añadido esos parámetros, pero no me muestra nada, ni sombra, ni texto, nada.
También he probado sin comentar la línea AjaxWaitON := .T.
Un Saludo,
Xevi.
XeviParticipantePedro,
1234567891011121314151617PROCEDURE miAjax()Local cHtmlLocal cDato := oCGI:GetCgiValue("MiEdit","")oCgi:Console( oCgi:aParams )If cDato == "aaa"* cHtml := Tag( "script", "window.location.href = '/@Soft?visparam'" )* oCGI:SendScript( cHtml )* CallAutoForm( "visparam" ) //No me muestra la página VisParamCallAutoForm( "visparam",, "nflcargo" ) //No me muestra la página VisParamElsecHtml := Tag("script", "alert('Dato NO encontrado')" )oCGI:SendScript( cHtml )EndIfRETURNXeviParticipanteSi os referís al icono que "incrusta" en el .exe, yo lo establezco en las propiedades del proyecto - Apariencia, selecciono el icono que tengo en mi .rc y veo que me cambia el Main(), dejándolo así...
123456789101112#include "Xailer.ch"Procedure Main()SET DATE FORMAT TO "dd/mm/yyyy"SET DELETE ONApplication:cTitle := "ASoft"Application:oIcon := "ASoft"CGI_Init()Application:Run()ReturnY me funciona perfectamente!!!
Un saludo,
Xevi
XeviParticipanteFredy,
esto no me enruta al procedure VisParam
1:cCookieBannerLink := "http://xevicomas.duckdns.org/@Soft/visparam"el navegador me manda a esta dirección...
1https://xevicomas.duckdns.org/@Soft/index.prg/visparamUn Saludo,
Xevi.
XeviParticipantePerdón... tenia la dirección de mi primer server, en lugar del segundo server
me está funcionando así
1:cCookieBannerLink := "http://xevicomas.duckdns.org:8069/@Soft?xcm_cookies"- Esta respuesta fue modificada 4 años, 1 mes por Xevi.
XeviParticipanteOk, perfecto!!!
XeviParticipantesi incluyo :aParams := { { "tabla", "#table_array" } }
No pasa nada...
Esperaré a que salga una actualización para ir probando cosas nuevas.XeviParticipanteSi, si... así lo tengo!!!
XeviParticipanteY... cómo recuperar los valores desde el programa ???
1oCGi:Console( oCGI:GetCGIValue("table_array") )Esto no devuelve el JSon y no veo la manera de poder "aprovechar" esos datos.
Un saludo,
Xevi
XeviParticipanteXeviParticipantePERFECTO!!!
Un Saludo,
Xevi.
XeviParticipanteMe lanza errores al linkar...
123456789101112131415Compilant Proves.prg...Enllaçant @Soft.exe...D:/XeviXailer/Nefele/@Soft/Obj/deprecated.o:(.data+0x98): undefined reference to `HB_FUN_NFL_CHECKCLR'D:/XeviXailer/Nefele/@Soft/Obj/deprecated.o:(.data+0xb8): undefined reference to `HB_FUN_NFL_PRELOADCSS'D:/XeviXailer/Nefele/@Soft/Obj/deprecated.o:(.data+0xd8): undefined reference to `HB_FUN_NFL_MSGSAVE'D:/XeviXailer/Nefele/@Soft/Obj/deprecated.o:(.data+0xf8): undefined reference to `HB_FUN_NFL_COMILLAS'D:/XeviXailer/Nefele/@Soft/Obj/deprecated.o:(.data+0x118): undefined reference to `HB_FUN_NFL_TOWEB'D:/XeviXailer/Nefele/@Soft/Obj/deprecated.o:(.data+0x138): undefined reference to `HB_FUN_NFL_TAG'D:/XeviXailer/Nefele/@Soft/Obj/ArrayBrowse.o:(.data+0x318): undefined reference to `HB_FUN_NFL_TAG'D:/XeviXailer/Nefele/@Soft/Obj/ArrayBrowse.o:(.data+0x448): undefined reference to `HB_FUN_NFL_PUTICON'D:/XeviXailer/Nefele/@Soft/Obj/ArrayBrowse.o:(.data+0x5d8): undefined reference to `HB_FUN_NFL_GETMEASURETYPE'D:/XeviXailer/Nefele/@Soft/Obj/ArrayBrowse.o:(.data+0x628): undefined reference to `HB_FUN_NFL_TOWEB'D:/XeviXailer/Nefele/@Soft/Obj/ArrayBrowse.o:(.data+0x648): undefined reference to `HB_FUN_NFL_UPDATEARRAY'1 Files, 0 Warnings, 11 ErrorsTemps de compilació: 0.37s Temps d'enllaçat: 0.43s Temp total: 0.83sNo pasa nada... espero a que salga la actualización
Un Saludo,
Xevi.
-
AutorEntradas