Welcome to TechNet Blogs Sign in | Join | Help

Разгон страниц Sharepoint: жесткая оптимизация

Кому-то еще на тренинге обещала опубликовать код того IHttpModule с помошью которого я облегчала вес страниц sharepoint. Вообщем вот он.

    /// <summary>
    /// Модуль очистки вывода от ненужных тегов
    /// </summary>
    public class OutputCleanupModule : IHttpModule
    {
        /// <summary>
        /// Инициализация
        /// </summary>
        /// <param name="app"></param>
        public void Init(HttpApplication app)
        {
            app.ReleaseRequestState                    += new EventHandler(InstallResponseFilter);
        }
        /// <summary>
        /// Инсталировать фильтр вывода
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void InstallResponseFilter(object sender, EventArgs e)
        {
            HttpResponse response                    = HttpContext.Current.Response;
            HttpRequest request                        = HttpContext.Current.Request;
            if ("text/html" == response.ContentType && true == request.Url.AbsolutePath.EndsWith(".aspx")
                && false == request.Url.AbsolutePath.Contains("_layouts/"))
            {
                SPWeb web                            = SPContext.Current.Web;
                if(false == web.DoesUserHavePermissions(SPBasePermissions.ManageLists))                                    
                    response.Filter                    = new OutputCleanupFilter(response.Filter);
            }
        }
        /// <summary>
        /// Очистка ресурсов
        /// </summary>
        public void Dispose()
        {
        }
    }

    /// <summary>
    /// Фильтр очистки вывода от ненужных тегов
    /// </summary>
    public class OutputCleanupFilter : Stream
    {
        private static String[] completeTagsToCleanup    = new String[]
        {
            "<meta name=\"GENERATOR\" content=\"Microsoft SharePoint\" />",
            "<input type=\"hidden\" name=\"__SPSCEditMenu\" id=\"__SPSCEditMenu\" value=\"true\" />"+System.Environment.NewLine,
            "<input type=\"hidden\" name=\"MSOWebPartPage_PostbackSource\" id=\"MSOWebPartPage_PostbackSource\" value=\"\" />"+System.Environment.NewLine,
            "<input type=\"hidden\" name=\"MSOTlPn_SelectedWpId\" id=\"MSOTlPn_SelectedWpId\" value=\"\" />"+System.Environment.NewLine,
            "<input type=\"hidden\" name=\"MSOTlPn_View\" id=\"MSOTlPn_View\" value=\"0\" />"+System.Environment.NewLine,
            "<input type=\"hidden\" name=\"MSOTlPn_ShowSettings\" id=\"MSOTlPn_ShowSettings\" value=\"False\" />"+System.Environment.NewLine,
            "<input type=\"hidden\" name=\"MSOGallery_SelectedLibrary\" id=\"MSOGallery_SelectedLibrary\" value=\"\" />"+System.Environment.NewLine,
            "<input type=\"hidden\" name=\"MSOGallery_FilterString\" id=\"MSOGallery_FilterString\" value=\"\" />"+System.Environment.NewLine,
            "<input type=\"hidden\" name=\"MSOTlPn_Button\" id=\"MSOTlPn_Button\" value=\"none\" />"+System.Environment.NewLine,
            "<input type=\"hidden\" name=\"MSOAuthoringConsole_FormContext\" id=\"MSOAuthoringConsole_FormContext\" value=\"\" />"+System.Environment.NewLine,
            "<input type=\"hidden\" name=\"MSOAC_EditDuringWorkflow\" id=\"MSOAC_EditDuringWorkflow\" value=\"\" />"+System.Environment.NewLine,
            "<input type=\"hidden\" name=\"MSOSPWebPartManager_DisplayModeName\" id=\"MSOSPWebPartManager_DisplayModeName\" value=\"Browse\" />"+System.Environment.NewLine,
            "<input type=\"hidden\" name=\"MSOWebPartPage_Shared\" id=\"MSOWebPartPage_Shared\" value=\"\" />"+System.Environment.NewLine,
            "<input type=\"hidden\" name=\"MSOLayout_LayoutChanges\" id=\"MSOLayout_LayoutChanges\" value=\"\" />"+System.Environment.NewLine,
            "<input type=\"hidden\" name=\"MSOLayout_InDesignMode\" id=\"MSOLayout_InDesignMode\" value=\"\" />"+System.Environment.NewLine,
            "<input type=\"hidden\" name=\"MSOSPWebPartManager_OldDisplayModeName\" id=\"MSOSPWebPartManager_OldDisplayModeName\" value=\"Browse\" />"+System.Environment.NewLine,
            "<input type=\"hidden\" name=\"MSOSPWebPartManager_StartWebPartEditingName\" id=\"MSOSPWebPartManager_StartWebPartEditingName\" value=\"false\" />"+System.Environment.NewLine,
            //"_spBodyOnLoadWrapper();",
      };
        private static String[] tagsToCleanup        = new String[]
        {
            "<link rel=\"stylesheet\" type=\"text/css\" href=\"/_layouts/1033/styles/core.css?rev=",
            "<link rel=\"stylesheet\" type=\"text/css\" href=\"/Style%20Library/en-US/Core%20Styles/Band.css",
            "<link rel=\"stylesheet\" type=\"text/css\" href=\"/Style%20Library/en-US/Core%20Styles/Controls.css",
            "<link rel=\"stylesheet\" type=\"text/css\" href=\"/_layouts/1033/styles/HtmlEditorCustomStyles.css?rev=",
            "<link rel=\"stylesheet\" type=\"text/css\" href=\"/_layouts/1033/styles/HtmlEditorTableFormats.css?rev=",

            "<link rel=\"stylesheet\" type=\"text/css\" href=\"/_layouts/1049/styles/core.css?rev=",
            "<link rel=\"stylesheet\" type=\"text/css\" href=\"/Style%20Library/ru-RU/Core%20Styles/Band.css",
            "<link rel=\"stylesheet\" type=\"text/css\" href=\"/Style%20Library/ru-RU/Core%20Styles/Controls.css",
            "<link rel=\"stylesheet\" type=\"text/css\" href=\"/_layouts/1049/styles/HtmlEditorCustomStyles.css?rev=",
            "<link rel=\"stylesheet\" type=\"text/css\" href=\"/_layouts/1049/styles/HtmlEditorTableFormats.css?rev=",

            //"<input type=\"hidden\" name=\"__REQUESTDIGEST\" id=\"__REQUESTDIGEST\"",
            //"<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=",
      };
        private static string[] scriptsToCleanup    = new String[]
        {
            "<script type=\"text/javascript\" language=\"javascript\" src=\"/_layouts/1033/core.js?rev=",
            "<script type=\"text/javascript\" language=\"javascript\" src=\"/_layouts/1033/init.js?rev=",
            "<script type=\"text/javascript\" language=\"javascript\" src=\"/_layouts/1033/ie55up.js?rev=",
            "<script type=\"text/javascript\" language=\"javascript\" src=\"/_layouts/1033/non_ie.js?rev=",

            "<script type=\"text/javascript\" language=\"javascript\" src=\"/_layouts/1049/core.js?rev=",
            "<script type=\"text/javascript\" language=\"javascript\" src=\"/_layouts/1049/init.js?rev=",
            "<script type=\"text/javascript\" language=\"javascript\" src=\"/_layouts/1049/ie55up.js?rev=",
            "<script type=\"text/javascript\" language=\"javascript\" src=\"/_layouts/1049/non_ie.js?rev=",

            //"<script src=\"/WebResource.axd?",
            "<script> var MSOWebPartPageFormName = 'aspnetForm'",
            "<script type=\"text/javascript\" language=\"javascript\" src=\"/_layouts/portal.js?rev=",
            "<script type=\"text/javascript\">"+System.Environment.NewLine+"<!--"+System.Environment.NewLine+"var __wpmExportWarning",
            "<script type=\"text/JavaScript\" language=\"JavaScript\">"+System.Environment.NewLine+"<!--"+System.Environment.NewLine+"var L_Menu_BaseUrl",
        };

        private Stream responseStream;
        private long position;

        public OutputCleanupFilter(Stream inputStream)
        {
            this.responseStream                        = inputStream;
        }

        public override void Write(Byte[] buffer, Int32 offset, Int32 count)
        {
            StringBuilder html                        = new StringBuilder(System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count));
            foreach (String completeTagToClean in completeTagsToCleanup)
            {
                this.CleanUp(html, completeTagToClean, null);
            }
            foreach (String tagToClean in tagsToCleanup)
            {
                this.CleanUp(html, tagToClean, ">");
            }
            foreach (String scriptToClean in scriptsToCleanup)
            {
                this.CleanUp(html, scriptToClean, "</script>");
            }
            Byte[] data                                = System.Text.UTF8Encoding.UTF8.GetBytes(html.ToString());
            responseStream.Write(data, 0, data.Length);
        }
        /// <summary>
        /// Удаление патернов
        /// </summary>
        /// <param name="html"></param>
        /// <param name="search"></param>
        /// <param name="endTag"></param>
        private void CleanUp(StringBuilder html, String search, String endTag)
        {
            Int32 startPos                            = html.ToString().IndexOf(search, StringComparison.OrdinalIgnoreCase);
            if (-1 != startPos)
            {
                if (false == String.IsNullOrEmpty(endTag))
                {
                    Int32 endPos                    = html.ToString().IndexOf(endTag, startPos, StringComparison.OrdinalIgnoreCase);
                    if (-1 != endPos)
                        html.Remove(startPos, endPos - startPos + endTag.Length);
                }
                else
                {
                    html.Remove(startPos, search.Length);
                }
            }
        }
