Получение ссылки на элемент списка в SharePoint Javascript COM

Работая с клиентской объектной моделью SharePoint через Javascript, у меня появилась необходимость получить ссылку на элемент списка. Причем если список является библиотекой, то всё просто — нужно получить поле FileRef — оно и хранит ссылку на файл библиотеки документов.

Со списком немного сложней, но есть поле FileDirRef, хранящее путь до списка, например, http://site/Lists/BrandCentralNews. Значит можно добавить название страницы отображения с идентификатором, вот так: http://site/Lists/BrandCentralNews/Dispform.aspx?ID=3.

Ниже основные участки кода:

    //Указываем какие поля получить из списка в CAML-запросе
    var camlQuery = new SP.CamlQuery();
    camlQuery.set_viewXml("<View><ViewFields> \
	    <FieldRef Name='ID'></FieldRef> \
	    <FieldRef Name='FileDirRef'></FieldRef> \
	    <FieldRef Name='Title'></FieldRef> \
    </ViewFields> \
    <Query><OrderBy><FieldRef Name='Modified' Ascending='False' /></OrderBy></Query><RowLimit>100</RowLimit></View>");
    
    this.collListItem = oList.getItems(camlQuery);

    ...

    var oListItem = listItemEnumerator.get_current();
    var url = oListItem.get_item('FileDirRef') + "/Dispform.aspx?ID=" + oListItem.get_item('ID');

Кажется, что ссылка должна храниться в поле LinkTitle, но нет, видимо поле формируется в runtime, а не хранится в БД SharePoint.

Рубрика: SharePoint | Добавить комментарий

Unit-тесты SharePoint 2013 в Visual Studio 2013: PlatformNotSupportedException

UPD 17 февраля 2015: Коллега, подсказал, что у него в январе 2015 года получилось запустить Unit-тесты из VS2013 через NUnit Test Adapter и отлаживать. Возможно повлиял какой-то апдейт студии, который к этому времени появился.

Использовать Unit-тесты очень удобно при любой разработке. Хотелось иметь такую возможность и в SharePoint 2013 из Visual Studio 2013. В интернетах нигде информации не нашёл, а ошибка повторялась:

sp13-unitTesting

PlatformNotSupportedException was unhandled by user code:
An exception of type ‘System.PlatformNotSupportedException’ occurred in Microsoft.SharePoint.dll but was not handled in user code
Additional information: Microsoft SharePoint is not supported in 32-bit process. Please verify that you are running in a 64-bit executable.

Сначала я использовал встроенный проект MSTest. Ошибка происходит при попытке создать SPSite, он работает из x64 сборки, а тесты, видимо, запускаются под x86(32). Как я не пытался решить с помощью настройки TEST->Test Settings->Default Processor Architecture -> X64, то не помогало.

В NUnit то же самое. Но тут я продвинулся:)
1. Нужно установить NUnit testing framework на компьютере;
2. Дальше для тестового проекта (предварительного созданного) через меню Manage NuGet Packages for Solution установить NUnit;
3. Собрать сборку тестового проекта
4. В PowerShell перейти в папку с установленным nunit.exe — это утилита запуска NUnit тестов
5. Запустить из папки nunit.exe «путьДоПапки/YourTestProject.dll»
6. В запустившейся утилите можно запускать тесты, внутри которых корректно работает SPSite и другие классы Microsoft.Sharepoint.dll !
7. Подключить Visual Studion 2013 для отладки к процессу nunit-agent.exe и можно даже отлаживать тесты.

В итоге задача решена, но, конечно, хотелось бы запускать и дебажить тесты напряиую из VS. Работаю над этим.
UPD: задача решена, см. начало статьи

Рубрика: SharePoint, Без рубрики, Удобный код, Это интересно | Метки: NUnit, PlatformNotSupportedException, SharePoint 2013, unit-testing, Visual Studio 2013, x64, тестирование | 1 комментарий

Ошибка в Powershell: «simple command» not recognized as the name of a cmdlet

Столкнулся с ошибкой в Powershell: «simple command» not recognized as the name of a cmdlet. Не работала в том числе команда cd. Дело оказалось в переменной среды, Powershell смотрит указанные пути в поисках модулей.
Решение такое:
1. Перейти Computer -> Properties -> Change settings -> Advanced -> Environment Variables:
2. Отредактировать System Variable с именем PSModulePath — к существующей строке без пробелов добавить точку с запятой и значение:
%SystemRoot%\system32\WindowsPowerShell\v1.0\Modules\;
3. Итоговый вид строки PSModulePath у меня такой:
;c:\Program Files\AppFabric 1.1 for Windows Server\PowershellModules;
c:\Program Files (x86)\Microsoft SQL Server\110\Tools\PowerShell\Modules\;
%SystemRoot%\system32\WindowsPowerShell\v1.0\Modules\;

