Respuestas de foro creadas
-
AutorEntradas
-
juan.novedadesParticipante
Hola Christian, no me acerco ni un poco a ser experto en el tema, te comento mi opinión... Lo más común es instalar apache en este caso para Nefele en un equipo con Windows, los CGI son para este sistema operativo y si... Nefele se puede comportar como una APP, solo seria cuestion de que la prepares para ser instalable (si en algo me equivoco por favor uno de los expertos no podrá corregir), con respecto a scanear QR me parece que hay librerias de js que te pueden ayudar. Saludos !
juan.novedadesParticipanteGracias Pedro, seguimos checando. Saludos.
juan.novedadesParticipantecurioso, si en console del inspector pongo : $("#modal_usua").modal("open"); si se muestra la ventana modal !
juan.novedadesParticipanteProbe con este ejemplo basado en uno de Xevi aparte de mi codigo y lo mismo:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140/** Proyecto: Ejemplo1* Fichero: MainPage.prg* Descripción: Aplicación CGI de Ejemplo1* Autor: usuario1* Fecha: 10/10/2023*/#include "Xailer.ch"#include "Nefele.ch"//------------------------------------------------------------------------------//Función principal de la app WebPROCEDURE MainPage()// 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 )RETURNFUNCTION SendAjaxScript( cText, cModal, cFocus )IF !Empty( cModal )cText += cOpenModal( cModal )ENDIFIF !Empty( cFocus )cText += SetFocus( cFocus )ENDIFoCGI:Send( "" )oCGI:send( IF(At("<SCRIPT>",Upper(cText))=0,"<script>","") + crlf + cText + crlf + "</script>" )RETURN NIL//----------------------------------------------FUNCTION cOpenModal( cName )RETURN '$("#' + cName + '").modal("open");' + crlf//----------------------------------------------FUNCTION SetFocus( cName )RETURN 'document.querySelector("#' + cName + '").focus();' + crlfjuan.novedadesParticipanteGracias Pedro ! vamos a enterarnos.
juan.novedadesParticipanteMe uno a la petición, seria genial que nos compartieran video de lo expuesto en la reunión. Rene e Israel platiquen algo... 🙂 Saludos Cordiales.
juan.novedadesParticipanteFredy, siguiendo con las pruebas:
Con Edge, Chrome y Firefox al hacer esto:
Local cUuid := oCGI:GetCgiValue( "onesignaluser", "no" )
no me da valor:
Con Brave marca:
Pero si agrego lo siguiente en el :cOnReady
1234567891011121314151617181920var OneSignal = window.OneSignal || [];OneSignal.push(function() {OneSignal.init({appId: "d485c717-4331-498a-9d1e-3c03cfcfae97",});});alert("cargo el js");OneSignal.isPushNotificationsEnabled(function(isEnabled) {alert("si");OneSignal.getUserId(function(userId) {alert(userId);OneSignalUser = userId;var a = document.getElementsByName("onesignaluser")for (i = 0; i < a.length; i++)a[i].value = OneSignalUser;});});Entonces si en los alerts da el valor de userId en Chrome y Firefox, en Edge da un valor Null, y sigue sin dar valor con: Local cUuid := oCGI:GetCgiValue( "onesignaluser", "no" )
En pruebas con un iphone y con un Android corriendo chrome no se muestran los alerts con el userId
Que podra ser lo que falta?
- Esta respuesta fue modificada 1 año por juan.novedades.
- Esta respuesta fue modificada 1 año por juan.novedades.
juan.novedadesParticipanteMuchas Gracias Fredy, probando...
juan.novedadesParticipanteGracias Fredy, checamos y comentamos...
juan.novedadesParticipanteen la función del programa xailer Button1Click() en la línea 56 me pone que el error es el número 12029.
- Esta respuesta fue modificada 1 año, 1 mes por juan.novedades.
juan.novedadesParticipanteen la función RestFunction() deje algunos nfl_console() pero no se ven reflejados en el "Nefele Console" como si no llegara a esa parte del codigo.
juan.novedadesParticipantePedro, buenas tardes en el ejemplo mas simple que genera el Nefelewizard, agrego en el Main.Prg lo siguiente:
12345678910Class 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 MainPage()METHOD RestFunction() INLINE RestFunction()* METHOD OtraMas() Inline OtraMas() //Y así tantas como queramosEND CLASScon esta función basada en los samples en el mismo main.prg
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253FUNCTION RestFunctionLOCAL aData, n,mnfl_Console( "linea número 346" )WITH OBJECT oCGInfl_Console( :cRestRaw )IF !Empty( :cRestRaw )HB_JsonDecode(:cRestRaw, @aData )nfl_Console( AllTrim( Str( Len( aData ) ) ) )DO CASE // HTTP://samples.nefele.dev/n4h/factura/13.jpg/800x600CASE :Route( 1,"clientes","PATCH" ) .OR. :Route( 1,"clientes","PUT" )nfl_Console( "linea 351" )IF :nRequestMode == rmPATCH // rmPATCH NO FUNCIONA LA CONSTANTEFOR n := 1 TO Len( aData )aData[n,4] = Time()NEXTENDIF:Send( "Status: 200 OK" ):Send( "Content-type: " + GetEnv( "CONTENT_TYPE" ) ) // ojo, puede ser, por ejemplo, un pdf o un exe:Send(""):Send(HB_JsonEncode(aData))CASE :Route( 1,"cliente","POST")TRYIF :Route( 2,"RANDOM")m := HB_Random(Len( aData))n := Int( m )+1m := Transform( n, "@e 999,999")ELSEm := Time()n := Val(:Route(2))ENDIFaData[ n,4] = m:Send( "Status: 200 OK" ):Send( "Content-type: " + GetEnv( "CONTENT_TYPE" ) ) // ojo, puede ser, por ejemplo, un pdf o un exe:Send(""):Send(HB_JsonEncode({aData[n]}))CATCH:Send( "Status: 500 Internal Server Error" ):Send("")ENDOTHERWISE:Send( "Status: 400 Bad Request" ):Send("")ENDCASEELSE:Send( "Status: 500 Internal Server Error" ):Send("")ENDIFENDRETURN Nilpor otro lado en una aplicación hecha con Xailer puro al onclick de un boton pongo lo siguiente:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172METHOD Button1Click( oSender ) CLASS TForm9LOCAL hRequestLOCAL cBuffer := Space( 1024 )LOCAL aDatos, cHeaders, aData, jDataLOCAL n,aLOCAL cRead := ""aData := {{"alfredo Sanz" , "parque 52 " , "50007 zaragoza", "" },;{"Paco Pérez" , "paseo Independencia 24", "50004 zaragoza", "" },;{"Carlos Lamarte", "emilio castelar 4" , "50002 zaragoza", "" },;{"Ramón Pérez" , "Miguel servet 24" , "50002 zaragoza", "" } }FOR n=5 TO ::oMaskEdit1:ValueAAdd(aData,{"usuario Nº "+AllTrim(Str(n)),"dirección","población",""})NEXTMsgInfo("enviando")jData := HB_JsonEncode(aData)a := Seconds()WITH OBJECT TInternet()*:nPort := 44444:Create()IF :Open()// IF :Connect( "localhost" )// IF :Connect( "samples.nefele.dev" ) // "127.0.0.1" )IF :Connect( "127.0.0.1" )// IF :Connect( "localhost" )// hRequest := :OpenRequest("PUT", "/n4h/clientes" )// hRequest := :OpenRequest("PUT", "/cgi-bin/nefele_samples.exe/clientes" )hRequest := :OpenRequest("PATCH", "/cgi-bin/ejemplo1.exe/clientes" )// hRequest := :OpenRequest("POST", "/cgi-bin/nefele_samples.exe/cliente/random" )// hRequest := :OpenRequest("POST", "/cgi-bin/nefele_samples.exe/cliente/200" ):SendRequest( hRequest,"Content-Type: application/json" , jData )IF GetLastError() == 0WHILE :ReadFile( hRequest, @cBuffer, 1024 )cRead += cBuffercBuffer := Space( 1024 )END:QueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, @cHeaders )LogDebug( "cHeaders: " + cHeaders )::oMemo1:nClrPane := clWindow::oMemo1:Value := cHeaders:CloseRequest( hRequest )ElseMsgStop( AllTrim( Str( GetLastError() ) ) )ENDIFElseMsgStop( "no conecto" )ENDIF:Close()ENDIFENDHB_JsonDecode(cRead, @aDatos )::oArrayBrowse1:aArrayData := aDatosMsgInfo( cRead + ", recuperados en "+Transform(Seconds()-a,"@e 999.99"))RETURN Nilla aplicación nefele se llama ejemplo1.exe en el puerto 8082, pero no jala, que estoy haciendo mal, necesitas mas datos de lo que hago?
Saludos cordiales Pedro.
- Esta respuesta fue modificada 1 año, 1 mes por juan.novedades.
juan.novedadesParticipanteMuchas gracias Pedro, lo preparo y les aviso.
juan.novedadesParticipanteuna observación adicional es que usamos http no https.
juan.novedadesParticipanteDisculpa Alfredo, estoy creando el cgi con la libNefeleProject.a con fecha del 02/08/2022 02:12 p.m. pero aun me sigue poniendo el mensaje de la vigencia, sera que se me esta pasando hacer algo mas ? Saludos cordiales !
juan.novedadesParticipanteMuchas gracias Alfredo, sigo el consejo... Saludos cordiales !
juan.novedadesParticipanteuna disculpa, este tema ya fue resuelto hace tiempo. Gracias !
juan.novedadesParticipanteUna disculpa, no aclare... la instalación en ese vps, tiene la configuración de apache, xailer y nefele wizard recomendadas en el blog. Saludos
juan.novedadesParticipanteMuchas gracias Fredy, revisamos la entrada para entender mas.
juan.novedadesParticipanteMuchas gracias Fredy, pues creo que siendo que andamos en temas desconocidos se esta avanzando, explico...en la configuracion de Frenom hay una sección llamada "URL Forwarding" en ella se pone la url del cgi , ademas se puede seleccionar "Frame (cloaking) (default)" ó "Redirect (HTTP 301 forwarding)" si selecciono la primera la pagina se muestra en el modo normal si selecciono la segunda si que se muestra en modo responsivo solo que en la barra se muestra la dirección completa del cgi en lugar del dominio (como que no es lo ideal), siguiendo en la "googleada" encontramos la sugerencia de configurar en la opción "Manage Freenom DNS" , se agregaron dos registros de la siguiente manera :
Name Type Ttl Target
vacio A 3600 ip del VPS
www A 3600 ip del VPS
Pero ahí no puedo poner la dirección completa del cgi, solo la ip, entonces la "solución" fue poner un index.html en htdocs que redireccionara al cgi y de esa manera funciono el modo responsivo y muestra el dominio y aunque funciona no parece que sea la solución mas "limpia", comparto el dominio y la ip del vps, aun creo que me falta mucho para el tema de seguridad así que tengan compasión jejeje .
http://www.lupitadidactica.ml http://104.129.131.115/cgi-bin/lupita2021.cgi
Se que no es tema propiamente de Nefele pero casi todos vamos a pasar por aquí en algún momento, cualquier ayuda es de agradecer. Saludos y que sean días de Familia y Amigos.
juan.novedadesParticipanteMuchas gracias Alfredo, estaremos al pendiente. Saludos !
juan.novedadesParticipanteGenial! Alfredo, mas opciones para nuestras aplicaciones. Saludos Cordiales.
juan.novedadesParticipantePedro muchas gracias por la aclaración, vamos a probar. Saludos!
juan.novedadesParticipanteAñadi esto: AAdd( :aHeadLinks,'<link rel="stylesheet" href="/css/materialize.css">') en seguida de definir un TWebPage y funciono! , espero no estar complicando, jejeje
juan.novedadesParticipanteGenial Alfredo, funciono muy bien, lo puse asi: :oStyle:cHeight = "520px" y ya se muestran sin espacios pero ahora el detalle es con los botones se muestran a "alturas" diferentes, pense que quizas si uniformara el ancho de la descripción de los productos se resolviera pero de alguna manera u otra html lo recorta y termina siempre poniendo lo mismo. Alguna sugerencia para ello ? Saludos Cordiales y aprovecho para decir que esta es una herramienta que da mucha satisfaccion.
juan.novedadesParticipanteHola Alfredo buenas noches tengo una duda con el ejemplo si cambiamos la linea 11 con lo siguiente:
12345678aModel := { ;{ "3420", "1.png", "Pijama homewear sdf sdf sdf sdfsdf sdfs df" }, ;{ "4653", "2.png", "Pijama corazones sdf sdf sdfsdfsdfs" }, ;{ "7689", "3.png", "Baby escolar" }, ;{ "1234", "4.png", "Camisola verano" }, ;{ "5323", "5.png", "Pijama caballero" }, ;{ "7260", "6.png", "Camisa sportwear" } ;}cambia la altura de las cards y provoca que se haga un espacio en blanco entre la tercera y la cuarda, hay una manera de obligar la misma altura para todas?
Saludos Cordiales.
juan.novedadesParticipanteVa a servir mucho para validaciones, solo tuve que agregar en main.prg lo siguiente:
Method Alerta1 InLine Alerta1()
Method AjaxAlerta1 InLine AjaxAlerta1()puse en la linea #4
:lAlerts := .T.sustitui en la linea #37
1cHtml := Tag("script", "alert('Dato NO encontrado: "+ cDato + "')" )por
12345WITH OBJECT WMsgAlert():New():cText := 'Dato NO encontrado: ' + cDato:Create()cHtml := :FullHtml()END WITHMuchas gracias y Saludos Cordiales!
- Esta respuesta fue modificada 4 años, 1 mes por Alfredo Sanz.
- Esta respuesta fue modificada 4 años, 1 mes por Alfredo Sanz.
juan.novedadesParticipanteMuy bueno Xevi, solo tuve que agregar lo siguiente en main.prg:
Method ArrayBrowseAlertOnClick InLine ArrayBrowseAlertOnClick()
Method DatosRegistro InLine DatosRegistro()Saludos Cordiales!
juan.novedadesParticipanteMe fui por la solución "Imagen en Columna wArrayBrowse" que esta en el foro, las imágenes que ocupe son de : https://material.io/resources/icons/?icon=delete_outline&style=baseline
Saludos Cordiales!
juan.novedadesParticipanteHola Daniel también soy nuevo en este foro pero para mostrar el código dentro de un cuadro lo que tienes que hacer (bueno a mi me funciono jejeje) es que en la edición del mensaje a publicar en la parte superior derecha están las opciones visual y HTML, te vas a HTML y te muestra una barra de herramientas como cabecera, te vas a "CRAYON" pegas tu código y listo!, espero ser correcto en la explicación. Saludos Cordiales.
juan.novedadesParticipantePerfecto! Gracias.
juan.novedadesParticipanteSiguiendo con las pruebas me funciono asi:
1234567891011<nav><div class="navbar-fixed col s12 green"><!-- <a href="#" rel="nofollow">Clasificaciones</a> --><ul class="left"><li><a href="#" rel="nofollow"><i class="material-icons">keyboard_arrow_left</i></a></li><li><a href="http://127.0.0.1:8080/cgi-bin/ejemplo.exe?editarclasificacion" rel="nofollow"><i class="material-icons">add</i></a></li><li><a href="#" rel="nofollow"><i class="material-icons">print</i></a></li><li><a href="#" rel="nofollow"><i class="material-icons">archive</i></a></li></div></nav>Pero si la aplicacion la montara en otro equipo con otra ip ya no seria la solucion, hay alguna otra forma de hacerlo?
Saludos Cordiales
juan.novedadesParticipanteGenial, muchas gracias por el dato! Integrada y funcionando.
Saludos cordiales.
- Esta respuesta fue modificada 4 años, 1 mes por juan.novedades.
juan.novedadesParticipanteHola Xevi gracias por el tip pero ya probe quitandola pero sigue sin localizar la funcion. Saludos Cordiales.
juan.novedadesParticipanteFunciono perfecto la linea: cRegistro := oCGI:GetCGIValue( "Bancos" ) //El :cID del ArrayBrowse
Pero la linea: oRegistro := GetRowValue( cRegistro ) al momento de compilar marca "undefined reference to 'HB_FUN_GETROWVALUE'" en xailer tengo la version personal "6.2.0" y la version de Nefele es la "1.3" el proyecto tiene enlazadas las librerias "wClassNefele" y "NefeleProject" me falta algo mas?
Saludos Cordiales.
juan.novedadesParticipanteMuchas gracias por la aclaracion Alfredo, quedaremos al pendiente. Saludos!
juan.novedadesParticipanteHola Eduardo y Alfredo, mi nombre es Juan Castillo; Lo que estan haciendo es genial y ya empece a hacer pequeñas pruebas de Nefele, pero aqui leo que tienen ejemplos de browse, "TablaSql y TablaModeloJson de la seccion pruebas basicas." pero no puedo encontrar esa seccion que mencionan, me pueden ayudar a tener esos ejemplos u otros que ya tengan para entender mas ? Saludos Cordiales!
-
AutorEntradas