Блог

    Caché (Кашэ́) — промышленная высокопроизводительная, объектная система управления базами данных, интегрированная с технологией разработки веб-приложений. Единая архитектура данных Caché позволяет разработчикам использовать одновременно объектный, реляционный (SQL) и прямой (NoSQL) доступ к одним и тем же данным, хранение которых обеспечивается ориентированным на транзакции многомерным ядром СУБД.

    http://www.intersystems.ru/cache/

Последние записи


Теги

Информация

$(REST - CSP - (-HyperEvents) + EasyUI + File Upload). Часть 3a

добавлено: 08 июл 15
понравилось:0
просмотров: 1176
комментов: 0

теги:

Автор: servit

..Но сперва рассмотрим две небольшие темы, а именно:

Создание многостраничного rest-приложения


Пока что у нас лишь одна страничка. А давайте добавим ещё одну? Сказано - сделано.
...
<Route Url="/upload" Method="POST" Call="SrvUpload"/>
<Route Url="/secondpage" Method="GET" Call="SecondPage"/>
...

ClassMethod SecondPage() As %Status
{
  
%response.ContentType="text/html"

  
&html<
<!DOCTYPE html>
<
html>
  <
head>
    <
meta charset="#(..#CHARSET)#">
    <
meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <
meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1, user-scalable=no"/>
    <
title>Другая страница</title>
  </
head>
  <
body>
    <
button onclick="alert('Это другая страница!')">Нажми меня ещё раз</button>
    <
href=".">Перейти на главную rest-страницу</a>
  </
body>
</
html>>
  
q $$$OK
}
Добавим ссылку на главной странице для перехода на новую:
...
<input id="fileupload" type="file" name="files[]" data-url="upload" multiple data-sequential-uploads="false">
<
href="secondpage">Перейти на другую rest-страницу</a>
...
Вы также можете добавлять дополнительные параметры в url, а на самой странице читать эти данные.
Важно:
Поскольку создание rest-страниц - это нечто "новое" по сравнению с csp/cls, то вы пока не сможете воспользоваться некоторыми возможностями CSP/CLS относительно безопасности, например: приватные страницы (параметр PRIVATE=1), прозрачная проверка входных параметров (параметр ENCODED=2) и соответственно метод Link. Поэтому пока придётся вручную использовать методы ..Encrypt/..Decrypt.
Давайте рассмотрим небольшой пример:
MainPage
...
<href="secondpage">Перейти на другую rest-страницу 1</a><br>
<
href="secondpage?a=1&b=test">Перейти на другую rest-страницу 2</a><br>

#[
p("параметр")="secondpage.csp",p("<script>")="alert(""<!>"")"]#
<
href="#($replace(..Link("secondpage.csp",.p),".csp","",,1))#">Перейти на другую rest-страницу 3</a>
...
SecondPage
...
<body>
  Нам передали:<
br>
  a = #(
%request.Data("a",1))#<br>
  b = #(
%request.Data("b",1))#<br>
  параметр = #(
%request.Data("параметр",1))#<br>
  
&lt;script&gt; = #(..EscapeHTML(%request.Data("&lt;script&gt;",1)))#<br>
  <
button onclick="alert('Это другая страница!')">Нажми меня 2</button>
  <
href=".">Перейти на главную rest-страницу</a>
</
body>
...
Если у вас много параметров и они сложные, то лучше пользоваться методом Link, который берёт на себя всю работу. Пока же он ещё не поддерживает имена страниц без расширений, поэтому здесь приходится немного подстраиваться. Или его можно переопределить:
ClassMethod Link(
  
link As %String,
  
ByRef query As %String,
  
addQ As %Boolean 0As %String CodeMode = expression, ServerOnly = 1 ]
{
$replace($$cspLink^%SYS.cspServer(link_".csp",.query,addQ),".csp","",,1)
}
В этом случае код выше немного упростится.

Конвертация json из формата {id:1,parentId:1} в формат {id:1,children[{}] для визуализации дерева


Картинка с другого сайта.

На одном из русскоязычных вебинаров, посвящённых REST (17813224), был задан вопрос про конвертацию JSON для нужд UI-фреймворков, которые часто рассчитаны на один формат, а разработчик серверной части возвращает другой формат.

Встаёт вопрос: что делать и кто виноват?

Ответ: воспользоваться тем, что уже сделали другие.

На сервере ничего делать не надо, а вот на клиенте нужно будет вызвать всего один короткий метод. Ведь форматы бывают нужны разные, на всех не напасёшься, к тому же незачем нагружать сервер, когда это спокойно и без лишних затрат может сделать клиент.

Предложенный код, переведённый на javascript, у меня выглядит так:
_makeTree: function(options) {
  
var children, e, id, o, pid, temp, _i, _len, _ref;
  id 
options.id || "id";
  pid 
options.parentid || "parentid";
  children 
options.children || "children";

  
// create the index
  
temp {};
  _ref 
options.q;

  
for (_i = 0, _len _ref.length; _i _len; _i++) {
    e 
_ref[_i];
    
// predefine the childs array
    
e[children] [];
    
// write the id index to find by parentid in second loop
    
temp[e[id]] e;
  }

  
// Create the tree
  
[];
  _ref 
options.q;
  
for (_i = 0, _len _ref.length; _i _len; _i++) {
    e 
_ref[_i];
    
// This parent should be in the index
    if 
(temp[e[pid]] != null) {
      
// This row is a child
      // Add the child to the parent
      
temp[e[pid]][children].push(e);
    } 
else {
      
// Add a root item
      
o.push(e);
    }
  }
  
return o;
}
Он нам пригодится для следующей части, которой и завершим цикл статей, посвящённых созданию rest-приложений.

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии