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

Тема в разделе "Lotus - Xpages", создана пользователем motogarri, 5 июл 2016.

Метки:
  1. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Всем привет.
    Когда мы открываем документ в xpage по url такого вида:
    http://server/database.nsf/page.xsp?documentId=4851FFB7095D533446257CC5002944F9&action=openDocument
    сервер возвращает 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"];

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

    lionk Well-Known Member

    Регистрация:
    5 апр 2007
    Сообщения:
    308
    Симпатии:
    3
    получить 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();
     
  3. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    567
    Симпатии:
    214
    var doc:NotesDocument = database.getDocumentByUNID(unid) (database - текущая, для данного xpage)

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

    romych2004 Well-Known Member

    Регистрация:
    1 апр 2013
    Сообщения:
    56
    Симпатии:
    4
    Чет я не понял что именно нужно :)
    Чтобы из датагрида открывался документ?
    Формируй ссылку типа page.xsp?documentId=4851FFB7095D533446257CC5002944F9&action=openDocument и по клику на нее пользователь будет переходить. Чем такой вариант не подходит?

    UPD: если Вы хотите получить JSON документа, то надо создать другой РЕСТ - xe:documentJsonService
     
    #4 romych2004, 6 июл 2016
    Последнее редактирование: 6 июл 2016
  5. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Да, именно так. Нужно открывать документ из грида по двойному клику и сделать источником данных для полей, наверное рест. Только я не понял, как это сделать. Для xe:documentJsonService не нашёл ни одного примера, где бы он использовался для открытия документа.
     
  6. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Ну да, так и делаю. Думал, может, какой-то стандартный способ есть. Как при открытии из вьюшки по клику на ссылку.
     
  7. romych2004

    romych2004 Well-Known Member

    Регистрация:
    1 апр 2013
    Сообщения:
    56
    Симпатии:
    4
    Зачем вам рест? Юзайте обычный дата сорс, мне кажется проще будет. Или необходим именно рест?
     
  8. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Ну, пока так и делаю. Мне просто не нравится, что браузер тянет с сервера всю html страницу и это видно в нетворках консоли, не нравится километровая адресная строка. В идеале построить сингл пейдж приложение, максимально защищенное, насколько это возможно в браузере. На первый взгляд казалось, что рест-сервис это как раз тот вариант. Не хватает опыта оценить.
     
  9. romych2004

    romych2004 Well-Known Member

    Регистрация:
    1 апр 2013
    Сообщения:
    56
    Симпатии:
    4
    урл можно сделать практически любой. ну т.е. заменить параметры на свои
    в таком случае смотрите рест, да.. там есть рест для документа, я думаю он должен подойти. Еще вариант - посмотрите xcontrols, там разработчики как раз апдейтят документы через параметры, на сколько я помню
     
  10. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Что-то не выходит у меня открыть документ с помощью реста. Сервис возвращает нормальный 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;
        }
    });

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

    romych2004 Well-Known Member

    Регистрация:
    1 апр 2013
    Сообщения:
    56
    Симпатии:
    4
    Ну ничего страшного в обмене html нет, ну тянет вместо 20кб - 70кб.. ничего криминального, как мне кажется :)
    Для SPA советую посмотреть контрол dynamicContent, я его использую.
    Урл можно сделать любым.. типа page.xsp?id=noteId, а в датасорсе указывать айди документа как param.id

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

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Так и работает. Просто пытаюсь все подвести под одну концепцию. Как-то странно это, xe:documentJsonService есть, а контрола (по типу грида) для работы с одним документом нет. Или я не нашел просто. Store нормально забирает json из сервиса, а что потом с этим store делать, непонятно.
     
  13. romych2004

    romych2004 Well-Known Member

    Регистрация:
    1 апр 2013
    Сообщения:
    56
    Симпатии:
    4
    Не совсем понимаю какой именно контрол Вам нужен. Данный сервис предоставляет Вам АПИ для чтения документа и для записи документа из клиентского джаваскрипта. Делается это ajax-ом. Можно конечно и в store запихнуть :) Но особого смысла не вижу
     
  14. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    зависит от того - что хотите (задачи)
    гриды в хэпагах мну не понра - много особенностей и мало возможностей (мне нужных, под задачу, не нашел)
    для небольшой выборки заюзал gridx https://xcellerant.net/gridx-in-xpages/
    еще понра - можно не весь док апдейтить ("руками" запрос отправлять), а только поле (PATCH на сервере надо настроить)
    к стору вменяемый доступ...
     
Загрузка...

Поделиться этой страницей