can someone explain to me what is mod_harbour?

MGA
Posts: 1219
Joined: Mon Feb 25, 2008 2:54 pm
Location: Brasil/PR/Maringá
Contact:

can someone explain to me what is mod_harbour?

Post by MGA »

Please,
can someone explain to me what is mod_harbour?
ubiratanmga@gmail.com

FWH17.04
FWPPC
Harbour/xHarbour
xMate
Pelles´C
TDolphin
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: can someone explain to me what is mod_harbour?

Post by Antonio Linares »

Ubiratan,

Have you ever wished to use Harbour to build apps for the web ? :-)

That is exactly mod_harbour

mod_harbour is an extension module for Apache that allows you to run PRGs directly on the web, without having to build EXEs, etc.

You simply install mod_harbour on an Apache server (running locally on your computer or on a remote PC) and you start running your PRGs on the web !!!

Next, you need to understand how to develop web apps but, don't worry, we provide lots of examples so you can quick start using it

Please review this live demo built using mod_harbour (pure Harbour!)
https://harbour.fourtech.es/modharbour_ ... /index.prg

Finally, mod_harbour is totally free and open source. Wow !!! :-D
regards, saludos

Antonio Linares
www.fivetechsoft.com
MGA
Posts: 1219
Joined: Mon Feb 25, 2008 2:54 pm
Location: Brasil/PR/Maringá
Contact:

Re: can someone explain to me what is mod_harbour?

Post by MGA »

thanks :D
ubiratanmga@gmail.com

FWH17.04
FWPPC
Harbour/xHarbour
xMate
Pelles´C
TDolphin
User avatar
Marc Venken
Posts: 727
Joined: Tue Jun 14, 2016 7:51 am

Re: can someone explain to me what is mod_harbour?

Post by Marc Venken »

Antonio,

So it is easy to show as example Customer.dbf from sample's on the web in a xbrowse now ?
Marc Venken
Using: FWH 20.08 with Harbour
User avatar
Marc Venken
Posts: 727
Joined: Tue Jun 14, 2016 7:51 am

Re: can someone explain to me what is mod_harbour?

Post by Marc Venken »

Looking into Genesis.

We need php code to do the job right ?

In fact, you use prg directly, but it would be the same as using files in .php like before ?

At this moment it is not so that Xbrowse will become a single line call in Mod_harbour like Xbrowser("customer")
Marc Venken
Using: FWH 20.08 with Harbour
User avatar
Marc Venken
Posts: 727
Joined: Tue Jun 14, 2016 7:51 am

Re: can someone explain to me what is mod_harbour?

Post by Marc Venken »

Ok, I found the source code of Genesis, and mutch more is clear now.

Php is needed !

Maybe FWH can build the php code from xbrowse in the near future... (a Xbrowse light version)
Marc Venken
Using: FWH 20.08 with Harbour
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: can someone explain to me what is mod_harbour?

Post by Antonio Linares »

Marc,

PHP is NOT needed at all. We only use Harbour PRG code !!!

thats the beauty of it :-)

1. Have you installed Apache on your Windows or Xampp on your Windows ?
2. Have you properly installed mod_harbour ?

Please read this and follow the steps:
http://forums.fivetechsupport.com/viewt ... 85#p223785
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Marc Venken
Posts: 727
Joined: Tue Jun 14, 2016 7:51 am

Re: can someone explain to me what is mod_harbour?

Post by Marc Venken »

Antonio Linares wrote:Marc,

PHP is NOT needed at all. We only use Harbour PRG code !!!

thats the beauty of it :-)

1. Have you installed Apache on your Windows or Xampp on your Windows ?
2. Have you properly installed mod_harbour ?

Please read this and follow the steps:
http://forums.fivetechsupport.com/viewt ... 85#p223785
But the source is using PHP to build the table.

I use the same technique to build a php file from fwh and upload that php file to the server. I'm missing the logic and/or advantages right now. What i'm missing that Mod_harbour is doing better ?

Code: Select all

