Документ из джисона

motogarri

Well-known member
17.02.2010
200
3
#1
Всем привет.
Когда мы открываем документ в xpage по url такого вида:
Для просмотра контента необходимо: Войти или зарегистрироваться

сервер возвращает HTML всей страницы.

В случае работа rest service + datagrid возвращается только json. Пытаюсь понять, как открыть документ по тому же принципу и никак не нахожу решения. Рест сервис нельзя использовать как датасорц, непонятно как в самом сервисе запросить один документ по униду, как этот унид передать из грида в след. икспейдж с формой документа по даблклику.
Ну, как получить унид понятно, непонятно что с ним делать потом
JavaScript:
var grid = arguments[0].grid;
var index = arguments[0].rowIndex;
var item = grid.getItem(index);
var unid = item.attributes["@unid"];

Пните плиз в нужную сторону. Как это делается?
 

lionk

Well-known member
05.04.2007
310
2
#2
Пытаюсь понять, как открыть документ по тому же принципу
получить json как отдаёт дата провайдер? или какой json тебе надо?

если просто по обращению к Х-странице получить ответ типа жсон то
JavaScript:
<xp:this.afterRenderResponse>

var externalContext = facesContext.getExternalContext();
var writer = facesContext.getResponseWriter();
var response = externalContext.getResponse();
 
response.setContentType("application/json");
response.setHeader("Cache-Control", "no-cache");
               
writer.write( сюда строку жсона );

writer.endDocument();
 

alexas1

Lotus team
10.04.2014
723
144
#3
var doc:NotesDocument = database.getDocumentByUNID(unid) (database - текущая, для данного xpage)

"как этот унид передать из грида в след. икспейдж" - напр. запомнить в Scope...
 

romych2004

Lotus team
01.04.2013
112
20
#4
Чет я не понял что именно нужно :)
Чтобы из датагрида открывался документ?
Формируй ссылку типа
Для просмотра контента необходимо: Войти или зарегистрироваться
и по клику на нее пользователь будет переходить. Чем такой вариант не подходит?

UPD: если Вы хотите получить JSON документа, то надо создать другой РЕСТ - xe:documentJsonService
 
Последнее редактирование:

motogarri

Well-known member
17.02.2010
200
3
#5
Да, именно так. Нужно открывать документ из грида по двойному клику и сделать источником данных для полей, наверное рест. Только я не понял, как это сделать. Для xe:documentJsonService не нашёл ни одного примера, где бы он использовался для открытия документа.
 

romych2004

Lotus team
01.04.2013
112
20
#7
Да, именно так. Нужно открывать документ из грида по двойному клику и сделать источником данных для полей, наверное рест. Только я не понял, как это сделать. Для xe:documentJsonService не нашёл ни одного примера, где бы он использовался для открытия документа.
Зачем вам рест? Юзайте обычный дата сорс, мне кажется проще будет. Или необходим именно рест?
 

motogarri

Well-known member
17.02.2010
200
3
#8
Ну, пока так и делаю. Мне просто не нравится, что браузер тянет с сервера всю html страницу и это видно в нетворках консоли, не нравится километровая адресная строка. В идеале построить сингл пейдж приложение, максимально защищенное, насколько это возможно в браузере. На первый взгляд казалось, что рест-сервис это как раз тот вариант. Не хватает опыта оценить.
 

romych2004

Lotus team
01.04.2013
112
20
#9
Ну, пока так и делаю. Мне просто не нравится, что браузер тянет с сервера всю html страницу и это видно в нетворках консоли, не нравится километровая адресная строка. В идеале построить сингл пейдж приложение, максимально защищенное, насколько это возможно в браузере. На первый взгляд казалось, что рест-сервис это как раз тот вариант. Не хватает опыта оценить.
урл можно сделать практически любой. ну т.е. заменить параметры на свои
в таком случае смотрите рест, да.. там есть рест для документа, я думаю он должен подойти. Еще вариант - посмотрите xcontrols, там разработчики как раз апдейтят документы через параметры, на сколько я помню
 

