tag:blogger.com,1999:blog-35929679293396356402024-03-18T19:53:26.077-07:00немного о SharePoint Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.comBlogger99125tag:blogger.com,1999:blog-3592967929339635640.post-38020358253722385622021-08-13T04:11:00.001-07:002021-08-13T04:12:21.781-07:00Проверить наличие файла и требуемого расширения в элементе при сохранении.<p class="MsoNormal">В этой статье я расскажу, как можно проверить наличие вложений
в элементе и расширение файла.<o:p></o:p></p>
<p class="MsoNormal">К примеру, у нас есть два вложения, и мы можем к ним
обратиться с помощью <span lang="EN-US" style="mso-ansi-language: EN-US;">jQuery<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6SC23tv1MxbqwDi6fbAj8HhDigpnz25EzrIrNFMW0qYRjHjaybtPUng2-3Jq5C_nkvyuEDe8fHyN-bDTvDNAAHkGnwKC4G4Oj5Af-17jz8AdpQNIn0-xw8pwDReiarwTqwcuju72ruiYQ/s1110/2021-08-13+13_56_50-Design+Ticket+System+-+New+Item.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="459" data-original-width="1110" height="165" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6SC23tv1MxbqwDi6fbAj8HhDigpnz25EzrIrNFMW0qYRjHjaybtPUng2-3Jq5C_nkvyuEDe8fHyN-bDTvDNAAHkGnwKC4G4Oj5Af-17jz8AdpQNIn0-xw8pwDReiarwTqwcuju72ruiYQ/w400-h165/2021-08-13+13_56_50-Design+Ticket+System+-+New+Item.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><p>
</p><pre class="brush:js">var attachments = jQuery("#idAttachmentsTable tbody" ).children();
</pre><p></p>
<p class="MsoNormal">Так же мы можем прочитать расширение файлов <o:p></o:p></p>
<p class="MsoNormal"><o:p>
</o:p></p><pre class="brush:js"> for(var i =0; i< attachments.length;i++){
var fileName = jQuery("#attachRow" + i +" .ms-vb span").text();
var extension = fileName.match(/\.[0-9a-z]+$/i)[0];
console.log(extension);
}
</pre><p></p>
<p class="MsoNormal">Собираем все единое решение и добавляем в функцию PreSaveAction<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p>
</o:p></p><pre class="brush:js">function PreSaveAction()
{
var attachments = jQuery("#idAttachmentsTable tbody" ).children();
if(attachments || attachments.length > 0){
var excelFileExist = false;
for(var i =0; i< attachments.length; i++){
var fileName = jQuery("#attachRow" + i +" .ms-vb span").text();
var extension = fileName.match(/\.[0-9a-z]+$/i)[0];
console.log(extension);
if(extension == ".xls" || extension == ".xlsx"){
excelFileExist = true;
}
}
if(!excelFileExist){
alert("вложите файл Excel");
return false;
}else{
return true;
}
}else{
alert("нужно вложить файлы");
return false;
}
}
</pre><p>
этот код можно добавить в веб-часть редактор скриптов или редактор контента
</p>Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-64094271902120875952020-12-17T04:13:00.002-08:002020-12-17T04:14:33.861-08:00Кнопка на Ribbon (userCustomActions только с помощью JS)<p></p><p class="MsoNormal">Появилась задача, что бы сотрудники компании могли
распечатать заявки согласно определенной формы. При этом была возможность выбрать
сразу несколько и распечатать.<o:p></o:p></p>
<p class="MsoNormal">Как основное решение для формы печати было <span lang="EN-US" style="mso-ansi-language: EN-US;">React</span><span lang="EN-US"> </span>приложение,
размещенное на страницу, а в представлении добавил кастомную кнопку на риббон которая
отрывала новый таб с требуемой страницей и передавала <span lang="EN-US" style="mso-ansi-language: EN-US;">ID</span><span lang="EN-US"> </span>выделенных элементов
как параметр.<br style="mso-special-character: line-break;" />
<!--[if !supportLineBreakNewLine]--><br style="mso-special-character: line-break;" />
<!--[endif]--><o:p></o:p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieIEybBMTTaNzT5VM0Aso_GKynDWbm22cNuo5_72rg1pv9HfbjgA6CO5qEdHsG4004LIOp1u95IIhRt-imOwSCkHYwFDiUvfGn-gWy7iffcfcY34TV06uNTl6HiWgM663VbRAtvw-9v7Mh/s763/print+btn.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="763" data-original-width="747" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieIEybBMTTaNzT5VM0Aso_GKynDWbm22cNuo5_72rg1pv9HfbjgA6CO5qEdHsG4004LIOp1u95IIhRt-imOwSCkHYwFDiUvfGn-gWy7iffcfcY34TV06uNTl6HiWgM663VbRAtvw-9v7Mh/s320/print+btn.gif" /></a></div><br />
<span><a name='more'></a></span><p class="MsoNormal">Что бы добавить кнопку нужно единожды выполнить код в консоли:</p><p class="MsoNormal">
<br />
</p><pre class="brush:ps"> //Get the client context and list object
var context = new SP.ClientContext.get_current();
var list = context.get_web().get_lists().getByTitle(_spPageContextInfo.listTitle);
//Get the custom user action collection and add the user action
var customUserAction = list.get_userCustomActions().add();
//Set the location of the user action
customUserAction.set_location('CommandUI.Ribbon.ListView');
//Add the properties for the custom action
var userActionExtension = '<commanduiextension xmlns="http://schemas.microsoft.com/sharepoint/">' +
'<commanduidefinitions>' +
'<commanduidefinition location="Ribbon.List.Actions.Controls._children">' +
'<button abeltext="Распечатать заявки" emplatealias="o1" equence="0" escription="Print" id="Ribbon.Documents.New.RibbonTest" mage16by16="/Style%20Library/Images/printer.png" mage32by32="/Style%20Library/Images/printer.png" ommand="PrintRequest">' +
'</button></commanduidefinition>' +
'</commanduidefinitions>' +
'<commanduihandlers>' +
'<commanduihandler command="PrintRequest" nabledscript="javascript:SP.ListOperation.Selection.getSelectedItems().length > 0;" ommandaction="javascript:window.open(\'https:\/\/contoso.sharepoint.com\/SitePages\/CourierServicePrintPage.aspx?isdlg=1&selectedItems=\'+SP.ListOperation.Selection.getSelectedItems().map(function(item){ return item.id; }).join(\',\') ,\'_blank\'); ">' +
'</commanduihandler></commanduihandlers>' +
'</commanduiextension>';
//Add the command UI extension and update the custom user action
customUserAction.set_commandUIExtension(userActionExtension)
customUserAction.set_title("Распечатать заявки");
customUserAction.update();
//Load the client context and execute the batch
context.load(list, 'UserCustomActions');
context.executeQueryAsync(function() {
console.log("Custom User Action added successfully to ribbon.");
}, function(sender, args) {
console.log(args.get_message());
});
</pre>
при желании можно поправить параметры кнопки (при каком условии она активна)<o:p></o:p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkAyB4y21A_uZv-f0otnDeWulZd5sut_eXyCTxHc13i8-bFtuztARHUy5WlMVTsfBCXzs1OjitRqF42L27MIC0P8qbF9vE9nZ2swmObjvnFS7XHHrHczzUFF34wIYc0Gk203SxTyKXB6Aw/s1093/2020-12-17+15_05_25-Window.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="565" data-original-width="1093" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkAyB4y21A_uZv-f0otnDeWulZd5sut_eXyCTxHc13i8-bFtuztARHUy5WlMVTsfBCXzs1OjitRqF42L27MIC0P8qbF9vE9nZ2swmObjvnFS7XHHrHczzUFF34wIYc0Gk203SxTyKXB6Aw/s320/2020-12-17+15_05_25-Window.png" width="320" /></a></div><br /><p class="MsoNormal"><br /></p>
<p class="MsoNormal"><span style="mso-spacerun: yes;"> </span><o:p></o:p></p><br /><p></p><span><!--more--></span><span><!--more--></span><span><!--more--></span>Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-25565023593000234352020-11-06T06:13:00.001-08:002020-11-09T02:40:53.933-08:00Очистить значение поля выбор (Power Automate)В рабочих процессах созданных через дизайнер можно было легко очистить поле типа выбор, но вот в Power Automate с этим возникают сложности.<div>Если выбрать свое значение и оставить его пустым или заполнить null, то прежнее значение остается без изменения.</div><div>Для очистки значения можно воспользоваться следующим способом, передать пустую строку как значение поля.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEsT2N362oBPOMcGSMB6-6lg3Kjq0k00zIEtgWhx-Ekofwj07NU8lywYA5uz59AfaAnhpoKofR9QXVgixWmokTi254u-EUBTZU8S876kBrSJa14Uyt9PM5xcuoZgWm5-w_VEld52tx4idH/s860/2020-11-06+17_05_15-Edit+your+flow+_+Power+Automate.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="428" data-original-width="860" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEsT2N362oBPOMcGSMB6-6lg3Kjq0k00zIEtgWhx-Ekofwj07NU8lywYA5uz59AfaAnhpoKofR9QXVgixWmokTi254u-EUBTZU8S876kBrSJa14Uyt9PM5xcuoZgWm5-w_VEld52tx4idH/s320/2020-11-06+17_05_15-Edit+your+flow+_+Power+Automate.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR1ryB8vnk9aNoVt0gFiGymNrFX-E1BeRT0C6P7ojI_yk_9xOVryO2eoND8-6EOvVvSh07FFKCtQovzTLeKJdtQ8caB0MQw2Z3DpaPiZKUp3UcrGODwpToPmKI_L5zp2ISPEGqsCNcEIDs/s1381/2020-11-06+17_06_30-Edit+your+flow+_+Power+Automate.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="483" data-original-width="1381" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR1ryB8vnk9aNoVt0gFiGymNrFX-E1BeRT0C6P7ojI_yk_9xOVryO2eoND8-6EOvVvSh07FFKCtQovzTLeKJdtQ8caB0MQw2Z3DpaPiZKUp3UcrGODwpToPmKI_L5zp2ISPEGqsCNcEIDs/s320/2020-11-06+17_06_30-Edit+your+flow+_+Power+Automate.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9bhqlLdOlR9Nih7OBjpWSrsurqdoJyVl9A8Xg3MpTG9p9lKSJvNUMBShun6Feoum-XggX-rRLM27Pa8k9FY3UOM-u5QX87Nu8LFxSePbcHjKWhuzIxWvDeLVZPDCHUUMLbgFm_7ReetdA/s654/2020-11-06+17_08_17-Unread+Mail+-+vladimir.kaplin%2540abbyy.com+-+Outlook.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="379" data-original-width="654" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9bhqlLdOlR9Nih7OBjpWSrsurqdoJyVl9A8Xg3MpTG9p9lKSJvNUMBShun6Feoum-XggX-rRLM27Pa8k9FY3UOM-u5QX87Nu8LFxSePbcHjKWhuzIxWvDeLVZPDCHUUMLbgFm_7ReetdA/s320/2020-11-06+17_08_17-Unread+Mail+-+vladimir.kaplin%2540abbyy.com+-+Outlook.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZAGGsnSRlRX_6BgFOcERI4LuVyW7uqxMLiigOmr01elrT6RNVeqYNbOkEGQeG8PnVgOwAvkcxml6V8xqw7ZTbvwytyxmpo_oCl5xeXh3TdP6BHXhovE_LZVuUE1nKauZb5chDqugOWt8g/s872/2020-11-06+17_08_36-Edit+your+flow+_+Power+Automate.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="129" data-original-width="872" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZAGGsnSRlRX_6BgFOcERI4LuVyW7uqxMLiigOmr01elrT6RNVeqYNbOkEGQeG8PnVgOwAvkcxml6V8xqw7ZTbvwytyxmpo_oCl5xeXh3TdP6BHXhovE_LZVuUE1nKauZb5chDqugOWt8g/s320/2020-11-06+17_08_36-Edit+your+flow+_+Power+Automate.png" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><div><br /></div>Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-821473476057236912020-10-06T07:27:00.005-07:002020-10-09T06:04:08.161-07:00Получение всех рабочих процессов WorkFlow 2010 в tenant <p> Я упустил новость о том, что WorkFlow 2010 будут отключены и только недавно увидел сообщение</p><p><span face=""Segoe UI", Segoe, Tahoma, Helvetica, Arial, sans-serif" style="background-color: #fff19d; color: #333333; font-size: 13px;">Starting 11/1/2020 6:00:00 AM, SharePoint 2010 workflows will be retired and users will no longer have the ability to run or create 2010 Workflows. </span><br /><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-4GZIHSxTve4AgM4YUyGpvGRnRZJBdIqeHAXgs9Ttx4411c6nKuB2o8OeLH8z_s2KZioGricMzqBFCQBgmK6Y7yCTd3AcsZ9oW2d7b95ZvRjPpVKVEA_2HwfMFC0nxb5F6ZEnxRXjXwOR/s1241/2020-10-06+16_56_26-Workflows.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="160" data-original-width="1241" height="51" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-4GZIHSxTve4AgM4YUyGpvGRnRZJBdIqeHAXgs9Ttx4411c6nKuB2o8OeLH8z_s2KZioGricMzqBFCQBgmK6Y7yCTd3AcsZ9oW2d7b95ZvRjPpVKVEA_2HwfMFC0nxb5F6ZEnxRXjXwOR/w400-h51/2020-10-06+16_56_26-Workflows.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: left;"><a href="https://docs.microsoft.com/en-us/sharepoint/dev/transform/modernize-scanner" rel="nofollow" target="_blank">SharePoint Modernization Scanner</a> у меня так и не завелся.</div><div class="separator" style="clear: both; text-align: left;">возникала аналогичная ошибка <a href="https://github.com/pnp/sp-dev-modernization/issues/524">https://github.com/pnp/sp-dev-modernization/issues/524</a> </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">тогда решил сам найти все активные WorkFlow. Так же выводится информация количестве всех элементов списка, так же созданных и измененых с 1 августа.</div></div><div><br /></div><div><br /></div><div><span face="SegoeUI, Lato, Helvetica Neue, Helvetica, Arial, sans-serif" style="color: #333333;"><pre class="brush:ps">#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.WorkflowServices.dll"
$UserName = "adm@company.com"
$Cred= Get-Credential $UserName
$SiteUrl = "https://contoso.sharepoint.com" #tenant
$array = @()
function GetSubWebs($sWeb){
$Ctx.Load($sWeb)
$WorkflowServicesManager = New-Object Microsoft.SharePoint.Client.WorkflowServices.WorkflowServicesManager($Ctx, $sWeb)
$WorkflowSubscriptionService = $workflowServicesManager.GetWorkflowSubscriptionService()
$allLists = $sWeb.Lists
$Ctx.Load($allLists)
$Ctx.ExecuteQuery()
$webUrl = $sWeb.Url
foreach($list in $allLists){
$list.Title
$listTitle = $list.Title
$List = $sWeb.Lists.GetByTitle($listTitle)
$Ctx.Load($List)
$WFassociation = $List.WorkflowAssociations
$Ctx.Load($WFassociation)
$Ctx.ExecuteQuery()
$wfCount = 0
foreach($wf in $WFassociation){
if($wf.Enabled -eq $true){
$wfCount++
}
}
if($wfCount -gt 0){
$wfCount
$allItemCount = $List.ItemCount
$camlQuery = [Microsoft.SharePoint.Client.CamlQuery]::new();
$camlQuery.ViewXml = "<view><query><where><gt><fieldref name="Modified"><value includetimevalue="TRUE" type="DateTime">2020-07-31T14:48:24Z</value></fieldref></gt></where></query></view>"
$addItems = $List.GetItems($camlQuery)
$camlQuery = [Microsoft.SharePoint.Client.CamlQuery]::new();
$camlQuery.ViewXml = "<view><query><where><gt><fieldref name="Created"><value includetimevalue="TRUE" type="DateTime">2020-07-31T14:48:24Z</value></fieldref></gt></where></query></view>"
$modyItems = $List.GetItems($camlQuery)
$Ctx.Load($addItems )
$Ctx.Load($modyItems )
$Ctx.ExecuteQuery()
$modyItemsCount = $modyItems.Count
$addItemsCount = $addItems.Count
$object = New-Object PSObject
$object | Add-Member -Name 'Title' -MemberType Noteproperty -Value $listTitle
$object | Add-Member -Name 'All Items' -MemberType Noteproperty -Value $allItemCount
$object | Add-Member -Name 'Add Items' -MemberType Noteproperty -Value $addItemsCount
$object | Add-Member -Name 'Modified Items' -MemberType NoteProperty -Value $modyItemsCount
$object | Add-Member -Name 'WF Count' -MemberType NoteProperty -Value $wfCount
$object | Add-Member -Name 'URL' -MemberType NoteProperty -Value $webUrl
$Global:array += $object
}
}
$webs= $sWeb.Webs
$Ctx.Load($webs)
$Ctx.ExecuteQuery()
if($webs.Count -gt 0)
{
Write-Host $aWeb.Url " - " $aWeb.Webs.Count
foreach($aWeb in $webs)
{
$Ctx.Load($aWeb)
GetSubWebs $aWeb
}
}
}
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)
$Web = $Ctx.Web
$Ctx.Load($Web)
$webs= $Web.Webs
GetSubWebs($Web)
$array | Format-Table
$array | Export-Csv -NoTypeInformation -Path C:\Temp\lists.csv -encoding "utf8" -Delimiter ";"
</pre></span></div> <div>На выходе таблица и можно экспортировать в csv</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6c3YOGTEdHjx5Hbj9jEKVY9OUVzaxOjDTkRDjYFzpUDpgNpDKUHMjFhXsRagpEIjtqHdnbeCjlVFaYMDjYoDY46UMwMICs0p8Lr5dX_SZhyphenhyphen3Vk3GE85vBbSGei1riDDvk-7fvFMX6hptO/s1619/2020-10-06+17_15_13-Administrator_+Windows+PowerShell+ISE.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="645" data-original-width="1619" height="159" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6c3YOGTEdHjx5Hbj9jEKVY9OUVzaxOjDTkRDjYFzpUDpgNpDKUHMjFhXsRagpEIjtqHdnbeCjlVFaYMDjYoDY46UMwMICs0p8Lr5dX_SZhyphenhyphen3Vk3GE85vBbSGei1riDDvk-7fvFMX6hptO/w400-h159/2020-10-06+17_15_13-Administrator_+Windows+PowerShell+ISE.png" width="400" /></a></div><br /><div><br /></div>Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-9592627131520149482020-08-11T08:50:00.004-07:002020-08-12T23:23:13.497-07:00Shared folder для внешних сотрудников с помощью WorkFlow (SharePoin Online)<p> </p><p class="MsoNormal">Не так давно появилась задача бизнеса шарить файлы с
партнерами и что бы всем партнерам приходили оповещения о изменении файла.<o:p></o:p></p>
<p class="MsoNormal">Мы взвесили все за и против и решили, что делится файлами
будет удобнее чем заводить внешних пользователей себе, тратить на них лицензию.
Да и первый вход внешнего сотрдника через создание новой записи <span lang="" style="mso-ansi-language: EN-US;">MS</span>, подтверждение не так
удобен пользователям. <o:p></o:p></p>
<p class="MsoNormal">Если достум через <span lang="" style="mso-ansi-language: EN-US;">Share</span><span lang=""> </span><span lang="" style="mso-ansi-language: EN-US;">link</span><span lang=""> </span>не сложный как для бизнеса так и для
внешнего сотрудника, то оповещение внешних пользователей о том, что изменился
файл в расшариной папке задача оказалась не совсем простая.<o:p></o:p></p><span><a name='more'></a></span><p class="MsoNormal"><br /></p>
<p class="MsoNormal">Оснойвой решения была статья <a href="https://cann0nf0dder.wordpress.com/2018/04/04/externally-sharing-getsharinginformation-rest-api/">https://cann0nf0dder.wordpress.com/2018/04/04/externally-sharing-getsharinginformation-rest-api/</a>.
Я настроил процес который брал все внешние <span lang="" style="mso-ansi-language: EN-US;">email</span><span lang=""> </span>начиная от самого файла и
заканчивая верхней папкой. Проект запустили, но у бизнеса возникла потребность
шарить с новыми партнерами. И вся сложность в том, что уже стало сложно
отслеживать с кем уже расшарили папку, а с кем нет, ведь внешних пользователей
100+.<br />
Как решение было создать новый <span lang="" style="mso-ansi-language: EN-US;">List</span>
(<span lang="" style="mso-ansi-language: EN-US;">ExternalEmails</span>) и в
нем настроить <span lang="" style="mso-ansi-language: EN-US;">WorkFlow</span><span lang=""> </span>которое будет отправлять приглашения при добавлении новой
почты.<o:p></o:p></p>
<p class="MsoNormal">Посмотрев <span lang="" style="mso-ansi-language: EN-US;">Network</span><span lang=""> </span>я увидел запрос</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8SzmSGDxS-xYdLKyn6riVZ4RxxJr43kSp2T_GsxlXEp1OYx05hyphenhypheny90zSS3rmhky_YdkHXZTAhLErgi7WvrHbL6VjVQ-lvN1TRwUq4WX5YLVzTT0zADgEYUbma_o6fc1xXT8k0FUNl64tO/s1765/2020-08-11+17_08_54-Demo+%2528public%2529+-+ExternalUserNotification+-+All+Documents.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="527" data-original-width="1765" height="119" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8SzmSGDxS-xYdLKyn6riVZ4RxxJr43kSp2T_GsxlXEp1OYx05hyphenhypheny90zSS3rmhky_YdkHXZTAhLErgi7WvrHbL6VjVQ-lvN1TRwUq4WX5YLVzTT0zADgEYUbma_o6fc1xXT8k0FUNl64tO/w400-h119/2020-08-11+17_08_54-Demo+%2528public%2529+-+ExternalUserNotification+-+All+Documents.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy22sm6_M4l25JwRUqnZn_yHvb1hdsu8u7b6lkGhj8J_TUbCOWZsP44aMg9am05_94U5tkErzGNjB5mSyEWz41F4mJBhrKgarD4T5HT0HhXP4B44Ev97lSsZIujkP_rdFYj3OV5Jzhv_pN/s874/2020-08-11+17_15_27-Demo+%2528public%2529+-+ExternalUserNotification+-+All+Documents.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="464" data-original-width="874" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy22sm6_M4l25JwRUqnZn_yHvb1hdsu8u7b6lkGhj8J_TUbCOWZsP44aMg9am05_94U5tkErzGNjB5mSyEWz41F4mJBhrKgarD4T5HT0HhXP4B44Ev97lSsZIujkP_rdFYj3OV5Jzhv_pN/w400-h213/2020-08-11+17_15_27-Demo+%2528public%2529+-+ExternalUserNotification+-+All+Documents.png" width="400" /></a></div><p class="MsoNormal"><br />
/_api/web/Lists(@a1)/GetItemById(@a2)/ShareLink?@a1=%27 <span lang="" style="mso-ansi-language: EN-US;">ListGuid</span><span lang=""> <span style="mso-spacerun: yes;"> </span></span>%27&@a2=%27 <span lang="" style="mso-ansi-language: EN-US;">Item</span><span lang=""> </span><span lang="" style="mso-ansi-language: EN-US;">Id</span><span lang=""> </span>%27<o:p></o:p></p>
<p class="MsoNormal"><span lang="" style="mso-ansi-language: EN-US;">Json <br /><br /></span></p><p class="MsoNormal"><span lang="" style="mso-ansi-language: EN-US;">
</span></p>
<pre class="brush:js"> {"request":
{
"createLink":true,
"settings":{
"linkKind":6,
"expiration":null,
"role":2,
"restrictShareMembership":true,
"updatePassword":false,
"password":""
},
"peoplePickerInput":"[{
"Key":"externalEmail@mail.ru",
"DisplayText":"externalEmail@mail.ru",
"IsResolved":true,
"Description":"externalEmail@mail.ru",
"EntityType":"",
"EntityData":{
"SPUserID":"externalEmail@mail.ru",
"Email":"externalEmail@mail.ru",
"IsBlocked":"False",
"PrincipalType":"UNVALIDATED_EMAIL_ADDRESS",
"AccountName":"externalEmail@mail.ru",
"SIPAddress":"externalEmail@mail.ru",
"IsBlockedOnODB":"False"
},
"MultipleMatches":[],
"ProviderName":"",
"ProviderDisplayName":""
}]",
"emailData":{
"body":"",
"subject":""
}
}
}
</pre><span lang="" style="mso-ansi-language: EN-US;">
</span><p></p>
<p class="MsoNormal">В процессе сложнее всего создать вложенность объектов <span lang="" style="mso-ansi-language: EN-US;">JSON</span>.<o:p></o:p></p><p class="MsoNormal">Весь процесс выглядит так<br /><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqgmtiJnysQafwslwy6UrLzgfnU7v2FKIM2GHiG3k45Ix3Gu2StkMp8izafQ0fEDlInKEPW7x7nS4bsHMB_gxKx1IdLFHYTcHBEaouDOTqKwENOXdE_CuvinlLpe_rXGDt37AO2Mj9WPZb/s1148/2020-08-11+17_35_27-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="506" data-original-width="1148" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqgmtiJnysQafwslwy6UrLzgfnU7v2FKIM2GHiG3k45Ix3Gu2StkMp8izafQ0fEDlInKEPW7x7nS4bsHMB_gxKx1IdLFHYTcHBEaouDOTqKwENOXdE_CuvinlLpe_rXGDt37AO2Mj9WPZb/w400-h176/2020-08-11+17_35_27-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><p class="MsoNormal">переменная url</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkRdftWy9mJW3RW6sxKD_LSvjTTGVDADjcKg7QpZpk080EnFibPbqS-cpHzieB-2PejoE1Q19-KvNlNeFV7W5-ePY5Y0hy6pLW68o6MjEQK3rxIPjVAPHMJicDGI-4LjB-WZBwaFneGkkp/s948/2020-08-11+17_37_15-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="171" data-original-width="948" height="72" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkRdftWy9mJW3RW6sxKD_LSvjTTGVDADjcKg7QpZpk080EnFibPbqS-cpHzieB-2PejoE1Q19-KvNlNeFV7W5-ePY5Y0hy6pLW68o6MjEQK3rxIPjVAPHMJicDGI-4LjB-WZBwaFneGkkp/w400-h72/2020-08-11+17_37_15-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><p class="MsoNormal">далее переменная EntityData</p><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRMOWuw8TpRrvZl_h04TJSt_Il-MKJXMxyLcN4lKwJv1goZd2FBlaoBBrWiep8qOuoIV_74lEhK7spsQGYlz8anMQtgfU2eZl7yta5XcyPsKFO126Fh6YxFrD0SLPLJSsZc4Ycnhwhu9nQ/s793/2020-08-11+17_38_17-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="338" data-original-width="793" height="171" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRMOWuw8TpRrvZl_h04TJSt_Il-MKJXMxyLcN4lKwJv1goZd2FBlaoBBrWiep8qOuoIV_74lEhK7spsQGYlz8anMQtgfU2eZl7yta5XcyPsKFO126Fh6YxFrD0SLPLJSsZc4Ycnhwhu9nQ/w400-h171/2020-08-11+17_38_17-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiYUt8uy_AnlbcPcNUEaL74x3SR6L2yhT9jnufRsaVsmwD3u2ktkb1FIBlu6SNlDgRmDt-_LISLV1MZeD72kz4l0Bd_EklsDEPU_scE65Bs2QntkJkf6DP4L5QuN_ofTrshwf0UnGQZigO/s445/2020-08-11+17_39_02-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="445" data-original-width="442" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiYUt8uy_AnlbcPcNUEaL74x3SR6L2yhT9jnufRsaVsmwD3u2ktkb1FIBlu6SNlDgRmDt-_LISLV1MZeD72kz4l0Bd_EklsDEPU_scE65Bs2QntkJkf6DP4L5QuN_ofTrshwf0UnGQZigO/s0/2020-08-11+17_39_02-https___abbyyihq.sharepoint.com_Demo.png" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-zinupYxnLNClfJw5n8k4qrG9o8Huxp1tTGFGEd3bz8NXu9laP9cd5W0NDeKFyEpNTWiMgVgfGqHFntusMND6D-axzycNDh8ZCoXebkeC0rsW_RzUXFGwpm0fsfgpfZ3BkaSDCNtbNi1F/s460/2020-08-11+17_39_14-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="460" data-original-width="419" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-zinupYxnLNClfJw5n8k4qrG9o8Huxp1tTGFGEd3bz8NXu9laP9cd5W0NDeKFyEpNTWiMgVgfGqHFntusMND6D-axzycNDh8ZCoXebkeC0rsW_RzUXFGwpm0fsfgpfZ3BkaSDCNtbNi1F/s0/2020-08-11+17_39_14-https___abbyyihq.sharepoint.com_Demo.png" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbmhiQPcOIXoHECUbNCucH09kvXaRX8XE8CRG-WbN9WIfZwqGItwEc_-UHZ140Cip6Ts_VCqGVqRaprdMnlNTAAKZsk-Mq9mTW-guJGvoWAbNWeZ5c-SLs5l7ZOA22M1mCiRmQaxTKhub0/s469/2020-08-11+17_39_42-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="469" data-original-width="423" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbmhiQPcOIXoHECUbNCucH09kvXaRX8XE8CRG-WbN9WIfZwqGItwEc_-UHZ140Cip6Ts_VCqGVqRaprdMnlNTAAKZsk-Mq9mTW-guJGvoWAbNWeZ5c-SLs5l7ZOA22M1mCiRmQaxTKhub0/s0/2020-08-11+17_39_42-https___abbyyihq.sharepoint.com_Demo.png" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii96UsPKCfagDRB9YetmnrqTqEf5nLvAXga66HiacE9WzHPsgYIGLw-jx9TEJSLsvX9lk4Vk0JGm85k7F_7Ipwamay1saWijIZ9fD7P-VFsOIxxDsfySFU4gPPVhyphenhyphenQn7jF8l0rUplnT1NF/s471/2020-08-11+17_39_53-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="471" data-original-width="389" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii96UsPKCfagDRB9YetmnrqTqEf5nLvAXga66HiacE9WzHPsgYIGLw-jx9TEJSLsvX9lk4Vk0JGm85k7F_7Ipwamay1saWijIZ9fD7P-VFsOIxxDsfySFU4gPPVhyphenhyphenQn7jF8l0rUplnT1NF/s0/2020-08-11+17_39_53-https___abbyyihq.sharepoint.com_Demo.png" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqHR1bbJhFEmz1W9Zt_Gu7uwK2QFXWK4RAgXZf3Y1odPFXyEXaS5B72tycBlZ75NQUglTORga0EE_oHVNAdt9Qm1x8SXDVvTlFCQDjR0A8mPxS0UnHibwEN9frm4j_y0upPDAcJCrOAFZr/s448/2020-08-11+17_40_13-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="448" data-original-width="390" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqHR1bbJhFEmz1W9Zt_Gu7uwK2QFXWK4RAgXZf3Y1odPFXyEXaS5B72tycBlZ75NQUglTORga0EE_oHVNAdt9Qm1x8SXDVvTlFCQDjR0A8mPxS0UnHibwEN9frm4j_y0upPDAcJCrOAFZr/s0/2020-08-11+17_40_13-https___abbyyihq.sharepoint.com_Demo.png" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5skGUH3bLd5_iYnQelJUsZyZYPysdtDtHJDlryw5S7tuzwFtG-TaxlI7B_nIG4XzYpD5mnj5fbYN89ZeDdflpuj26dTAlLIqA5YOdtwyouYoM9jqd_FrWvVdtMvviYhMyokfatbsijHao/s468/2020-08-11+17_40_27-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="468" data-original-width="404" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5skGUH3bLd5_iYnQelJUsZyZYPysdtDtHJDlryw5S7tuzwFtG-TaxlI7B_nIG4XzYpD5mnj5fbYN89ZeDdflpuj26dTAlLIqA5YOdtwyouYoM9jqd_FrWvVdtMvviYhMyokfatbsijHao/s0/2020-08-11+17_40_27-https___abbyyihq.sharepoint.com_Demo.png" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><div class="separator" style="clear: both; text-align: left;">переменная emailData</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWtCEzf0VodGIzbMIhoX_m5nE2M3rTcev5qRP-3yn2VZtYGuhDBicJBkK0ghpXa5xb5Oqy7CX5vhuItOym0sMnRi8QLWTs__4OWIuLDNceOTcLNWbCdI1ISCrV2k-TEsWOwNmTfO5qleHG/s786/2020-08-11+18_13_05-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="286" data-original-width="786" height="146" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWtCEzf0VodGIzbMIhoX_m5nE2M3rTcev5qRP-3yn2VZtYGuhDBicJBkK0ghpXa5xb5Oqy7CX5vhuItOym0sMnRi8QLWTs__4OWIuLDNceOTcLNWbCdI1ISCrV2k-TEsWOwNmTfO5qleHG/w400-h146/2020-08-11+18_13_05-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><br /><div class="separator" style="clear: both; text-align: left;">переменная peoplePickerInput</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKUWGxJho-ua8HXpb1U0hKRYpJZq0S7Y7lvuQrxRO_ea6HlqWJbga7TPe0Eu5tXNT4layWfPC1LwjMjBgiTgc0CjHHPgOfSgYIkK-XJjV8tbph7z0OvWhTixwoctccZNCme5fs8cVbg9DW/s712/2020-08-11+18_24_01-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="355" data-original-width="712" height="199" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKUWGxJho-ua8HXpb1U0hKRYpJZq0S7Y7lvuQrxRO_ea6HlqWJbga7TPe0Eu5tXNT4layWfPC1LwjMjBgiTgc0CjHHPgOfSgYIkK-XJjV8tbph7z0OvWhTixwoctccZNCme5fs8cVbg9DW/w400-h199/2020-08-11+18_24_01-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKPD0UTYdbI9RWCIavKJmsB_lvpccRrb8zdKlQ1pwKPtUQKEdoyZExLa7TBADh2Z8fHs6CZMF_y_-_TMSpPOpiVYYnHJr0IYKd16SV8KekWakgybBPR2I5OWYTfNtARe9DVC8MXmG060C2/s707/2020-08-11+18_24_33-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="327" data-original-width="707" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKPD0UTYdbI9RWCIavKJmsB_lvpccRrb8zdKlQ1pwKPtUQKEdoyZExLa7TBADh2Z8fHs6CZMF_y_-_TMSpPOpiVYYnHJr0IYKd16SV8KekWakgybBPR2I5OWYTfNtARe9DVC8MXmG060C2/w400-h185/2020-08-11+18_24_33-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp553S344xUgiwhWr5tpjgWQjAROpAC0FaX_ZGrb2OFGECABIfH9l1Ao5WbosQfjXA4EwHS2I7avmUKDDlykmbXKnV-3F6Bp2z4RyDdUy3mx7H1fqIa7bVQdlRqdW7dqUwUzNcDJ-38UMM/s701/2020-08-11+18_24_51-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="376" data-original-width="701" height="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp553S344xUgiwhWr5tpjgWQjAROpAC0FaX_ZGrb2OFGECABIfH9l1Ao5WbosQfjXA4EwHS2I7avmUKDDlykmbXKnV-3F6Bp2z4RyDdUy3mx7H1fqIa7bVQdlRqdW7dqUwUzNcDJ-38UMM/w400-h214/2020-08-11+18_24_51-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMfl_kSyLFoqMcud0F79mtwtjiJn3MabYTUyMuKfCNNQHejDbVeNuGIJ3GppSMTr2g6JxHA502qB-hAtWVwq8BTrU-1hTdg6u2SgfXQuXUN897pSkGfoYBAWWA2EJQVRnOe5-TSvEl6D4R/s715/2020-08-11+18_25_15-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="304" data-original-width="715" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMfl_kSyLFoqMcud0F79mtwtjiJn3MabYTUyMuKfCNNQHejDbVeNuGIJ3GppSMTr2g6JxHA502qB-hAtWVwq8BTrU-1hTdg6u2SgfXQuXUN897pSkGfoYBAWWA2EJQVRnOe5-TSvEl6D4R/w400-h170/2020-08-11+18_25_15-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSVAgmq7A32TF_kRXo7uU7hqMlM1JokXt6KgCYPb0nqXpS7ZZZbKssYW9K0RPSFI3thvY_PiIGtP5VC3p530izFWGdj6KSqz0PUpjtf2EqLgZ51HKL7OK61w0chD9T86HIQ_9O18kQel8Z/s723/2020-08-11+18_25_47-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="349" data-original-width="723" height="193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSVAgmq7A32TF_kRXo7uU7hqMlM1JokXt6KgCYPb0nqXpS7ZZZbKssYW9K0RPSFI3thvY_PiIGtP5VC3p530izFWGdj6KSqz0PUpjtf2EqLgZ51HKL7OK61w0chD9T86HIQ_9O18kQel8Z/w400-h193/2020-08-11+18_25_47-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div>переменная settingsJSON<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4BpbVSOmBmLQ1-kUeT4FlmXNVv2qTfUhhTXk6LylhOL7XSLIbKgIhyVGW60ySIBtKcUd9q3qlcuh3o_X6sulGQB_JRMRMfq-TIDa960oURK5oJXRcugh8hHIp_G-_k1b0-1GlL4WEXoUs/s730/2020-08-11+18_28_06-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="325" data-original-width="730" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4BpbVSOmBmLQ1-kUeT4FlmXNVv2qTfUhhTXk6LylhOL7XSLIbKgIhyVGW60ySIBtKcUd9q3qlcuh3o_X6sulGQB_JRMRMfq-TIDa960oURK5oJXRcugh8hHIp_G-_k1b0-1GlL4WEXoUs/w400-h178/2020-08-11+18_28_06-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg04wCWInUO3UVcqG6YqhF1h8FFLWCBucAdnA5WvsEf4m2K6EOf_zk3iD88kHNFJ6kc-fXQd-_Cj3HrNWfcfYTjHgjqoeel-LUmXhK2ZQMmGLacdVkcuXmzF5KisG1zMSVRC0pSLPzzjPKL/s687/2020-08-11+18_28_33-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="315" data-original-width="687" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg04wCWInUO3UVcqG6YqhF1h8FFLWCBucAdnA5WvsEf4m2K6EOf_zk3iD88kHNFJ6kc-fXQd-_Cj3HrNWfcfYTjHgjqoeel-LUmXhK2ZQMmGLacdVkcuXmzF5KisG1zMSVRC0pSLPzzjPKL/w400-h183/2020-08-11+18_28_33-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv18Rwa0CztW3g0onv5ujV84-hC67vl5SS6StlnZor_B_eiI3zLj_3CLSm-jUUGpK7cZStMa_DD_woxy8oH6KOQ9KndpRcI-0sYhmWF21nyXeGEOCNQKUTnSgQqVALX-XG83kUBm5ptqoQ/s734/2020-08-11+18_28_49-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="340" data-original-width="734" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv18Rwa0CztW3g0onv5ujV84-hC67vl5SS6StlnZor_B_eiI3zLj_3CLSm-jUUGpK7cZStMa_DD_woxy8oH6KOQ9KndpRcI-0sYhmWF21nyXeGEOCNQKUTnSgQqVALX-XG83kUBm5ptqoQ/w400-h185/2020-08-11+18_28_49-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXDINmUpxOZeJ8XrC30AImjzCLAUhK8qVwO1QY7SoDl8mHuZw4py4gUGi54R-mwMcDNEfqJUCgs-NXaF3OdDO7EML45xyB8QOm1sx53uPGxLW4AriwR8Po8RgZ9MnwwwRmHSMCDygOAK0g/s772/2020-08-11+18_29_04-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="355" data-original-width="772" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXDINmUpxOZeJ8XrC30AImjzCLAUhK8qVwO1QY7SoDl8mHuZw4py4gUGi54R-mwMcDNEfqJUCgs-NXaF3OdDO7EML45xyB8QOm1sx53uPGxLW4AriwR8Po8RgZ9MnwwwRmHSMCDygOAK0g/w400-h184/2020-08-11+18_29_04-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div>переменная requestData</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjILmhUztRWW3PPjPT4NcgLWOOYrlLKIJzPui-5oKQFchKiEPsVXm0s16bferypxlmfyxvYZdd2Ibi-uCSY_Kc0dtnOrv1NvuxxwwVvf2Jgx_N9lfq6eFXIufcefgsfNQjf8466tqiid4T_/s1049/2020-08-11+18_31_15-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="358" data-original-width="1049" height="136" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjILmhUztRWW3PPjPT4NcgLWOOYrlLKIJzPui-5oKQFchKiEPsVXm0s16bferypxlmfyxvYZdd2Ibi-uCSY_Kc0dtnOrv1NvuxxwwVvf2Jgx_N9lfq6eFXIufcefgsfNQjf8466tqiid4T_/w400-h136/2020-08-11+18_31_15-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPDYEdbOvvUJj32Q2Nw-Rbe1WQIDPj3vexHE_REFtgEWvd7VRk3-Ju_2eelRdXetY_ricv4Q66L-AVKU-9Pll-LaA-OpFwE1rNZK8QPTaKtRJKodxCeNHzXZkvD4vqG0G9E2PgLRdliG9P/s772/2020-08-11+18_29_04-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="355" data-original-width="772" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPDYEdbOvvUJj32Q2Nw-Rbe1WQIDPj3vexHE_REFtgEWvd7VRk3-Ju_2eelRdXetY_ricv4Q66L-AVKU-9Pll-LaA-OpFwE1rNZK8QPTaKtRJKodxCeNHzXZkvD4vqG0G9E2PgLRdliG9P/w400-h184/2020-08-11+18_29_04-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1mD4nPeIUfVoISOmT7rzDnngQzkUmDqtomQpTbMzHwc7sg-dnwWSNGgd5j-Cpj1YKYiQOgDCMHAUorq_3GNTUqdno7HpK5YR6-i5Eu3N33BB34zUZJWKUGYF_GZ-VtvtmO4uutsMlGp3M/s778/2020-08-11+18_31_52-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="475" data-original-width="778" height="244" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1mD4nPeIUfVoISOmT7rzDnngQzkUmDqtomQpTbMzHwc7sg-dnwWSNGgd5j-Cpj1YKYiQOgDCMHAUorq_3GNTUqdno7HpK5YR6-i5Eu3N33BB34zUZJWKUGYF_GZ-VtvtmO4uutsMlGp3M/w400-h244/2020-08-11+18_31_52-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYJNC7dGjjnbsG5s87KvR4bm-MMdZZ1KlbKuAHwTojo7Rdof5VsSQhK4wIZZ-c3dP9ach0nXwtYnzx9nb8YrZWvS-olhbIoYx3IiY6QWlcb8HuvRoG5B-l1TM1l1l1fmfBgKVhtUWSgnAn/s782/2020-08-11+18_32_29-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="372" data-original-width="782" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYJNC7dGjjnbsG5s87KvR4bm-MMdZZ1KlbKuAHwTojo7Rdof5VsSQhK4wIZZ-c3dP9ach0nXwtYnzx9nb8YrZWvS-olhbIoYx3IiY6QWlcb8HuvRoG5B-l1TM1l1l1fmfBgKVhtUWSgnAn/w400-h190/2020-08-11+18_32_29-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYsU2Ahx-JCUkiM81c0aoVp4nLdU2gow9u8uJRJ-DaJEvKpOcNutfX026ZpZnGTBV9pza8QZjgghfUedwb9qR7mjn6VriRkUaqhVWLoKljLqJid21VSFwUDnysqr6TAccWRpYNlB3V3o02/s733/2020-08-11+18_32_59-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="370" data-original-width="733" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYsU2Ahx-JCUkiM81c0aoVp4nLdU2gow9u8uJRJ-DaJEvKpOcNutfX026ZpZnGTBV9pza8QZjgghfUedwb9qR7mjn6VriRkUaqhVWLoKljLqJid21VSFwUDnysqr6TAccWRpYNlB3V3o02/w400-h202/2020-08-11+18_32_59-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;">переменная request</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWU5cIlq9RhgK3kwJz6p5d3mUza5XCxHqwMINNI64vbpKA-ZZhd2CXaTLEzZfeV0HVzGGsDuMtjhziO0dl-i-Q75dTSdcUrsXertwmYKXQUDTHt5ZjYxdFhJxkD94hLq0WzkgRgLt9_C4p/s773/2020-08-11+18_54_09-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="527" data-original-width="773" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWU5cIlq9RhgK3kwJz6p5d3mUza5XCxHqwMINNI64vbpKA-ZZhd2CXaTLEzZfeV0HVzGGsDuMtjhziO0dl-i-Q75dTSdcUrsXertwmYKXQUDTHt5ZjYxdFhJxkD94hLq0WzkgRgLt9_C4p/w400-h272/2020-08-11+18_54_09-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;">выполняем запрос post</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd5qGfdwwiJk9FcFcZvtKDAxMSUqdUi4CvQyGUQvhovjz37TJo_RE0Y1TGHFux5G8NtOQk8Sg6G2mEfkv7cg9aUOUY-74r1C6f1P6pX9c4cBRwG7JKfLo7g2R9tJWupc1oLHmAgpMxdYUm/s1025/2020-08-11+18_59_06-https___abbyyihq.sharepoint.com_Demo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="431" data-original-width="1025" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd5qGfdwwiJk9FcFcZvtKDAxMSUqdUi4CvQyGUQvhovjz37TJo_RE0Y1TGHFux5G8NtOQk8Sg6G2mEfkv7cg9aUOUY-74r1C6f1P6pX9c4cBRwG7JKfLo7g2R9tJWupc1oLHmAgpMxdYUm/w400-h168/2020-08-11+18_59_06-https___abbyyihq.sharepoint.com_Demo.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><p class="MsoNormal">Теперь пользователи могут выгрузить в Excel все email с которыми поделились папкой и так же им проще стало понимать с какими партнерами еще не поделились папкой.</p>
<p class="MsoNormal"><o:p> </o:p></p></div>Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-86666285372038870472020-04-20T08:33:00.000-07:002020-04-20T08:38:18.539-07:00Решение проблем с Multiple lines of text с параметрами Plain text и Append Changes to Existing Text <div dir="ltr" style="text-align: left;" trbidi="on">
В одном из списков в поле Многострочный текст используются настройки<br />
"Обычный текст" и "Вносить изменения в существующий текст"<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4FztIunBCDsoGjrsCSdVwhiwZid1q4Ev6eG5id8LYuYUlUJo1Q58OC1lwcK4xTnMD_8gu69CsEET1OYp290ulzHZLEBm3I5I4OTdMHk9lEggYrL_hweiUVhCSbMFSkvMr7Gjj9uxd9Zzy/s1600/2020-04-20+18_25_04-Change+Column.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="766" data-original-width="807" height="303" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4FztIunBCDsoGjrsCSdVwhiwZid1q4Ev6eG5id8LYuYUlUJo1Q58OC1lwcK4xTnMD_8gu69CsEET1OYp290ulzHZLEBm3I5I4OTdMHk9lEggYrL_hweiUVhCSbMFSkvMr7Gjj9uxd9Zzy/s320/2020-04-20+18_25_04-Change+Column.png" width="320" /></a></div>
<br />
как результат - на форме редактирования история не читается.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoHybI3PyosjKW4PU-MFLY-hR9_xUdY_V5d27Jdr4qp3pIPwxvGIoS_Lp-5H2hRO2UJrAW7Wv2IpI-lUEKnSUkipWHguxYQHYPq0wwTPKEDYhx1iE0VnQVZT8WB2lxSbPRAxK-ESYTsG24/s1600/2020-04-20+18_20_29-Graphic+Design+Ticket+System+-+11696+Visual+needed+for+end+user+mailing.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="259" data-original-width="949" height="87" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoHybI3PyosjKW4PU-MFLY-hR9_xUdY_V5d27Jdr4qp3pIPwxvGIoS_Lp-5H2hRO2UJrAW7Wv2IpI-lUEKnSUkipWHguxYQHYPq0wwTPKEDYhx1iE0VnQVZT8WB2lxSbPRAxK-ESYTsG24/s320/2020-04-20+18_20_29-Graphic+Design+Ticket+System+-+11696+Visual+needed+for+end+user+mailing.png" width="320" /></a></div>
<a name='more'></a>для решения этой задачи написал небольшой скрипт<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhokcpdP2rrJBDqt67OeoSF3nPkPpiBtdDMo3UCSPX5lZ-SUgPs7JBv5PlXZBfdhJA8OgVmhVTY7zry_RYt2eZvNqOWayWO3E69DVNx4MsYG8xS7_bCRtgpBHAippwnaR21u3b6kugXNQ4q/s1600/2020-04-20+18_37_12-editForm.js+-+vanila+-+Visual+Studio+Code.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="289" data-original-width="1249" height="74" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhokcpdP2rrJBDqt67OeoSF3nPkPpiBtdDMo3UCSPX5lZ-SUgPs7JBv5PlXZBfdhJA8OgVmhVTY7zry_RYt2eZvNqOWayWO3E69DVNx4MsYG8xS7_bCRtgpBHAippwnaR21u3b6kugXNQ4q/s320/2020-04-20+18_37_12-editForm.js+-+vanila+-+Visual+Studio+Code.png" width="320" /></a></div>
<br />
<pre class="brush:js">jQuery("textarea").each(function(i,e){
var jEl =jQuery(e);
var div = jEl.closest("span").nextAll("div");
if(div ){
var jDiv = jQuery(div);
var htmlContent = jDiv.html();
if(htmlContent){
jDiv.html( (htmlContent.toString()).replace(/ /g,"").replace(/\n/g,"") );
}
}
})
</pre>
теперь вот такой результат<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjC6epxwJIHAik6b_106x99V07wZPGzs-xCwfk_etWH-0hcVHLGVvhL7r3rGcvNDWXGeXYIOpTiu3WQ1-Hq395js9E3phPu1Yt9ou7FaE5ZNitognbUuE9AXPGZY5Q4VX3Fjap2K62vBkCa/s1600/2020-04-20+18_21_27-Graphic+Design+Ticket+System+-+11696+Visual+needed+for+end+user+mailing.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="502" data-original-width="1079" height="148" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjC6epxwJIHAik6b_106x99V07wZPGzs-xCwfk_etWH-0hcVHLGVvhL7r3rGcvNDWXGeXYIOpTiu3WQ1-Hq395js9E3phPu1Yt9ou7FaE5ZNitognbUuE9AXPGZY5Q4VX3Fjap2K62vBkCa/s320/2020-04-20+18_21_27-Graphic+Design+Ticket+System+-+11696+Visual+needed+for+end+user+mailing.png" width="320" /></a></div>
<br />
<br /></div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-45502396932724602702020-03-23T04:31:00.000-07:002020-03-23T23:57:01.924-07:00Вывести ID элемента на форму редактирования/просмотра<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="MsoNormal">
Появилась задача вывести <span lang="EN-US" style="mso-ansi-language: EN-US;">ID</span><span lang="EN-US"> </span>элемента на форму и эту задачу можно
решить несколькими способами.<br />
1. Добавить вычисляемое поле, которое будет брать данные из поля <span lang="EN-US" style="mso-ansi-language: EN-US;">ID</span>. <br />
Минус – на форме редактирования не отображается.<o:p></o:p></div>
<div class="MsoNormal">
2. Создать поле и писать в него или с помощью РП или <span lang="EN-US" style="mso-ansi-language: EN-US;">JS</span>. <o:p></o:p></div>
<div class="MsoNormal">
Можно сделать другим способом. Прибегнув к <span lang="EN-US" style="mso-ansi-language: EN-US;">jQuery</span><span lang="EN-US"> </span>и написав
немного кода.<span lang="EN-US" style="mso-ansi-language: EN-US;"><o:p></o:p></span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgquUrNNP4cDn01woASRSEZItlQtxvJIGERN50Z7eA42WizSXuwtAMuCs46tcOqlyhW6bi7_MSyMMv7eOKE0VFloYspdUqU4eVk5QUVgxoTybjMD93kaS_WMCwFXN7mvQdrlq20bYUqvWII/s1600/2020-03-23+14_35_32-editForm.js+-+vanila+-+Visual+Studio+Code.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="185" data-original-width="1309" height="45" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgquUrNNP4cDn01woASRSEZItlQtxvJIGERN50Z7eA42WizSXuwtAMuCs46tcOqlyhW6bi7_MSyMMv7eOKE0VFloYspdUqU4eVk5QUVgxoTybjMD93kaS_WMCwFXN7mvQdrlq20bYUqvWII/s320/2020-03-23+14_35_32-editForm.js+-+vanila+-+Visual+Studio+Code.png" width="320" /></a></div>
<br />
<br />
<a href="https://drive.google.com/file/d/1v2DhPsM8_FBSrpCOskNs-HQkjTwLm9Tx/view?usp=sharing" target="_blank">ссылка на код</a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn7i9YUKX1duEmCtZ9y08UYwRy39hxp0H7p8LdqWyADH7_CUteHz1ksPBgm3YFWXH16X-2bhpkBt3sI0G4jHrZP8Kz5zJR34PPPZVKRCSTV8j2xpJLjHL6cNhYUhYCzGCho-xiJHdRq-bo/s1600/2020-03-24+09_55_28-OSS+Registry+-+ePubReader.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="500" data-original-width="1246" height="128" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn7i9YUKX1duEmCtZ9y08UYwRy39hxp0H7p8LdqWyADH7_CUteHz1ksPBgm3YFWXH16X-2bhpkBt3sI0G4jHrZP8Kz5zJR34PPPZVKRCSTV8j2xpJLjHL6cNhYUhYCzGCho-xiJHdRq-bo/s320/2020-03-24+09_55_28-OSS+Registry+-+ePubReader.png" width="320" /></a></div>
<br /></div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-68485725849941171802020-02-18T04:15:00.001-08:002020-02-18T04:15:52.072-08:00Создание сайта PWA в новой базе. (PowerShell)<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="MsoNormal">
В данной статье я поделюсь скриптом который:<br />
1. Создает управляемый путь<o:p></o:p></div>
<div class="MsoNormal">
2. Создает базу данных <o:p></o:p></div>
<div class="MsoNormal">
3. Создает новый сайт <span lang="EN-US">PWA</span></div>
<div class="MsoNormal">
4. Переводит в режим разрешений Project Server.</div>
<a name='more'></a><br />
<br />
<br />
<pre class="brush:ps">cls
if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) {
Add-PSSnapin Microsoft.SharePoint.PowerShell;
}
$siteName = "Site Name" #название сайта
$webApp = "https://portal.ru" # веб приложение
$path = "PWA_STK" # путь
$siteUrl = "https://portal.ru/" + $path
$template = "pwa#0"
$owner = "domain\user" # владелец сайта
$databaseName = "SP_Content_" +$path
$databaseServer = "SP-SQL"
write-host "создание базы" -ForegroundColor Yellow
New-SPContentDatabase -Name $databaseName -DatabaseServer $databaseServer -WebApplication $webApp
write-host "База " $databaseName " создана" -ForegroundColor Yellow
New-SPManagedPath $path -WebApplication $webApp -Explicit
write-host "Путь добавлен" -ForegroundColor Yellow
New-SPSite -Url $siteUrl -OwnerAlias $owner -ContentDatabase $databaseName -Template $template -Name $siteName -Language 1049
Write-Host "сайт создан, активация фичи" -ForegroundColor Yellow
Enable-SPFeature pwasite -URL $siteUrl
Write-Host "готово!" -ForegroundColor Yellow
#Get-SPContentDatabase fb1b5379-81cc-42fd-9182-1139800975fa | Remove-SPContentDatabase
#
Set-SPPRojectPermissionMode -Url $siteUrl -Mode ProjectServer
</pre>
</div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-55471992896340836812020-01-13T01:28:00.001-08:002020-01-13T01:30:10.296-08:00Получение WorkFlow Status с помощью CSOM <div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="MsoNormal">
В этой статье я расскажу, как можно получить <span lang="EN-US" style="mso-ansi-language: EN-US;">Internal</span><span lang="EN-US"> </span><span lang="EN-US" style="mso-ansi-language: EN-US;">Status</span><span lang="EN-US"> </span>в
экземплярах рабочих процессов для конкретного элемента.<o:p></o:p></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDGhMhpSkw3Pax9722JsE1IZiVID5j8Zp2Bma8gQkJpTeWiYprCu2PSZo0yhxw8AO46k3Fd1BRkDsAZFLEKuB0VausmjrCvv1P9n209odtnIlVvejzJBS7R9Me5C3WqEFDnKNb1ujWhmTv/s1600/2020-01-13+12_11_00-Window.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="273" data-original-width="762" height="114" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDGhMhpSkw3Pax9722JsE1IZiVID5j8Zp2Bma8gQkJpTeWiYprCu2PSZo0yhxw8AO46k3Fd1BRkDsAZFLEKuB0VausmjrCvv1P9n209odtnIlVvejzJBS7R9Me5C3WqEFDnKNb1ujWhmTv/s320/2020-01-13+12_11_00-Window.png" width="320" /></a></div>
<a name='more'></a><br />
Вот сам код.<br />
нужно только указать List GUID и Item Id<br />
<br />
<pre class="brush:js">function getWFInternalStatus() {
var listGuid = "bf3a96d1-53dc-461f-a072-404508311da9"; // List GUID
var itemId = 2; //List Item Id
var context = SP.ClientContext.get_current();
var web = context.get_web();
var sMgr =new SP.WorkflowServices.WorkflowServicesManager(context, web);
var WFInnstanceServises = sMgr.getWorkflowInstanceService();
var ssubs =WFInnstanceServises.enumerateInstancesForListItem(listGuid,itemId );
context.load(ssubs);
context.executeQueryAsync(
function(){
var enumerator = ssubs.getEnumerator();
while(enumerator.moveNext())
{
var fwEl = enumerator.get_current();
console.log(" id: "+ fwEl.get_id() + " status :" + fwEl.get_status() + " userStatus: " + fwEl.get_userStatus());
};
},
function(err ){ console.log(err)}
);
}
SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function(){
SP.SOD.registerSod('sp.workflowservices.js', SP.Utilities.Utility.getLayoutsPageUrl('sp.workflowservices.js'));
SP.SOD.executeFunc('sp.workflowservices.js', "SP.WorkflowServices.WorkflowServicesManager", getWFInternalStatus);
});
</pre>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe9IKoToyB1MohySZMdDyOXjsD8JFL1PsQZ7-fvR71ddw6PpLMK0qTmwkq07A3Mb_35zNzfO95fDI6X8OYAKKT9Fw_uy-bsBuF7FTd8qo3z5JmWOD12pv7PXOELcks_qz5uKkJV8PudP6r/s1600/2020-01-13+12_14_26-Window.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="160" data-original-width="633" height="80" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe9IKoToyB1MohySZMdDyOXjsD8JFL1PsQZ7-fvR71ddw6PpLMK0qTmwkq07A3Mb_35zNzfO95fDI6X8OYAKKT9Fw_uy-bsBuF7FTd8qo3z5JmWOD12pv7PXOELcks_qz5uKkJV8PudP6r/s320/2020-01-13+12_14_26-Window.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Статусы:</div>
<div class="separator" style="clear: both;">
</div>
<ul style="text-align: left;">
<li>0 = Not Started</li>
<li>1 = Started</li>
<li>2 = Suspended</li>
<li>3 = Canceling</li>
<li>4 = Canceled</li>
<li>5 = Terminated</li>
<li>6 = Completed</li>
<li>7 = NotSpecified</li>
<li>8 = Invalid</li>
</ul>
<br />
<div class="separator" style="clear: both;">
подробнее <a href="https://docs.microsoft.com/en-us/dotnet/api/microsoft.sharepoint.workflowservices.workflowstatus?view=sharepoint-server" target="_blank">WorkflowStatus Enum</a></div>
</div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-83239567382431381782019-12-24T23:39:00.000-08:002020-01-15T23:12:30.195-08:00Свои цвета в календаре.<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="MsoNormal">
Как возможно вы уже знаете, календари (представления
календарей) можно объединять в один и разные календари выделить цветом. Но
цветов не много и свои указать нет возможности.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkDtZOfYRT7tcKXqjC2EIjFCpeBZVuFU-xMz9i0y-Gl74VDU0Yw4LJnpsibSp-Em_DbeBbVuYQ08AyKZ7gI46AzIe0ZyPA1msaeXe-l6JJUia0FOeXP3i-34_5RYc9AHdRaTyP62mFBxEN/s1600/2019-12-25+10_28_59-Customize+Calendar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="482" data-original-width="657" height="234" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkDtZOfYRT7tcKXqjC2EIjFCpeBZVuFU-xMz9i0y-Gl74VDU0Yw4LJnpsibSp-Em_DbeBbVuYQ08AyKZ7gI46AzIe0ZyPA1msaeXe-l6JJUia0FOeXP3i-34_5RYc9AHdRaTyP62mFBxEN/s320/2019-12-25+10_28_59-Customize+Calendar.png" width="320" /></a></div>
<a name='more'></a><div class="MsoNormal">
<o:p><br /></o:p></div>
<div class="MsoNormal">
Но если бизнес просит, то нужно делать.<o:p></o:p></div>
<div class="MsoNormal">
В начале я хотел сделать более изящным способом и пошел в
глубь функций рендера. Ничего подходящего не нашел.<o:p></o:p></div>
<div class="MsoNormal">
В свойствах календаря просто есть номер цвета.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8X9LBOxs1VJ4azH64FH6kg8hthXw5DAgFCwLePJVvk1uPuLo4n3j8TPe2Trd-p2uWqoDAPbGWotcD31H47hYs2JQ5LVJG0IOkSc2iuR6fwyq1ZQUlVEmWnenkmtG02B8ti6KSi6ZLPE_-/s1600/2019-12-25+09_51_58-Global+Marketing+Calendar+-+Calendar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="542" data-original-width="693" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8X9LBOxs1VJ4azH64FH6kg8hthXw5DAgFCwLePJVvk1uPuLo4n3j8TPe2Trd-p2uWqoDAPbGWotcD31H47hYs2JQ5LVJG0IOkSc2iuR6fwyq1ZQUlVEmWnenkmtG02B8ti6KSi6ZLPE_-/s320/2019-12-25+09_51_58-Global+Marketing+Calendar+-+Calendar.png" width="320" /></a></div>
<br />
<div class="MsoNormal">
Далее, в момент добавления, у элементов календаря добавляется
класс с номером цвета.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhavF9F6eA_Usef1WMu7LibibS9V30-F2dmBmbFznsSdAl1PVt_4fs7foql9keM9nheBD7fS05c3Aed041zSoWqn613CDbvNXAGmkU0hxTnLx46iDYn7HZKvvfj4iWMqcj2JBRUeaHFQvEE/s1600/2019-12-25+09_50_43-Global+Marketing+Calendar+-+Calendar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="455" data-original-width="1032" height="141" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhavF9F6eA_Usef1WMu7LibibS9V30-F2dmBmbFznsSdAl1PVt_4fs7foql9keM9nheBD7fS05c3Aed041zSoWqn613CDbvNXAGmkU0hxTnLx46iDYn7HZKvvfj4iWMqcj2JBRUeaHFQvEE/s320/2019-12-25+09_50_43-Global+Marketing+Calendar+-+Calendar.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8O2bPbXJqu66VsRgHlq5RzmKYmBdYqGyTE6lO4xdMAWcr-fVni6F8WerXrNPIb0dYTAbFmY1pJXW9LQKaoF2sGrz4zayQ-cEqAMrtHvjEOMeLUIJpD0oZbtunRr5IiQx0DOZpXvdL2gSy/s1600/2019-12-25+09_53_15-Global+Marketing+Calendar+-+Calendar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="497" data-original-width="777" height="204" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8O2bPbXJqu66VsRgHlq5RzmKYmBdYqGyTE6lO4xdMAWcr-fVni6F8WerXrNPIb0dYTAbFmY1pJXW9LQKaoF2sGrz4zayQ-cEqAMrtHvjEOMeLUIJpD0oZbtunRr5IiQx0DOZpXvdL2gSy/s320/2019-12-25+09_53_15-Global+Marketing+Calendar+-+Calendar.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<div class="MsoNormal">
Пошел по простому пути. Просто добавил на страницу свой <span lang="EN-US" style="mso-ansi-language: EN-US;">css</span><span lang="EN-US"> </span>файл,
в котором переопределил цвета классов.<o:p></o:p></div>
<br />
<br />
<pre class="brush:css">.ms-acal-item.ms-acal-color1,
.ms-acal-apanel-item.ms-acal-apanel-color1{
background-color: #b3d4ff;
color: #0052cc;
}
.ms-acal-item.ms-acal-color1 a,
.ms-acal-apanel-item.ms-acal-apanel-color1 span{
color: #0052cc!important;
}
.ms-acal-item.ms-acal-color2,
.ms-acal-apanel-item.ms-acal-apanel-color2{
background-color: #00875a;
border-color: #00875a;
color: #fff;
}
.ms-acal-item.ms-acal-color2 a,
.ms-acal-apanel-item.ms-acal-apanel-color2 span{
color: #fff!important;
}</pre>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKgDas3X3h4dzSe8g-FpIMf1qEpttyoHU3NO_21e9ikFV1rrfawvGUQVMQf-OTFFEmf_rNNvfuRhXvYieXB6g2RvFyvF8eROgU4gW_oqtFpGBYGNq3-fwSdmC8D0EK-D_JTR3yRiU-TTt4/s1600/2019-12-25+10_41_40-Global+Marketing+Calendar+-+Calendar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="593" data-original-width="1600" height="118" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKgDas3X3h4dzSe8g-FpIMf1qEpttyoHU3NO_21e9ikFV1rrfawvGUQVMQf-OTFFEmf_rNNvfuRhXvYieXB6g2RvFyvF8eROgU4gW_oqtFpGBYGNq3-fwSdmC8D0EK-D_JTR3yRiU-TTt4/s320/2019-12-25+10_41_40-Global+Marketing+Calendar+-+Calendar.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br /></div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-76259198028377915962019-05-31T00:42:00.003-07:002019-05-31T00:46:18.016-07:00Копирование верхней навигационной панели между коллекциями с помощью PowerShell. SharePoint 2013, 2016 <div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="MsoNormal">
Архитектура SharePoint такова,что ферма содержит много коллекций сайтов, а
бизнес хочет единую верхнюю навигационную панель на всех коллекциях (или многих).
Для решения такой задачи можно сделать свое решение, в котором создать своего
провайдера. В мастер странице изменить провайдера, настроить провайдера, что бы
он брал данные из требуемой коллекции.<o:p></o:p></div>
<div class="MsoNormal">
В этой статье я расскажу, как можно копировать TopNavigationBar с одной коллекции в
другу. </div>
<a name='more'></a><br />
<br />
<br />
<pre class="brush:ps">cls
#Коллекция исходник
$web = Get-SPWeb https://portal.ru
$webNav = $web.Navigation.TopNavigationBar
#Сохраняем файл
$xmlFilePath = "C:\temp\QuickLaunchNav.xml"
New-Item $xmlFilePath -type file -force
#Экспортируем файл
Add-Content $xmlFilePath ""
Add-Content $xmlFilePath "`n<navigation>"
$webUrlXml = "`n<weburl>" + $web.ServerRelativeUrl + "</weburl>"
Add-Content $xmlFilePath $WebUrlXml
$webTitleXml = "`n<webtitle>" + $web.Title + "</webtitle>"
Add-Content $xmlFilePath $webTitleXml
Add-Content $xmlFilePath "`n<headings>"
$webNav | ForEach-Object {
if($_.Properties.NodeType -eq "Heading")
{
Write-Host "Добавляем Heading: " $_.Title -ForegroundColor DarkGray
$headingXML = "`n<heading amp="" itle.replace="" rl.replace="" title="`" url="`">"
Add-Content $xmlFilePath $headingXML
$_.Children | ForEach-Object {
# $_.Title
$navLinkXML = "<navlink amp="" itle.replace="" rl.replace="" title="`" url="`">"
Add-Content $xmlFilePath $navLinkXML
}
Add-Content $xmlFilePath "`n</navlink></heading>"
}
}
Add-Content $xmlFilePath "`n</headings>"
Add-Content $xmlFilePath "`n</navigation>"
$web.Dispose()
#=======================================#
#Перечень коллекций
$webUrlArray = 'https://portal.ru/sites/Contracts/',
'https://portal.ru/departments/',
'https://portal.ru/sites/DocLib',
'https://portal.ru/tasks'
foreach($webUrl in $webUrlArray){
$newWeb = Get-SPWeb $webUrl
$qlNav = $newWeb.Navigation.TopNavigationBar
#Читаем файл
$xmlFilePath = "C:\temp\QuickLaunchNav.xml"
$xmlFile = [xml](Get-Content($xmlFilePath))
$oldWebUrl = $xmlFile.Navigation.WebUrl
$currentLinks = @()
#Очищаем существующие ссылки
$qlNav | ForEach-Object {
$currentLinks = $currentLinks + $_.Id
}
$currentLinks | ForEach-Object {
$currentNode = $newWeb.Navigation.GetNodeById($_)
write-host "Удаление " $currentNode.Title "и всех вложенных ссылок..." -ForegroundColor Blue
$qlNav.Delete($currentNode)
}
#создание первой ссылки
$headingNode = New-Object Microsoft.SharePoint.Navigation.SPNavigationNode($xmlFile.Navigation.WebTitle, $xmlFile.Navigation.WebUrl,$true)
$qlNav.AddAsLast($headingNode)
#Создаем ссылку
$xmlFile.Navigation.Headings.Heading | ForEach-Object {
$LinkTitle = $_.Title.replace("?","")
#Write-Host $_.Url $_.NavLink
#$headingNode = New-Object Microsoft.SharePoint.Navigation.SPNavigationNode($_.Title, $_.Url.Replace($oldWebUrl, $web.ServerRelativeUrl))
$headingNode = New-Object Microsoft.SharePoint.Navigation.SPNavigationNode($LinkTitle, $_.Url,$true)
write-host "Создаем Heading:" $_.Title -ForegroundColor Green
$heading = $qlNav.AddAsLast($headingNode)
$heading.Properties["NodeType"] = "Heading";
$heading.Update();
$_.NavLink | ForEach-Object {
#$linkNode = New-Object Microsoft.SharePoint.Navigation.SPNavigationNode($_.Title, $_.Url.Replace($oldWebUrl, $web.ServerRelativeUrl))
write-host "Создаем Navigation Link:" $_.Title -ForegroundColor Yellow
$LinkTitle = $_.Title.replace("?","")
if ( $_.Url -eq $newWeb.ServerRelativeUrl ){ # Проверяем что ссылка на этот же сайт
$url = $_.Url+"/temp"
$linkNode = New-Object Microsoft.SharePoint.Navigation.SPNavigationNode($LinkTitle, $url,$true)
$link = $heading.Children.AddAsLast($linkNode)
$link.Url = $newWeb.ServerRelativeUrl
$link.Update()
}else{
$linkNode = New-Object Microsoft.SharePoint.Navigation.SPNavigationNode($LinkTitle, $_.Url,$true)
$link = $heading.Children.AddAsLast($linkNode)
}
}
}
$newWeb.Dispose()
}
</pre>
<br />
Основным условием является то, что необходимо активировать фичу "Публикация" .</div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-43162610895673717092018-11-28T01:35:00.000-08:002018-11-28T01:35:07.255-08:00Заполнение текущего пользователя в PeoplePicker<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="MsoNormal">
В этой статье я расскажу, как можно заполнять текущего
пользователя в поле <span lang="EN-US" style="mso-ansi-language: EN-US;">PeoplePicker</span><o:p></o:p></div>
<div class="MsoNormal">
Для этого нам понадобятся две функции:<br />
1. Получает текущего пользователя<o:p></o:p></div>
<div class="MsoNormal">
2. Меняет значение в поле <span lang="EN-US" style="mso-ansi-language: EN-US;">PeoplePicker<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="mso-ansi-language: EN-US;"><br /></span></div>
<div class="MsoNormal">
конечный резульрат</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkvOewJyD1dnKDmy4y8EsBvY77nY39HKjh-g1ZWIH87E-X0urKzt12mImMm7Ar6MOzF7CIktIWlyheo56PLnK9aK3riBsXmhmSkdHpbb1YpDcdPdkA8q8hjUoZSEZmSJSB58mYW6_BRwIx/s1600/user.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="692" data-original-width="813" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkvOewJyD1dnKDmy4y8EsBvY77nY39HKjh-g1ZWIH87E-X0urKzt12mImMm7Ar6MOzF7CIktIWlyheo56PLnK9aK3riBsXmhmSkdHpbb1YpDcdPdkA8q8hjUoZSEZmSJSB58mYW6_BRwIx/s320/user.gif" width="320" /></a></div>
<a name='more'></a><div class="MsoNormal">
код решения</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<pre class="brush:js">
<script type="text/javascript" src="/tasks/Style Library/js/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
function setPPUser(fieldId)
{
//debugger
if (SP.ClientContext != null) {
SP.SOD.executeOrDelayUntilScriptLoaded(getCurrentUser, 'sp.js');
}
else {
SP.SOD.executeFunc('clientpeoplepicker.js','SP.ClientContext',function(){
SP.SOD.executeFunc('sp.js','', getCurrentUser);
});
}
var currentUser;
function getCurrentUser() {
var context = new SP.ClientContext.get_current();
var web = context.get_web();
currentUser = web.get_currentUser();
context.load(currentUser);
context.executeQueryAsync(onSuccessMethod, onRequestFail);
}
function onSuccessMethod(sender, args) {
var account = currentUser.get_loginName();
var currentUserAccount = account.substring(account.indexOf("|") + 1);
// заполение поля
SetPeoplePickerValue(fieldId, currentUserAccount ) ;
}
function onRequestFail(sender, args) {
console.log('request failed' + args.get_message() + '\n' + args.get_stackTrace());
}
};
function SetPeoplePickerValue(fieldId, userName) {
var peoplePickerDiv = $("[id^='" +fieldId+"_']")
var peoplePickerEditor = $("input[id^='" + fieldId + "']");
var spPeoplePicker = SPClientPeoplePicker.SPClientPeoplePickerDict[peoplePickerDiv[0].id];
jQuery("[id ^='" +fieldId+"_] a.sp-peoplepicker-delImage").click();
peoplePickerEditor.val(userName);
spPeoplePicker.AddUnresolvedUserFromEditor(true);
};
_spBodyOnLoadFunctionNames.push("WorkingWithFields");
function WorkingWithFields()
{
setPPUser("User");
}
</script>
</pre>
</div>
<div class="MsoNormal">
<span lang="EN-US" style="mso-ansi-language: EN-US;"><br /></span></div>
</div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-25407209051234681102018-05-21T04:47:00.000-07:002018-05-22T22:48:00.405-07:00Обновление фотографий пользователей из AD (SharePoint 2016)<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: left;">
</div>
<div class="MsoNormal">
Наверное, ни для кого не секрет, что в <span lang="EN-US" style="mso-ansi-language: EN-US;">SP</span><span lang="EN-US"> </span>2016 убрали FIM
и на его основе сделали <span lang="EN-US" style="mso-ansi-language: EN-US;">MIM</span>.
Но как быть если хочется погружать свойства из <span lang="EN-US" style="mso-ansi-language: EN-US;">AD</span><span lang="EN-US"> </span>в свойства
пользователей и при этом не ставить <span lang="EN-US" style="mso-ansi-language: EN-US;">MIM</span>.<o:p></o:p></div>
<div class="MsoNormal">
В этой статье я расскажу, как можно с помощью <span lang="EN-US" style="mso-ansi-language: EN-US;">PowerShell </span>загрузить фото.<o:p></o:p></div>
<div class="MsoNormal">
Принцип работы такой:<o:p></o:p></div>
<div class="MsoNormal">
</div>
<ul>
<li>Из <span lang="EN-US">AD</span>
получаем всех пользователей, у которых есть фото.</li>
<li>Далее пробегаем по ним и сохраняем файлы фотографий локально
на диск сервера.</li>
<li>Следующим этапом циклом проходим по файлам на диске и
загружаем их <span lang="EN-US">SP<a name='more'></a></span></li>
</ul>
<o:p></o:p>Скрипт позволяет удалять не синхронизированных пользователей (удаленных из AD).<br />
так же обновлять доп свойства которые не импортируются по умолчанию.<br />
Скрипт можно сохранить в файл и запускать по через задания Windows, при этом будут создаваться записи в EventViewer.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgakI4Dz495oACLKsp44CQEznsUWUra9J4FSN1Tzcud0ChMnMO38BpgjPuq95ROhiNHTyCgNlZwrqr47C5z8g3HVFcB5kby2gvq1062xzzT_70EP5Kn6fC45Z7xBF8Mn0Z1XbWtxbUyF5Xl/s1600/2018-05-22+14_47_36-sp16-wfe01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="666" data-original-width="1050" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgakI4Dz495oACLKsp44CQEznsUWUra9J4FSN1Tzcud0ChMnMO38BpgjPuq95ROhiNHTyCgNlZwrqr47C5z8g3HVFcB5kby2gvq1062xzzT_70EP5Kn6fC45Z7xBF8Mn0Z1XbWtxbUyF5Xl/s320/2018-05-22+14_47_36-sp16-wfe01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" width="320" /></a></div>
<br />
<br />
для использования необходимо поменять значения переменных<br />
$MySiteUrl = "https://my.company.ru"<br />
$LocalPath = "C:\temp\folder"<br />
$domain = "My-CORP\"<br />
$domainOU = "DC=my-corp,DC=local"<br />
<br />
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
<o:p></o:p></div>
<pre class="brush:ps">if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) {
Add-PSSnapin Microsoft.SharePoint.PowerShell;
}
function Upload-PhotosToSP
{
Param (
[parameter(Mandatory=$true)][string]$LocalPath,
[parameter(Mandatory=$true)][string]$MySiteUrl,
[parameter(Mandatory=$true)][string]$Domain,
[parameter(Mandatory=$false)][switch]$Overwrite
)
$mySiteHostSite = Get-SPSite $MySiteUrl
$mySiteHostWeb = $mySiteHostSite.OpenWeb()
$context = Get-SPServiceContext $mySiteHostSite
$profileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
try
{
#Get files from local folder
$localPhotosFolder = Get-ChildItem $LocalPath
#Get User Photos document library in the My Site host site
$spPhotosFolder = $mySiteHostWeb.GetFolder("User Photos")
#Upload each image file and configure user profiles
$localPhotosFolder | ForEach-Object {
#Generate file path for upload into SharePoint
$spFullPath = $spPhotosFolder.Url + "/" + $_.Name
#Check if the file exists and the overwrite option is selected before adding the file
if ((!$mySiteHostWeb.GetFile($spFullPath).Exists) -or ($Overwrite)) {
#Add file to the User Photos library
$spFile = $spPhotosFolder.Files.Add($spFullPath, $_.OpenRead(), $true)
$spImagePath = $mySiteHostWeb.Url + "/" + $spFile.Url
#Get the domain and user name from the image file name
$adAccount = $_.Name -replace ".jpg", "";
$adAccountFull = "$Domain$adAccount"
$users = $profileManager.Search($adAccount)
foreach($user in $users){
if($user.ProfileType -eq "User"){
$userId = $user.RecordId
if ($userId -ne $null)
{
$up = $profileManager.GetUserProfile($userId)
$up.AccountName
#Get user profile and change the Picture URL value
if($up.AccountName -eq $adAccountFull){
Write-host $up.AccountName -ForegroundColor Blue
$up["PictureURL"].Value = $spImagePath
$up.Commit()
}else{
Write-host "логин не соответствует - " $adAccountFull -ForegroundColor Red
}
}
else
{
write-host "Profile for user"$adAccount "cannot be found"
}
}
}
}
else
{
write-host "`nFile"$_.Name "already exists in" $spFullPath.Replace("/" + $_.Name,"") "and shall not be uploaded" -foregroundcolor Red
}
}
#Run the Update-SPProfilePhotoStore cmdlet to create image thumbnails and update user profiles
write-host "Waiting to update profile photo store - Please wait..."
Start-Sleep -s 60
Update-SPProfilePhotoStore –MySiteHostLocation $MySiteUrl
write-host "Profile photo store update run - please check thumbnails are present in Profile Pictures folder."
}
catch
{
write-host "The script has stopped because there has been an error: "$_
}
finally
{
#Dispose of site and web objects
$mySiteHostWeb.Dispose()
$mySiteHostSite.Dispose()
}
}
$MySiteUrl = "https://my.company.ru"
$LocalPath = "C:\temp\folder"
$domain = "My-CORP\"
$domainOU = "DC=my-corp,DC=local"
cls
#Старт полной синхронизации
$upa = Get-SPServiceApplication | where {$_.TypeName -eq "User Profile Service Application"}
$upa.StartImport($true)
Import-Module ActiveDirectory
$users = Get-ADUser -Filter * -SearchBase $domainOU -Properties thumbnailPhoto | ? {$_.thumbnailPhoto} #| select Name
$count = 0
foreach ($user in $users) {
$count = $count + 1
Write-Progress -Activity "Загрузка фотографий из AD " -status "текущий элемент № $count" -percentComplete ($count / $users.Count * 100)
$user.SamAccountName
$name = $user.SamAccountName + ".jpg"
$user.jpegPhoto | Set-Content ("$LocalPath\$($User.SamAccountName).jpg") -Encoding byte
}
start-sleep 3
write-progress one one -completed
Write-Host "фото загружены на диск сервера."
Upload-PhotosToSP -LocalPath $LocalPath -MySiteUrl $MySiteUrl -Domain $domain -Overwrite
Write-Host "Удаление не синхронизированных пользователей." -ForegroundColor Green
Set-SPProfileServiceApplication -Identity $upa -PurgeNonImportedObjects $true
#Set-SPProfileServiceApplication -Identity $upa -GetNonImportedObjects $true
Write-Host "Обновление свойств пользователя."
$context = Get-SPServiceContext($MySiteUrl)
$profileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
$users = $profileManager.GetEnumerator()
$count = 0
foreach($user in $users){
$userLogin = ($user.AccountName).Replace($domain,"")
$count = $count + 1
Write-Progress -Activity "Обновление свойств пользователя " -status "текущий пользователь № $count" -percentComplete ($count / $profileManager.Count * 100)
$userAD = Get-ADUser -Identity $userLogin -Properties "Company"
if($userAD.Company -ne $null -and $userAD.Company -ne "" ){
# Write-Host $user.DisplayName // $userAD.Company -ForegroundColor Green
$user["Company"].Value = $userAD.Company
$user.Commit()
}
}
New-EventLog –LogName Application –Source "SST-SharePoint"
Write-EventLog -LogName "Application" -Source "SST-SharePoint" -EventID 11111 -EntryType Information -Message "Фото обновлены" -Category "Update User Photo"
</pre>
за основу был взят скрипт <a href="https://gallery.technet.microsoft.com/office/Bulk-Upload-and-Update-2c27437e" target="_blank">Bulk Upload and Update User Profile Photos in SharePoint 2013</a></div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-75205767237032564192018-04-06T00:55:00.000-07:002018-04-06T01:59:54.623-07:00Изменение лимита workflow manager <div dir="ltr" style="text-align: left;" trbidi="on">
Последнее время участились случаи, когда при массовых обновлениях элементов SharePoint из других систем память заканчивалась. Я тешил изменить настройки лимитов и согласно статье <a href="https://msdn.microsoft.com/ru-ru/library/jj680843(v=azure.10).aspx">https://msdn.microsoft.com/ru-ru/library/jj680843(v=azure.10).aspx</a><br />
Нужно поменять параметр WorkflowServiceMaxLoadedInstances и жизнь должна наладиться, но мои попытки сделать это через PowerShell заканчивались ошибкой.<br />
<br />
<blockquote class="tr_bq">
Set-WFServiceConfiguration : ActivityId клиента Базовое соединение закрыто: Непредвиденная ошибка при приеме.: 599cc617-c030-0007-31cf-af5930c0d301.<br />
строка:1 знак:1<br />
+ Set-WFServiceConfiguration<br />
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
+ CategoryInfo : NotSpecified: (:) [Set-WFServiceConfiguration], WorkflowCommunicationException<br />
+ FullyQualifiedErrorId : Microsoft.Workflow.Client.WorkflowCommunicationException,Microsoft.Workflow.Commands.SetServiceConfigCommand</blockquote>
<br />
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGx10QivveZ96C7Q-qoL2pL68BY8pYl5Xaxs7qWdXZuWQHUNDJAOTmGde8l1qOq7yn6MeaNeS227Cqz-e09pAMAWLlsrw5OzIyvwwMEfRFAE3HO233PQ88OM4cPBK6BD-oPRv1kJd_ADkl/s1600/2018-04-06+10_43_39-sp16-wfe01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="362" data-original-width="697" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGx10QivveZ96C7Q-qoL2pL68BY8pYl5Xaxs7qWdXZuWQHUNDJAOTmGde8l1qOq7yn6MeaNeS227Cqz-e09pAMAWLlsrw5OzIyvwwMEfRFAE3HO233PQ88OM4cPBK6BD-oPRv1kJd_ADkl/s320/2018-04-06+10_43_39-sp16-wfe01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" width="320" /></a></div>
<br />
Тогда я решил изменить настройки на прямую в базе.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJDAVgh9UIoKiBDmTnlZTfgYwQ99ZWX0_B-sKVxlMFVxt-HxwJUfKIDch1sJU_PDXIh37rB857d1X2MsFeT5B8QmbMzUvXFLBG_Jp7I10C768CxuNxIQhhzk-apOQgBMVJIAj-6_6mga7_/s1600/2018-04-06+10_49_59-sp16-sql01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="357" data-original-width="944" height="121" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJDAVgh9UIoKiBDmTnlZTfgYwQ99ZWX0_B-sKVxlMFVxt-HxwJUfKIDch1sJU_PDXIh37rB857d1X2MsFeT5B8QmbMzUvXFLBG_Jp7I10C768CxuNxIQhhzk-apOQgBMVJIAj-6_6mga7_/s320/2018-04-06+10_49_59-sp16-sql01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" width="320" /></a></div>
<br />
После изменения параметра нужно перепустить службу <b>microsoft.workflow.servicehost</b><br />
<b><br /></b>
<br />
<br /></div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-87854190785439488912017-11-27T04:19:00.000-08:002017-11-27T04:22:45.054-08:00Отображение Ribbon для конкретного пользователя<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="margin-bottom: .0001pt; margin: 0cm;">
<span style="font-size: 13.5pt;">Рассмотрим задачу, когда нужно скрыть риббон и верхнюю панель.<o:p></o:p></span></div>
<div style="margin: 0cm 0cm 0.0001pt;">
<span style="font-size: 13.5pt;">это сделать не так сложно,
нужно добавить всего пару строчек CSS<o:p></o:p></span></div>
<pre class="brush:css">#suiteBarDelta{
display: none;
}
#s4-ribbonrow{
display: none;
}
</pre>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAGCQrL2k28MB0D_hSxOJfkl-isBEtp3a1fZQO1ebFPBf3om8axmXi2itRnJZgmt4mxPEIuB5cIQYgHxn0D4h6t0e5HsieL4MCx_vykpkwsDCM7wA76zgNQ0jkzmjIxRA3qCdtQUXGA4LI/s1600/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="397" data-original-width="1287" height="98" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAGCQrL2k28MB0D_hSxOJfkl-isBEtp3a1fZQO1ebFPBf3om8axmXi2itRnJZgmt4mxPEIuB5cIQYgHxn0D4h6t0e5HsieL4MCx_vykpkwsDCM7wA76zgNQ0jkzmjIxRA3qCdtQUXGA4LI/s320/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B9.png" width="320" /></a></div>
<br /></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<span style="font-size: 13.5pt;">Но возникает проблема, ведь часть кнопок скрыта и администрировать
становится не возможным. Конечно можно открыть панель разработчика в браузере и
отобразить требуемы контент, но при частой работе с риббоном это не удобно.<o:p></o:p></span><br />
<span style="font-size: 13.5pt;"></span><br />
<a name='more'></a><span style="font-size: 13.5pt;"><br /></span></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<span style="font-size: 13.5pt;">Решение<o:p></o:p></span></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<span style="font-size: 13.5pt;">Пишем скрипт который получает </span><span lang="EN-US" style="font-size: 13.5pt;">id</span><span lang="EN-US" style="font-size: 13.5pt;"> </span><span style="font-size: 13.5pt;">текущего пользователя и если пользователю разрешено, то
отображается риббон.<o:p></o:p></span></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<br /></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<br /></div>
<pre class="brush:js">'use strict';
// получение текущего пользователя
function getCurrentUser() {
var dfd = jQuery.Deferred();
var currentUser;
if (SP.ClientContext != null) {
SP.SOD.executeOrDelayUntilScriptLoaded(getUser, 'sp.js');
}
else {
SP.SOD.executeFunc('sp.js', null, getUser);
}
function getUser() {
var context = new SP.ClientContext.get_current();
var web = context.get_web();
currentUser = web.get_currentUser();
context.load(currentUser);
context.executeQueryAsync(onSuccessMethod, onRequestFail);
}
function onSuccessMethod(sender, args) {
//currUser = currentUser;
dfd.resolve(currentUser);
}
function onRequestFail(sender, args) {
console.log('ошибка получения пользователя' + args.get_message() + '\n' + args.get_stackTrace());
dfd.reject(args);
}
return dfd.promise();
};
var currUser = getCurrentUser();
currUser.done(function (res) {
console.log("Ид текущего пользователя - ", res.get_id() )
if(res.get_id() == 9)
{
setTimeout(function(){
console.log("показываем")
jQuery('#suiteBarDelta').show();
jQuery('#s4-ribbonrow').show();
},3000)
}
});
</pre>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<span style="font-size: 13.5pt;">В примере установлен </span><span lang="EN-US" style="font-size: 13.5pt;">setTimeout</span><span style="font-size: 13.5pt;">, его можно убрать.<o:p></o:p></span></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<span style="font-size: 13.5pt;">Вот что у нас на выходе.<o:p></o:p></span></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHaB8GTLNt-UNZAlQPoSg6a-ekUNf3BFq5e1gPgoEJ7fVJUhYJofCpPd801Mu1RpCvYROtH_U-v-Z6tesRI7dfviieJsqJWqSh6Jd-sFJlZbFgfccZidJql6RYMpIMdBRS8Z2oU57HdAp8/s1600/hide.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="390" data-original-width="765" height="163" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHaB8GTLNt-UNZAlQPoSg6a-ekUNf3BFq5e1gPgoEJ7fVJUhYJofCpPd801Mu1RpCvYROtH_U-v-Z6tesRI7dfviieJsqJWqSh6Jd-sFJlZbFgfccZidJql6RYMpIMdBRS8Z2oU57HdAp8/s320/hide.gif" width="320" /></a></div>
<br /></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<br /></div>
<br />
<div class="MsoNormal">
<br /></div>
</div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com2tag:blogger.com,1999:blog-3592967929339635640.post-42085082798078398012017-10-10T23:21:00.001-07:002018-02-19T03:47:56.860-08:00Как получить значение поля в DispForm<div dir="ltr" style="text-align: left;" trbidi="on">
<div>
Некоторое время назад появилась задача произвести манипуляции с полем (скрыть/показать) на форме просмотра.</div>
<div>
Можно пойти по пути обращения к полю по его названию, но мне этот вариант не нравиться.<br />
<br />
<a name='more'></a><br /></div>
<div>
Я решил пойти по пути CSR.</div>
<div>
<br /></div>
<div>
<pre class="brush:js">'use strict';
'use strict';
(function () {
var ctx = {};
ctx.Templates = {};
ctx.Templates.Fields = {
'Status':{ 'DisplayForm': AddIdInField }
};
SPClientTemplates.TemplateManager.RegisterTemplateOverrides(ctx);
function AddIdInField(ctx) {
console.log(ctx.CurrentFieldValue)
return '<div id="'+ ctx.CurrentFieldSchema.Name +'">' + SPField_FormDisplay_Default(ctx) + '</div>';
}
})();
</pre>
</div>
<div>
<br /></div>
<div>
что делает скрипт </div>
<div>
<br /></div>
<div>
Для поля Status переопределяет свой шаблон рендера и возвращаем стандартный шаблон отображения поля обернутый в DIV с id поля.</div>
<div>
<br /></div>
<div>
что имеем</div>
<div>
<br /></div>
<div>
1. значение поля (в примере выводится в консоль)</div>
<div>
<br /></div>
<div>
2. div c id, что позволяет нам обратиться к нему и произвести манипуляции</div>
<div>
<br /></div>
<div>
Как пользоваться:</div>
<div>
Указать свой id поля и указать требуемый шаблон рендера (вместо SPFieldNote_Display).</div>
<div>
Шаблоны для разных видов полей можно посмотреть тут</div>
<div>
<br /></div>
<div>
<h1 itemprop="name" style="background-color: white; border: 0px; color: #444444; font-family: "Segoe UI", Segoe, "Helvetica Neue", "Lucida Grande", Arial, sans-serif; font-size: 22px; font-stretch: inherit; font-variant-numeric: inherit; font-weight: inherit; line-height: 1.3; margin: 0px 0px 0.5em; padding: 0px; vertical-align: baseline;">
<a class="question-hyperlink" href="https://sharepoint.stackexchange.com/questions/112506/sharepoint-2013-js-link-return-default-field-rendering" style="border: 0px; color: #222222; cursor: pointer; font-family: inherit; font-size: 24px; font-stretch: inherit; font-style: inherit; font-variant: inherit; line-height: 1.35; margin: 0px 0px 0.5em; padding: 0px; text-decoration-line: none; vertical-align: baseline;">Sharepoint 2013 JS Link return default field rendering</a></h1>
</div>
</div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com2tag:blogger.com,1999:blog-3592967929339635640.post-57073814794862080602017-09-27T00:24:00.000-07:002017-10-03T00:09:23.675-07:00Заполнение пользователя в поле, если форма изменена в дизайнере <div dir="ltr" style="text-align: left;" trbidi="on">
Допустим мы изменили форму через дизайнер и у нас есть задача указать поле "Пользователь или группа" определенного пользователя.<br />
мы можем это сделать прибегнув к jQuery<br />
<br />
<br />
<pre class="brush:js">
jQuery("table.ms-usereditor").find("div").text("user login");
jQuery("table.ms-usereditor").find("td:eq(2)").children().eq(0).click();
</pre>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLkmLRh80f_7jGHGEFUVFXQ8vEzlykA4IjlhvPg6gDrT1MpHJcBXbUrlKoE_VRpScWV8Hd3B4ymFuZ5Axjx33_RqDIS4cbLq-Iep7oKX0jk3ACIkPe0OaoOZ7VAcOK9Quf1WCdLIhb3cwo/s1600/addUser.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="505" data-original-width="854" height="189" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLkmLRh80f_7jGHGEFUVFXQ8vEzlykA4IjlhvPg6gDrT1MpHJcBXbUrlKoE_VRpScWV8Hd3B4ymFuZ5Axjx33_RqDIS4cbLq-Iep7oKX0jk3ACIkPe0OaoOZ7VAcOK9Quf1WCdLIhb3cwo/s320/addUser.gif" width="320" /></a></div>
<br />
данное решение будет работать если в форме поле выбора пользователя только одно.<br />
<br /></div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-47640615332661138032017-09-07T06:12:00.002-07:002017-09-07T06:39:39.599-07:00Всплывающие подсказки - callout <div dir="ltr" style="text-align: left;" trbidi="on">
<div style="margin-bottom: .0001pt; margin: 0cm;">
<span style="font-size: 13.5pt;">В этой статье я расскажу, как можно добавить Callout (popover от
MS).<o:p></o:p></span></div>
<br />
<div style="margin: 0cm 0cm 0.0001pt;">
<span style="font-size: 13.5pt;">Я не буду в даваться в детали,
т.к. примеров в инете достаточно, а покажу как можно сделать универсальное
решение.<o:p></o:p></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYAsiLhgYqBrrsBbKbheSgyxW3vcTRDqoitATGroFhCRRVZnwFwGCHplUI-ZHwPEz3UjnyyPIXNOfyPyZXPapAbatO02VEREvw0t7JMe9bSafWmE_SReKx_5q52Bm4TbBrDJpJOCYFav8v/s1600/Colluot.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="506" data-original-width="709" height="227" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYAsiLhgYqBrrsBbKbheSgyxW3vcTRDqoitATGroFhCRRVZnwFwGCHplUI-ZHwPEz3UjnyyPIXNOfyPyZXPapAbatO02VEREvw0t7JMe9bSafWmE_SReKx_5q52Bm4TbBrDJpJOCYFav8v/s320/Colluot.gif" width="320" /></a></div>
<br />
<a name='more'></a><div class="MsoNormal">
<span style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;">Рассмотрим ситуацию, когда нам нужно инициализировать
много </span><span lang="EN-US" style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;">callout</span><span style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;">. Ну не будем же мы прописывать в </span><span lang="EN-US" style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;">js</span><span lang="EN-US" style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;"> </span><span style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;">все варианты, и поэтому
я решил пойти по пути как у Bootstrap</span> и добавить необходимые для <span lang="EN-US" style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;">callout</span><span style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;"> данные в атрибуты </span><span lang="EN-US" style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;">html</span><span lang="EN-US" style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;"> </span><span style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;">элементов. <o:p></o:p></span><br />
<span style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;"></span><br />
<div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, "Courier New", monospace; font-size: 14px; line-height: 19px; white-space: pre;">
<div style="line-height: 19px;">
<span style="color: #9cdcfe;">calloutTitle</span>=<span style="color: #ce9178;">""</span></div>
</div>
<div style="background-color: #1e1e1e; color: #d4d4d4; font-family: Consolas, "Courier New", monospace; font-size: 14px; line-height: 19px; white-space: pre;">
<div style="line-height: 19px;">
<span style="color: #9cdcfe;">calloutContent</span>=<span style="color: #ce9178;">""</span></div>
</div>
</div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioUBZV47xmymyhuD2EBn7hNYytLXgm4j5onucABH5YFuEDBpMdLqR-YZSpEOBdaO3oCXEdN8DELTYEy4ZOovGsvrAp4rqwz1baS2i77DMtmh-PVTf2hT16NhaTGX13o8Mf2WQpZ1CJ-5tx/s1600/2017-09-07+16_05_28-index.html+%25E2%2580%2594+UsefulLinksForEmployee+%25E2%2580%2594+Visual+Studio+Code.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="220" data-original-width="909" height="77" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioUBZV47xmymyhuD2EBn7hNYytLXgm4j5onucABH5YFuEDBpMdLqR-YZSpEOBdaO3oCXEdN8DELTYEy4ZOovGsvrAp4rqwz1baS2i77DMtmh-PVTf2hT16NhaTGX13o8Mf2WQpZ1CJ-5tx/s320/2017-09-07+16_05_28-index.html+%25E2%2580%2594+UsefulLinksForEmployee+%25E2%2580%2594+Visual+Studio+Code.png" width="320" /></a></div>
<br />
<div class="MsoNormal">
<span style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;">В решении я использовал стандартный </span><span lang="EN-US" style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;">mQuery</span><span style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;">.<o:p></o:p></span><br />
<span style="font-family: "times new roman" , serif;"><span style="font-size: 18px;">Скрипт пробегает по всем элементам с классом </span></span><span style="font-family: "times new roman" , serif; font-size: 13.5pt;">.myCallout и инициализирует Callout</span><br />
<br />
<pre class="brush:js">SP.SOD.executeFunc('mQuery.js', 'm$', addMyCallout);
function addMyCallout() {
m$(".myCallout").forEach(function( el,index){
if(!el.id){
el.id = "myCallout_"+ guid();
}
var self = m$(el);
var title = self.attr("calloutTitle");
var content = self.attr("calloutContent");
if(title || content){
SP.SOD.executeFunc("callout.js", "Callout", function()
{
var itemCallOut = CalloutManager.createNew(
{
ID: el.id,
launchPoint: el,
beakOrientation: 'leftRight',
title: title,
content: content,
openOptions:{event: "hover"},
});
});
};
});
function guid() {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
};
return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
};
};
</pre>
<span style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;">
</span></div>
<div class="MsoNormal">
<br /></div>
<br />
<div class="MsoNormal">
<span style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;">Данный скрипт можно сохранить в </span><span lang="EN-US" style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;">js</span><span lang="EN-US" style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;"> </span><span style="font-family: "times new roman" , serif; font-size: 13.5pt; line-height: 107%;">файл и положить в библиотеку. И добавлять ссылку на требуемые страницы.<o:p></o:p></span><br />
<span style="font-family: times new roman, serif;"><span style="font-size: 18px;">скачать файл <a href="https://drive.google.com/open?id=0BxdYSYWhKHrbVHdTVy1TUjdIeGc">myCallout.js</a> </span></span></div>
</div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-50509430036268694982017-08-04T00:39:00.000-07:002017-08-04T01:20:50.747-07:00Утверждение задач WorkFlow через PowerShell<div dir="ltr" style="text-align: left;" trbidi="on">
В этой статье я расскажу, как можно массово через PowerShell утвердить задачи РП созданные через рабочий процесс "Утверждение"<br />
<div>
<br /></div>
<div>
и так нам понадобится </div>
<h4 class="pi-weight-600" style="box-sizing: border-box; color: #21252b; font-family: "Open Sans", Arial, sans-serif; font-size: 20px; line-height: 1.3em; margin: 0px 0px 10px; padding: 0px;">
<a href="https://www.u2u.be/software">U2U Caml Query Builder </a> </h4>
<div>
с помощью которого мы формируем CAML</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-d86c7cwnPUtudhuM2pd7zmOUmIZiL82gbUCxQpDnT7ZcJJmXvYqEIEaBC3hpirSd94K2m5QmJT6rptlHA_WiOqqEn1pqlYTsKzbVnfxbqYVwO1sKLeRRqpAl7zpIXkXMPFG6aXIoiiEM/s1600/2017-08-04+10_33_22-Blogger_+%25D0%25BD%25D0%25B5%25D0%25BC%25D0%25BD%25D0%25BE%25D0%25B3%25D0%25BE+%25D0%25BE+SharePoint+%25E2%2580%2593+%25D0%259D%25D0%25BE%25D0%25B2%25D0%25BE%25D0%25B5+%25D1%2581%25D0%25BE%25D0%25BE%25D0%25B1%25D1%2589%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+-+Opera.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="607" data-original-width="1011" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-d86c7cwnPUtudhuM2pd7zmOUmIZiL82gbUCxQpDnT7ZcJJmXvYqEIEaBC3hpirSd94K2m5QmJT6rptlHA_WiOqqEn1pqlYTsKzbVnfxbqYVwO1sKLeRRqpAl7zpIXkXMPFG6aXIoiiEM/s320/2017-08-04+10_33_22-Blogger_+%25D0%25BD%25D0%25B5%25D0%25BC%25D0%25BD%25D0%25BE%25D0%25B3%25D0%25BE+%25D0%25BE+SharePoint+%25E2%2580%2593+%25D0%259D%25D0%25BE%25D0%25B2%25D0%25BE%25D0%25B5+%25D1%2581%25D0%25BE%25D0%25BE%25D0%25B1%25D1%2589%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+-+Opera.png" width="320" /></a></div>
<div>
полученный CAML вставляем в скрипт</div>
<div>
<br /></div>
<div>
<pre class="brush:ps">$web = Get-SPWeb http://portal/sites/Doct
$List = $web.Lists["Задачи"]
$Query = New-Object Microsoft.SharePoint.SPQuery;
$Query.Folder = $List.RootFolder;
$camlQuery = "<where><eq><fieldref name="ID"><value type="Counter">9</value></fieldref></eq></where>"
$camlQuery
$Query.Query = $camlQuery;
$Query.RowLimit = 100;
$List.GetItems($Query) | foreach-object {
$item = $_
write-host $item.Name $item.Id
$item['WorkflowOutcome']='Утверждено'
$item['ExtendedProperties'] = $item['ExtendedProperties'] + "ows_TaskStatus='Утверждено' ows_FieldName_Comments=''"
$item['PercentComplete']= 1
$item['Completed']=1
$item['Status']= 'Завершена'
$item.Update()
}
$web.Dispose()</pre>
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjndKWZ41Y5vMa3f4rpNtUctRDQgyZlmiIp4-VdW4NRQyGF6_Bm9F3pFfZ27kW5TrQyJPVtd-5KgzOiprCymYzmBDVNt5QQL7hfBVZB74xa2Wby68C1jWwWoN00hdE3hHBOrvh6ExV1S-t6/s1600/2017-08-04+10_41_08-CustomList+-+%25D0%2592%25D1%2581%25D0%25B5+%25D1%258D%25D0%25BB%25D0%25B5%25D0%25BC%25D0%25B5%25D0%25BD%25D1%2582%25D1%258B+-+Internet+Explorer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="256" data-original-width="522" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjndKWZ41Y5vMa3f4rpNtUctRDQgyZlmiIp4-VdW4NRQyGF6_Bm9F3pFfZ27kW5TrQyJPVtd-5KgzOiprCymYzmBDVNt5QQL7hfBVZB74xa2Wby68C1jWwWoN00hdE3hHBOrvh6ExV1S-t6/s320/2017-08-04+10_41_08-CustomList+-+%25D0%2592%25D1%2581%25D0%25B5+%25D1%258D%25D0%25BB%25D0%25B5%25D0%25BC%25D0%25B5%25D0%25BD%25D1%2582%25D1%258B+-+Internet+Explorer.png" width="320" /></a></div>
<br /></div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-78446107434914139712017-08-01T01:24:00.001-07:002017-08-01T01:25:33.349-07:00Mount-SPContentDatabase : Could not connect to sharepoint using integrated security: Cannot connect to database master at SQL server at sharepoint.<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Сегодня при обновлении базы с 2013 на 2016 столкнулся с ошибкой<br />
<blockquote class="tr_bq">
Mount-SPContentDatabase : Не удалось подключиться к sp_sql, используя встроенную проверку подлинности: Не удается подключиться к базе данных master на сервере SQL в sp_sql. Возможно, база данных не существует, или у текущего пользователя нет разрешения на подключение к ней.</blockquote>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGtBREBH2jJfSuQV8MCgnA1pdpzXIGj7ym-BFoGu82PvZF6Py3c-UnDKpTHkEVDKxnZDPgN6prLDS_AIgi7d-pB6iY2EAHhhl8JHtgkekuQWf60KAzHuGn30MTMlzbDKr3Z4oMAGF09YZ5/s1600/2017-08-01+11_15_47-sp16-wfe01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="177" data-original-width="1017" height="55" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGtBREBH2jJfSuQV8MCgnA1pdpzXIGj7ym-BFoGu82PvZF6Py3c-UnDKpTHkEVDKxnZDPgN6prLDS_AIgi7d-pB6iY2EAHhhl8JHtgkekuQWf60KAzHuGn30MTMlzbDKr3Z4oMAGF09YZ5/s320/2017-08-01+11_15_47-sp16-wfe01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" width="320" /></a></div>
<br />
Mount-SPContentDatabase "DB_HR" -DatabaseServer "sp_sql" -WebApplication http://portal.ru<br />
<br />
Хотя ферма работает, работает и учетная запись имеет соответствующие права на SQL<br />
<br />
<a name='more'></a><br />
в эвентах можно было найти<br />
<blockquote class="tr_bq">
Unknown SQL Exception 53 occurred. Additional error information from SQL Server is included below.</blockquote>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc-Kn8dilF940RxGBrUIHQcgfrKM9dx7PdvqaNKlXLTUCzsw1keQkp7PQkX8JChDPLbGFPARimmvTfdrVRl2uPNzu_CPnhBexiEuICjMcKs0kIWAcHLv1BadqyZhgVxSvhBbNV44tNAgEK/s1600/2017-08-01+11_22_14-sp16-wfe01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="469" data-original-width="662" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc-Kn8dilF940RxGBrUIHQcgfrKM9dx7PdvqaNKlXLTUCzsw1keQkp7PQkX8JChDPLbGFPARimmvTfdrVRl2uPNzu_CPnhBexiEuICjMcKs0kIWAcHLv1BadqyZhgVxSvhBbNV44tNAgEK/s320/2017-08-01+11_22_14-sp16-wfe01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" width="320" /></a></div>
<br />
Много что было проверено, но все оказалось гораздо проще.<br />
Нужно было веб приложение (url) брать в кавычки (')<br />
<div>
<br /></div>
Mount-SPContentDatabase "DB_HR" -DatabaseServer "sp-sql" -WebApplication 'http://portal.ru'<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUliqpOWAai-NGMQ6LG86qZNBoItnLyzp81IikHrzHZm95-Q5NdfV6_B292IT5dXBNsU-EKB8-upmaKTuzKMk362xI26-FnKT2C9lKxuGJgwyy9AkwLYknTMACwFxRHUONkroVL3KToPLM/s1600/2017-08-01+11_16_35-sp16-wfe01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="169" data-original-width="939" height="57" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUliqpOWAai-NGMQ6LG86qZNBoItnLyzp81IikHrzHZm95-Q5NdfV6_B292IT5dXBNsU-EKB8-upmaKTuzKMk362xI26-FnKT2C9lKxuGJgwyy9AkwLYknTMACwFxRHUONkroVL3KToPLM/s320/2017-08-01+11_16_35-sp16-wfe01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" width="320" /></a></div>
<br />
Надеюсь статья будет вам полезна :)</div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-81664534316024049002017-06-05T06:49:00.001-07:002022-05-31T03:17:58.576-07:00Опрос с картинками (Sharepoint Survey Image Question)<div dir="ltr" style="text-align: left;" trbidi="on">
Появилась задача по созданию голосования для выбора лучшей фотографии.<br />
есть стандартный функционал голосования, но в нем нет возможности вставить изображения.<br />
<br />
<br />
И пришлось прибегнуть к кастомизации страницы с помощью jQuery. Так же для зумирования изображения была использована библиотека <a href="https://github.com/s-yadav/ImageViewer">ImageViewer</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH5TEHUDyOKvyg8mDCJIS6Ru7Dt00ImfqMiKat43luO544vYkvjgIGCnpTtXzrzYSu01Gz0vOf7fp5nW049UG27xEdBoTCAaEx5CWuLjijaeztPIOjvBdXjUored_-Kqki8pigr9omaT_G/s1600/%25D0%25BE%25D0%25BF%25D1%2580%25D0%25BE%25D1%2581.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="466" data-original-width="822" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH5TEHUDyOKvyg8mDCJIS6Ru7Dt00ImfqMiKat43luO544vYkvjgIGCnpTtXzrzYSu01Gz0vOf7fp5nW049UG27xEdBoTCAaEx5CWuLjijaeztPIOjvBdXjUored_-Kqki8pigr9omaT_G/s320/%25D0%25BE%25D0%25BF%25D1%2580%25D0%25BE%25D1%2581.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<a name='more'></a><br />
<br />
И так к обзору решения.<br />
Все достаточно просто. Пробегаем по всем вариантам ответов и в блок с вариантом ответа добавляем div с изображением.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdPb5mHMFM4zDlG-JJrwNzVbAH0bwKE6ACn_t_aFlnMCg1nzJtpMlw01hFDvbFk34yYoOZVWYTqE_mIuJFj182inpgCMvSFns6e2v3NEPUgxY5uJJWevGKOx0cdyBQg1Sn1Ag9V7qB41ws/s1600/2017-06-05+16_30_17-%25D0%25A4%25D0%25BE%25D1%2582%25D0%25BE%25D0%25BA%25D0%25BE%25D0%25BD%25D0%25BA%25D1%2583%25D1%2580%25D1%2581+%25D0%2591%25D0%25B0%25D0%25BA%25D1%2583+2017+-+%25D0%25A1%25D0%25BE%25D0%25B7%25D0%25B4%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5+%25D1%258D%25D0%25BB%25D0%25B5%25D0%25BC%25D0%25B5%25D0%25BD%25D1%2582%25D0%25B0.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="686" data-original-width="827" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdPb5mHMFM4zDlG-JJrwNzVbAH0bwKE6ACn_t_aFlnMCg1nzJtpMlw01hFDvbFk34yYoOZVWYTqE_mIuJFj182inpgCMvSFns6e2v3NEPUgxY5uJJWevGKOx0cdyBQg1Sn1Ag9V7qB41ws/s320/2017-06-05+16_30_17-%25D0%25A4%25D0%25BE%25D1%2582%25D0%25BE%25D0%25BA%25D0%25BE%25D0%25BD%25D0%25BA%25D1%2583%25D1%2580%25D1%2581+%25D0%2591%25D0%25B0%25D0%25BA%25D1%2583+2017+-+%25D0%25A1%25D0%25BE%25D0%25B7%25D0%25B4%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5+%25D1%258D%25D0%25BB%25D0%25B5%25D0%25BC%25D0%25B5%25D0%25BD%25D1%2582%25D0%25B0.png" width="320" /></a></div>
<br />
!!! ВАЖНО название изображения должно совпадать с вариантом ответа и иметь расширение jpg.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE5nOANKvxPO0xnyat02XpTqBQDL0CSkDwv7L844Wtcx21kLVw3NwPLORd9XxrafFCCkVXaBYOZ-9wqNZApEebJkdw1M0JqhaJydr8dWpQpoQ6y3La2hinf2P339vq2q5Q7sLndnoz1dYK/s1600/2017-06-05+16_30_57-%25D0%25A4%25D0%25BE%25D1%2582%25D0%25BE%25D0%25BA%25D0%25BE%25D0%25BD%25D0%25BA%25D1%2583%25D1%2580%25D1%2581+%25D0%2591%25D0%25B0%25D0%25BA%25D1%2583+2017+-+%25D0%25A1%25D0%25BE%25D0%25B7%25D0%25B4%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5+%25D1%258D%25D0%25BB%25D0%25B5%25D0%25BC%25D0%25B5%25D0%25BD%25D1%2582%25D0%25B0.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="301" data-original-width="640" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE5nOANKvxPO0xnyat02XpTqBQDL0CSkDwv7L844Wtcx21kLVw3NwPLORd9XxrafFCCkVXaBYOZ-9wqNZApEebJkdw1M0JqhaJydr8dWpQpoQ6y3La2hinf2P339vq2q5Q7sLndnoz1dYK/s320/2017-06-05+16_30_57-%25D0%25A4%25D0%25BE%25D1%2582%25D0%25BE%25D0%25BA%25D0%25BE%25D0%25BD%25D0%25BA%25D1%2583%25D1%2580%25D1%2581+%25D0%2591%25D0%25B0%25D0%25BA%25D1%2583+2017+-+%25D0%25A1%25D0%25BE%25D0%25B7%25D0%25B4%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5+%25D1%258D%25D0%25BB%25D0%25B5%25D0%25BC%25D0%25B5%25D0%25BD%25D1%2582%25D0%25B0.png" width="320" /></a></div>
<br />
Как пользоваться<br />
В файле core.js поменять путь до места хранения фото<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4OxcQvduEYy8QKl8U-wnrrBPgB-W9tY82gl1FBzgcBTAu1JBZ054VTF9tD_R-mE0Rvx1izoU0knoBGA3BiIg2oxjqtZG_ROA4tDW2_IKRbHKKzSze2qoQsFqkn7x0TU8hC2Axi8iWgNR5/s1600/2017-06-05+16_38_46-core.js+-+Photo+Baku+2017+-+Visual+Studio+Code.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="247" data-original-width="1127" height="70" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4OxcQvduEYy8QKl8U-wnrrBPgB-W9tY82gl1FBzgcBTAu1JBZ054VTF9tD_R-mE0Rvx1izoU0knoBGA3BiIg2oxjqtZG_ROA4tDW2_IKRbHKKzSze2qoQsFqkn7x0TU8hC2Axi8iWgNR5/s320/2017-06-05+16_38_46-core.js+-+Photo+Baku+2017+-+Visual+Studio+Code.png" width="320" /></a></div>
<br />
Добавить веб часть редактор контента и в нем указать ссылку на index.html<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbal-iWBy9psoq-IxciPD1hce1kwFpM76Mn_s4ioCaXggM-3_t3GMt_YryuQeepk-rAa8OBfHt0WZ9ZVZTDbjG45209t60enk2X0ffToK_OCaBc8xwoapKGJ60eMagwdF-YFPu3XTEvTQa/s1600/2017-06-05+16_35_04-%25D0%25A4%25D0%25BE%25D1%2582%25D0%25BE%25D0%25BA%25D0%25BE%25D0%25BD%25D0%25BA%25D1%2583%25D1%2580%25D1%2581+%25D0%2591%25D0%25B0%25D0%25BA%25D1%2583+2017+-+%25D0%25A1%25D0%25BE%25D0%25B7%25D0%25B4%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5+%25D1%258D%25D0%25BB%25D0%25B5%25D0%25BC%25D0%25B5%25D0%25BD%25D1%2582%25D0%25B0.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="381" data-original-width="883" height="137" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbal-iWBy9psoq-IxciPD1hce1kwFpM76Mn_s4ioCaXggM-3_t3GMt_YryuQeepk-rAa8OBfHt0WZ9ZVZTDbjG45209t60enk2X0ffToK_OCaBc8xwoapKGJ60eMagwdF-YFPu3XTEvTQa/s320/2017-06-05+16_35_04-%25D0%25A4%25D0%25BE%25D1%2582%25D0%25BE%25D0%25BA%25D0%25BE%25D0%25BD%25D0%25BA%25D1%2583%25D1%2580%25D1%2581+%25D0%2591%25D0%25B0%25D0%25BA%25D1%2583+2017+-+%25D0%25A1%25D0%25BE%25D0%25B7%25D0%25B4%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5+%25D1%258D%25D0%25BB%25D0%25B5%25D0%25BC%25D0%25B5%25D0%25BD%25D1%2582%25D0%25B0.png" width="320" /></a></div>
<br />
Код js<br />
<pre class="brush:js">'use strict'
_spBodyOnLoadFunctionNames.push("getStarted");
function getStarted()
{
// добавляем изображения
var spanArray = jQuery(".ms-RadioText");
spanArray.each(function( index ) {
var labelText = $( this ).text();
jQuery( this ).after('<div class="divImage">
<img alt="'+labelText + '" class="gallery-items" data-high-res-src="/SiteCollectionImages/Фото%20Баку%202017/'+ labelText +
'.jpg" src="/SiteCollectionImages/Фото%20Баку%202017/'+ labelText +
'.jpg" /></div>
');
});
// активируем зумм
var viewer = ImageViewer();
$('.gallery-items').click(function () {
//console.log("clik")
var imgSrc = jQuery(this).attr("data-high-res-src");
var highResolutionImage = $(this).data('high-res-img');
//console.log(imgSrc, highResolutionImage);
viewer.show(imgSrc, highResolutionImage);
});
};
</pre>
<br />
Css<br />
<pre class="brush:css">.gallery-items {
width: 250px;
cursor: pointer;
border-width: 2px;
border-color: #92c0e0;
border-style: double;
}
.ms-RadioText label{
font-size: large;
}
.divImage{
text-align: right;
margin: 10px;
}
.divImage :hover {
box-shadow: 0 0 10px rgba(0,0,0,0.5);
}
.ms-RadioText {
width: 250px!important;
}
.ms-formbody span table tr:nth-child(2n){
background-color: rgba(128, 128, 128, 0.15);
}
.ms-formbody span table tr td{
width: 450px;
}
</pre>
<br />
HTML<br />
<pre class="brush:html"><script src="/Style%20Library/Js/jquery-1.11.1.min.js" type="text/javascript"></script>
<script src="/Style%20Library/ImageViewer-master/imageviewer.min.js" type="text/javascript"></script>
<script src="/Style Library/PhotoSurvey/core.js" type="text/javascript"></script>
<link href="/Style%20Library/ImageViewer-master/imageviewer.css" rel="stylesheet" type="text/css"></link>
<link href="/Style Library/PhotoSurvey/style.css" rel="stylesheet" type="text/css"></link>
</pre>
<br />
<br />
вот результат<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMj7OdAWaoz5JQsDv61ZIJaEZI_IgBd0S_Py6iVYyEwD_23xEI0rn3dO6twt1rVwEx7bBrcxzyGMRhNYJEvydXHSAOIuWhR996HyH4FKCc-9lcLxMEcWcYHNufoFQIJYCKMZQKG36DHpG7/s1600/%25D0%25BE%25D0%25BF%25D1%2580%25D0%25BE%25D1%2581.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="788" data-original-width="1108" height="227" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMj7OdAWaoz5JQsDv61ZIJaEZI_IgBd0S_Py6iVYyEwD_23xEI0rn3dO6twt1rVwEx7bBrcxzyGMRhNYJEvydXHSAOIuWhR996HyH4FKCc-9lcLxMEcWcYHNufoFQIJYCKMZQKG36DHpG7/s320/%25D0%25BE%25D0%25BF%25D1%2580%25D0%25BE%25D1%2581.gif" width="320" /></a></div>
<br />
Весь проект <a href="https://drive.google.com/drive/folders/0BxdYSYWhKHrbQVFlY0dNZzVyOEE?resourcekey=0-1RokRjSKPfrMY77ZCaz7Fw&usp=sharing">можно скачать тут</a>.<br />
<br />
UPD<br />
для оптимизации загрузки страницы можно использовать стандартный функционал позволяющий получать меньший размер изображения. <a href="https://blog.mastykarz.nl/image-renditions-sharepoint-2013/">подробнее можно почитать тут</a><br />
<br />
<div>
я добавил свой размер изображения и превю будет иметь меньший размер<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkfYMfKTNJ62MuaWA7BL0m0eHnMgowod9y_QDwqLbWH5lGRAOax7WEqslF5hdBF71E8R7x7-Kgg6i3M50ThshYyWCKs6dpwTxuqcJcF8XxvDTN63l6kbldqxCjw9y9WO0lHNygT_1xxTPM/s1600/2017-06-06+14_29_32-%25D0%259F%25D1%2580%25D0%25B5%25D0%25B4%25D1%2581%25D1%2582%25D0%25B0%25D0%25B2%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25B8%25D1%258F+%25D0%25B8%25D0%25B7%25D0%25BE%25D0%25B1%25D1%2580%25D0%25B0%25D0%25B6%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B9+-+Internet+Explorer.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="295" data-original-width="739" height="127" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkfYMfKTNJ62MuaWA7BL0m0eHnMgowod9y_QDwqLbWH5lGRAOax7WEqslF5hdBF71E8R7x7-Kgg6i3M50ThshYyWCKs6dpwTxuqcJcF8XxvDTN63l6kbldqxCjw9y9WO0lHNygT_1xxTPM/s320/2017-06-06+14_29_32-%25D0%259F%25D1%2580%25D0%25B5%25D0%25B4%25D1%2581%25D1%2582%25D0%25B0%25D0%25B2%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25B8%25D1%258F+%25D0%25B8%25D0%25B7%25D0%25BE%25D0%25B1%25D1%2580%25D0%25B0%25D0%25B6%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B9+-+Internet+Explorer.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU4vJYPZFrdHzaztG9vodsUjgPrXKUaemIo-1gBObekNaeFPEXKrkeox_DrNCat6w_TSBEGWNqtZlQS9TaLNzQBKV9U88BF4NC8gASWJJsY-iOGZB3LYI0FFcHmsXaUJiAi751IWVyqwgh/s1600/2017-06-06+12_43_04-core.js+-+Visual+Studio+Code.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="229" data-original-width="656" height="111" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU4vJYPZFrdHzaztG9vodsUjgPrXKUaemIo-1gBObekNaeFPEXKrkeox_DrNCat6w_TSBEGWNqtZlQS9TaLNzQBKV9U88BF4NC8gASWJJsY-iOGZB3LYI0FFcHmsXaUJiAi751IWVyqwgh/s320/2017-06-06+12_43_04-core.js+-+Visual+Studio+Code.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br /></div>
</div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-37752949987314850002017-04-18T02:20:00.000-07:002017-04-19T05:34:29.359-07:00Итоги (суммирование) для вычисляемого поля в представлении.<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
В этой статье я расскажу как можно вывести итоги для вычисляемого поля.<br />
по умолчанию SharePoint не предоставляет возможности вывести сумму по Calculated field, но мы можем это исправить и изменить шаблон рендера представления CSR и самостоятельно посчитать сумму.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIYrZzbnvMbT3RV8yuySX5xPd7efrsN1auVSXdtb7bmzGxnZKkwoOqun3ELetGmKgw0jZlidzeMwWvLD3o9nid8_uMmhmIf47tc2_t0fIWXrY9ppe4jraMf1Bki-6jwiYI54LdtQAtYZ_l/s1600/2017-04-18+11_37_10-Test+-+%25D0%2592%25D1%2581%25D0%25B5+%25D1%258D%25D0%25BB%25D0%25B5%25D0%25BC%25D0%25B5%25D0%25BD%25D1%2582%25D1%258B.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="94" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIYrZzbnvMbT3RV8yuySX5xPd7efrsN1auVSXdtb7bmzGxnZKkwoOqun3ELetGmKgw0jZlidzeMwWvLD3o9nid8_uMmhmIf47tc2_t0fIWXrY9ppe4jraMf1Bki-6jwiYI54LdtQAtYZ_l/s320/2017-04-18+11_37_10-Test+-+%25D0%2592%25D1%2581%25D0%25B5+%25D1%258D%25D0%25BB%25D0%25B5%25D0%25BC%25D0%25B5%25D0%25BD%25D1%2582%25D1%258B.png" width="320" /></a></div>
<br />
<a name='more'></a>и так начнем.<br />
хочу рассказать что решение получилось достаточно универсальным и не зависит:<br />
1. сколько полей вычисляемых полей мы можем вывести.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfLod8T3GCpgfzIEiigEM5u8wIIqpj9zvpEUFS56kpmT4VF5wqQD3QQR7gRaPPO9UlfTRlkbMxIaZTxKw8-B2YUUQh_kevIyFGyh5N-W8wduZdBrWNy8bUecaON1CWnOyNuzk2DfyUcWgW/s1600/2017-04-18+12_11_24-Test+-+%25D0%2592%25D1%2581%25D0%25B5+%25D1%258D%25D0%25BB%25D0%25B5%25D0%25BC%25D0%25B5%25D0%25BD%25D1%2582%25D1%258B.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="153" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfLod8T3GCpgfzIEiigEM5u8wIIqpj9zvpEUFS56kpmT4VF5wqQD3QQR7gRaPPO9UlfTRlkbMxIaZTxKw8-B2YUUQh_kevIyFGyh5N-W8wduZdBrWNy8bUecaON1CWnOyNuzk2DfyUcWgW/s320/2017-04-18+12_11_24-Test+-+%25D0%2592%25D1%2581%25D0%25B5+%25D1%258D%25D0%25BB%25D0%25B5%25D0%25BC%25D0%25B5%25D0%25BD%25D1%2582%25D1%258B.png" width="320" /></a></div>
<br />
2. положение поля вычисляется в коде (есть проблемы если вычисляемое поле первое с лева).<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZdgAwQbW7IeyZVVXCYxhc4P3Fz1sF5XSPD7AT0NTy1bnbhyJag3n3-D9wlpQvb1PHU2Cv-xueRAws5CHaZoNHo786CmmUstdepiAOoRma4-klmALNiXb14cn6Uffhvj8x8ifJvvWRLcsf/s1600/%25D0%25BF%25D0%25BE%25D0%25BB%25D0%25BE%25D0%25B6%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25B2%25D1%258B%25D1%2587%25D0%25B8%25D1%2581%25D0%25BB%25D1%258F%25D0%25B5%25D0%25BC%25D0%25BE%25D0%25B3%25D0%25BE+%25D0%25BF%25D0%25BE%25D0%25BB%25D1%258F.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZdgAwQbW7IeyZVVXCYxhc4P3Fz1sF5XSPD7AT0NTy1bnbhyJag3n3-D9wlpQvb1PHU2Cv-xueRAws5CHaZoNHo786CmmUstdepiAOoRma4-klmALNiXb14cn6Uffhvj8x8ifJvvWRLcsf/s320/%25D0%25BF%25D0%25BE%25D0%25BB%25D0%25BE%25D0%25B6%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25B2%25D1%258B%25D1%2587%25D0%25B8%25D1%2581%25D0%25BB%25D1%258F%25D0%25B5%25D0%25BC%25D0%25BE%25D0%25B3%25D0%25BE+%25D0%25BF%25D0%25BE%25D0%25BB%25D1%258F.gif" width="320" /></a></div>
<br />
3. отображается ли стандартная панель итогов или нет.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqAnORBOyJStNdlu8PFR3VxgflKnv6aom41aerQSdGaMA9IFMfdQPAgZUWU_Zs1AXQZCBQd30XifPmp3A0XQtmre_kDEfetGU9JQinc8exb5Sg8DiygVF4lrf-Erf6UUkOkBWdK3psVSTz/s1600/%25D0%25B5%25D1%2581%25D1%2582%25D1%258C+%25D1%2581%25D1%2582%25D0%25B0%25D0%25BD%25D0%25B4%25D0%25B0%25D1%2580%25D1%2582%25D0%25BD%25D0%25B0%25D1%258F+%25D0%25BF%25D0%25B0%25D0%25BD%25D0%25B5%25D0%25BB%25D1%258C.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqAnORBOyJStNdlu8PFR3VxgflKnv6aom41aerQSdGaMA9IFMfdQPAgZUWU_Zs1AXQZCBQd30XifPmp3A0XQtmre_kDEfetGU9JQinc8exb5Sg8DiygVF4lrf-Erf6UUkOkBWdK3psVSTz/s320/%25D0%25B5%25D1%2581%25D1%2582%25D1%258C+%25D1%2581%25D1%2582%25D0%25B0%25D0%25BD%25D0%25B4%25D0%25B0%25D1%2580%25D1%2582%25D0%25BD%25D0%25B0%25D1%258F+%25D0%25BF%25D0%25B0%25D0%25BD%25D0%25B5%25D0%25BB%25D1%258C.gif" width="320" /></a></div>
<br />
<br />
как использовать:<br />
необходимо в шаблоне указать id вычисляемого поля<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg18pBfdMT-t68qiD8ImfF3pwH-ffL9X_Kbm5YKfvUd7xP52H7-0YCcyo5SNYNQ6nT8HmtQqHsFN1r9BmH8tDnRTSLoWntG0xYAYz_W-nUxMe4QAi-hPPm99LEZViorOGbGC-9CwGrEf6XU/s1600/2017-04-18+12_18_02-sumJs.js+-+Visual+Studio+Code.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="116" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg18pBfdMT-t68qiD8ImfF3pwH-ffL9X_Kbm5YKfvUd7xP52H7-0YCcyo5SNYNQ6nT8HmtQqHsFN1r9BmH8tDnRTSLoWntG0xYAYz_W-nUxMe4QAi-hPPm99LEZViorOGbGC-9CwGrEf6XU/s320/2017-04-18+12_18_02-sumJs.js+-+Visual+Studio+Code.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
файл можно скачать по ссылке <a href="https://drive.google.com/open?id=0BxdYSYWhKHrbQmY2X1dob3hJRUk">sumJs.js</a><br />
<br />
<pre class="brush:js">
SP.SOD.executeFunc("clienttemplates.js", "SPClientTemplates", function() {
function getBaseHtml(ctx) {
return SPClientTemplates["_defaultTemplates"].Fields.default.all.all[ctx.CurrentFieldSchema.FieldType][ctx.BaseViewID](ctx);
};
function init() {
var totalSum = {};
var ctx = {};
ctx.Templates = {};
ctx.OnPostRender = postRenderer;
ctx.Templates.Fields = {
"calc": { 'View': summation }, // указать ID поля
"Sum": { 'View': summation }, // указать ID поля
};
SPClientTemplates.TemplateManager.RegisterTemplateOverrides(ctx);
function postRenderer(ctx){
console.log(totalSum);
for(var f in totalSum){
var fieldId = f;
var fieldSum = Math.round(totalSum[f] * 100) / 100;
var fiedPOsition = getCellField(ctx,fieldId);
if(! jQuery("#aggr"+ ctx.wpq).length > 0){
var tableId = ctx.listName + "-" + ctx.view;
var tr = "<tr>";
for (var i = 0; i < ctx.ListSchema.Field.length+2; i++) {
tr+="<td></td>";
};
tr+="</tr>";
var tbody = '<tbody id="aggr'+ ctx.wpq +'">'+tr+'</tbody>';
jQuery("[id='"+tableId+"'] tbody").before(tbody);
}
jQuery("#aggr"+ ctx.wpq).find("tr").children().eq(fiedPOsition -1).html("<b>Sum= " + fieldSum + "</b>");
};
};
function summation(ctx){
var fieldValue = ctx.CurrentItem[ctx.CurrentFieldSchema.RealFieldName];
if(fieldValue){
var currSum = fieldValue.replace(",",".").replace(/\s/g,"")*1;
if(!isNaN(currSum)){
var sum = totalSum[ctx.CurrentFieldSchema.RealFieldName];
if(sum){
totalSum[ctx.CurrentFieldSchema.RealFieldName] = sum + currSum;
}else{
totalSum[ctx.CurrentFieldSchema.RealFieldName] = currSum;
};
};
}
return '<div align="right" class="ms-number">'+ fieldValue + '</div>';
};
};
function getCellField(Ctx, NameField) {
for (var f = 0; f < Ctx.ListSchema.Field.length; ++f) {
var listField = Ctx.ListSchema.Field[f];
if (listField.Name == NameField) {
return f + 3;
};
};
return null;
};
//RegisterModuleInit(SPClientTemplates.Utility.ReplaceUrlTokens("~siteCollection/Style Library/sumJs.js"), init);
init();
});
</pre>
</div>
</div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-45811038348999437892017-03-28T02:35:00.000-07:002017-03-28T02:35:02.427-07:00ValidateCredentialClaims - Access Denied: Claims stored in the credentials did not match with the group claim for a group app.<div dir="ltr" style="text-align: left;" trbidi="on">
<div>
Сегодня планировал настроить синхронизацию внешнего списка с «Настраиваемым списком» SharePoint по средствам PowerShell, но столкнулся с ошибкой </div>
<div>
<br /></div>
<blockquote class="tr_bq">
The shim execution failed unexpectedly - Access is denied to the Secure Store Service </blockquote>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy9QuPsrhClIYmqzdDFeO2ZCznwr6UdkbfhJ_4PQdYUc0Cipw_bQJwiQE38JGVPQTDC4iXNi6s0zKaOttbGRGJPrKFygu7hkfp4wh5jrsmshv_EiRaqXoCZgJtnuvG79R2PbnA03zLtOi2/s1600/2017-03-28+12_31_11-sp-wfe01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy9QuPsrhClIYmqzdDFeO2ZCznwr6UdkbfhJ_4PQdYUc0Cipw_bQJwiQE38JGVPQTDC4iXNi6s0zKaOttbGRGJPrKFygu7hkfp4wh5jrsmshv_EiRaqXoCZgJtnuvG79R2PbnA03zLtOi2/s320/2017-03-28+12_31_11-sp-wfe01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" width="320" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
В ULS нашел:</div>
<blockquote class="tr_bq">
ValidateCredentialClaims - Access Denied: Claims stored in the credentials did not match with the group claim for a group app.</blockquote>
<br />
<div>
<a name='more'></a><br /></div>
<div>
При том, через браузер я видел содержимое внешнего списка.</div>
<div>
Проверил настроийки, ничего подозрительного не нашел.</div>
<div>
Решил перенастроить заново и о чудо, завелось.</div>
<div>
Оказалось, что нужно указывать не All, а All_Users.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg80ovaUOWfcjGfHgMT1VmJPxrf29zRXuMsEtxvLuOXs3WQxJfN3hp1fhBbwCQ-80Jw27kJWOcy5bz6GmvofqHc3BYzMLca5qf1mpoSy8ONs3GhwLvGlbYIqy6WEQJIzIBg6MYn8JPhFZly/s1600/2017-03-28+12_28_56-sp-wfe01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg80ovaUOWfcjGfHgMT1VmJPxrf29zRXuMsEtxvLuOXs3WQxJfN3hp1fhBbwCQ-80Jw27kJWOcy5bz6GmvofqHc3BYzMLca5qf1mpoSy8ONs3GhwLvGlbYIqy6WEQJIzIBg6MYn8JPhFZly/s320/2017-03-28+12_28_56-sp-wfe01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" width="320" /></a></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcVNYEHkq5qtzq9X7RUCE9OuHSguMhePk5OvHr_e2ZscvvgTMOL71TOZTyUTC4n32g-ER1LAgxJLYrS11kAU_Z59dZvyMFFc7K_zgfQUd_xODEE99Geeq9eP7GkYmDg2dpPgo9RhMmpCLB/s1600/2017-03-28+12_27_48-sp-wfe01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="243" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcVNYEHkq5qtzq9X7RUCE9OuHSguMhePk5OvHr_e2ZscvvgTMOL71TOZTyUTC4n32g-ER1LAgxJLYrS11kAU_Z59dZvyMFFc7K_zgfQUd_xODEE99Geeq9eP7GkYmDg2dpPgo9RhMmpCLB/s320/2017-03-28+12_27_48-sp-wfe01+%25E2%2580%2594+%25D0%259F%25D0%25BE%25D0%25B4%25D0%25BA%25D0%25BB%25D1%258E%25D1%2587%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BA+%25D1%2583%25D0%25B4%25D0%25B0%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25BD%25D0%25BE%25D0%25BC%25D1%2583+%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2587%25D0%25B5%25D0%25BC%25D1%2583+%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D1%2583.png" width="320" /></a></div>
<div>
<br /></div>
</div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-61012571447522271422017-01-27T07:32:00.003-08:002020-05-26T12:26:58.972-07:00Проверка выбранного значение в PeoplePicker при сохранении элемента<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="MsoNormal">
В этой статье я расскажу, как можно осуществлять проверку
выбранного значения в поле типа «Пользователь или группа». И так будем
проверять что в поле выбран пользователь отличный от текущего. В случае если он
выбрал сам себя, то ему будет выведено сообщение об этом.<o:p></o:p></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghLgGdb2Ag-IJVVUhAZK742xZgHuLSPKQn4zAsMzP1xUDqLesnVUsO6sBf0eL82HoP4cyZDiJMRRwKeay4TGWiTD2G0oN3l99lAzBbtmwO2VVSIxfJlkLsZJNUAHmQuO4MLqbAkJEvHQjU/s1600/user.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="153" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghLgGdb2Ag-IJVVUhAZK742xZgHuLSPKQn4zAsMzP1xUDqLesnVUsO6sBf0eL82HoP4cyZDiJMRRwKeay4TGWiTD2G0oN3l99lAzBbtmwO2VVSIxfJlkLsZJNUAHmQuO4MLqbAkJEvHQjU/s320/user.gif" width="320" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
</div>
<a name='more'></a><br />
<br />
<div class="MsoNormal">
Первым делом, после загрузки страницы, нам нужно получить
текущего пользователя. <o:p></o:p></div>
<div class="MsoNormal">
<pre class="brush:js">// получение текущего пользователя
function getCurrentUser() {
var dfd = jQuery.Deferred();
var currentUser;
if (SP.ClientContext != null) {
SP.SOD.executeOrDelayUntilScriptLoaded(getUser, 'sp.js');
}
else {
SP.SOD.executeFunc('sp.js', null, getUser);
}
function getUser() {
var context = new SP.ClientContext.get_current();
var web = context.get_web();
currentUser = web.get_currentUser();
context.load(currentUser);
context.executeQueryAsync(onSuccessMethod, onRequestFail);
}
function onSuccessMethod(sender, args) {
//currUser = currentUser;
dfd.resolve(currentUser);
}
function onRequestFail(sender, args) {
console.log('ошибка получения пользователя' + args.get_message() + '\n' + args.get_stackTrace());
dfd.reject(args);
}
return dfd.promise();
};
</pre>
</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
На выходе будет промис, который будет знать получены
асинхронные данные или нет, и какие данные получены.<o:p></o:p></div>
<div class="MsoNormal">
Вторая функция получает значение из поля <span lang="EN-US">PeoplePicker</span>.<o:p></o:p></div>
<div class="MsoNormal">
<pre class="brush:js">function getPPValue(fieldId) {
var strFieldId = jQuery("[id ^= '" + fieldId + "']").attr("id");
var field = SPClientPeoplePicker.SPClientPeoplePickerDict[strFieldId];
var ui = field.GetAllUserInfo();
return ui;
};
</pre>
</div>
<div class="MsoNormal">
<br /></div>
<br />
<div class="MsoNormal">
Третья функция проверки, в момент нажатия на кнопку «Сохранить». <o:p></o:p></div>
<div class="MsoNormal">
<pre class="brush:js">function PreSaveAction() {
var PPvalue = getPPValue("User")
var result = false;
currUser.done(function (res) {
if(PPvalue[0] && PPvalue[0].Key == res.get_loginName()){
console.log(PPvalue[0].Key, res.get_loginName());
alert("Выберите другого пользователя")
result = false;
}else{
// alert(res.get_loginName())
result = true;
};
});
return result;
}
</pre>
</div>
<div class="MsoNormal">
<br />
<br /></div>
Решение полностью<br />
<script src="/Style%20Library/Js/jquery-1.11.1.min.js" type="text/javascript"></script>
<script src="/Style%20Library/test/test.js" type="text/javascript"></script>
<br />
<pre class="brush:js"><script src="/Style%20Library/Js/jquery-1.11.1.min.js" type="text/javascript"></script>
<script src="/Style%20Library/test/test.js" type="text/javascript"></script>
/// содежимое test.js
var currUser;
_spBodyOnLoadFunctionNames.push("WorkingWithFields");
function WorkingWithFields()
{
currUser = getCurrentUser();
}
// получение текущего пользователя
function getCurrentUser() {
var dfd = jQuery.Deferred();
var currentUser;
if (SP.ClientContext != null) {
SP.SOD.executeOrDelayUntilScriptLoaded(getUser, 'sp.js');
}
else {
SP.SOD.executeFunc('sp.js', null, getUser);
}
function getUser() {
var context = new SP.ClientContext.get_current();
var web = context.get_web();
currentUser = web.get_currentUser();
context.load(currentUser);
context.executeQueryAsync(onSuccessMethod, onRequestFail);
}
function onSuccessMethod(sender, args) {
//currUser = currentUser;
dfd.resolve(currentUser);
}
function onRequestFail(sender, args) {
console.log('ошибка получения пользователя' + args.get_message() + '\n' + args.get_stackTrace());
dfd.reject(args);
}
return dfd.promise();
};
// получение данные из поля PeoplePicker
function getPPValue(fieldId) {
var strFieldId = jQuery("[id ^= '" + fieldId + "']").attr("id");
var field = SPClientPeoplePicker.SPClientPeoplePickerDict[strFieldId];
var ui = field.GetAllUserInfo();
return ui;
};
function PreSaveAction() {
var PPvalue = getPPValue("User")
var result = false;
currUser.done(function (res) {
if(PPvalue[0] && PPvalue[0].Key == res.get_loginName()){
console.log(PPvalue[0].Key, res.get_loginName());
alert("Выберите другого пользователя")
result = false;
}else{
// alert(res.get_loginName())
result = true;
};
});
return result;
}
</pre>
</div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0tag:blogger.com,1999:blog-3592967929339635640.post-83018122996482938422017-01-11T05:54:00.002-08:002017-01-11T06:24:12.813-08:00Копирование и применение мастер страницы на все сайты веб приложения.<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="display: none;">replacement master page across all sites Web application copying master </div>
<div class="MsoNormal">
Думаю, что многие сталкивались с задачей замены мастер страницы в большом количестве сайтов. В моем случае это было порядка 30 коллекций в которых есть под сайты. Если менять страницу руками, то это будет занимать продолжительное время. Поэтому мне было проще написать скрип, который все сделает сам.<o:p></o:p></div>
<div class="MsoNormal">
</div>
<a name='more'></a>Скрипт размещенный ниже обращается в веб приложению, получает все коллекции сайтов. Берет файл из указанной директории, загружает его в каталог и публикует файл.<br />
Далее применяет новую masterpage для корневого сайта и наследует эту страницу для всех под сайтов.<br />
Как пользоваться:<br />
<blockquote class="tr_bq">
Нужно заменить значение в переменных:<br />
$docLibraryName<br />
$docLibraryUrlName<br />
$localFolderPath </blockquote>
<pre class="brush:ps">cls
$docLibraryName = "Коллекция главных страниц" # название библиотеки
$docLibraryUrlName = "_catalogs/masterpage/My" # расположение папки для загрузки
$localFolderPath = "C:\Users\User\Desktop\" # путь к файлу masterpage
$webApp = Get-SPWebApplication http://web.app.ru/ # web application
foreach ($SiteCollection in $webApp.Sites)
{
Write-Host $SiteCollection.Url
$docLibrary = $SiteCollection.RootWeb.Lists[$docLibraryName]
write-host $docLibrary
$files = ([System.IO.DirectoryInfo] (Get-Item $localFolderPath)).GetFiles()
ForEach($file in $files)
{
if($file.Name.Contains(".master"))
{
write-host $file
#Open file
try
{
$fileStream = ([System.IO.FileInfo] (Get-Item $file.FullName)).OpenRead()
#Add file
$folder = $SiteCollection.RootWeb.getfolder($docLibraryUrlName)
write-host "Copying file " $file.Name " to " $folder.ServerRelativeUrl "..."
$SiteCollection.GetFile
$spFile = $folder.Files.Add($folder.Url + "/" + $file.Name,[System.IO.Stream]$fileStream, $true)
$spFile.Publish("")
write-host "Success"
#Close file stream
$fileStream.Close()
Write-Host "Set masterPage"
$SiteCollection.RootWeb.MasterUrl = $SiteCollection.ServerRelativeUrl +"/"+ $docLibraryUrlName+"/" + $file.Name
$SiteCollection.RootWeb.MasterUrl
$rootMasterUrl = $SiteCollection.RootWeb.MasterUrl
$rootSiteLogo = "/_layouts/15/images/logo_clear.png"# $SiteCollection.RootWeb.SiteLogoUrl
ForEach ($web in $SiteCollection.AllWebs)
{
write-host $web.Url
if(($web.Url -eq 'http://site.ru/SearchCenter')-or($web.Url -eq 'http://site/SearchCenter') ) # сайты на которых не нужно применять masterpage
{
write-host "/SearchCenter"
}
else
{
try{
Disable-SPFeature –identity "MDSFeature" -URL $web.URL -confirm:$false
}
catch
{
Write "Error: $file.name: $_" #>>c:\logfile.txt
continue;
}
write-host $web.Title $web.Url
$web.MasterUrl = $rootMasterUrl #адрес кастомной страницы в корневом сайте
$web.SiteLogoUrl = $rootSiteLogo
$web.Update()
}
$web.Dispose()
}
}
catch
{
Write "Error: $file.name: $_" >>c:\logfile.txt
continue;
}
}
}
$SiteCollection.RootWeb.Update()
$SiteCollection.Dispose()
}
</pre>
<div class="MsoNormal">
<br /></div>
</div>
Kaplin Vladimirhttp://www.blogger.com/profile/17156047886310112992noreply@blogger.com0