function BuildBrowse( cTableName )

   local cHtml := "", n, nRow := 0

   USE ( hb_GetEnv( "PRGPATH" ) + "/data/" + cTableName ) SHARED NEW

   if ! Empty( GetAction() ) .and. GetAction() == "add"
      APPEND BLANK
      GO TOP
   endif   

   if ! Empty( GetAction() ) .and. GetAction() == "del"
      USE
      USE ( hb_GetEnv( "PRGPATH" ) + "/data/" + cTableName ) NEW
      DbGoTo( GetVal1() )
      DELETE 
      PACK
      USE
      USE ( hb_GetEnv( "PRGPATH" ) + "/data/" + cTableName ) SHARED NEW
      GO TOP
   endif

   if ! Empty( GetAction() ) .and. GetAction() == "search"
      SET FILTER TO Upper( GetParam1() ) $ Upper( DBRECORDINFO( 7 ) )
      GO TOP
      nVal1 = 20
   endif   

   if GetVal2() != 0
      DbSkip( GetVal2() )
   endif   

   cHtml += '<table id="browse" class="table table-striped table-hover;"">' + CRLF
   cHtml += '<thead>' + CRLF
   cHtml += '<tr>' + CRLF
   cHtml += '<th scope="col">#</th>' + CRLF

   for n = 1 to FCount() 
      cHtml += '<th scope="col">' + FieldName( n ) + '</th>' + CRLF
   next

   cHtml += '<th scope="col">ACTIONS</th>' + CRLF

   cHtml += '</tr>' + CRLF
   cHtml += '</thead>' + CRLF
   cHtml += '<tbody>' + CRLF

   while ! Eof() .and. nRow < GetVal1()
      cHtml += "<tr>" + CRLF
      cHtml += '<th scope="row">' + AllTrim( Str( RecNo() ) ) + "</th>" + CRLF
      
      for n = 1 to FCount()
         do case
            case FieldType( n ) == "M"
               cHtml += '<td>' + If( "</" $ FieldGet( n ), "...", SubStr( FieldGet( n ), 1, 20 ) ) + CRLF
               if ! "</" $ FieldGet( n )
                  cHtml += '<button onclick="MsgInfo(' + "'" + ;
                           StrTran( FieldGet( n ), Chr( 13 ) + Chr( 10 ), "<br>" ) + "', '" + ;
                           FieldName( n ) + "');" + '"' + ;
                           ' type="button" class="btn btn-primary"' + CRLF 
                  cHtml += ' style="border-color:gray;color:gray;background-color:#f9f9f9;">' + CRLF
                  cHtml += '<i class="fas fa-eye"' + ;
                           ' style="color:gray;padding-right:15px;font-size:16px;">' + CRLF
                  cHtml += '</i>View</button>' + CRLF
               endif   
               if FieldName( n ) == "CODE"
                  cHtml += '<button onclick="location.href=' + "'index.prg?" + Lower( Alias() ) + ":exec:" + ;
                           AllTrim( Str( RecNo() ) ) + "';" + ;
                           '" type="button" class="btn btn-primary"' + CRLF 
                           cHtml += ' style="border-color:gray;color:gray;background-color:#f9f9f9;">' + CRLF
                           cHtml += '<i class="fas fa-flash"' + ;
                                    'style="color:gray;padding-right:15px;font-size:16px;">' + CRLF
                  cHtml += '</i>Exec</button>' +  "</td>" + CRLF
               else
                  cHtml += "</td>" + CRLF                
               endif   
                        
            case FieldType( n ) == "L"
               cHtml += '<td><input type="checkbox" onclick="return false;"' + ;
                        If( FieldGet( n ), "checked", "" ) + "></td>" + CRLF

            otherwise
               cHtml += '<td>' + ValToChar( FieldGet( n ) ) + "</td>" + CRLF  
               if FieldType( n ) == "C" .and. "." $ FieldGet( n ) 
                  // if File( hb_GetEnv( "PRGPATH" ) + FieldGet( n ) )
                     cHtml += '<td><img src="' + hb_GetEnv( "DOCUMENT_ROOT" ) + ;
                              AllTrim( FieldGet( n ) ) + ;
                              '" style="width:50px;border-radius:50%;"></td>' + CRLF
                  // endif
               endif      
         endcase   
      next

      cHtml += '<td>' + CRLF
      cHtml += '<button onclick="Edit(' + AllTrim( Str( RecNo() ) ) + ');"' + ;
               ' type="button" class="btn btn-primary"' + CRLF 
      cHtml += ' style="border-color:gray;color:gray;background-color:#f9f9f9;">' + CRLF
      cHtml += '<i class="fas fa-edit" style="color:gray;padding-right:15px;font-size:16px;">' + CRLF
      cHtml += '</i>Edit</button>' + CRLF
      cHtml += '<button onclick="Delete(' + AllTrim( Str( RecNo() ) ) + ');"' + ;
               ' type="button" class="btn btn-primary"' + CRLF 
      cHtml += ' style="border-color:gray;color:gray;background-color:#f9f9f9;">' + CRLF
      cHtml += '<i class="fas fa-trash" style="color:gray;padding-right:15px;font-size:16px;">' + CRLF
      cHtml += '</i>Delete</button>' + CRLF
      cHtml += '</td>' + CRLF

      SKIP
      nRow++
   end 

   cHtml += '</tbody>' + CRLF
   cHtml += '</table>' + CRLF

   cHtml += "<hr>" + CRLF
   cHtml += '<div class="row" style="padding-left:15px">' + CRLF
   cHtml += '<div class="col-sm-3">' + CRLF
   cHtml += "Showing records " + AllTrim( Str( Max( GetVal2() + 1, 1 ) ) ) + " - " + ;
            AllTrim( Str( RecNo() - 1 ) ) + " / Total: " + AllTrim( Str( RecCount() ) ) + "</div>" + CRLF
   cHtml += '<div class="col-sm-1"></div>' + CRLF         

   if RecCount() > nRow 
      cHtml += '<div class="col-sm-3 btn-group" style="height:50px;">' + CRLF
      cHtml += '   <button onclick="' + "location.href='index.prg?" + GetContent() + ":browse:' + GetRowsPerPage() + ':" + ;
               AllTrim( Str( 0 ) ) + "'" + '" type="button" class="btn btn-primary" style="background-color:{{GetColor1()}};">' + ;
               '<i class="fas fa-angle-double-left" style="color:white;padding-right:15px;font-size:18px;"></i>First</button>' + CRLF
      cHtml += '   <button onclick="' + "location.href='index.prg?" + GetContent() + ":browse:' + GetRowsPerPage() + ':" + ;
               AllTrim( Str( RecNo() - 41 ) ) + "'" + '" type="button" class="btn btn-primary" style="background-color:{{GetColor2()}};">' + ;
               '<i class="fas fa-angle-left" style="color:white;padding-right:15px;font-size:18px;"></i>Prev</button>' + CRLF
      cHtml += '   <button onclick="' + "location.href='index.prg?" + GetContent() + ":browse:' + GetRowsPerPage() + ':" + ;
               AllTrim( Str( RecNo() - 1 ) ) + "'" + '" type="button" class="btn btn-primary" style="background-color:{{GetColor2()}};">Next' + ;
               '<i class="fas fa-angle-right" style="color:white;padding-left:15px;font-size:18px;"></i></button>' + CRLF
      cHtml += '   <button onclick="' + "location.href='index.prg?" + GetContent() + ":browse:' + GetRowsPerPage() + ':" + ;
               AllTrim( Str( RecCount() - 20 ) ) + "'" + '" type="button" class="btn btn-primary" style="background-color:{{GetColor1()}};">Last' + ;
               '<i class="fas fa-angle-double-right" style="color:white;padding-left:15px;font-size:18px;"></i></button>' + CRLF
      cHtml += '</div>' + CRLF
   endif              

   cHtml += "</div>" + CRLF + "</div>" + CRLF + "</div>" + CRLF 

   USE

