Показаны сообщения с ярлыком SharePoint Designer 2013. Показать все сообщения
Показаны сообщения с ярлыком SharePoint Designer 2013. Показать все сообщения

среда, 18 февраля 2015 г.

SharePoint. Сменить URL библиотеки или списка

Если появилась необходимость поменять url адрес списка или библиотеки, то сделать это через веб-интерфейс не получиться. Можно изначально назвать латиницей библиотеку или список, а потом переименовать. Тогда название будет отличаться от url.
Если же надо именно у уже созданной библиотеке или списка сменить url, то есть 2 способа.
1. Использовать SharePoint Designer
2. Использовать проводник Windows
Давайте начнем с SharePoint Designer и случаем, когда необходимо переименовать библиотеку. Откройте SPD и выполните действия как на картинке:


Второй способ, это переименовать библиотеку или список, но не используя SharePoint Designer. Для этого, используя Internet Explorer, откройте библиотеку. Потом выберите на ленте инструментов "Библиотека->Открыть в проводнике":

Если все хорошо, то Windows Explorer (Проводник Windows) подключится к библиотеке, используя протокол WebDav:

Перейдите на уровень выше и среди папок увидите свою библиотеку. Ищите папку не отображаемым именем, а с тем, которое видите в адресной строке браузера. Потом переименуйте.
Последним способом можно переименовать и список, но для этого надо открыть через WebDav в проводнике любую другую библиотеку, потом перейти на уровень выше и в папку "Lists". Там найдите необходимый список.
После смены url любым из указанных способов, необходимо самостоятельно поменять ссылку на библиотеку или список. Если этого не сделал, то пользователи будут попадать на старый Url и видеть сообщение:





пятница, 30 января 2015 г.

Sharepoint designer. Рабочий процесс не обновляется после публикации

Создавая рабочий процесс для SharePoint 2010 и используя SharePoint Designer 2010 я столкнулся с проблемой, новый процесс не начинал работать с новой логикой. Причем ошибка появилась после решения такой ошибки.
SharePoint "видел", что процесс именно новый, т.к. к отработанным в прошлом добавлялось время публикации, в скобках. Но работать продолжал по старой логике.
Как выяснилось, причина на стороне клиента, а именно в SharePoint Designer. Причем ошибка появилась в 2010 и 2013 версиях.
Что бы побороть проблему надо почистить кэш, для этого необходимо удалить все данные по следующим путям:

%USERPROFILE%\AppData\Local\Microsoft\WebsiteCache
%APPDATA%\Microsoft\Web Server Extensions\Cache

Для SharePoint Designer 2010 еще надо сделать несколько движений:
Файл->Параметры->Общие->Кэшировать данные сайта во время сеансов в SharePoint Designer(Снять галочку)

Это решило проблему.

четверг, 27 ноября 2014 г.

Workflow Manager error: Scope '/SharePoint/default/... is not in an active state

При работе с Workflow Manager получил ошибку:
System.InvalidOperationException: Operation failed with error Microsoft.Workflow.Client.ScopeInactiveException: Scope '/SharePoint/default/71295e23-e1ea-45b8-b072-61a6548fa5cd' is not in an active state. Its current state is 'Unregistering'. HTTP headers received from the server - ActivityId: b9d7fa25-bf33-4303-ba60-7dda39e7574c. NodeId: PK-SP-WF. Scope: /SharePoint/default/71295e23-e1ea-45b8-b072-61a6548fa5cd. Client ActivityId : e583bf9c-b891-80dd-3ac0-277bbb634739. ---> System.Net.WebException

В SharePoint Designer она выглядела так:



Я неоднократно сталкивался с ошибками Workflow Manager'а, все удавалось как то решать.
С этой же проблемой мне ничего не удалось сделать, от отчаяния я полез в базу...
Попробовал обновить запись о статусе руками и это сработало:
update [WFResourceManagementDB].[dbo].[Scopes] set [Status] = 'Active' where [Status] = 'Unregistering'


воскресенье, 24 августа 2014 г.

SharePoint 2013. Тип поля "Связанные элементы"

В списке задач у нас есть замечательная возможность добавить связанные с задачей файлы:

Рабочий процесс автоматически делает элемент, вокруг которого идет рабочий процесс, связанным элементов задачи.
Процесс добавления связанного элемента(ов) выглядит это так:

Т.е. обычный диалог выбора файла из SharePoint.
После добавления:
При попытке добавить такое же поле в свой настраиваемый список - я его не нашел.
Используя SharePoint Manager 2013 я посмотрел какие есть поля у коллекции сайтов и нашел среди них "Связанные элементы":

Сделаем как на картинке - переименуем из "_Hidden" в "Related Items".
Теперь мы сможем добавить поле "Связанные элементы" к нашему списку:
Все отлично. Теперь можно использовать!

Но есть нюанс с его удалением. Я так его и не смог удалить. Удалить его через веб-интерфейс нельзя. Через SharePoint Designer тоже:

Если определить его обратно в группу столбцов "_Hidden", это так же не поможет. Сделать его невидимым на форме через его свойства, поменяв "ShowInDisplayForm" на "False" не вышло:


Удалить через SharePoint Manager 2013:



Не вышло... Поскольку это поле отображается только на форме просмотра, я решил что-то с формой сделать. Для начала создал новую форму просмотра и заметил что теперь поле отображает только общее количество связанных элементов. Но просмотреть их или добавить нельзя:
 Дальше, используя SharePoint Designer 2013, я посмотрел код формы и добавил стиль, что бы спрятать столбец:
 
Теперь поля нет.

UPD:
Есть более расширенный и ранее написанный пост, ознакомитесь.











четверг, 7 августа 2014 г.

SharePoint 2013. Windows Workflow Foundation, part of .Net Framework 3.0, must be installed to use this feature

При попытке отредактировать созданный ранее рабочий процесс в SharePoint Designer 2013 на ферме SharePoint Server 2013 с установленным Workflow manager 1.0 возникла ошибка:
[Ру] Не удалось загрузить этот рабочий процесс. Чтобы устранить эту проблему.
[En] Failed to load this workflow. To correct this problem, restart SharePoint Designer.

Потом другая ошибка:
[Ру] Для использования этой возможности необходимо установить Windows Workflow Foundation (входит в состав .Net Framework 3.0).[En] Windows Workflow Foundation, part of the .NET Framework 3.0, must be installed to use this feature.

Для начала я попробовал очистить кэш SharePoint Designer 2013, для этого надо удалить все по этим путям в файловой системе на клиенте:
%APPDATA%\Microsoft\Web Server Extensions\Cache
%APPDATA%\Microsoft\SharePoint Designer\ProxyAssemblyCache
%USERPROFILE%\AppData\Local\Microsoft\WebsiteCache

Если это не помогло, то необходимо выполнить все обновления SharePoint Designer 2013.
Если и это не помогло, то попробуйте выполнить редактирование с другого компьютера.
Мне это тоже не помогло. 
Позже, пытаясь найти решение в сети, я наткнулся на сообщение господина John Scott.
Суть его сообщения в том, что если описанные выше решения не сработали, то это известная ошибка, надо ждать исправление от Microsoft. И еще John Scott выявил, какие действия приводят к поломке, описав их в этом сообщении.
После прочтения этих сообщений я был глубоко обеспокоен необходимость снова сделать огромнейший рабочий процесс. Позже я посмотрел дату сообщения John Scott - ON 4/30/2014 9:00 PM. Почти 3 месяца прошло. Потом я проверил статус обновления фермы, с которой работал - Service Pack 1. Я обновил ферму используя June 2014 CU for SharePoint 2013


И это помогло. При этом я точно не установил какое именно обновление исправляет ошибку.

вторник, 8 июля 2014 г.

Действие "Сохранить сайт как шаблон" не поддерживается на этом сайте

При попытке сохранить сайт как шаблон можно получить ошибку:
Действие "Сохранить сайт как шаблон" не поддерживается на этом сайте
Проблема в том, что в propertybag settings сайта свойство SaveSiteAsTemplateEnabled = false:


Поменяйте на true, для этого откройте SharePoint Designer 2013, на ленте инструментов в разделе "Управление" кликните по иконке "Параметры сайта", как на картинке ниже. Появится окно как на картинке выше.



Сделайте изменения. Ошибка пропадет:




пятница, 6 июня 2014 г.

Как возвращаться на форму элемента после старта рабочего процесса

После старта рабочего процесса из формы элемента - Вас вернет на представление списка.
Поменять такое поведение можно, если добавить немного JavaScript кода на страницу с представлением списка. Код будет читать referrer, брать ID и делать редирект на форму элемента списка. В нашем случае на форму просмотра. При это важно, что бы код отработал только если Вы перешли на страницу после старта рабочего процесса. Это мы сможем понять по присутствию "Workflow.aspx" в referrer.