Рубрика: Без рубрики | Метки: cd, not recognized cmdlet, Powershell, PSModulePath | Добавить комментарий

SharePoint 2013 — загрузить файл цветовой схемы .spcolor

Как загрузить файл цветовой схемы SharePoint 2013 .spcolor через интерфейс? Подумал я сегодня утром. Ответ: перейти в браузере по вот такой ссылке siteurl/_catalogs/theme/15.

Быстро перейти на страницу Change the look, чтобы применить новую схему: siteurl/_layouts/15/designgallery.aspx.

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

Рубрика: SharePoint, Без рубрики | Метки: change the look, SharePoint 2013, spcolor, url | Добавить комментарий

Невозможно выполнить поиск, поскольку этому сайту не назначен индексатор в SharePoint 2010

Всем привет!

На днях столкнулся с ошибкой веб-части отображения результатов поиска Sharepoint 2010. Всё бы ничего, погуглил, нашёл статью на stackoverflow.com, починил. НО, как же это перевести обратно на английский сообщение об ошибке:)

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

Оказывается, вот так: Your search cannot be completed because this site is not assigned to an indexer. Contact your administrator for more information.

Мне помогли шаги из статьи на английском блога автора Kirk Barrett:

  1. Перейти в центр администрирования Central Administration > Application Management > Manage Content Databases (Underneath Databases)
  2. Выбрать на странице нужную базу данных контента для web application — по щелчку откроется страница Manage Content Database Settings
  3. Удостовериться, что сервер поиска правильно выбран на странице Manage Content Database Settings, выбрать, если нет
  4. Можно дополнительно проверить настройку сервера для Timer Jobs

Удачи! Скорейшего SharePoint 2013 вам!:)

Рубрика: SharePoint, Без рубрики | Добавить комментарий

SharePoint 2010 + VS 2012 + VisualWebPart = невозможно?

Столкнулся с необходимостью добавить в проект SharePoint веб-часть VisualWebPart (веб-часть с ascx контролом) в Visual Studio 2012. Оказалось, что это не так просто. Студия далеко не всегда корректно работает с проектом SharePoint (надеюсь, баги будут правиться, вот и 13я студия вышла), хотя надо отметить что по сравнению с версией 2010 сделан большой шаг вперёд в плане удобства добавления новых частей в проект.

Суть проблемы: при добавлении в проект Visual Web Part из шаблонов модулей, предлагаемых студией, ascx файл контрола не генерируется, и кроме того появляется ошибка неописанного метода InitializeControls().

После пары часов тщетных попыток скопировать другую веб-часть и переименовать, перенести веб-часть из пустого проекта, удалить CKSDev, перезагрузить компьютер… в сети я наткнулся на решение проблемы от, как мне кажется, восходящей звезды SharePoint трабл киллинг блоггинга Anatoly Mironov http://chuvash.eu/2012/09/20/the-original-visual-web-part-template-is-missing-in-visual-studio-2012/. Автору огромное спасибо!

Решение. Вот краткий перевод и пересказ оригинала. Решение проблемы состоит в замене шаблона для Visual Web Part в vs2012 версией шаблона из vs2010.
Шаги:
1. Скопировать в отдельное место zip-файл из папки со студией 2010 (взять с компьютера со студией 2010 или по ссылке из статьи) и разархивировать:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates\CSharp\SharePoint\SharePoint14\1033\
SharePoint14VisualWebPart.zip

2. Изменить в файле SharePointVisualWebPart.vstemplate версию сборки на 11 (для 12ой студии). Должно выглядеть так:
Microsoft.VisualStudio.SharePoint.ProjectExtensions.Wizards, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a

3. Нужно на всякий случай забекапить оригинальный шаблон. Переименовываем — добавляем окончание .bak в папках 12ой студии файлу SharePointVisualWebPart.vstemplate:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplates\CSharp\SharePoint\SharePoint14\1033\
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplatesCache\CSharp\SharePoint\SharePoint14\1033\

4. В те же 2 папки скопировать шаблон студии 2010 (с изменённым на шаге 2 файлом):
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplates\CSharp\SharePoint\SharePoint14\1033\
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplatesCache\CSharp\SharePoint\SharePoint14\1033\