//**************************************************
// Stream
//**************************************************
        #region Stream
        public override bool CanRead
        {
            get
            {
                return true;
            }
        }
        public override bool CanSeek
        {
            get
            {
                return true;
            }
        }
        public override bool CanWrite
        {
            get
            {
                return true;
            }
        }
        public override void Close()
        {
            responseStream.Close();
        }
        public override void Flush()
        {
            responseStream.Flush();
        }
        public override long Length
        {
            get
            {
                return 0;
            }
        }
        public override long Position
        {
            get
            {
                return position;
            }
            set
            {
                position = value;
            }
        }
        public override long Seek(long offset, SeekOrigin origin)
        {
            return responseStream.Seek(offset, origin);
        }
        public override void SetLength(long length)
        {
            responseStream.SetLength(length);
        }
        public override int Read(byte[] buffer, int offset, int count)
        {
            return responseStream.Read(buffer, offset, count);
        }
        #endregion Stream
    }


* This source code was highlighted with Source Code Highlighter.

На всякий случай  напоминаю. Модуль просто так не заработает. Сборку надо класть в GAC и прописывать модуль в web.config

Веб-части для Sharepoint

Одной из наиболее распространенных и повседневных задачь разработчика для платформы Sharepoint является разработка веб-частей. Это наиболее гибкий и доступный способ расширения функционала платформы. Несмотря на то, что в интернете сейчас достаточно статей про разработку веб-частей, не многие знают про все возможности и ньюансы.

