TWeb. Como usarlo con Mercury y MVC

Post Reply
carles
Posts: 45
Joined: Thu Dec 19, 2019 7:08 pm

TWeb. Como usarlo con Mercury y MVC

Post by carles » Fri Apr 17, 2020 1:49 pm

Hola,

Explico como podeis cargar la libreria (pluggin) TWeb dentro de Mercury y poder usar el sistema MVC con ella.

1.- Creamos una entrada en el Route

Code: Select all

oApp:oRoute:Map( "GET"		, "test1"			, "testtweb1"		, "test1@mycontroller.prg" )
Como recordais hemos definido un metodo GET y eso significa que por la url del navegador podemos ejecutaro http: //myurl/testtwweb1
Esto invocará el método test1() de la clase mycontroller.prg


Definiremos nuestro Controlador mycontroller y lo primero que haremos es cargar la libreria como ya sabemos

Code: Select all

//----------------------------------------------------------------------------//
// {% LoadHrb( 'lib/tweb/tweb.hrb' ) %}	//	Load TWeb library...
//----------------------------------------------------------------------------//

CLASS MyController

        METHOD New( oController )			CONSTRUCTOR

	METHOD Test1( oController )

ENDCLASS   

//----------------------------------------------------------------------------//

METHOD New( oController ) CLASS MyController

RETU Self    

//----------------------------------------------------------------------------//

METHOD Test1( oController ) CLASS MyController 
	
	oController:View( 'testtweb1.view' )

RETU nil
Como se puede ver el metodo Test1 hará lo que sea hasta q finalmente llamara a la Vista testtweb1.view

a solo queda definir la vista testtweb1.view

Como sabeis la vista ya se interpreta directamente como código html y podemo sintercalar {{ ... }} para macros

Code: Select all

<h3>Version {{ TWebVersion() }} </h3><hr>
Esto nos tendria de mostrar la version de la libreria TWeb. Si aparece es que tenemos cargada correctamente la libreria. Por cierto la libreria la pondremos por defecto en la carpeta /lib/tweb

Ya solo queda probar algun ejemplo de TWeb. Como sabemos los ejemplos son prg, por lo que tendremos entonces de meterlo dentro de las etiquetas <?prg ... ?>

Code: Select all

<h3>Version {{ TWebVersion() }} </h3><hr>


	<?prg

		#include {{ TWebInclude() }}		

		LOCAL o
		
		DEFINE WEB oWeb TITLE 'Tutor1' INIT

		DEFINE FORM o ID 'demo'	

		INIT FORM o  		
		   
			ROWGROUP o
			
				GET ID 'myid' VALUE '' GRID 6 LABEL 'Id.' PLACEHOLDER 'User Id.' BUTTON 'GetId' ACTION 'GetId()' OF o
			
			END o		
			
			HTML o
				<script>
				
					function GetId() {
					
						var cId = $('#myid').val() 
					
						MsgInfo( cId )
					}
					
				</script>		
			ENDTEXT
			
		END FORM o RETURN		
	?>

La unica cosa a tener en cuenta es que como sabeis la etiqueta <?prg ... ?> ha de devolver un string. Para esto se soluciona con el prepro y poniendo END FORM <oForm> RETURN


Y ya teneis el ejemplo andando ! :D --> https://54.37.60.33/test/testtweb1


Saludos.
C.

xevi
Posts: 30
Joined: Thu Dec 19, 2019 8:24 pm

Re: TWeb. Como usarlo con Mercury y MVC

Post by xevi » Fri Apr 17, 2020 2:58 pm

he podido con el primer ejemplo tutor.prg y me muestra la versión de TWeb correctamente.
Ahora bien, si pongo el contenido del ejemplo para que "chute" como el testweb.prg me marca error

Code: Select all

Error PRG
Filename	twebtutor2.view
Error	Syntax error "syntax error at 'FORM'"
Operation	line:30
Error Code	COMPILER 30
Num. Code Block	1
El contenido es un paste del ejemplo que tienes en el foro, y que el link que has colgado corre bien.

Gracias por tu tiempo.
Un Saludo,
Xevi.

xevi
Posts: 30
Joined: Thu Dec 19, 2019 8:24 pm

