ActiveVFP
Последнее изменение этой страницы: 16:33, 26 декабря 2017.
![]() | |
Разработчики | VFP Community |
---|---|
Первый появившийся | 2001 |
Стабильная версия | 6.03 / 29 January 2013 года |
Язык физической реализации | Visual FoxPro 9 SP2 |
OS | Windows |
Лицензия | MIT |
Расширение файла |
Common extensions .avfp Other extensions extensionless |
Портал: |
activevfp |
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
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
Источники
- ↑ ActiveVFP Project [Электронный ресурс]: Foxpro on the World Wide Web / Дата обращения: 20.12.2017. Режим доступа: https://activevfp.codeplex.com/.
- ↑ Home of ActiveVFP [Электронный ресурс]: Сравнение веб-сценариев Windows / Дата обращения: 20.12.2017. Режим доступа: http://activevfp.codeplex.com/discussions/249603
- ↑ Wikipedia [Электронный ресурс]: ActiveVFP / Дата обращения: 20.12.2017. Режим доступа: https://en.wikipedia.org/wiki/ActiveVFP.
ISSN 2542-0356
Следуй за Полисом
Оставайся в курсе последних событий
Лицензия
Если не указано иное, содержание этой страницы доступно по лицензии Creative Commons «Attribution-NonCommercial-NoDerivatives» 4.0, а примеры кода – по лицензии Apache 2.0. Подробнее см. Условия использования.