Кому и зачем это надо?

Разрабатывая интернет сайт или внутренний корпоративный портал программисты стремятся к эллегантности кода и повторному использованию. Вы знаете, что Sharepoint – это платформа и для того, чтобы ваше решение было успешным - необходимо разрабатывать дополнительный функционал, будь то сервис новостей на сайте или сложные системы отчетности и документооборота, который будет обладать легкой и гибкой настройкой. Итак, основные преимущества веб-частей – это повторное использование и  возможность добавления\настройки\использования через веб-интерфейс пользователями, которые могут не являться разработчиками и вообще могут не иметь отношения к IT. С элементами управления и пользовательскими элементами управления это сделать сложнее.

Веб-части прекрасно отчуждаемы от вашего решения и переносимы.

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

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

 

Основы основ

Для разработки нам понадобятся

·         Microsoft® Visual Studio® 2005 или Microsoft® Visual Studio® 2008

·         Visual Studio Extensions for Windows SharePoint Services 3.0 (для VS2005 или VS 2008).

 

В принципе можно разрабатывать и без экстеншна, создавая проект типа Class Library. Но установив extension вам станут доступны новые шаблоны проектов. Один из них – для разработки веб-частей.

 

Для того, чтобы создать веб-часть надо написать класс в Visual Studio .Net - наследник от одного из стандартных классов веб-частей.

Так исторически сложилось, что Sharepoint поддерживает два вида веб-частей.

  • Веб-части ASP.NET - наследуются от класса веб частей из System.Web.dll. Импортируются в .webpart файлы. Это наиболее рекомендуемый вариант.
  • Веб-части Windows SharePoint Services - наследуются от класса веб частей из Microsoft.Sharepoint.dll. Импортируются в .dwp файлы. Поддерживается для обратной связи с Sharepoint v2.

Наша первая веб часть может выглядеть следующим образом:

 

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