Код выглядит так:
// Функция позволяет взять параметр из referrer
function getParameterByName(name, url) {
    name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
results = regex.exec(url);
    return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}

// Получаем referrer
var ref = document.referrer
// Получаем ID из referrer
var ID = getParameterByName("ID", ref)
if (ref.indexOf("Workflow.aspx") > -1){
// Делаем редирект
    window.location = "/office/Lists/Contractors/DispForm.aspx?ID=" + ID
}

Теперь надо добавить это все в представление списка, воспользуемся SharePoint Designer 2013:
В моем случая я имею только одно представление, откроем его в расширенном режиме и добавим код, как на картинке:
Сохраните изменение и проверьте работу.

пятница, 23 мая 2014 г.

Как создать пустой сайт в SharePoint 2013

Для создания пустых сайтов в SharePoint 2010 изначально имелась возможность создать таковой. В SharePoin 2013 такой возможности нет, изначально.

Давайте попробуем выполнить PowerShell команду: Get-SPWebTemplate


В шаблонах он есть. Теперь давайте перейдем в папку с SharePoint в файловой системе по адресу:
C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\TEMPLATE\1049\XML

Следует отметить, что путь установки может быть иным. Указан который по умолчанию. Так же папка 1049 указывает на локаль ru-Ru, 1033 en-US.

В этой папке лежат несколько XML файлов, нас интересует WEBTEMP.XML


Как видите, на отображение шаблона в веб-интерфейсе влияет атрибут Hidden="True", меняем на "FALSE".

Делаем IISReset и получаем нужный нам результат:


В SharePoint Designer 2013 тоже можно будет создавать "Пустой сайт":


Так же можно было создать сайт по шаблону "Пустой сайт" используя PowerShell:
$blankSitetemplate= Get-SPWebTemplate "STS#1" New-SPSite -Url "<Url of new site collection" -OwnerAlias "<domain\user>" -Template $blankSitetemplate
Еще можно взять любой другой сайт, убрать все списки и деактивировать фичи. Сохранить как шаблон. И потом от него создавать новые сайты. Это плохой вариант.

И есть решаемая проблема с рабочими процессами Workflow manager 1.0, как ее решить написано здесь.

вторник, 29 апреля 2014 г.

Отправить ссылку на элемент из рабочего процесса

В ходе выполнения рабочего процесса может возникнуть необходимость уведомить определенного пользователя о необходимости изменить поля в элементе списка.
Для уведомления можно использовать электронную почту.

Сформировать письмо и отправить пользователю ссылку:

К сожалению, если использовать способ как картинке выше, то мы получим следующую ссылку:
http://server/Lists/ListName/81_.000

Где 81 - это Id текущего элемента. Такая ссылка на элемент работать не будет.
Что бы создать рабочую ссылку нужно использовать встроенный в SharePoint Designer 2013 построитель строк и сформировать такое:
[%Контекст рабочего процесса:URL адрес текущего сайта %]/Lists/listname/Dispform.aspx?ID=[%Текущий элемент:ID%]




Для этого получаем URL текущего сайта:



И Id текущего элемента:


Теперь у нас есть рабочая ссылка на элемент.

Стоить отметить, что в приведенном примере мы указываем ссылку на форму просмотра.
У нас остается возможность формировать ссылку сразу на форму изменения элемента.


UPD:
Можно использовать контекст рабочего процесса и получить ссылку на документ:
Но при этом нельзя будет сформировать ссылку сразу на форму редактирования.
Создается ссылка на форму просмотра, чего почти всегда достаточно.




понедельник, 28 апреля 2014 г.

Редактирование JS для SharePoint

JSOM становиться все популярнее. Разработчиков SharePoint все плотнее толкают в сторону клиентской разработки. Так же появился CSR и TypeScript c полезными дополнениями. И несмотря на явное сопротивление, я все же начинаю все активнее писать JavaScript код. Создав несколько решений используя JavaScript, вместо Custom field type, удалось получить небольшой опыт удачного использования окружения и инструментов. Главный вывод который я сделал - не использовать для редактирования JS кода SharePoint Designer 2013.
Необходимо делать ссылку на файл c JS кодом, а сам файл класть в библиотеку. Подключать по WebDav к проводнику. Включить версионность в библиотеке со скриптами. Дальше Вы можете редактировать код в Visual Studio или Webstorm:


Для JS рекомендую использовать webstorm. Он не много стоит.

SharePoint custom file uploader by JSOM & REST\oData

SharePoint имеет встроенную возможность прикреплять файлы к элементам списка.

Но нет возможности иметь 2 поля. Что бы логически разделять документы.
Такого столбца просто нет в списке.
Так же нет возможности задать библиотеку, куда складывать вложения.
Что бы просмотреть вложенные элементы, необходимо открыть элемент списка.
Решением может быть создание своего custom field type.
Использовать серверный код для реализации функционала. В таком случае ограничений почти нет.
Можно купить. Есть несколько предложений на рынке.
Я же кратко покажу как добавить такой функционал без серверного кода.
Решение должно иметь возможность явно указать библиотеку, куда складывать файлы.
Не блокировать интерфейс на время загрузки.
Иметь возможность загрузки файлов большого размера.
Решение должно сразу же отображать загруженный файл и предоставлять возможность его удаления.
Все должно быть без постбэков.
Все будет сделано на JavaScript.

Для начала создайте новую форму просмотра.
Это можно сделать в SharePoint Designer.
Имя папки для хранения файлов- "Documents".
Библиотека указывается в html элементе для загрузки файлов:
onchange="UploadFile('Documents', 'fileinputInit')"
Добавьте в нее html:
<tr> 
    <td width="190px" valign="top" class="ms-formlabel"> 
        <h3 class="ms-standardheader"> 
            <nobr>Документы по открытию</nobr> 
        </h3> 
    </td> 
    <td width="400px" valign="top" class="ms-formbody"> 
        <input style="margin-left:2px" type="button" id="browseButton" value="Добавить файл ..." onclick="fileinputInit.click()" />
        <input type='file' id='fileinputInit' onchange="UploadFile('Documents', 'fileinputInit')" style='position:absolute;visibility:hidden;' multiple="multiple" /> 
        <div id="attachedFilesInit"> 
            <h2 id="initAnchor"></h2> 
        </div> 
    </td>
</tr> 
Этот html надо вставить в таблицу полями формы.
Что бы поле загрузки располагалось после поле "Название", вставьте код выше после указанного ниже:
    <td width="190px" valign="top" class="ms-formlabel"> 
        <h3 class="ms-standardheader"> 
            <nobr> 
                Название<span class="ms-formvalidation"> *</span> 
            </nobr> 
        </h3> 
    </td> 
    <td width="400px" valign="top" class="ms-formbody"> 
        <SharePoint:FormField runat="server" id="ff1{$Pos}" ControlMode="New" FieldName="Title" __designer:bind="{ddwrt:DataBind('i',concat('ff1',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Title')}" /> 
        <SharePoint:FieldDescription runat="server" id="ff1description{$Pos}" FieldName="Title" ControlMode="New" /> 
    </td> 
</tr>
 Потом добавить после:

Этот JS




Решение работает асинхронно.
Загрузки делалась именно с помощью REST, т.к. JSOM имеет ограничение файла на загрузку в 2 Mb.

В результате у Вас должно быть как на гиф ниже:

Решение есть куда дорабатывать.
Для начала отключить возможность сабмита формы, на время загрузки.
И индикатор загрузки в список файлов.



среда, 16 апреля 2014 г.

Баг SharePoint Designer 2013

В связи с известиями о прекращении развития InfoPath и его отсутствии в новой версии SharePoint, а следовательно и невозможности миграции форм - было принято решение реализовать задачу с использованием JavaScript. Все делать исключительно на клиенте.

Изначально весь JS вставлял в стандартные формы списка.
Периодически весь JS код переставал работать.
Причиной было поведение SharePoint Designer 2013.
В код, который сбрасывал состояние элемента:

window.reset = function (e) {
   e.wrap('<form>').closest('form').get(0).reset();
   e.unwrap();
}


Дизайнер добавлял:
<head> 
<meta name="WebPartPageExpansion" content="full" /> 
</head> 
В итоге я получал:
window.reset = function (e) { 
    console.log("Начало выполнения функции 'window.reset"); 
    e.wrap('<head> 
    <meta name="WebPartPageExpansion" content="full" /> 
    </head> 
    <form>').closest('form').get(0).reset(); 
    e.unwrap(); 
}


Решить удалось подключая код отдельным файлом.
Как и должно быть.