Рубрика: SharePoint | Метки: SharePoint | Добавить комментарий

Быстрый переход наверх страницы, как вконтакте

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

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

Ссылка на демо (откроется в новом окне)

Не представляю, как я жил без этой кнопки раньше, если её нет на сайте, а прокрутка большая, то меня ломает:)

Вот как это выглядит (для тех, кто ещё не видел демо):
Быстрый переход наверх страницы
Нажатием на серую область слева, браузер «отскролит» нас наверх.

Инструменты: html, javascript, jquery.

Алгоритм:
1. Берем нужный шаблон джумлы, вордпресса или страницу сайта
2. Добавляем на страницу область-кнопку

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

Я добавил div перед закрывающим тегом элемента wrap (на моей странице wrap имеет фиксированную ширину и выровнен посередине).

<div id="up-button" >
	<div>Наверх<div>
<div>

И стили для области перехода (пояснения в комментариях):

<style type="text/css">
/*Left fast top scroll*/
#up-button
{
/*
позиция элемента - фиксированная на странице, в левом верхнем углу;
так же задаём 100% высоту и получаем область на всю 
левую часть экрана шириной 100px
*/
position: fixed; 
top: 0; 
left: 0; 
width:100px; 
height:100%; 
background: #D1D1D1; 
display: none;/*скрываем область по умолчанию*/
}

#up-button div
{
/*элемент с подписью названия области*/
font-weight: bold;
font-size: 14px;
width:50px;
margin: 5px auto;
color: #636363;
}
</style>

3. Добавляем на страницу javascript для своевременного отображения области и реакции на клик

<script type="text/javascript">
//высота в пикселях, при прокрутке на которую, появится область для быстрого возврата слева
var scrollButtonLimit = 300;

//фукнция для инициализации решения
function InitScrollNavigation() {
	//применён jQuery
	//получаем область быстрого возврата наверх (div) в переменную
	var upButton = $("#up-button");

	//навешиваем реакцию на каждое событие скрола от пользователя
	$(window).scroll(function (e) {
		var scrollTop = $(window).scrollTop();//получаем значение прокрутки
		if (scrollTop > scrollButtonLimit) {//значение больше заданной константы - показываем кнопку
		  $(upButton).show();
		  return;
		}
		if (scrollTop <= scrollButtonLimit) {//значение меньше заданной константы - скрываем кнопку
		  $(upButton).hide();
		  return;
		}
	});
	
	//навершиваем реакцию на событие при клике на область, скролим пользователя наверх 
	$(upButton).click(function (e) {
		$(window).scrollTop(0);
	});
}

$(document).ready(function() {
	//навешиваем обработчики при загрузке страницы
	InitScrollNavigation();	
});
</script>


Вот наша область быстрого перехода и готова!
Прокручиваем вниз, появляется кнопка слева, щёлкаем, переходим наверх.

Возможно, кому-то достаточно и этого для покрытия задач.

Но мы всё равно переходим к созданию меню:)

4. Помечаем нужные «якори» — теги <a name="your-anchor-name">your-element-name</a>, на которые мы хотим переходить на странице.

Ключевым для нас является атрибут name, о нём ещё будет сказано дальше (он может реализовать стандартный механизм переходов html).

Например, такая вёрстка:

<p><strong><a name="brod-artisti">Бродячие артисты</a></strong></p>
<p style="color: #4E76C2;">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas et metus ac arcu sollicitudin lacinia ac ac risus.
</p>
<p><strong><a name="veselo-tancuut">Весело танцуют</a></strong></p>
<p style="color: #C2544E;">
Aliquam tempor enim aliquet nisl ultrices pellentesque. Maecenas ultrices nulla et eros euismod pellentesque. Nam mattis mattis mi sit amet semper. Nam aliquam leo lacus. ...
</p>

4. Добавляем меню

<ul id="video-menu" >
	<li><a onclick="return ScrollToTarget(this);" href="#brod-artisti">Бродячие артисты</a></li>
	<li><a onclick="return ScrollToTarget(this);" href="#veselo-tancuut">Весело танцуют</a></li>
</ul>

Функцией ScrollToTarget по окончании действий возвращается значение false, что не даёт браузеру перейти по ссылке.

5. Добавляем реакцию по клику на пункт меню для перехода на конент