Re: TWeb. Como usarlo con Mercury y MVC

Post by xevi » Fri Apr 17, 2020 7:45 pm

adjunto sample MVC-TWeb
Attachments
testweb.zip
(120.14 KiB) Downloaded 16 times
Un Saludo,
Xevi.

carles
Posts: 45
Joined: Thu Dec 19, 2019 7:08 pm

Re: TWeb. Como usarlo con Mercury y MVC

Post by carles » Fri Apr 17, 2020 9:28 pm

Xevi,

El ejmplo funciona perfectamente. Revisa q no falte algo


Saludos
C.

xevi
Posts: 30
Joined: Thu Dec 19, 2019 8:24 pm

Re: TWeb. Como usarlo con Mercury y MVC

Post by xevi » Fri Apr 17, 2020 9:54 pm

Si, si... este ejemplo está funcionando PERFECTAMENTE!!!

por eso lo he colgado, para quien quiera verlo y probarlo.

He desecho lo que tenia en mi aplicación MVC, y paso a paso, añadiendo como este test, lo tengo perfectamente implantado en mi aplicación.

Gracias por tu tiempo.
Un Saludo,
Xevi.

xevi
Posts: 30
Joined: Thu Dec 19, 2019 8:24 pm

Re: TWeb. Como usarlo con Mercury y MVC

Post by xevi » Sat Apr 25, 2020 11:27 pm

He preparado un sample para mostrar lo que intento explicar y que yo veo que funciona indevidamente o lo hago yo de alguna manera mal

partiendo del sample mercurytweb, he añadido dos enrutes y dos views.
Uno al tutor4b, que funciona correctamente, mostrando la comilla simple (al seleccionar IL del desplegable) y otro tutor4g que "casca" y no muestra ningun registro si algun registro contiene una comilla simple.

Decir que tutor4b y tutor4g parten de los samples de tweb.
Además, he puesto en la carpeta data, las dos DBFs, test.dbf con el registro Simp'son y test1.dbf que es la misma sin modificar ese registro.

Si se cambia la dbf a consultar en tutor4g.view de test.dbf a test1.dbf, funciona correctamente, ya que no hay ningun registro con comilla simple.

No me deja colgar el zip. Archivo demasiado grande, dice. 271kb
pongo el code de tutor4g.view

Code: Select all

<?prg

	#define PATH_DATA 		HB_GetEnv( "PRGPATH" ) + '/data/'

	#include {{ TWebInclude() }}		

    local o, oWeb, oCol, oBrw
	local aRows := LoadData()	

	DEFINE WEB oWeb TITLE 'Test Browse' ICON 'images/favicon.ico' TABLES INIT
	
	DEFINE FORM o ID 'demo'
		
		HTML o INLINE '<h3>Test Browse - dblclick event</h3><hr>'
		
	INIT FORM o 

		ROW o
		
			COL o GRID 12

				DEFINE BROWSE oBrw ID 'ringo' HEIGHT 400 DBLCLICK 'ViewRow' OF o

					ADD oCol TO oBrw ID 'first' 	HEADER 'First' 	ALIGN 'right'
					ADD oCol TO oBrw ID 'last'	HEADER 'Last'  	SORT			
					ADD oCol TO oBrw ID 'age'		HEADER 'Age' 	WIDTH 70 

				INIT BROWSE oBrw DATA aRows
		
			END o	
			
		END o

		HTML o 
		
			<script>				
				
				function ViewRow( e, row ) {
				
					MsgInfo( row.first.trim() + ' ' + row.last + '<br>' + row.street + ' ' + row.city, 'Customer' ) 
				}					
				
			</script>
			
		ENDTEXT

	END FORM o RETURN		

function LoadData() 

	local aRows := {}
	local cAlias, nI

	USE ( PATH_DATA + 'test.dbf' ) SHARED NEW VIA 'DBFCDX'
