Шпаргалка по Libretto во Flex

5.10.2023 12:03

Шпаргалка по Flex и Libretto

Методы работы с ключом документа

Доступны следующие методы, использующие ключ:

// получение уникального ключа объекта в модели
def <Form> m/ikey: m/Ikey!

// получение строкового представления ключа объекта в модели
// для передачи через клиента
def <Form> m/stringIkey: String! // пример obj.m/stringIkey

// получение ключа элемента по строковому представлению ключа
def String m/toIkey // пример fix dIkey = dId.m/toIkey.*m/one

// получение документа по ключу:
def get<Form>(ikey: m/Ikey!): <Form>? // пример flex/getProject(dIkey)

Дополнительные методы для документов формы <Form>

// пользователь данной сессии (если прошел аутентификацию)
def m/user

// бегущее название документа, локализованное по языку

def Item m/runtitle(lang:String!)
def Item m/runtitle // язык по-умолчанию

// текущий статус документа
def Item m/state: `#State_Участник`!

// история статусов документа (жизненный цикл)
def Item m/states

// удаление документа
def Item m/remove

// восстановление удаленного документа
def Item m/revive

// проверка, активный документ или удаленный
def Item> m/alive

Методы работы со статусами документов

// дата создания статуса
def `#State_<Form>`  

// дата изменения статуса
def `#State_<Form>` modidate

// пользователь, создавший статус
def `#State_<Form>` creauser

// пользователь, модифицировавший статус
def `#State_<Form>` modiuser

// наименование статуса
def `#State_<Form>` title

// наименование статуса
def `#State_<Form>` title(lang: String!)

// имеет ли документ статус state
def `#State_<Form>` is(state) 

// имя статуса, пользоваться аккуратнее из-за переименований
def `#State_<Form>` name 

Примеры запросов к модели (транслируются в SQL)

querySource(
  flex/allSource() as s.
    where(s.name == #{name} and s.project == #{project} and s.type == #{type})
).*dyn[Source?]

fix project = this
queryPage( 
  flex/allPage() as p.where(p.name == #{name} and p.project == #{project})
)

queryЗадача( 
   tasks/allЗадача() as t.
     where(t.stateIn(Создана, Перенесена))
  )

fix curMs = дата.stamp

queryПрайсЛист(
  main/allПрайсЛист() as pl.
    where(pl.stateIn(Утвержден)).
    where(действуетС as dt.(
      dt.stamp >= #{curMs}
    ))
)

Структура имени обратного поля

@<имя-пакета>_<имя-класса>_<имя-поля>

например,

this.@книги_Автор_библиотека

Это обратное поле возвращает всех участников, у которых значение поля предприятия содержит текущее предприятие predpr.

Переменные в компонентах страниц

Переменные для html-компоненты, привязанного к компоненте-разбиению веб-страницы

fix <compname> – доступ к под-компоненте по её имени (если компонента типа `code`)
fix ctx – контекст веб-страницы
fix userRole // вычисленное значение роли пользователя для страницы

Методы получения параметров в http-запросе

def strings(key: String): String*
def stringp(key: String): String+
def string(key: String): String?
def stringe(key: String): String

def ints(key: String): Int*
def intp(key: String): Int+
def int(key: String): Int?
def inte(key: String): Int

def reals(key: String): Real*
def realp(key: String): Real+
def real(key: String): Real?
def reale(key: String): Real

def dates(key: String): date/Date*
def datep(key: String): date/Date+
def date(key: String): date/Date?
def datee(key: String): date/Date

def ikeys(key: String): m/Ikey*
def ikeyp(key: String): m/Ikey+
def ikey(key: String): m/Ikey?
def ikeye(key: String): m/Ikey

def files(key: String): m/LoaderFile*
def filep(key: String): m/LoaderFile+
def file(key: String): m/LoaderFile?
def filee(key: String): m/LoaderFile

Общие методы

def env:runner/Env // получение контекста вычислений

// получение значений из контекста вычислений
def string(key:String!):String?
def stringe(key:String!):String!
def item(key:String!):doc/Item?

// получение текущей страницы
def page():model/Page!

// получение текущей компоненты
def component():model/Component!

// получение припиненного документа
def pinned(key:String!)

// получение контекстного документа
def pageContext():doc/Item?

Организация гиперссылки на страницу

hlink – метод, генерирующий url перехода на страницу проекта по имени страницы в проекта. Пример:

<a href=#{
  ctxObj.gn/hlink("pagename"): {
    "objKey" set obj.m/stringIkey
  }
}
>Показать страницу</a>

ctxObj – объект, в контексте которого формируется вызываемая страница. Если у страницы контекста нет, то ctxObj опускается.

Асинхронный запрос

Асинхронный запрос по событию:

def ajax(method:String!, #:q/AjaxBuilder init)
  method - короткое имя метода
  init - параметры в соответствии с правилами jetx

Пример:

  fix text = "Hello, World!"
  fix cls = (".my-class", "#my-id")
  fix newObj = messages/newMessage()
  
  fix ajax =
    q/ajax(jetx/url("/pageOp")): {
      "obj" set this.m/stringIkey
      "what" set "showPrice"
      "text" set text
      if (cls) as cls {val: cls}
    }

Если в модели в пакете messages определен класс Message со строковым полем text, а в коде страницы есть, например, элементы

<input type="checkbox" name="car" value="Honda" class="my-class"/>
<textarea id="my-id" name="price">0.00</textarea>
<div id="space"></div>
<button onclick=#{ajax}>Узнать оконччательную цену</button>
то вызываемый метод pageOp мог бы выглядеть примерно так (в пакете url во Flex определяются методы, доступные для вызова из клиента):

package url
...
def pageOp = m/w:{
  fix what = gn/stringe("what")
  fix obj = 
    gn/stringe("obj").
      m/toIkey as ikey. 
        messages/getMessage(ikey)
  fix car = gn/stringe("car")
  fix price = gn/real("price")
  
  // изменяем поле объекта в модели
  obj.text = gn/string("text")

  if (what == "showPrice") {

    fix комиссионные = 1.1

    // изменяем содержимое страницы на клиенте
    if (price) as price {
      fix newDiv =
        <div id="space">
          Окончательная цена машины #{car} - #{price * комиссионные}
        </div>
      q/q("#space).replaceWith(newDiv)  
    }
  }
} 

m/w:{...} – метод организации транзакции в модели (аналогично базам данных). Код внутри {...} выполняется как единая транзакция ("либо все, либо ничего"). Без m/w доступ к модели отсутствует.