<script type="text/javascript">
//функция, которая будет вызываться при клике на ссылку в меню
function ScrollToTarget(element) {
	//получем ссылку, выбираем из неё всё, что после # - название элемента a, куда мы хотим перейти
	var elHref = $(element).attr('href');		
	var name = elHref.substring(elHref.lastIndexOf('#') + 1, elHref.length);

	//получаем позицию скрола элемента, на который должен быть осуществлён переход
	var targetTop = $("#video-content").find("a[name='" + name + "']").offset().top;

	//скролим пользователя на элемент (чуть выше элемента - для эргономики)
	$(window).scrollTop(targetTop - 5);
	
	return false;
}
</script>

Меню готово! Щёлкаем на одном из пунктов — переходим на него на странице.

Возвращаясь к тегу <a/> с атрибутом name, этот атрибут позволяем делать ссылки внутри страницы (якори) на нужные элементы. Если убрать из тега меню <a onclick="return ScrollToTarget(this);" href="#brod-artisti">Текст ссылки</a> функцию на onclick, отработает стандартный механизм, который модифицирует ссылку (что нам не нужно); но механизм перехода наверх всё равно будет работать.

Спасибо за внимание!
Удачи и до новых встреч на просторах сети!

P.S. Надо добавить описанный скрол в блог:)

Рубрика: Веб-дизайн | Комментарии (2)

Узнать район по адресу — очень просто!

Район по адресу - изображение с сайта
Любой, кто хоть раз пытался узнать район города по адресу, знает, что это не так просто, даже с помощью поисковика и карты… Для таких случаев, я написал небольшой сервис — raionpoadresu.ru. Я пользуюсь, мне нравится.

Рубрика: Это интересно | Комментарии (15)

Подключить сервис сокращения ссылок bit.ly к ASP.NET сайту

Недавно столкнулся с интересной задачей, нужно было прикрутить короткие ссылки к ASP.NET сайту. Использовал один из самых известных сервисов коротких ссылок — bit.ly Документация к API на английском.

Как это работает: bit.ly создаёт короткую ссылку на нашу ссылку. Таким образом, идёт запрос к bit.ly, а bit.ly «перекидывает» пользователя на наш адрес.

Алгоритм такой:
1. Регаемся на bitly.com

2. Для запросов на короткие ссылки, нам понадобится авторизация, чтобы сервис мог вести квоты по запросам. Я использовал «api key», то есть передавал логин и ключ в get-запросе прямо в ссылке. Узнаём свой api key по адресу http://bitly.com/a/your_api_key.

3. Будем использовать ссылку /v3/shorten (описание). Теперь нам нужно всего лишь создать get-запрос (можно прямо через браузер) вида:

http://api-ssl.bitly.com/v3/shorten?format=xml&longUrl=_longurl_&login=_login_&apiKey=_apikey_

Здесь нужно подставить login — получен на шаге 1, apiKey — получен на шаге 2, longUrl — ссылка, которую хотим укоротить (начиная с http://).
Мы указали format=xml для получения результата в этом формате.

4. Проверили, всё работает через браузер. Теперь нужно создать программный запрос. Вот класс, в нём запрограммировано, как это сделать:

public static class BitlyApi
    {
        private const string HttpStatusOk = "200";
        private const string ApiSslUrl = "http://api-ssl.bitly.com/v3/shorten";
        private const string Login = "ваш_логин";
        private const string ApiKey = "ваш_ключ";

        public static string GetShortenedUrl(string longUrl)
        {
            string url = string.Format("{0}?format=xml&longUrl={1}&login={2}&apiKey={3}",
                                       ApiSslUrl, HttpUtility.UrlEncode(longUrl), Login, ApiKey);
            XDocument resultXml = XDocument.Load(url);

            if (resultXml.Descendants("status_code").FirstOrDefault().Value == HttpStatusOk)
            {
                XElement shortUrlElement = resultXml.Descendants("data").Elements("url").FirstOrDefault();
                if (shortUrlElement != null)
                {
                    //всё в порядке, возвращаем короткую ссылку
                    return shortUrlElement.Value;
                }
            }

            //что-то пошло не так - возвращаем, исходную длинную ссылку
            return longUrl;
        }
    }

Использован метода XDocument.Load(string url), который создаёт XDocument из полученного в ответе на запрос xml-файла. Проверяется пришедший в xml status_code и если всё нормально, идёт небольшой разбор, получение значения нужной ветки файла и возвращается коротка ссылка!

Рубрика: Без рубрики | Добавить комментарий

pinterest.com — любопытный сервис, у которого, как мне кажется, есть будущее

Source: afisha.ru via Rustam on Pinterest

Рубрика: Это интересно | Метки: pinterest, Un bonheur n'arrive jamais seul, Любовь с препятствиями, фильм | Добавить комментарий