none
List Item Attacments - создание папки средствами SPServices RRS feed

  • Вопрос

  • Всем привет.

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

    Первая часть задачи получилась, решил я это так:

    oDAV.navigateFrame("http://portal/sites/dpt/DF/Buch/Lists/TT/Attachments/"+ItemID, "_self");

    Но есть проблема, если вложений в Item'е ещё не было, папки с ID элемента в папке Attachments нет и проводник не откроется.

    Я пытался создать папку через SPServices оператором "UpdateListItems".

    Но, он прекрасно умеет создавать любые папки и подпапки в корне списка, в папке Attachments этого сделать не получается.

    Подскажите, пожалуйста, как лучше решить задачу с созданием папки в Attachments и почему воникают пробдемы при работы с ней.

    Вот полный код:

    <script src="/SiteAssets/JQuery/1.11.0/jquery.min.js"></script>
    <script src="/SiteAssets/JQuery/SPServices/jquery.SPServices-2014.02.min.js"></script>

    <script type="text/javascript">
    function fnOpenFolderView(){
        var ItemID = GetUrlKeyValue("ID");
        CreateFolder(ItemID);
        oDAV.navigateFrame("http://Имя портала/sites/dpt/DF/Buch/Lists/TT/Attachments/"+ItemID, "_self");
    };
    function CreateFolder(folderName) {
      $().SPServices({
      operation: "UpdateListItems",
      async: false,
      listName: "Имя Спска",
      updates:
            "<Batch OnError='Continue' PreCalc='TRUE' ListVersion='0' >" +
            "<Method ID='2' Cmd='New'>" +
                "<Field Name='FSObjType'>1</Field>" +
                "<Field Name='BaseName'>Attachments/" + folderName + "</Field>" +
                "<Field Name='Title'>" + folderName + "</Field>" +
            "</Method>" +
            "</Batch>",
      completefunc: function(xData, Status) {
       alert("Status=" + Status);  }
     });
     return true;
    }
     </script>
       
    <div id = "oDAV" class = "httpFolder"/>
    <input type = "button" value = "Открыть в проводнике" onclick ="fnOpenFolderView()"/>

    8 апреля 2015 г. 14:44

