Monday, December 28, 2009

Как убрать "Действия" или "Создать " в списке или библиотеке документов

В Интернете много решений этой проблемы, в большинстве своём они весьма объёмны и задействуют jquery, просто громоздкие джаваскрипты или изменение системных шаблонов Sharepoint. Я решила пойти по более простому пути.
Сначала открываем исходный код страницы с нужным представлением - в моём случае это был "Календарь" - и находим там кнопку "Действия". Код выглядит примерно так:
<span title="Открыть меню">
<div id="zz17_ListActionsMenu_t" class="ms-menubuttoninactivehover" onmouseover="MMU_PopMenuIfShowing(this);MMU_EcbTableMouseOverOut(this, true)" hoveractive="ms-menubuttonactivehover" hoverinactive="ms-menubuttoninactivehover" onclick=" MMU_Open(byid('zz11_ActionsMenu1'), MMU_GetMenuFromClientId('zz17_ListActionsMenu'),event,false, null, 0);" foa="MMU_GetMenuFromClientId('zz17_ListActionsMenu')" oncontextmenu="this.click(); return false;" nowrap="nowrap">
<a id="zz17_ListActionsMenu" accesskey="C" href="#" style="cursor: pointer; white-space: nowrap;" onfocus="MMU_EcbLinkOnFocusBlur(byid('zz11_ActionsMenu1'), this, true);" onkeydown="MMU_EcbLinkOnKeyDown(byid('zz11_ActionsMenu1'), MMU_GetMenuFromClientId('zz17_ListActionsMenu'), event);" onclick="javascript:return false;" oncontextmenu="this.click(); return false;" menutokenvalues="MENUCLIENTID=zz17_ListActionsMenu,TEMPLATECLIENTID=zz11_ActionsMenu1" serverclientid="zz17_ListActionsMenu">
Действия
<img src="/_layouts/images/blank.gif" alt="Для открытия меню воспользуйтесь сочетанием клавиш SHIFT+ВВОД (в новом окне)." border="0">
a>
<img src="/_layouts/images/menudark.gif" alt="" align="absbottom">
div>
span>



Мы видим, что ID div'а, в который заключена нужная нам кнопка - zz17_ListActionsMenu_t.
Открываем страницу с этим представлением в Sharepoint Designer и в одном из блоков добавляем следующее:
<style type="text/css">
#zz17_ListActionsMenu_t {
  display:none;       
}
</style>


Сохраняем страницу - и вуаля! Кнопки "Действия" больше нет.
Для остальных кнопок на панели инструментов действия аналогичные.

Tuesday, December 08, 2009

создание рабочего процесса в visual studio 2008

Создание рабочих процессов для MOSS 2007 - занятие нетривиальное.
Начнём с того, что, во-первых, для разработки в visual studio 2008 она должна быть установлена на машине с MOSS 2007 (и, соответственно, серверной Windows).
Во-вторых, несмотря на то, что для MOSS рекомендуется 64хбитное окружение, разработка с использованием разрекламированных встроенных шаблонов VS возможна только в 32-битной системе.
Соответственно, заставив работать рабочий процесс на 32хбитной машине для тестов, надо перенести его на 64хбитную ферму, где он будет крутиться в боевом режиме.
Для этого сначала создаём на сервере боевой фермы папку C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\названиеРабочегоПроцесса, куда копируем файлы feature.xml и workflow.xml, любезно созданные Visual Studio 2008 (в папке проекта они находятся в bin\Debug\).
Потом DLL рабочего процесса из той же папки bin\Debug устанавливаем в GAC: есть несколько способов это сделать, я предпочитаю самый простой - просто перетащить в Проводнике файл в C:\WINDOWS\assembly.
ВНИМАНИЕ! Если в ферме несколько серверов, файлы xml и DLL нужно скопировать на ВСЕ СЕРВЕРА! Иначе будут проблемы со своевременным отрабатыванием процесса.
После этого нужно добавить feature (возможность?). Для этого на одном из серверов запускаем команду:

stsadm -o installfeature -name названиеРабочегоПроцесса

После этого запускаем команду активации:

stsadm -o activatefeature -name названиеРабочегоПроцесса -url http://sharepointsite

Параметр name при этом - название папки в FEATURES, куда были скопированы xml с описанием рабочего процесса, а параметр url должен указывать на корневой сайт Sharepoint.
После этого заходим в библиотеку документов -> Параметры -> Библиотека документов: Параметры -> Параметры рабочих процессов -> Добавить рабочий процесс - и вуаля, в списке появился наш процесс. Ура, товарищи!
Надеюсь, кому-нибудь это поможет :)

Wednesday, December 02, 2009

Ошибка при присоединении базы данных к веб-приложению

Случилась недавно такая проблема: нужно было присоединить к существующему веб-приложению базу данных контента, восстановленную из бэкапа за предыдущий день.
База данных всего занимала 65 гигабайт: после 2х с небольшим часов попытки отрабатывания команды stsadm -o addcontentdb -url http://sharepoint -databasename WSS_Content_Sharepoint80 мне выдавалось сообщение: "Обновление завершено с ошибками".
В файле C:\Program files\Common Files\Microsoft Shared\web server extensions\12\Logs\Upgrade.log писалось следующее:
--------
[SPContentDatabaseSequence] [DEBUG] [30.11.2009 21:55:53]: Executing database object restore script.
[SPUtility] [DEBUG] [30.11.2009 21:55:53]: File C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\Template\sql\storeup.sql, Time out = 7229 sec
[SPManager] [ERROR] [30.11.2009 23:56:33]: Upgrade [SPContentDatabase Name=WSS_Content_Sharepoint80 Parent=SPDatabaseServiceInstance] failed.
[SPManager] [ERROR] [30.11.2009 23:56:33]: Истекло время ожидания. Время ожидания истекло до завершения операции или сервер не отвечает.
[SPManager] [ERROR] [30.11.2009 23:56:33]: в System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
--------
Как показало наблюдение за попыткой выполнить команду addcontentdb, к моменту наступления таймаута обычно выполнялся запрос
  1. IF NOT EXISTS (SELECT id FROM sysindexes WHERE id = object_id(N'[dbo].[AuditData]') AND name = N'AuditData_OnSiteOccurredEvent')
  2. BEGIN
  3.     CREATE CLUSTERED INDEX AuditData_OnSiteOccurredEvent ON AuditData (SiteId, Occurred, Event)
  4. END
* This source code was highlighted with Source Code Highlighter.

Этот запрос был взят из упомянутого в логе Upgrade.log файла storeup.sql.
Также выяснилось, что таблица AuditData занимает 37 гигабайт (из 65 всей базы), а содержит отчёты о деятельности пользователей (которые всё равно никто не просматривает).
После чего была запущена команда Truncate Table AuditData, и была запущена снова команда addcontentdb, на этот раз завершившаяся успешно.
При попытке вернуть данные в AuditData на место снова было получено изначальное сообщение об ошибке. Поскольку эти данные пока что никому не были нужны, оставляю их в бэкапе и предоставляю накапливаться новым.
Надеюсь, кому-то это окажется полезным, и спасёт от недельного (как было в моём случае) бесплодного мозгоимения.