ActiveVFP

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:33, 26 декабря 2017.
AVFP
1231.png
Разработчики VFP Community
Первый   появившийся 2001; 18 years ago (2001)
Стабильная версия 6.03 / 29 January 2013 года; 6 years ago (2013-01-29)
Язык физической реализации Visual FoxPro 9 SP2
OS Windows
Лицензия MIT
Расширение файла Common extensions
.avfp
Other extensions
extensionless
Портал: activevfp.codeplex.com

ActiveVFP (также известный как AVFP) представляет собой платформу сценариев на стороне сервера, предназначенную для веб-разработки для создания динамических веб-страниц. Подобно PHP, но используя собственный язык Visual FoxPro (VFP) и базу данных (или другие базы данных, такие как Microsoft SQL и MySQL), ActiveVFP можно также использовать в веб-приложениях Model-View-Controller (MVC), а также в RESTful API. ActiveVFP является полностью бесплатным и открытым исходным кодом и не требует покупки Microsoft Visual FoxPro или любого дополнительного программного обеспечения.

ActiveVFP был создан в 2001 году. Основная реализация ActiveVFP теперь создается сообществом FoxPro на сайте activevfp.codeplex.com и служит официальной ссылкой на ActiveVFP. ActiveVFP - это бесплатное программное обеспечение, выпущенное под лицензией MIT.

ActiveVFP уникален среди серверных веб-языков и фреймворков, поскольку в нем есть база данных и функциональность базы данных, встроенные в язык.

Синтаксис

ActiveVFP использует родной язык Visual FoxPro, поскольку он существует в последней версии, выпущенной Microsoft, Visual FoxPro 9 SP2. Многопотоковая среда выполнения VFP vfp9t.dll используется вместо обычной версии среды выполнения VFP.[Источник 1]

Используя ActiveVFP, компилятор VFP выполняет только код VFP в своих разделителях. Все, что находится за пределами своих разделителей, не обрабатывается VFP. Наиболее распространенными разделителями являются короткие формы ASP-типа <% или <% = и%>. <%%> выполняет блок кода FoxPro, а <% =%> немедленно выводит эту переменную. Цель всех этих разделителей состоит в том, чтобы отделить код VFP от кода, отличного от VFP, включая HTML.

Основными объектами, доступными для ActiveVFP для веб-программирования, являются: oRequest, oResponse и oSession (и все объекты, доступные в классических активных серверных страницах (ASP)). Эти объекты полностью используются в Visual FoxPro для выполнения веб-программирования с помощью FoxPro.

Язык FoxPro содержит команды, очень похожие на другие языки программирования, такие как Basic. Циклы включают do, if, while, for, else команды в использовании, которые легко понятны любому, кто знаком с другими языками программирования. Команды принимают форму «command» и «endcommand». Язык также имеет обширные команды управления базами данных и индексирования.

Как и PHP, ActiveVFP использует автоматическую память Garbage Collection (GC) и Dynamic / Weak Typing,[Источник 2] повышая производительность программиста.

В дополнение к режиму «сценариев» ActiveVFP также предлагает конструкцию Model-View-Controller (MVC). Контроллер состоит из кода класса FoxPro, который находится в файле Foxpro .prg. Вывод может состоять из представлений .avfp, JSON и других, аналогичных другим современным реализациям MVC. Модель может быть DBF-файлами или другими базами данных.[Источник 3]

Примеры

  • Код VFP, встроенный в HTML-код, для открытия таблицы и списков записей
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>VFP code in HTML</title>
...
<% 
*Settings
 lnTotPerPage  =10       
 lnpagenumbers =5         
 lnStart=VAL(oRequest.querystring("page"))  
 lcButton=oRequest.querystring("nav")       
*sql
 SELE * FROM Customer INTO CURSOR tCursor 
*create page numbers
 START=0
 lnPageMax = 0
 lnPageBegin = 0
 lnRowCount = RECCOUNT()
 SET PROC to oProp.AppStartPath+'prg\pages' ADDITIVE   
 lcPages= pages(lnTotPerPage,lnpagenumbers,lnStart,lcButton,lnRowCount)
%>
...
 <% FOR lnX = lnPageBegin TO lnPageMax 
     IF lnX <= lnRowCount
      GOTO lnX %>
      <tr>
        <td width="40%"><font face="helvetica, arial" size="2">
	<a hhref="<%=JustPath(oProp.ScriptPath)+[/detail.avfp?cust_id=]+;
         ALLTRIM(cust_id)%>"><%=tCursor.company%></a></font></td>
        <td width="36%"><font face="helvetica, arial" size="2">
	<%=tCursor.Contact%></font></td>
        <td width="24%"><font face="helvetica, arial" size="2" color="#000000">
	<%=tCursor.Title %></font></td>
      </tr>
