WikiDer > ActiveVFP

ActiveVFP
AVFP
ActiveVFPlogo2.png
Парадигмаобъектно-ориентированный, процедурный, 4-GL
РазработчикСообщество VFP
Впервые появился2001; 19 лет назад (2001)
Стабильный выпуск
6.03 / 29 января 2013 г.; 7 лет назад (2013-01-29)
Печатная дисциплинаДинамический, слабый
Язык реализацииVisual FoxPro 9 с пакетом обновления 2 (SP2)
Операционные системыWindows
ЛицензияМассачусетский технологический институт
Расширения имени файлаОбщие расширения
.avfp
Прочие расширения
без расширений
Интернет сайтactivevfp.codeplex.com

ActiveVFP (также известный как AVFP) это серверные сценарии рамки, предназначенные для Веб-разработка производить динамические веб-страницы. Похожий на PHP, но используя родной Язык и база данных Visual Foxpro (VFP) (или другой базы данных подобно Microsoft SQL и MySQL), ActiveVFP также можно использовать в Модель-представление-контроллер (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 (а также все объекты, которые были доступны в Classic Active Server Pages (ASP)). Эти объекты полностью используются в Visual FoxPro для выполнения веб-программирования с помощью FoxPro.

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

Как и PHP, ActiveVFP использует преимущества автоматического сборка мусора памяти (GC) и Динамический / слабый набор текста,[3] повышение производительности программистов.

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

Примеры

  • Код VFP, встроенный в HTML код для открытия таблицы и списка записей
<!DOCTYPE html><html><head><мета charset =«УТФ-8»><title>Код VFP в HTML</title>...<% *Настройки lnTotPerPage  =10        lnpagenumbers =5          lnStart=ВАЛ(oRequest.Строка запроса("страница"))   lcButton=oRequest.Строка запроса("навигация")       *sql SELE * ИЗ Покупатель В КУРСОР tCursor *Создайте страница числа НАЧНИТЕ=0 lnPageMax = 0 lnPageBegin = 0 lnRowCount = ПЕРЕСЧЕТ() НАБОР PROC к oProp.AppStartPath+ДОБАВКА 'prg  pages'  lcPages= страницы(lnTotPerPage,lnpagenumbers,lnStart,lcButton,lnRowCount)%>... <% ЗА lnX = lnPageBegin К lnPageMax      ЕСЛИ lnX <= lnRowCount      ИДТИ К lnX %>      <tr>         ширина ="40%"> <шрифт лицо ="helvetica, arial" размер ="2">	 hhref ="<%=JustPath(oProp.ScriptPath)+[/деталь.avfp?cust_id=]+;         ALLTRIM(cust_id)%>"><%=tCursor.Компания%>         ширина ="36%"> <шрифт лицо ="helvetica, arial" размер ="2">	<%=tCursor.Контакт%>         ширина ="24%"> <шрифт лицо ="helvetica, arial" размер ="2" цвет ="#000000">	<%=tCursor.Заголовок %>      </tr><%   ENDIF   ENDFOR %>                               ...<%= lcPages %>
  • Код контроллера VFP для веб-приложения MVC
* customers.prg -Customers Controller * * обходит код сценария Main.prg и .AVFP * ОПРЕДЕЛЕНИЕ КЛАССА customersController КАК restController * ПРОЦЕДУРА openData ВЫБРАТЬ 0 ИСПОЛЬЗОВАТЬ (ЭТО.homeFolder + "customers.dbf") ALIAS customers ENDPROC PROCEDURE infoAction && GET www. hostname.com/app/customers/info RETURN "homeFolder: " + THIS.homeFolder + "" ENDPROC PROCEDURE getAction && GET www.hostname.com/app/customers/  LOCAL cCustId cCustId = THIS.Params [1] THIS.openData () ВЫБРАТЬ КЛИЕНТОВ МЕСТО ДЛЯ 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') УСТАНОВИТЬ PROC в substr (oProp.AppStartPath, 1, AT ([], oProp.AppStartPath, 2)) + 'prg  AVFPutilities' ADDITIVE && Убедитесь, что вы используйте ДОБАВКУ или случаются неприятности! ЭТО.openData () ВЫБРАТЬ КЛИЕНТОВ cHTML = oHTML.mergescript (FILETOSTR (substr (oProp.AppStartPath, 1, AT ([], oProp.AppStartPath, 2)) + 'viewtest.avfp')) RETURN cHTML ENDPROC PROCEDURE & helloworld собственный метод (&& GET www.hostname.com/app/customers/helloworld/) LOCAL cHTML cHTML = "" * ИСПОЛЬЗУЙТЕ mydbf * SET PROC для substr (oProp.AppStartPath, 1, AT ([], oProp.AppStartPath, 2 )) + 'prg  AVFPutilities' ADDITIVE && Убедитесь, что вы используете ADDITIVE, иначе случатся неприятности! 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/  oJSON = NEWOBJECT ('json', 'json.prg') УСТАНОВИТЬ ПУТЬ К oProp.AppStartPath + 'data  AVFPdemo41 ' выберите e.emp_id как id, e.first_Name как firstName, e.last_Name как lastName, e.title как заголовок, [images / Emps /] + e.picture как изображение, count (r.emp_id) как reportCount; от сотрудника e left присоединиться к сотруднику r в VAL (r.reports_to) = VAL (e.emp_id); INTO Cursor SearchResults; сгруппировать по e.last_Name, e.emp_id, e.first_Name, e.title, e.picture; упорядочить по e.last_Name, e.first_Name oJSON.keyforcursors = "items" * отправить данные и свойства JSON обратно oResponse.ContentType = "application / json; charset = utf-8" oResponse.Write (oJSON.stringify ('SearchResults')) oResponse.Flush lcHTMLout = [] ENDPROC ******* ************************************************* *************** ENDDEFINE

Рекомендации

внешняя ссылка