Respuestas de foro creadas
-
AutorEntradas
-
Alfredo SanzSuperadministrador
Lo cierto es que es muy raro. ¿tal vez porque tengas cosas en 32 bits y otras en 64 bits?
Mándame por wetransfer la carpeta apache24 completa, que la pondré en el mío a ver qué me dice
Alfredo SanzSuperadministradorXevi, lo he probado con tu httpd.conf y también me funciona .
El apache que me dices que funciona está en el mismo ordenador?
Solo se me ocurre que pueda ser algo relacionado con el antivirus o el firewall. Prueba a desactivar todo a ver.
Alfredo SanzSuperadministradorNe ha enviado bien el http.conf
Comprime el fichero en un zip o si lo prefieres mándamelo a hola@nefele.dev
Alfredo SanzSuperadministradorOk. Vamos a revisarlo. Ese es el carácter de final de fichero (^z) que el memowrit de clipper se empeña en poner al final.
Alfredo SanzSuperadministradorBueno, algo es algo 🙂
He probado tu ejemplo en mi servidor y también funciona.
Vamos a hacer una cosa:
Mándame el httpd.conf del servidor donde no funciona y lo comparo con el mío.
Dime también el apache que usas (xampp,wampp,etc..)
Casi seguro que es alguna opción de seguridad de apache que te está enjaulando el cgi y te impide el acceso a ficheros.
Créate un fichero txt en la misma carpeta que tienes el xls y prueba a ver si lo puedes abrir desde néfele
1234With Object TWebPage():New():AddHTML( MemoRead("c:\prova\prova.txt") )oCgi:SendPage( :Create() )End WithCon :AddHtml puedes inyectar código html a tu página, por ejemplo
prova.txt123<hr><center>fichero de texto</center><hr>Alfredo SanzSuperadministradorHola Vicente.
No te entiendo. No sé qué es "pro01"
El fichero exe tiene que estar en la carpeta cgi-bin de tu apache.
Para acceder a el directamente http://localhost/cgi-bin/<nombrefichero>.exe
Alfredo SanzSuperadministradorXevi,
Adjunta el projecto y el xls y lo pruebo en mi servidor
Alfredo SanzSuperadministradorParece que Quim tiene algún problemilla para postear.
Te indico la respuesta en su nombre
Xevi
Siempre nos queda poder programar funcionalidades personalizadas
Néfele te permite 'meter el cuchillo' y extender sin límite 😉Fíjate en el siguiente código :
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051static function myScript()local cScript := ""TEXT INTO cScriptvar form = document.querySelector('#uploads'); // == WForm():cId// Interceptando accion por defecto del formularioform.onsubmit = function(e) {// mostrar popup, capturar datos, etcprompt("Please enter your name", "Harry Potter");// parar propagación del evento originale.preventDefault();// devolver true / false si dejamos que el formulario siga// con la accion programada originalreturn false;}ENDTEXTreturn cScript//------------------------------------------------------------------------------WITH OBJECT TWebPage():New()AAdd( :aScript, myScript() )WITH OBJECT WForm():New(:WO):cId := "uploads":cFunction := "myfunction"WITH OBJECT WFileOpenDlg():New(:WO):cName := "files":cTitle := "Seleccione uno o varios archivos para adjuntar":lMultiple := .T.:Create()ENDWITH OBJECT WButton():New(:WO):lSubmit := .T.:cText := "Subir":Create()END:Create()ENDoCGI:SendPageNoCache( :Create() )ENDAlfredo SanzSuperadministradorXevi.
Ten en cuenta que la propia seguridad de los navegadores web hay muchas cosas que nos va a dejar hacer tal y como lo hacemos en el escritorio para evitar que el navegador tenga acceso a determinados elementos del ordenador cliente
Alfredo SanzSuperadministradorSí. había un error en esa versión. En un par de días publicaremos la corregida
Alfredo SanzSuperadministradorLa property para filtrar ficheros es :cAccept
puede pasarle tanto el tipo de ficheros que aceptas
:cAccept := "application/vnd.ms-excel"
como las extensiones separadas por comas
:cAccept := ".xlsx, .xls"
El poder poner un dato por defecto en el nombre del fichero es algo que no permite la seguridad de html, Para poder enviar el fichero el usuario ha tenido que hacer una acción positiva para seleccionarlo.
Alfredo SanzSuperadministradorAlfredo SanzSuperadministradorXevi:
Prueba a copiarlo a otra carpeta fuera de apache24. En algunos casos hemos tenido problemas con los permisos que otorga apache dentro de cgi-bin.
Recuerdo que algún compañero nos ha comentado que ha leído correctamente, creo que ficheros word.
Mañana se lo comento y que nos cuente.
Alfredo SanzSuperadministradorHay controles en los que aún no están implementados todos los eventos.
Y en el caso de ajax, este es especialmente complejo, porque tendíamos que enviar no solo el nombre del fichero, sino también el contenido, con el aumento de tráfico que eso genera.
Tenemos ya resuelto el problema del atributo accept del <input> y en la nueva versión que publicaremos en un par de días ya funciona
WITH OBJECT WFileOpenDlg():New(:WO)
:cName := "fichero"
:cAccept := "application/vnd.ms-excel"aunque lo estamos mejorando, porque si bien las líneas anteriores te mostrarán solo archivos con la extensión de excel, las especificaciones de html te permiten hacer un *.* y seleccionar cualquier otro tipo de fichero.
Si revisas https://fractality.ddns.net:44444/cgi-bin/nefele_samples.exe?form3 verás que solo te muestra ficheros xls y xlsx , pero además, solo te permite seleccionar ficheros con esas extensiones
Alfredo SanzSuperadministradorHola Eduardo.
El Cgi te va a funcionar sin necesidad de hacerle nada especial, lo que tendrás que configurar es el IIS para que acepte la ejecución del archivo cgi.
La única diferencia es que la carpeta assets que en apache esta en htdocs la tendrás que copiar en wwwroot
Yo hace muchos (pero muchos) años que no tocaba IIS (creo que desde su versión 3), pero en un ratico googleando por la web encontré cómo hacerlo.
Te dejo un pantallazo de la configuración de mi ejemplo por si te sirve de ayuda
- Esta respuesta fue modificada 4 años, 1 mes por Alfredo Sanz.
Alfredo SanzSuperadministradorHola Andrés.
Ahora mismo no se puede hacer lo que dices.
Peeero...
Estamos trabajando en añadir una nueva property en wArrayBrowse que va a permitir incluir dentro del html un json con los datos del array y poder recuperarlos a través de oCgi:GetCgiValue()
Mantente atento a la próxima version
Alfredo SanzSuperadministradorTienes dos opciones
Definir el onclick a nivel de todo el arraybrowse, con lo cual se ejecutará al hacer click en cualquier columna
WITH OBJECT WArrayBrowse():New( oParent )
:cOnClick := "VisParam"O .. definirlo a nivel de columna, con lo cual sólo se ejecutará al hacer click en esa columna en concreto
WITH OBJECT :AddCol("") //damos formato a la columna del icono add_circle_outline
:cOnClick := "#BtnAlert('has pulsado la columna 1')"Si no defines onClick ni para la fila ni para la columna, entonces tendrías que poner un onclick en el elemento interno si quieres que haga algo.
Alfredo SanzSuperadministradorUff, lo pillé. Ya sé qué te está pasando!
Vamos a ver, el problema está en que para un control tan básico y sencillo como es un botón, html ha logrado complicarlo hasta límites insospechados.
Cuando ponemos <button>test</button> html lo interpreta como <input type="submit" value="test">, es decir, un button siempre hará el submit, que es lo que nos estaba pasando. Para evitarlo, podemos hacer <button onclick="return false">test</button>
Por otro lado, ten en cuenta que al definer el ::addCol dentro de Browse y ponerle un
:cOnClick := "#alert('hola desde la columna')"El cOnclick se está asignando realmente a la columna, no al contenido de la columna
Por lo cual el botón "de dentro de la columna" no tiene por qué tener ninguna acción ( ya se encarga la columna de hacerlo) y quedaría así
<input type="button" value="test" >
Si al botón le ponemos una acción en el onClick, hemos de tener en cuenta que se "lanzará" tanto el click del botón como el de la columna. Primero se ejecutará el click correspondiente al botón ( o el elemento que esté en el interior de la columna) y después el click asociado a esa columna,
Si solo queremos ejecutar el primer click (el del botón) tenemos "para la ejecución" dentro del onClick poniendo
'<input type="button" value="test" onclick="alert('hola desde el botón');event.stopPropagation()">'
Espero haberme explicado, si no, decírmelo, que este punto es importante
- Esta respuesta fue modificada 4 años, 2 meses por Alfredo Sanz.
Alfredo SanzSuperadministradorSi no te aparece, el onclick como a mí dímelo para revisarlo
Puedes ponerlo tú directamente en el onclick:cOnClick := "#event.stopPropagation();Sumar(1)"
Alfredo SanzSuperadministradorVaya,
Enséñame la parte del código html donde hace el onClick a la función
Néfele ya pone el stopPropagation ( o debería)
Alfredo SanzSuperadministradorSí, está prácticamente terminada.
Antes de meterme con un datatables o similares, quería currarme una tabla "a pelo"
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748WITH OBJECT oSQL:=SqlSourceConnect("appgestion")aConsulta := :QueryArray("SELECT Codigo, BIC, NOMBRE, 'icon:remove_red_eye' FROM bancos WHERE BIC<>'NIL'")END WITHWITH OBJECT oPageWeb := TWebPage():New()WITH OBJECT oPanel := WPanel():New(oPageWeb):cTitle := "Consulta Tabla de Bancos"WITH OBJECT WArrayBrowse():New(oPanel):cId := "Bancos"WITH OBJECT :AddCol("Código") AS wItemColBrowse:nWidth := 5END WITHWITH OBJECT :AddCol("BIC",xc_Left,xc_Left) AS WItemColBrowse:lBold := .T.:nWidth := 20:oStyle:cFont_size := 12END WITHWITH OBJECT :AddCol("Entidad",xc_Left,xc_Left):nWidth = 70ENDWITH OBJECT :AddCol( "", xc_Center, xc_Center ):cCursor := "pointer":nWidth := 1:cClrText := "blue":cOnClick := "#alert('Has seleccionado el banco: \r'+this.parentNode.querySelector('#bancos_col3').innerText)":oStyle:cMargin := "auto"END:aItems :=AsciiHTML(aConsulta):Create()END WITH:Create()END WITHcHtml := :Create()END WITHoCgi:SendPage(cHtml)RETURNy lo cierto es que se pueden hacer cosas bastante chulas
https://fractality.ddns.net:44444/xacgi?mariadb2
Alfredo SanzSuperadministradorTe pasa como a nosotros. No terminamos de entender muy bien la utilidad de este control
Alfredo SanzSuperadministradorDe momento va a seguir así, pero seguramente el @ terminará desapareciendo
Alfredo SanzSuperadministradorRev.232 (16-09-2020)
* source\image.prg
+ PROPERTY cImage2 INIT "" // imagen a mostar si pasamos el cursor sobre la principal
+ PROPERTY cAlt2 INIT ""
+ PROPERTY lClickZoom INIT .T. // Zoom al hacer click en la imagen
% Quitado el cursor default a pointer. Da la sensación de que se puede hacer click para ir a otro sitio y puede resultar confuso. siempre tenemos :cCursor* source\nefeleControl.prg
+ METHOD Create() Ha de tener los procesos comunes a todos los botones. LLamar con ::super:create() al principio del create del control
+ METHOD Measure( n ) //Devuelve medidas en formato correcto
+ Incoporado ::nTabIndex al método Create* source\button.prg
+ PROPERTY lHide INIT .f. // oculta el botón. nota: hay que añadirlo a otros botones* source\Button.prg
// Llamada a URL externa con o sin parametros por POST y GET
cAction := URL a llamar
cUrlParam := Parametros a enviar por GET
aParams := Parametros a enviar por POST
Por defecto los parametros por POST se encriptan, se puede deshabilitar en ::lEncript* source\Edit.prg
! NO estaba aplicandose lAjaxWaitOn en AjaxTimeOut
! NO se añadia # a cAjaxBevel en AjaxTimeOut
! No ponia en minusculas cAjaxBevel* source\ListView.prg
% Se habia desconfigurado en nType xc_Avatar
% Optimizado el uso de cSecondTitle cunado no es ColapsibleAlfredo SanzSuperadministradorAlucinante!!
El cOnClick, si empieza con el símbolo # te permite ejecutar directamente javascript en lugar de llamar al cgi.
:cOnClick := "#alert('Néfele')"
El materialboxes no lo conocía. lo incorporaré como una opción a WImage. Ya he añadido una opción para que cambie la imagen cuando ponemos el cursor sobre ella.
Tenemos ya nefelizado el facybox ( https://fractality.ddns.net:44444/xacgi?flex ) pero el que indicas es realmente sencillo
Alfredo SanzSuperadministradorPues sí, se nos ha quedado olvidado.
Voy a ver si lo "nefelizo"Las llamadas a ajax funcionan indicando el div al que le quieres "incrustar" el ajax
por ejemplo
12345678910with OBJECT WComboBox():New(:WO):cId := "diavisita":aItems := {{1,"Lunes"},{2,"Martes"},{3,"Miercoles"},{4,"Jueves"},{5,"Viernes"},{6,"Sabado"},{7,"Domingo"}}:cText := "Seleccione el día de visita":cAjaxBevel := "bvHoraVisita" // Le indicamos que la respuesta al evento no va ha ser una página nueva// sino que hay que "incrustarla" en el wBevel bvHoraVisita:cOnChange := "actualizahorario" // Este es el Method de nuestro CGI que procesara la llamada por AJAX// y nos devolvera el resultado:Create()end withAl cambiar el combo ejecuta la función del cgi "actualizarhorario" y el resultado lo mete en "bvHoraVisita"
Se puede decir que lo meta en uno de los paneles del tab siempre y cuando tenga un id único que lo identifique
16-09-2020 a las 09:52 en respuesta a: Eliminar elementos HTML no deseados, que se incluyen por defecto #688Alfredo SanzSuperadministradorQuitada
Si no te queda igual es posible que se cambiara algo que aun no está publicado. En unos días publicaremos una nueva versión.
Alfredo SanzSuperadministradorVaya, pues no se...
Haz una cosa: Vete a Proyecto/ exportar proyecto. En archivos selecciona todo y me adjuntas el fichero zip que te genera, a ver si puedo dar con lo que te pasa.
15-09-2020 a las 21:18 en respuesta a: Eliminar elementos HTML no deseados, que se incluyen por defecto #677Alfredo SanzSuperadministradorJeje, Fredy para los amigos.
Lo reviso a ver. Fíjate cómo queda en https://fractality.ddns.net:44444/xacgi?tablasql
15-09-2020 a las 17:54 en respuesta a: Eliminar elementos HTML no deseados, que se incluyen por defecto #673Alfredo SanzSuperadministradorHola,
Creo que lo que estás viendo es en realidad un margen que pone materialize
prueba a poner justo debajo del twebpage
12:cSubtitle := "":cCss += "body > footer > div.row{ margin-bottom: 0px }"Ya me contarás si funciona
Alfredo SanzSuperadministradorUps, disculpa. se pusieron mal esas propiedades en el wiki, son
cClrFootPane y cClrFootText
Alfredo SanzSuperadministradorEl problema que tienes es que el NefeleWizard no te ha modificado el fichero httpd.conf, seguramente porque apache no estaba configurado como un servicio
Busca en tu httpd.conf la línea
ScriptAlias /cgi-bin/ "C:/xampp/cgi-bin/"
y ponle justo debajo la siguiente
ScriptAlias /cobros "C:/xampp/cgi-bin/cobros.exe"
Con ella, le decimos a apache que establezca un "alias" y que cuando accedamos a /cobros donde realmente tiene que ir es a /cgi-bin/cobros.exe
Ah! y no te olvides de reiniciar apache una vez guardado el fichero y de que apache es sensible a mayúsculas y minúsculas
Ya me contarás si funciona
Alfredo SanzSuperadministradorHola Juan.
Como le comentaba a Eduardo, ese ejemplo no está del todo terminado. Tengo que optimizarlo mucho para que resulta más fácil de usar.
En unos días espero tenerlo preparado
de momento, puedes verlo funcionando en https://samples.nefele.dev/cgi-bin/nefele_test.exe?tablasql
Alfredo SanzSuperadministradorEso es algón problema con el fichero de configuración de apache
Haz lo siguiente:
- Prueba si puedes acceder a http://localhost/cgi-bin/cobros.exe (ojo con mayúsculas y minúsculas)
si te funciona es un problema de la config de apache
- Reinicia el servidor apache y prueba otra vez con http://localhost/cobros
si no te funciona, mándame el fichero httpd.conf y te reviso lo que falla
Alfredo SanzSuperadministradorHola,
Para que el wizard te detecte apache, lo tienes que tener instalado como un servicio
Clica el check de service y nos cuentas si te funciona
Alfredo SanzSuperadministradorEspero poder publicarlo en esta semana o la siguiente
Alfredo SanzSuperadministradorHola,
Gracias por la información. Ya está corregido
Ten en cuenta que es un ejemplo que aún no está terminado. Tengo que depurar muchas cosas
Alfredo SanzSuperadministradorRev.228 (09-09-2020)
* source\FloatBtn.prg
% El texto que aparece al dato del btn ahora tiene el id lbl_ + cIdDelBoton* source\button.prg
+ PROPERTY aDefaultClass INIT {'waves-effect waves-light'} //Clases por defecto a aplicar al boton
+ PROPERTY cIconWidth INIT "20px" // Tamaño por defecto del icono
+ PROPERTY nIconRotate // Rotacion en º a aplicar al icono
+ PROPERTY cToolTip* source\SideNav.prg
+ PROPERTY cTitleClass INIT "z-depth-5" // Clase a aplicar al Title del menu* source\Rebar.prg
% si cClrText tiene contenido, se lo asigna a cClrTitle, dado que en la mayoría de los controles usamos cCrlText* source\ListView.prg
+ METHOD CreateItem ( oItem ) // la creación del item se hace en un method, no directamente en el código* source\image.prg
+ PROPERTY cAlt INIT "" // permite asignar un alt a la imagen* source\NefeleFunctions.prg
% ahora, la creación de iconos en todo nefele se hace a través de FUNCTION PutIcon()
+ UpdateAjaxById( {{ "id del elemento", valor},{...}}) // actualiza el .value del control con el id indicado con el nuevo valor* source\NefeleControl.prg
+ PROPERTY lAjaxAppend INIT .f. // Si .t. la respuesta ajax se añadirá a la actual* source\mask.prg
+ PROPERTY cValidatorAPlaceHolder INIT " " //Caracter del placeholder
+ PROPERTY cValidatorBPlaceHolder INIT " " //Caracter del placeholder* source\cgi.prg
+ PROPERTY cSameSitePolicy INIT "lax" //protección cookies //https://www.tarlogic.com/blog/same-site-cookies-ataques-csrf/
% Modeficado SendStatus para que funcione lNoCache en Firefox* source\webpage.prg
+ PROPERTY lSnippet INIT .T. // si .f. no pone description en serp
+ PROPERTY cDescription INIT Application:cDescription //permite un meta description personalizado para la página
% Movida la sábana al pie de página para que no afecte al seo en buscadores* source\edit.prg
% cAjaxTimeout ahora se ejecuta cambién cuando el control pierde el focoAlfredo SanzSuperadministradorSí, claro,
Mándame un email a hola@nefele.dev y quedamos
Contenido no disponible.
Por favor, acepta las cookies haciendo clic en este avisoAlfredo SanzSuperadministradorOk. Entiendo
Lo cambiaremos en la próxima versión para que resulte más fácil.
Por ahora, ten en cuenta que tendrás que incluir en el texto el tag <a> y el <i> completos
Alfredo SanzSuperadministradorPues la verdad es que no hemos pensado en eso.
Mándame una img para poder ver qué es #cart_text.
Ese código tiene que funcionar, pero depende de dónde pongas el script.
De todas formas ten en cuenta que si cambias el innerHTML, tiene que incluir todo el código html que hay en él, porque te va a desaparecer
Alfredo SanzSuperadministradorBueno, paciencia.
Todo llegará.
Para conectarse a las bases de datos usamos los recursos que nos proporciona Xailer.
Alfredo SanzSuperadministradorHola!
Lo que te pasa es simplemente un problema en la configuración de Xailer.
Te recomiendo que uses Mingw en lugar de Borland, te funcionará todo mucho mejor
En las propiedades del proyecto, asegúrate de tener como compilador MinGW
Luego en opciones generales, MinGw pon el path donde tienes el compilador, que en tu caso parece ser C:\hb30\comp\mingw
una vez hecho esto, prueba a ver si puedes compilar algunos de los ejemplos que vienen con xailer y que están dentro de la carpeta de Xailer.
Cuando esto te funcione, revisa el post que tenemos en nuestro blog en https://nefele.dev/blog/nefele-wizard/ para completar tu primer programa en Néfele
Si sigues teniendo problemas, dímelo y lo solucionaremos
Alfredo SanzSuperadministradorPues lo cierto es que no lo sé.
Yo también creo que tendría que funcionar
Prueba directamente desde Xailer, a ver qué te dice.
Prueba a mapear \\server10\c como una unidad de disco local
Prueba a usar la dirección ip en lugar de server10. Puede que Apace no sea capaz de resolver el nombre
Ya me contarás si te funciona alguna de las ideas
Alfredo SanzSuperadministradorRev.226 (02-09-2020)
* source\nefelecontrol.prg
% CreateEvent // Estaba añadiendo un ; de más cuando se utilizaba para llamar a una funcion JS directamente* source\bevel.prg
% reemplazada la llamada a ::CreateOnClick por ::CreateEvent para ir eliminando ::CreateOnClick- Esta respuesta fue modificada 4 años, 2 meses por Alfredo Sanz.
Alfredo SanzSuperadministradorSí, es un efecto que siempre pone Materialize
En la próxima versión de Néfele lo hemos cambiado añadiendo al SideNav la property
PROPERTY cTitleClass INIT "z-depth-5"
de tal forma que se pueda modificar por el que más te guste, o simplemente eliminarlo
Alfredo SanzSuperadministradorÉchale un vistazo al Néfele Wizard te hace esas cosas de forma automática
Alfredo SanzSuperadministradorBien!!, veo que le vas cogiendo el "tranquillo"
Alfredo SanzSuperadministradorMuy bien! Así me gusta!
Veamos:
Digamos que hemos "nefelizado" las opciones más usuales para incrementar la productividad a la hora de hacer desarrollos web.
Cosas como las que pides, se pueden hacer, pero tenemos que "arremangarnos" con un poquito de css. Merece la pena, porque podemos hacer auténticas diabluras
Tomando como base el ejemplo que hemos puesto en el foro, prueba esto:
- Cuando definimos la Rebar, vamos a darle un :cId para poder trabajar con ella
123456with object WRebar():New(oParent)******* NUEVO *****:cId := "mirebar"*******************:cClrPane := "pink":lBeforeMain := .T.- Al crear el TWebPage, vamos a asignarle la propiedad :cCss que nos permite jugar con el css de la página que estamos creando
1234567With Object TWebPage():New():lValign := .T.:lContainer := .T.******* NUEVO *****:cCss := "#mirebar_logo > img {margin-top: 30px;width: 40px; height: 40px !important; margin-right: 21px; animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;}"********************AppMenu( :WO )Como ya he comentado otras veces, para programar con Néfele no hace falta saber ni html, ni css, ni javascript, lo que no quita que si sabes aunque sea un poquito de cualquiera de ellos, vas a poder llevar tus apps a un nuevo nivel
Este otro, de poner el texto "puntacabeza" te lo dejo a ti, a ver si lo consigues
- Esta respuesta fue modificada 4 años, 2 meses por Alfredo Sanz.
Alfredo SanzSuperadministradorcClrPane sólo acepta el esquema de colores de materialize
Quita el :cClrPane y usa :oStyle:cBackground = "#bfccc3"
En la próxima versión lo cambiaremos para detectar si cClrPane empieza con # utilice el esquema de colores de css
-
AutorEntradas