Метаязык для определения рабочего процесса приложения HTML - PullRequest
3 голосов
/ 03 мая 2011

Я ищу способ, чтобы язык независимо выражал рабочий процесс HTML-приложения. Если пользователь заполняет определенные значения в форме, должна отображаться другая форма. Далее, если значения заполнены, в этих дочерних формах должны быть показаны новые части этих дочерних форм.

Я хочу выразить отношения между формами HTML , элементами HTML в этих формах и значениями этих элементов.

На основе информации базы данных, такой как поля таблиц и взаимосвязи таблиц, я управляю с помощью Doctrine и создаю формы ExtJS.

Теперь мне нужно ввести некоторую логику потока в мои формы ExtJS, чтобы я не жестко кодировал поток приложения непосредственно с помощью кода ExtJS (JavaScript).

Я хочу сгенерировать соответствующий код JavaScript во время выполнения на основе предварительно определенного файла конфигурации.

Например:

У меня есть X форм

FORM 1. (displayed on startup)
 |
 |-> FROM 1.1 (only display after values have been inserted into FORM 1.)
 |
 |-> FROM 1.2 (only display after values have been inserted into FROM 1.1)
 |
FROM 2. (display when something inserted into FORM 1.)
 |
 |-> FROM 2.1 (layout and elements of this form depend upon what has been 
     inserted into FROM 1.)
 ....  

Кроме того, я хочу отображать части форм, только если пользователь заполнил что-то в поле ввода

FORM 1. (displayed on startup)
 |
 |-> LAYER 1. (only display/activate after field <count> of FROM 1. 
 |   has been filled in)
 |
 |-> LAYER 2. (only display/activate after field <count> of LAYER 1. 
 |   has been filled in)
 |
 ....

Тогда я хочу отображать формы, только если значение, которое пользователь заполнил в элементе формы проходит предопределенное условие

FORM 1 (displayed on startup)
 |
 |-> FROM 1.1 (only display if field <count> of FROM 1. is greater that 10
 |   count > 10)
 |
 |-> FROM 1.2 (if count < 10 display this form)
 |
 ....  

Последнее, что я хочу, основываясь на значениях, вставленных пользователем в родительскую форму, установить правила для элементов ввода, чтобы ограничить их диапазон ввода (возможные значения)

Вот пример рабочего процесса

enter image description here

Есть ли уже метаязык для определения таких отношений?

Каков ваш подход к реализации чего-то подобного?

С уважением,

J.

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Я бы начал с других инструментов / проектов, которые используют аналогичную настройку в другом домене, и посмотрю, сможете ли вы применить его методы в своем собственном домене.

Например, взгляните на Cucumber (http://cukes.info/). Cucumber - инструмент разработки, основанный на поведении, предназначенный для функционального тестирования приложения. Он использует читаемый человеком синтаксис теста. Другим примером является Selenium (http://seleniumhq.org/), в котором интерактивность интерфейса описывается на предметно-ориентированном языке.

Надеюсь, эти двое вдохновят вас, удачи

Rob

0 голосов
/ 22 мая 2011

прежде всего спасибо @Rob за ваш ответ.В конце концов я решил пойти с пользовательским решением.

Поэтому я просмотрел некоторые другие реализации управления потоком JavaScript

А именно:

Поток
https://github.com/bemson/Flow/wiki/Flow-Use-Cases

Где вы можете определить поток приложения (порядок вызова функций javascript) в предопределенном синтаксисе.

Мне особенно понравилась идея функций до и после условия (_in и _out) в Flow, которые выполняются до входа в состояние в потоке приложения и выхода из состояния.Кроме того, идея массива _vars, прикрепленного к определенному состоянию потока, была довольно интересной.

См. https://github.com/bemson/Flow/wiki/Using-Flow#s3-1 для получения дополнительной информации.

Джеймс Мак Парлан, Джеймс Мак Парлейн, разработал конечный автомат(FSM) в JavaScript, где он описывал поток приложения в XML, а не в простом JavaScript.Я нашел это хорошей идеей, но он анализирует XML на стороне клиента, а не на стороне сервера.Что является недостатком для меня.

В любом случае.Он описывает состояния, подобные этому

<fsm>
  <states>
    <state name="Start">
      <enter call="initApp();" />
      <exit call="exitApp();" />
      <to>
        <from state="" call="displayStartPage();" />
        <from state="loggedOut" call="showLogoutMessage();displayStartPage();" />
       </to>
    </state>
    <state name="loggedIn">
      <include state="authenticated" />
      <exclude state="loggedOut" />
      <negate state="loggedOut" />
    </state>       
  </states>
</fsm>

Он использует следующие возможные теги

<fsm>       ... the root node of the fsm (I renamed it to better reflect the purpose)
<states>    ... a collection of possible states (a state can have sub-states)
<state>     ... a possible state
<exclude>   ... if a state is active excluded one should be inactive
<include>   ... if a state is active the included state should also be active
<require>   ... should check that a javascript condition is true
<unrequire> ... the negation of <require>
<negate>    ... negate a state if you enter another state
<affirm>    ... make another state active, if entering a specific state
<enter>     ... fire a trigger when state gets active
<exit>      ... fire a trigger when state gets in-active
<from>/<to> ... specify state transitions and actions according to these transitions
<lock>      ... lock state, until state machine is reset

Более того, могут потребоваться некоторые вспомогательные функции.Чтобы назвать представление:

testState   ... to test the state of the FSM
negateState ... negate a state 
affirmState ... set a new state and issue according transition events
flipState   ... set state from active to inactive and vice versa 
determine   ... determine current state


См.
http://blog.metawrap.com/2008/07/21/javascript-finite-state-machinetheorem-prover/
и
http://blog.metawrap.com/2008/09/25/practical-applications-of-finite-state-machines-in-web-development/
для получения дополнительной информации.

Некоторое другое решение, которое я нашел у Камило Азулы, является своего рода смесью между наблюдателем и шаблоном команды.

http://camiloazula.wordpress.com/2010/10/14/fsm/

Где он использует именованные константы дляопределите штаты и оповестите наблюдателей об изменениях штатов.

Михаэль Шуериг написал об этой теме, но, к сожалению, его источники больше не в сети.В любом случае его концепция основана на цепочке методов, как вы, вероятно, знаете это из jQuery и других JS Frameworks.

Наконец, у IBM также есть учебник, посвященный этой теме

http://www.ibm.com/developerworks/library/wa-finitemach1/ http://www.ibm.com/developerworks/library/wa-finitemach2/ http://www.ibm.com/developerworks/library/wa-finitemach3/

Но, если честноМне это не очень понравилось.

Прямо сейчас я погружаюсь в веб-поток Spring, который использует язык выражений Springs, что мне очень интересно.

В любом случае мой конечный продукт будет основан на определении потока, аналогичном определению Джеймса Мак Парлана, но в отличие от его подхода я проанализирую XML, который определяет поток приложения на стороне сервера.

На основе этого XML я прикреплю javascript к каждой странице (каждая страница имеет свой собственный XML), который содержит соответствующий поток приложений.Поскольку наша система основана на ExtJS, я буду использовать функцию

http://docs.sencha.com/ext-js/4-0/#/api/Ext.EventManager-method-addListener

addListener 

для управления потоком приложений на основе пользовательских событий.

Я надеюсь, что это будетпомогите кому-нибудь в будущем.

С уважением

JS

...