Настройка default.master в WSS 3.0 - PullRequest
1 голос
/ 18 марта 2009

Кто-нибудь знает, как настроить главную страницу (т.е. default.master) для сайта WSS 3.0? На самом деле, я уже знаю, как настроить главную страницу (т. Е. С помощью SharePoint Designer или текстового редактора), меня больше интересует, как настроить WSS 3.0 на использование моей настраиваемой главной страницы.

Я переименовал default.master с моей настроенной версией, и это работает, но это устанавливает его для всех сайтов WSS. Я хочу использовать версию A главной страницы для семейства сайтов A и отдельную главную страницу для других семейств сайтов.

Обратите внимание, я НЕ имею в виду MOSS 2007. Я уже знаю, как установить главную страницу для MOSS 2007. Хотя я не могу понять, как это сделать для WSS 3.0.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 19 марта 2009

Вам необходимо изменить свойство MasterUrl в объекте SPWeb, представляющем сайт. Хороший способ сделать это - создать функцию SharePoint, которая при активации устанавливает свойство, а при деактивации восстанавливает исходное значение. Feature.xml может выглядеть так:

<?xml version="1.0" encoding="utf-8"?>
<Feature  Id="8651CC66-FEB1-4255-B7E9-0DFE24367DAB"
          Title="My Master Page"
          Scope="Web"              
          SolutionId="06D3B01F-0C26-457a-BFA5-A1B0BC8D4225"
          ReceiverAssembly="MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9e95445247029289"
          ReceiverClass="MyFeatureReceiver"
          xmlns="http://schemas.microsoft.com/sharepoint/">
  <ElementManifests>
    <ElementManifest Location="Masterpage.xml"/>
    <ElementFile Location="my.master"/>
  </ElementManifests>
  <Properties>
    <Property Key="MyMaster" Value="my.master" />
  </Properties>
</Feature>

Файл Masterpage.xml загружает вашу главную страницу в галерею:

 <?xml version="1.0" encoding="utf-8" ?>
 <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
   <Module Name="UploadMaster" Url="_catalogs/masterpage" >
     <File Url="my.master" Type="GhostableInLibrary" IgnoreIfAlreadyExists="True"/>
    </Module>
 </Elements>

Включите эту функцию в решение WSP вместе с MyAssembly.dll, содержащей класс MyFeatureReceiver, который выглядит следующим образом:

public class MyFeatureReceiver : SPFeatureReceiver
{
  public override void FeatureActivated(SPFeatureReceiverProperties properties)
  {
    SPWeb web = (SPWeb)properties.Feature.Parent;
    web.MasterUrl = properties.Definition.Properties["MyMaster"].Value;
    web.Update();      
  }

  public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
  {
    SPWeb web = (SPWeb)properties.Feature.Parent;
    web.MasterUrl = "default.master";
    web.Update();      
  }

  public override void FeatureInstalled(SPFeatureReceiverProperties properties)
  {
  }

  public override void FeatureUninstalling(SPFeatureReceiverProperties properties)
  {
  }
}

Наконец, разверните решение и активируйте функцию на своих сайтах.

2 голосов
/ 18 марта 2009

WSS-страницы используют мастер-страницы, как обычные веб-приложения. Однако значение, если атрибут MasterPageFile является токеном и имеет значение «~ default.master». Этот токен заменяется фактической ссылкой на главную страницу в методе PreInit страницы.

Вы можете изменить значение ~ default.master на что угодно. Но лучшим решением будет сделать то же, что и в SharePoint.

Я добавил HttpHandler на свой сайт SharePoint. Обработчик присоединяется к методу PreRequestHandlerExecute и изменяет значение атрибута файла главной страницы до того, как SharePoint начнет рендеринг страницы.

Добавьте строку в раздел httpModules файла web.config, которая выглядит следующим образом:

Затем создайте класс, подобный этому:

namespace MyClassLibrary.Utility { открытый класс MasterPageHttpModule: IHttpModule { public void Init (контекст HttpApplication) { context.PreRequestHandlerExecute + = new EventHandler (context_PreRequestHandlerExecute); }

    void context_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        bool useCustomMasterPages = Convert.ToBoolean(ConfigurationManager.AppSettings["ShowCustomMasterPages"].ToString());
        if (useCustomMasterPages)
        {
            Page page = HttpContext.Current.CurrentHandler as Page;
            if (page != null)
            {
                page.PreInit += new EventHandler(page_PreInit);
            }
        }
    }

    void page_PreInit(object sender, EventArgs e)
    {
        bool useThreeColumnMaster = Convert.ToBoolean(ConfigurationManager.AppSettings["UseThreeColumnMasterOnDefaultPage"].ToString());

        try
        {
            Page page = sender as Page;
            if (page != null && SPContext.Current != null)
            {
                string url = page.Request.Url.AbsolutePath.ToLower();
                if (url.IndexOf("/public/") > -1)
                {
                    if (url.IndexOf("sitemap.aspx") == -1)
                    {
                        page.MasterPageFile = "~/_catalogs/masterpage/edge_con.master";
                    }
                    else
                    {
                        page.MasterPageFile = "";
                    }
                }
                else if (url.IndexOf("default.aspx") > -1)
                {
                    if (useThreeColumnMaster)
                    {
                        page.MasterPageFile = "~/_catalogs/masterpage/edge_con.master";
                    }
                    else
                    {
                        page.MasterPageFile = "~/_catalogs/masterpage/edge.master";
                    }
                }
                else if (url.IndexOf("sitemap.aspx") > -1)
                {
                    //
                    //  Sitemap pages should not have a master page
                    //
                    page.MasterPageFile = "";
                    page.Controls.Clear();
                }
                else if (url.IndexOf("/admin/") > -1)
                {
                    page.MasterPageFile = "~/_catalogs/masterpage/edge.master";
                }
                else if (url.IndexOf("/member/") > -1)
                {
                    page.MasterPageFile = "~/_catalogs/masterpage/edge.master";
                }
                else if (url.IndexOf("/supplier/") > -1)
                {
                    page.MasterPageFile = "~/_catalogs/masterpage/edge.master";
                }
                else if (page.MasterPageFile == "~masterurl/default.master")
                {
                    page.MasterPageFile = "~/_catalogs/masterpage/edge.master";
                }
            }
        }
        catch (Exception exception)
        {
            LogWriter logWriter = new LogWriter();
            logWriter.WriteToLog("Could  not set master page: " + exception.Message, LogType.MasterPage, DateTime.Now);
        }
    }

    public void Dispose()
    {
    }
}

}

Теперь вы динамически выбираете mater page.

...