motogarri

Well-known member
17.02.2010
200
3
#10
Что-то не выходит у меня открыть документ с помощью реста. Сервис возвращает нормальный json. Помещаю его в store, и пытаюсь отобразить в гриде. Вычитал, что в гриде один документ не покажешь, только коллекцию. А как тогда быть? Нужно открывать документы для просмотра, редактирования...

Вот что пока получилось:
XML:
<xe:restService id="restService1" pathInfo="rs">
  <xe:this.service>
    <xe:documentJsonService contentType="application/json" documentUnid="2C2D6686CA61AC7C43258048005394DE" var="doc">
      <xe:this.items>
        <xe:restDocumentItem itemName="LastName" name="s_last_name"></xe:restDocumentItem>
        <xe:restDocumentItem itemName="FirstName" name="s_first_name"></xe:restDocumentItem>
      </xe:this.items>
   </xe:documentJsonService>
  </xe:this.service>
</xe:restService>
JavaScript:
var store = new dojox.data.JsonRestStore({target: "myPage.xsp/rs"});
var layout = [
   {name:"1", field: "s_last_name" , datatype:"string"},
   {name:"2", field: "s_first_name", datatype:"string"},
];          
var grid = new dojox.grid.DataGrid({
   id: "grid",
   store: store,
   structure: layout,
});                   
grid.placeAt("gridDiv");
grid.startup();

Получается отображать поля документа, перебирая айтемы json-а, но это не слишком удобно и непонятно как быть в случае создания и редактирования документов.
JavaScript:
dojo.xhr.get({
    url:"myPage.xsp/rs",
    handleAs:"json",
    load: function(data){
    var content;
    for(var i in data){
        if(i == "s_last_name"){
            content =+ "<div>Счёт: " + data[i] + "</div>"
        } 
    }
    dojo.byId("div_result").innerHTML = content;
    }
});

Может кто-то сталкивался?
 

romych2004

Lotus team
01.04.2013
112
20
#11
Ну ничего страшного в обмене html нет, ну тянет вместо 20кб - 70кб.. ничего криминального, как мне кажется :)
Для SPA советую посмотреть контрол dynamicContent, я его использую.
Урл можно сделать любым.. типа page.xsp?id=noteId, а в датасорсе указывать айди документа как param.id

Full update я никогда не делают
 

motogarri

Well-known member
17.02.2010
200
3
#12
Ну ничего страшного в обмене html нет, ну тянет вместо 20кб - 70кб.. ничего криминального, как мне кажется
Так и работает. Просто пытаюсь все подвести под одну концепцию. Как-то странно это, xe:documentJsonService есть, а контрола (по типу грида) для работы с одним документом нет. Или я не нашел просто. Store нормально забирает json из сервиса, а что потом с этим store делать, непонятно.
 

romych2004

Lotus team
01.04.2013
112
20
#13
Так и работает. Просто пытаюсь все подвести под одну концепцию. Как-то странно это, xe:documentJsonService есть, а контрола (по типу грида) для работы с одним документом нет. Или я не нашел просто. Store нормально забирает json из сервиса, а что потом с этим store делать, непонятно.
Не совсем понимаю какой именно контрол Вам нужен. Данный сервис предоставляет Вам АПИ для чтения документа и для записи документа из клиентского джаваскрипта. Делается это ajax-ом. Можно конечно и в store запихнуть :) Но особого смысла не вижу
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#14
а контрола (по типу грида) для работы с одним документом нет
зависит от того - что хотите (задачи)
гриды в хэпагах мну не понра - много особенностей и мало возможностей (мне нужных, под задачу, не нашел)
для небольшой выборки заюзал gridx
Для просмотра контента необходимо: Войти или зарегистрироваться

еще понра - можно не весь док апдейтить ("руками" запрос отправлять), а только поле (PATCH на сервере надо настроить)
к стору вменяемый доступ...