Установка веб-части на Sharepoint тоже не является непосильной задачей. Для этого необходимо:

·         Положить сборку с кодом веб-части (.dll файл) в GAC (C:\Windows\assembly) или в bin папку в IIS веб-сайта

·         Прописать веб-часть в web.config

 

 

·         Добавить в библиотеку веб-частей Sharepoint. Для этого на коллекции узлов надо зайти в библиотеку веб-частей и перейти на страницу добавления веб-части. Если в веб конфиге всё было прописано правильно вы должны увидеть namespace вашей веб-части и сможете её добавить в библиотеку

 

 

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

Разгоняем Sharepoint до скорости Highload интернет сайта

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

В этой статье я коротко опишу основные возможности по кэшированию, используя которые можно существенно ускорить работу портала.

·         Во-первых можно включать механизмы кеширования страниц Sharepoint через веб интерфейс

·         Возможно включать кэширование объектов и использовать кэширование в разработанных вами веб-частях и элементах управления

·         Существует BLOB cache и сжатие средствами IIS

·         Необходимо делать оптимизацию страниц и мастер страниц, то есть отключать core.js и core.css там, где они не нужны, убирать ненужные элементы управления и т.д. Помещать ваши собственные сборки в GAC и обязательно подписывать их. Использовать <SharePointWebControls:ScriptLink runat="server"/> и   <SharePoint:CssLink ID="CssLink1" runat="server" /> для подключения css и js вместо аналогов из html.

 Теперь давайте по-порядку.

Кэширование возвращаемой страницы (Output caching)

Управляется на уровне коллекции узлов sharepoint. Кэширование вывода страницы может быть прервано для мастер страниц и дочерних узлов. Вы можете иметь разные настройки кэширования для ананимных и аутентифицированных пользователей. В стандартной поставке содержит 4 профиля, которые подходят для большинства сценариев. Страница применения профиля кэширования к коллекции сайтов выглядит следующим образом:

 

А теперь представим, что нам необходимо, чтобы при изменении какого-либо параметра в строке адреса (query string) страница бралась не из кэша, а отображалась и получала информацию заново. Этого можно достичь написав в поле Vary by Query String Parameters символ “*

 

Что делать, если на странице должны быть элементы управления с динамической информацией при этом вся остальная страница должна кэшироваться?  Нужно использовать Post-Cache Substitution control (http://www.nikhilk.net/PostCacheSubstitution.aspx)

Кэширование файлов (Blob cache)

Blob Cache помещает элементы SharePoint на диск на сервере. Опция отключена. Для включения необходимо отредактировать web.config.

 

Кэширование запросов и объектов (Object cache)

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

·         Навигация и структура портала

·         Поля и элементы списков

·         Данные отображаемые в Content by Query web part

По умолчинию кэш объектов составлет 100MB и это можно изменить через веб-интерфейс.

 

Сжатие IIS

Добавить сжатие для JS и CSS можно выполнив в командной строке на сервере:

cscript adsutil.vbs set w3svc/filters/compression/gzip/hcfileextensions "htm" "html" "txt" "js" "css"

cscript adsutil.vbs set w3svc/filters/compression/deflate/hcfileextensions "htm" "html" "txt" "js" "css"

iisreset

IHttpModule и жесткая оптимизация

Совет для тех, кого просто бесит много лишнего текста в возвращаемой браузером странице потому что он эстет или гик (ненужное зачеркнуть), или стоит задача сделать страницы совсем маленькими и легкими. Для этого пишется IHttpModule в котором в методе Init страницы убирается из возвращаемого результата всё лишнее. Только убрать надо именно лишнее, т.е. то без чего ваша страница продолжит нормально работать ;)

Заключение

В подготовке статьи участвовали мозг, НЛО и материалы с MSDN:

Output Caching and Cache Profiles

Object Caching

Disk-based Caching for Binary Large Objects

Creating and Registering a Custom HTTP Module

Post-Cache Substitution

Создание многоязычных сайтов на Sharepoint

Sharepoint позволяет быстро и без написания кода создавать и поддерживать различные локализации сайтов.

В Sharepoint есть такое понятие как Variations – варианты сайтов на различных языках. То есть вы можете через веб-интерфейс создать сайт на любом необходимом вам языке, или несколько сайтов на разных языках. При этом сайты могут иметь как одинаковую, так и разную структуру, то есть дублировать друг друга или являться независимыми друг от друга сайтами.