<%   ENDIF
   ENDFOR %>                               
...
<%= lcPages %>
  • Код контроллера VFP для веб-приложения MVC
* customers.prg - Customers Controller
* * bypasses Main.prg and .AVFP script code
* 
DEFINE CLASS customersController AS restController
 *
 PROCEDURE openData
  SELECT 0
  USE (THIS.homeFolder + "customers.dbf") ALIAS customers
 ENDPROC
 
 PROCEDURE infoAction && GET www.hostname.com/app/customers/info
  RETURN "homeFolder: <b>" + THIS.homeFolder + "</b>"
 ENDPROC
 
 PROCEDURE getAction && GET www.hostname.com/app/customers/<id>
  LOCAL cCustId
  cCustId = THIS.Params[1]
  THIS.openData()
  SELECT CUSTOMERS
  LOCATE FOR custId = cCustId
  IF FOUND()
   LOCAL cJSON
   **USE mydbf  &&test error
   *quick and dirty JSON
   cJSON = [{"custId":"] + RTRIM(custId) + [","custName":"] + RTRIM(custName) + [",] + ;
           ["custStat":"] + RTRIM(custStat) + ["}]
   RETURN cJSON 
  ENDIF
 ENDPROC
 
 PROCEDURE listAction  && GET www.hostname.com/app/customers/
  LOCAL cHTML
  cHTML = ""
  *oEmp=newOBJECT('schedbizobj','c:\avfp5.61Demo\prg\utiltest2.prg')
  SET PROC to substr(oProp.AppStartPath,1,AT([\],oProp.AppStartPath,2))+'prg\AVFPutilities' ADDITIVE   && Make sure you use ADDITIVE or bad things happen!
  THIS.openData()
  SELECT CUSTOMERS
  cHTML= oHTML.mergescript(FILETOSTR(substr(oProp.AppStartPath,1,AT([\],oProp.AppStartPath,2))+'viewtest.avfp'))
  RETURN cHTML 
 ENDPROC
 
 PROCEDURE helloworld      && custom method (&& GET www.hostname.com/app/customers/helloworld/)
  LOCAL cHTML
  cHTML = ""
  *USE mydbf
  *SET PROC to substr(oProp.AppStartPath,1,AT([\],oProp.AppStartPath,2))+'prg\AVFPutilities' ADDITIVE   && Make sure you use ADDITIVE or bad things happen!
  cHTML= oHTML.mergescript(FILETOSTR(substr(oProp.AppStartPath,1,AT([\],oProp.AppStartPath,2))+'hello.avfp'))
  RETURN cHTML 
 ENDPROC
 
 PROCEDURE getemployees      && custom method   (&& GET www.hostname.com/app/customers/getemployee/<id>
  
	oJSON=NEWOBJECT('json','json.prg')
    
    SET PATH TO oProp.AppStartPath+'data\AVFPdemo41\'
	
	select e.emp_id as id, e.first_Name as firstName, e.last_Name as lastName, e.title as title, [images/Emps/]+e.picture as picture,count(r.emp_id) as reportCount ;
	from employee e left join employee r on VAL(r.reports_to) = VAL(e.emp_id) ;
	INTO Cursor SearchResults;
	group by e.last_Name,e.emp_id, e.first_Name,e.title, e.picture ;
	order by e.last_Name,e.first_Name

	oJSON.keyforcursors="items"

	* send JSON data and properties back
	oResponse.ContentType = "application/json;charset=utf-8"  
	oResponse.Write(oJSON.stringify('SearchResults'))
	oResponse.Flush
	lcHTMLout=[]
 ENDPROC
ENDDEFINE

Источники

  1. ActiveVFP Project [Электронный ресурс]: Foxpro on the World Wide Web / Дата обращения: 20.12.2017. Режим доступа: https://activevfp.codeplex.com/.
  2. Home of ActiveVFP [Электронный ресурс]: Сравнение веб-сценариев Windows / Дата обращения: 20.12.2017. Режим доступа: http://activevfp.codeplex.com/discussions/249603
  3. Wikipedia [Электронный ресурс]: ActiveVFP / Дата обращения: 20.12.2017. Режим доступа: https://en.wikipedia.org/wiki/ActiveVFP.