Ответы

  • Всё получилось через аттач файла.

    В коде ниже сперва аттачится существующий файл из Библиотеки документов (при этом создаётся папки с именем ИД текущего элемента списка), потом он удаляется и затем открывается созданная папка.

    Но есть интересное поведение, вновь созданная папка вложений в течении минуты не открывается, при попытке открыть вручную через проводник получаю сообщение "'URL папки' ссылается на недопустимое значение...". Через минуту она нормально открывается.

    Вот код, работает в том числе в старых браузерах:

    <style>
        .httpFolder {behavior: url(#default#httpFolder);}
    </style>

    <script src="/SiteAssets/JQuery/1.11.0/jquery.min.js"></script>
    <script src="/SiteAssets/JQuery/SPServices/jquery.SPServices-2014.02.min.js"></script>

    <script type="text/javascript">
    function fnOpenFolderView(){
        var ItemID = GetUrlKeyValue("ID");
        var ListName = "Имя списка";
        var itemstream;
        var itemfields;
        var WebURL = "http://"Имя портала"/sites/dpt/DF/Buch";
        var UrlGetItem = "http://"Имя портала"/sites/dpt/DF/Buch/SiteAssets/file.txt";
        var UrlFileDelete = "http://"Имя портала"/sites/dpt/DF/Buch/Lists/TT/Attachments/"+ItemID+"/file.txt";

        $().SPServices({
            operation: "GetItem",
            Url: UrlGetItem,
            async: false,
            completefunc: function (xData, Status) {
                itemstream = $(xData.responseXML).find("Stream").text();
                itemfields = "";
                $(xData.responseXML).find("FieldInformation").each(function(){
                    itemfields+=$(this).get(0).xml;
                    
                });
            }
        });    

        $().SPServices({
            webURL: WebURL,
            operation: "AddAttachment",                 
            listName: ListName,
            async: true,
            listItemID: ItemID,
            fileName: "file.txt",
            attachment: itemfields,
            completefunc: function (xData, Status) {  

                $().SPServices({
                    operation: "DeleteAttachment",
                    listName: ListName,
                    listItemID: ItemID,
                    url: UrlFileDelete,
                    completefunc: function (xData, Status) {
                    }
                });    
            }
        });
        
        
        oDAV.navigateFrame("http://"Имя портала"/sites/dpt/DF/Buch/Lists/TT/Attachments/"+ItemID, "_self");
    };

    function GetItem(){

    };

    </script>
       
    <div id = "oDAV" class = "httpFolder"/>

    <input type = "button" value = "Открыть в проводнике" onclick ="fnOpenFolderView()"/>

    • Помечено в качестве ответа Druzhkov_dv 10 апреля 2015 г. 8:58
    10 апреля 2015 г. 8:52

Все ответы

  • Думаю, что вы не сможете эту папку кодом создать.
    Можно костылём: кидать туда какой-нибудь файл, перед тем как нажали кнопку.


    [custom.development]

    8 апреля 2015 г. 15:22
  • Всё получилось через аттач файла.

    В коде ниже сперва аттачится существующий файл из Библиотеки документов (при этом создаётся папки с именем ИД текущего элемента списка), потом он удаляется и затем открывается созданная папка.

    Но есть интересное поведение, вновь созданная папка вложений в течении минуты не открывается, при попытке открыть вручную через проводник получаю сообщение "'URL папки' ссылается на недопустимое значение...". Через минуту она нормально открывается.

    Вот код, работает в том числе в старых браузерах:

    <style>
        .httpFolder {behavior: url(#default#httpFolder);}
    </style>

    <script src="/SiteAssets/JQuery/1.11.0/jquery.min.js"></script>
    <script src="/SiteAssets/JQuery/SPServices/jquery.SPServices-2014.02.min.js"></script>

    <script type="text/javascript">
    function fnOpenFolderView(){
        var ItemID = GetUrlKeyValue("ID");
        var ListName = "Имя списка";
        var itemstream;
        var itemfields;
        var WebURL = "http://"Имя портала"/sites/dpt/DF/Buch";
        var UrlGetItem = "http://"Имя портала"/sites/dpt/DF/Buch/SiteAssets/file.txt";
        var UrlFileDelete = "http://"Имя портала"/sites/dpt/DF/Buch/Lists/TT/Attachments/"+ItemID+"/file.txt";

        $().SPServices({
            operation: "GetItem",
            Url: UrlGetItem,
            async: false,
            completefunc: function (xData, Status) {
                itemstream = $(xData.responseXML).find("Stream").text();
                itemfields = "";
                $(xData.responseXML).find("FieldInformation").each(function(){
                    itemfields+=$(this).get(0).xml;
                    
                });
            }
        });    

        $().SPServices({
            webURL: WebURL,
            operation: "AddAttachment",                 
            listName: ListName,
            async: true,
            listItemID: ItemID,
            fileName: "file.txt",
            attachment: itemfields,
            completefunc: function (xData, Status) {  

                $().SPServices({
                    operation: "DeleteAttachment",
                    listName: ListName,
                    listItemID: ItemID,
                    url: UrlFileDelete,
                    completefunc: function (xData, Status) {
                    }
                });    
            }
        });
        
        
        oDAV.navigateFrame("http://"Имя портала"/sites/dpt/DF/Buch/Lists/TT/Attachments/"+ItemID, "_self");
    };

    function GetItem(){

    };

    </script>
       
    <div id = "oDAV" class = "httpFolder"/>

    <input type = "button" value = "Открыть в проводнике" onclick ="fnOpenFolderView()"/>

    • Помечено в качестве ответа Druzhkov_dv 10 апреля 2015 г. 8:58
    10 апреля 2015 г. 8:52
  • Т.е. пошли по пути, предложенного выше, костыля? 
    А зачем такие сложности? 

    [custom.development]

    10 апреля 2015 г. 9:00
  • Всё из-за архитектуры портала, если в элементе списка ещё не было вложений, его папки в Attachments нет, и создаётся она только внутренним механизмом.

    Т.е. нельзя просто создать папки с именем ИД элемента в Attachments (в корне списка пожалуйста) и положить туда файл, для инициации механизма создания папки я аттачу файл, и что бы он не мешался его удаляю.

    А всё это ради более удобной работы с вложениями.


    • Изменено Druzhkov_dv 10 апреля 2015 г. 9:13 орфография
    10 апреля 2015 г. 9:11
  • Про архитектуру я в курсе, поэтому и предложил вам решение, которые вы реализовали )
    Attachemnt вообще не лучшее для работы с файлами. 
    А вот про решение использовать IE...А что будет, если пользователь зайдёт не с IE? 
    Чем библиотека не угодила или набор документов? 

    [custom.development]

    10 апреля 2015 г. 9:15
  • Для пользователей не с IE ничего не будет, надо дорабатывать решение.

    Вообще это решение сделано для задачи аля Ценрт задач/Сервис деск, оно построено на списках что в этом случае удобнее.

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

    10 апреля 2015 г. 9:31
  • Ещё момент, что бы избежать задержки открытия новой папки (около минуты) можно поставить загрузку и удаление "временного" файла при открытии формы:

    <script type="text/javascript">
    $(document).ready(function() {
        var ...

        $().SPServices({
            operation: "GetItem",
            ...
        });    

        $().SPServices({
            operation: "AddAttachment",                 
            ...
            completefunc: function (xData, Status) {  
                $().SPServices({
                    operation: "DeleteAttachment",
                    ...
                    }
                });    
            }
        });
    });

    function fnOpenFolderView(){
        oDAV.navigateFrame("http://"Имя портала"/sites/dpt/DF/Buch/Lists/TT/Attachments/"+GetUrlKeyValue("ID"), "_self");
    };

    </script>


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

    • Изменено Druzhkov_dv 10 апреля 2015 г. 11:29
    10 апреля 2015 г. 11:21
  • Ещё момент: в предыдущем решении возникает конфликт сохранения, т.к. аттач/деаттач файла вызывают сохранения элемента в то время как мы уже открыли его форму редактирования. Решил это проверкой существования папки вложений элемента. Если папка есть, то ничего не происходит, если нет - аттад/деаттач и перезагрузка формы:

    <script type="text/javascript">
    $( document ).ready(function() {
    var ...

        $.ajax({
            type: "HEAD",
            url: "http://"Имя портала"/sites/dpt/DF/Buch/Lists/TT/Attachments/"+ItemID,
            success: function() {
                //alert("папка на месте");
            },
            error: function() {
                //alert("папки нет");
                $().SPServices({
                    operation: "GetItem",
                    ...                      
                        });
                    }
                });   
                $().SPServices({
                    operation: "AddAttachment",                 
                    ...
                        $().SPServices({
                            operation: "DeleteAttachment",
                            ...
                            completefunc: function (xData, Status) {
                                window.open(window.location, "_self");
                            }
                        });    
                    }
                });
            }
        });    
    });

    function fnOpenFolderView(){
        oDAV.navigateFrame("http://"Имя портала"/sites/dpt/DF/Buch/Lists/TT/Attachments/"+GetUrlKeyValue("ID"), "_self");
    };
    </script>

    20 апреля 2015 г. 15:32