Для того, чтоб это было возможно необходимо:

1.      Установить Language Pack для нужного вам языка

2.      Зайти на страницу администрирования Variations и сделать что-то похожее на картинку ниже. Создать сопоставления для разных языков. При этом надо указать какая из локализаций будет основной и по какому шаблону сайта необходимо содавать локализованные копии сайтов.

 

После нажатия на кнопку “Create Hierarchies” на портале создадутся узлы для каждого из указанных вами языков.

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

 

Например, положив логотип в папку с кодом языка мы можем добавить его на страницу или мастер страницу следующим образом:

<img src=”<% $SPUrl:~SiteCollection/Style Library/~language/logo.gif %>” border=0 />

Таком образом можно использовать на страницах и  мастер страницах не только изображения, но и например CSS файлы:

<SharePoint:CssRegistration name=”<% $SPUrl:~SiteCollection/Style Library/~language/Core Styles/Band.css%>” runat=”server”/>

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

 

Его можно модифицировать, создав свой элемент управления по аналогии со стандартными VariationRootLanding и VariationLabelMenu:

 

А теперь представим, что у нас есть элементы управления, мастер страницы, страницы и веб части. Как заставить их поддерживать многоязычность? Ответ прост. Пользуемся изобретением ASP.NET, то есть ресурсными файлами (.resx)

Пример использования в коде выглядит следующим образом:

Label1.Text = Resources.devtraining_event.devtraining_EventContentFieldName;

Если вы хотите использовать данные из ресурсных файтов в xml файлах фич и шаблонов узлов Sharepoint, сделать это можно следующим образом:

 

Устанавливать ресурсные файлы надо  в папку 12\Resources:

 

Вот такого результата можно достигнуть если долго стараться.

 

Language Packs можно скачать тут:

·         MOSS 2007: скачать (104.1 MB)

·         WSS 3.0: скачать (9.8 MB)

Более подробную информацию по теме можно найти на MSDN:

·         Customizing and Branding Web Content Management-Enabled SharePoint Sites (Part 3 of 3): Creating and Configuring WCM-Enabled Sites

·         How to: Customize the Variation Root Landing Logic

·         How to: Customize the Variations Label Control Logic

Утилита по экспорту\импорту настроек SSP в xml

На codeplex уже несколько месяцев как лежит утилита, умеющая выгружать в xml и загружать xml обратно на Sharepoint настройки SSP, такие как:

  • Managed Properties
  • Crawled properties
  • Content sources
  • Search scopes

Скачать утилиту можно тут: http://www.codeplex.com/SSSPPC/ 

Пример использования:

Экспорт: SSPC.exe -o export ManagedProperties -url http://moss/ssp/admin -file output_managedproperties.xml

Импорт: SSPC.exe -o import ManagedProperties -removeexcessmappings -url http://moss/ssp/admin -file output_managedproperties.xml

Создаём Фичу для изменения дизайна

Cегодня мы будем рассматривать один из способов смены дизайна портала Sharepoint – создание фичи.

Фичи (Features) – это не только основательно задокументированные баги, а еще и механизм, позволяющий добавлять новую функциональность, веб-части, страницы, элементы дизайна на сайт или коллекцию сайтов Sharepoint.

Для того, чтобы создать фичу, необходимо создать несколько файлов в формате xml. Основным из которых является feature.xml.

Более подробно о том, как создавать фичи и что они умеют можно прочитать на сайте Microsoft MSDN по адресу http://msdn.microsoft.com/en-us/library/ms475286.aspx

Создание фичи

Можно встретить различные рекомендации по разработке SharePoint Features из Visual Studio. Я предпочитаю использовать Visual Studio 2008, создавать проект по шаблону Class Library. Многим вероятно понравится VSeWSS - расширение для Visual Studio, позволяющее создавать уже практически готовые проекты для Sharepoint.

В итоге нам надо создать проект со структурой как на картинке слева.

То есть у нас должен быть сss файл, картинки и asp.net мастер страница.

Основным файлом, необходимым для работы Feature является файл feature.xml.

Каждая Feature имеет идентификатор, название, описание и область действия (сайт, коллекция сайтов и ферма).

 

Данная фича имеет еще один xml файл CopyFiles.xml в котором то и происходит копирование картинок, css и мастер страницы c диска на сервере на портал, то есть в базу данных портала.

 