//	USE ( PATH_DATA + 'test1.dbf' ) SHARED NEW VIA 'DBFCDX'
	
	cAlias := Alias()
	
	for nI := 1 to 100
	
		Aadd( aRows,  {'first' 	=> UHtmlEncode( (cAlias)->first  )	,;
						'last' 		=> UHtmlEncode( (cAlias)->last 	 )	,;						
						'street'	=> UHtmlEncode( (cAlias)->street  )	,;						
						'city'		=> UHtmlEncode( (cAlias)->city 	 )	,;						
						'state'		=> UHtmlEncode( (cAlias)->state 	 )	,;						
						'zip'		=> UHtmlEncode( (cAlias)->zip 	 )	,;						
						'hiredate'	=> DToC( (cAlias)->hiredate )			,;						
						'married'	=> (cAlias)->married 	 				,;						
						'age' 		=> (cAlias)->age 						,;	
						'salary'	=> (cAlias)->salary					,;						
						'notes'		=> UHtmlEncode( (cAlias)->notes 	 )	 ;
					})
		
		(cAlias)->( dbskip() )
	next

retu aRows 

?>
Un Saludo,
Xevi.

carles
Posts: 45
Joined: Thu Dec 19, 2019 7:08 pm

Re: TWeb. Como usarlo con Mercury y MVC

Post by carles » Mon Apr 27, 2020 12:40 am

Xevi,

Se ha actualizado Mercury y TWeb. Como la mayoria de tablas dbf estan en formato Ansi, al leer los datos y mostralos en una pagina en utf-8 nos puede dar problemas. Tweb ahora por defecto al definir la web estará codificado con 'ISO-8859-1' y nos tiene que ir en la mayoria de casos bien. En el caso de quere codificar la página en utf-8 usaremos el comando CHARSETpara definirla

Code: Select all

DEFINE WEB oWeb TITLE 'Test CharSet - UTF8' CHARSET 'utf-8' INIT
Recordad que por defecto estará ya en ISO-8859-1

Code: Select all

DEFINE WEB oWeb  INIT
El ejemplo de Xevi en la que daba problemas al cargar una tablas en ansi y caracteres especiales como comillas simples y dobles ya esta resuelto

Image

La definicion de esta Web con 2 browses asi de facil

Code: Select all

	DEFINE WEB oWeb TITLE 'Test Browse'  TABLES INIT
	
	DEFINE FORM o ID 'demo'

		HTML o INLINE '<h3>Test Browse</h3><hr>'
		
	INIT FORM o  			
		
		ROWGROUP o
			DEFINE BROWSE oBrw ID 'ringo' HEIGHT 240 OF o

				ADD oCol TO oBrw ID 'ansi' 	HEADER 'Ansi' 						

			INIT BROWSE oBrw DATA aRowsAnsi
		END o		
		
		ROWGROUP o
			DEFINE BROWSE oBrw ID 'ringo2' HEIGHT 400 OF o

				ADD oCol TO oBrw ID 'first'  HEADER 'First' 	ALIGN 'right'
				ADD oCol TO oBrw ID 'last'	 HEADER 'Last'  	SORT			
				ADD oCol TO oBrw ID 'age'	 HEADER 'Age' 	WIDTH 70 

			INIT BROWSE oBrw DATA aRowsTest
		END o

	END FORM o RETURN 
Tambien recomiendo al cargar los datos "escapar" posibles caracteres especiales y posibles tags que pueden estar salvados en el registro.

Code: Select all

'first' := UHtmlEncode( (cAlias)->first  )

Saludos.
C.

xevi
Posts: 30
Joined: Thu Dec 19, 2019 8:24 pm

Re: TWeb. Como usarlo con Mercury y MVC

Post by xevi » Mon Apr 27, 2020 5:36 am

Estupendo, Carles.

Solo un pequeño detalle / inconveniente.
¿como tener codigo html en la web y registros con ansi???
o
¿como podemos lidiar con el caso que tengamos la necesidad de tener un header código utf-8, pero los registros en ansi???

Code: Select all

ADD oCol TO oBrw ID 'ansi' 	HEADER 'Ansi àÀóÖ'
Gracias por tu tiempo.
Un Saludo,
Xevi.

carles
Posts: 45
Joined: Thu Dec 19, 2019 7:08 pm

Re: TWeb. Como usarlo con Mercury y MVC

Post by carles » Fri May 15, 2020 10:55 am

Xevi,

En este caso tendrias de convertir tus datos de la tabla a utf8 al leerlos

C.

Post Reply