return cHtml
 
// 1. Have you installed Apache on your Windows or Xampp on your Windows ?

No, I generaly use dreamweaver to edit the php files offline and put them back online to the server. Also for testing..

// 2. Have you properly installed mod_harbour ?

Not yet. The installation seems not that easy, but I will look into it after seeing some more samples.

I simple would like a database to show data online. I can do it in php, but looking for a sample from Harbour. (the index.prg sample is using also PHP) but maybe I'm missing parts of way Mod is working.
Marc Venken
Using: FWH 20.08 with Harbour
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: can someone explain to me what is mod_harbour?

Post by cnavarro »

Marc Venken wrote: ...I can do it in php, but looking for a sample from Harbour. (the index.prg sample is using also PHP) but maybe I'm missing parts of way Mod is working.
Sorry, what is the index.prg file that php uses?
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: can someone explain to me what is mod_harbour?

Post by Antonio Linares »

Marc,

The generated code is HTML. Thats the web language plus css and javascript.

With mod_harbour you don't have to build an EXE. The PRGs directly run from the web server.

That turns Harbour into a web development language, in the same level as php, python, asp, etc

When you get the mod_harbour concept and test it for yourself, then you will realize the enormous difference this means.

We are organizing a mod_harbour seminar in Otto's Hotel. You should come :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Marc Venken
Posts: 727
Joined: Tue Jun 14, 2016 7:51 am