Установка

Созданную Feature скопировать в папку C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES. Там же можно посмотреть и изучить стандартные Features в Sharepoint.

Далее выполнить в командной строке: stsadm -o installfeature -name ExCustomDesign

Затем перейти на страницу активации возможностей и активировать её.

 

Далее надо применить установленную мастер страницу.

 

Избавляемся от ручной работы

А теперь, давайте избавимся от последнего шага, то есть выбора мастер страницы вручную. Для этого необходимо написать простенький FeatureReceiver:

 

И добавить в Feature.xml описание Receiver:

 

После активации фичи мы получили следующий результат.

 

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

Удачного сайтостроения!

Создание тем для сайтов Sharepoint используя CSS

Темы – самый простой и быстрый, но наименее гибкий способ изменения внешнего вида сайта Sharepoint. Поэтому, если задача стоит слегка перекрасить портал – сделайте это темами.  Для того, чтобы создать свою первую тему не требуется глубоких знаний в сайтостроении или архитектуре Sharepoint. Достаточно будет знания CSS. Применить готовую тему можно через веб интерфейс Sharepoint. Страница с выбором темы выглядит следующим образом.

 

Темы применяются для каждого сайта Sharepoint отдельно и делается это действие администратором.

Давайте создадим первую в своей жизни тему. На сервере SharePoint перейдите в папку "C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\THEMES". В ней располагаются все стандартные темы Sharepoint. Скопируйте например папку с темой "SIMPLE". Переименуйте её на ваше усмотрение. Например "HABR".

В папке " HABR" удалите все изображения и переименуйте файл SIMPLE.INF в  HABR.INF. Откройте HABR.INF и замените везде "Simple" на "HABR".

Перейдите в папку "C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS\1033\" и отредактируете SPTHEMES.XML добавив выделенный текст:

 

Ну вот и всё. Мы создали тему. Теперь вооружаемся чем-нибудь типа Internet Explorer Developer Toolbar или любым другим add-on’ом для браузера, позволяющим работать с CSS. Кстати в IE8 есть встроенная консоль для разработчиков, обладающая нужными нам возможностями.

Итак, давайте изменим логотип и перекрасим выпадающее меню Site Action.

Напишем в theme.css следующее:

#siteactiontd div, .ms-siteactionsmenu div{

background-image: none !important;

      background-color: #86C5EA !important;

      font-family: Arial !important;

      font-size: 12px;

} 

td.ms-sitetitle { 

width: 240px

height: 130px

background: 0 5px no-repeat url(habr_logo.gif)

h1.ms-sitetitle, td.ms-titleimagearea {

display: none;

} 

 

Используйте !important, когда идет речь о переопределении.

Применим тему к сайту зайдя на страницу Site Actions / Site Settings / Site Theme.

Как видите, «раскрасить»  портал – это просто! Спустя не более 20 минут у меня получился такой вот результат:

Состоялась веб-трансляция по разработке шаблонов узлов для Sharepoint

Всем присутствовавшим, спасибо!

Обещанные материалы, то есть запись, примеры кода и презентацию можно скачать тут: http://www.techdays.ru/videos/1233.html

Статьи про Sharepoint скоро на habrahabr

В этом блоге скоро начнут появляться статьи, которые потом можно будет увидеть на habrahabr.ru. Помогите сделать контент лучше. Комментируйте, критикуйте и предлагайте интересные темы.

Спасибо!

Posted by tvsmetanina | 2 Comments

Веб-трансляция

26 февраля в 12.00 я провожу веб-трансляцию по разработке сайтов Sharepoint с использованием шаблонов узлов.

Можно начинать регистрироваться.

Подробности тут: http://www.microsoft.com/Rus/Events/Detail.mspx?eventid=1032400459

Запись веб-трансляции будет выложена в последствии на techdays.ru

В погоне за новинками

Что еще делать зимним субботним вечером, кроме как съесть немного вкусного и полезного дог фуда.

Первым в меню была OC Microsoft Windows 7. Эстетически приятная глазу OC, которая быстро устанавливается и быстро работает. Установила пока только на виртуальной машине. Осталась довольна. На вирутальной машине она заняла <500 Мб памяти и 7Гб на диске. А еще на неё устанавливается Sharepoint. Это для любителей ставить его на Vista (я знаю среди вас такие имеются). 

Жду релиза и буду переезжать на Windows 7.

На закуску был Internet Explorer 8. По кнопке F12 открывается отличнейший Developer Tools, да и вообще браузер стал на много быстрее IE7. С отображением сайтов необъятного рунета никаких проблем не возникло. Разьве что в ЖЖ кое-чего не совсем корректно работает :) и при открытии стандартного узла публикации MOSS 2007 немного сместилась влево и слиплась навигационная панель. В остальном всё просто прекрасно.