Re: can someone explain to me what is mod_harbour?

Post by Marc Venken »

cnavarro wrote:
Marc Venken wrote: ...I can do it in php, but looking for a sample from Harbour. (the index.prg sample is using also PHP) but maybe I'm missing parts of way Mod is working.
Sorry, what is the index.prg file that php uses?
It is not using php, but it is generating html code (needed for web).

It is somewhat like using php files that also creates html files in order to work on the web.

As I think now, Mod_Harbour is also a way of programming web apps. Users that know Harbour well will benifid surely of the new development.
I had the wrong idea that it was possible now to use fwh programs the normal way and they would become web ready...

But I think that it will be possible in the future that a code like

xbrowser("customer")

will generate the table in html and execute well on the web

I will surely folow the genesis project.
Marc Venken
Using: FWH 20.08 with Harbour
User avatar
Otto
Posts: 4470
Joined: Fri Oct 07, 2005 7:07 pm
Contact:

Re: can someone explain to me what is mod_harbour?

Post by Otto »

Hello Marc,

for a quick test:
Please add these lines to GENESIS in menu.view
Image
That's all. WOW.

Best reards,
Otto


Image

Image
********************************************************************
mod harbour - Vamos a la conquista de la Web
modharbour.org

********************************************************************
User avatar
Massimo Linossi
Posts: 474
Joined: Mon Oct 17, 2005 10:38 am
Location: Italy

Re: can someone explain to me what is mod_harbour?

Post by Massimo Linossi »

Otto,
What you have done is really great. I'm making some progress using mod_harbour and with the big help of Antonio
I can now connect with Advantage Database Server. The browses and the selects are like rockets.
And the html code is built and optimized with Bootstrap. So all the forms are compatible with different screen sizes.
I found the Bootstrap Studio https://bootstrapstudio.io that can help to build fantastic forms.
User avatar
Otto
Posts: 4470
Joined: Fri Oct 07, 2005 7:07 pm
Contact:

Re: can someone explain to me what is mod_harbour?

Post by Otto »

Massimo,
I bought bootstrapstudio myself.
mod harbour opens up perspectives I did not even dare to think about.

Unfortunately I have a few other jobs to complete and can therefore only use little time for mod harbor at the moment .
I did some ASP programming 15 years ago. This helps me now. But with Harbour at the backend we are ready to go.
But I think I can start the first project in 14 days.
Maybe you come to visit me.
Sincerely
Otto
https://www.bergland.info
********************************************************************
mod harbour - Vamos a la conquista de la Web
modharbour.org

********************************************************************
User avatar
Massimo Linossi
Posts: 474
Joined: Mon Oct 17, 2005 10:38 am
Location: Italy

Re: can someone explain to me what is mod_harbour?

Post by Massimo Linossi »

Otto,
I wish to come to visit you. Maybe at the end of summer.
We are not so far and I've been a lot of times to ski near your place, many many years ago.
Have a nice evening
Massimo
Post Reply