Posted by tvsmetanina | 0 Comments
Filed under:

Как исключить из индексирования страницы отдельные элементы управления и части контента?

Продолжаю делиться рецептами из личного опыта. 

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

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

У меня получился вот такой элемент управления:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Web.UI;

namespace TestProject.WebControls

{

public class SearchCrawlTrimmedControl : Control

{

protected override void Render(HtmlTextWriter writer)

{

bool render = true;

if (this.Page.Request.UserAgent.ToLower().Contains("robot"))

{

render = false;

}

if (render)

{

base.Render(writer);

}

}

}

}

Использовать его можно следующим образом:

<XXX:SearchCrawlTrimmedControl runat=server >

<!-- текст и элементы управления, которые не должны индексироваться -->

</XXX:SearchCrawlTrimmedControl>

Находка дня

Столкнулась в очередной раз со следующей ошибкой при добавлении собственных пользовательских элементов управления на masterpage:

Server Error in '/' Application.
Parser Error
Description: An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately.
Parser Error Message: The page '/_catalogs/masterpage/Home.master' allows a limit of 11 direct dependencies, and that limit has been exceeded.

Смысл в том, что в web.config стоит ограничение на кол-во подключаемых элементов управления. За это отвечает параметр DirectFileDependencies и по умолчанию его значение = 10. То есть вы можете добавлять на master страницу 10 пользовательских элементов управления. В качестве решения проблемы можно отредактировать web.config поменяв значение на большее, или просмотреть вашу master страницу на наличие объявленных и не используемых пользовательских элементов управления и удалить их объявление (тэг <%@ Register ... %> ).

 

Изменение страницы Unhandled Exception (/_layouts/error.aspx)

В продолжение темы про интернет сайты создаваемые на MOSS 2007 и необходимость замены всех страниц, которые только могут увидеть пользователи, я покажу как можно переопределить стандартную страницу отображения ошибок error.aspx

Речь идет про переопределение вот этой, знакомой всем, страницы:

Переопределние производится в три шага:

1. Разработать IHttpModule и перекрыть событие Error

2. Создать страницу myerrorpage.aspx в папке 12\Template\Layouts. Создать можно скопировав и переименовав error.aspx

3. В web.config в секции httpmodules объявить модуль:

 <httpModules>
   <
clear />
   <
add name="ExceptionEventHandler" type="MyProject, MyProject.ExceptionEventHandler,
      Version=1.0.0.0, Culture=neutral,PublicKeyToken=34a2bd01f6f6eb10
" />

Ниже приведен код модуля: 

using System;

using System.Web;

using System.Web.UI;

namespace MyProject

{

/// <summary>

/// Модуль для переопределения страницы Unhandled exception

/// </summary>

public class ExceptionEventHandler : IHttpModule

{

public void Init(HttpApplication context)

{

context.Error += new EventHandler(context_Error);

}

void context_Error(object sender, EventArgs e)

{

Exception[] unhandledExceptions = HttpContext.Current.AllErrors;

foreach (Exception ex in unhandledExceptions)

{

// логировать ошибки

}

HttpContext.Current.Server.ClearError();

HttpContext.Current.Response.Clear();

HttpContext.Current.Server.Transfer("/_layouts/myerrorpage.aspx");

}

public void Dispose()

{

}

}

}

Как закрыть доступ на просмотр системмных страниц и страниц списков Sharepoint для анонимных пользователей?

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

Все оказалось очень просто. Есть стандартная фича ViewFormPagesLockdown  которая и закрывает анонимным пользователям доступ на системмные страницы и страницы работы со списками типа http://<адрес>/_layouts/viewlsts.aspx, http://<адрес>/Lists/News/DispForm.aspx ..

Фича активируется для коллекции узлов. Сделать это можно используя stsadm, или добавив в секцию SiteFeatures в файле onet.xml шаблона узла.

Удачного сайтостроения!

More Posts Next page »
 
Page view tracker