Управление представлениями для типов контента (или добавление представления в несколько списков) - PullRequest
4 голосов
/ 07 мая 2010

Я удивлен, что не могу найти в сети решение, где я мог бы управлять представлениями для типов контента. Действительно ли мне нужно просматривать каждый список задач в моем браузере, чтобы добавить / изменить представление?

Есть ли какие-либо решения, которые позволили бы мне просто определить представление для типа контента и, таким образом, сделать это представление доступным во всех списках, где тип контента?

Ответы [ 2 ]

3 голосов
/ 07 мая 2010

Прямо говоря, нет , вид не может быть назначен типу контента. Списки - это то, что содержит фактическую коллекцию представлений и соответствующую страницу aspx, созданную с ее помощью. Представление также имеет зависимое существование со своим списком: вы не можете иметь представление, не связанное со списком. Также нет «обработчика событий» для добавления типа контента в список, поэтому у вас не может быть автоматического процесса, который происходит всякий раз, когда вы добавляете тип контента в список (и это было бы громоздко в любом случае, так как вы нужно прикрепить обработчик событий к списку в первую очередь!).

Это не означает, что для выполнения этой задачи вам нужно вручную разбираться в пользовательском интерфейсе. Используя объектную модель в чем-то вроде рабочего процесса с собственным кодом, вы можете перемещаться по всему вашему SPWeb и создайте новое представление для каждого списка, который имеет указанный тип содержимого. Все, что вам нужно, - это рабочий процесс с одним действием кода, который перебирает все SPLists в SPWeb.Lists и проверяет, имеет ли этот SPList тип контента с тем же именем, что и ваш целевой тип контента. Если это так, создайте новый SPView с нужными вам параметрами. Поскольку вы не можете просто создать один SPView и клонировать его, поскольку SPView должен быть связан со списком, а клонирование SPView просто клонирует его в один и тот же список, вам придется запускать все создание SPView в каждом цикле. Но вы должны написать это только один раз, это система, которая будет запускать его несколько раз. И, черт возьми, это, безусловно, сделает это гораздо более продуктивно, чем если бы вам приходилось танцевать в пользовательском интерфейсе в течение нескольких часов.

Просто запустите рабочий процесс в любое время, когда вам понадобится подтвердить существование этого SPView.

0 голосов
/ 11 апреля 2019

Я нашел это решение в c #, однако я еще не тестировал его. Я проверю это в будущем, и обновлю это при необходимости.

По-видимому, это для SharePoint 2010, однако оно может работать и в более поздних версиях.

private void CreateView(string strViewName)
{
    try
    {
        string fieldName = //Get Field Internal Name
        var docquery = "<Where><Eq><FieldRef Name='" + fieldName.ToString() + "' /><Value Type='Choice'>" + strViewName.ToString() + "</Value></Eq></Where>";
        System.Collections.Specialized.StringCollection viewFields = new System.Collections.Specialized.StringCollection();
        viewFields.Add("Type");
        viewFields.Add("Name");
        viewFields.Add("Modified");
        viewFields.Add("Modified By");
        viewFields.Add(fieldName.ToString());
        oViewCollection.Add(strViewName, viewFields, docquery, 100, true, false);
        web.Update();
    }
    catch (Exception e)
    {
        throw new SPException(e.Message.ToString());
    }
}

Я также нашел это решение в PowerShell ...

Add-PSSnapin Microsoft.SharePoint.PowerShell -EA silentlycontinue

#Title View
$viewTitle = "Sort by modified date"
#Add the column names from the ViewField property to a string collection
$viewFields = New-Object System.Collections.Specialized.StringCollection
$viewFields.Add("DocIcon") > $null
$viewFields.Add("LinkFilename") > $null
$viewFields.Add("Modified") > $null
$viewFields.Add("Editor") > $null
$viewFields.Add("FileSizeDisplay") > $null
#Query property
$viewQuery = "<OrderBy><FieldRef Name='Modified' Ascending='FALSE'/></OrderBy>"
#RowLimit property
$viewRowLimit = 50
#Paged property
$viewPaged = $true
#DefaultView property
$viewDefaultView = $false

$ListsToUpdate = @()

$App = Get-SPWebApplication  http://....
foreach ($Site in $App.Sites)
{
    foreach ($Web in $Site.AllWebs)
    {
        foreach ($List in $Web.Lists)
        {
            if($List.BaseType -eq "DocumentLibrary" -and $List.Title -eq "Documents" )
            {
                $ListsToUpdate += $Web.Lists[$List.Title]
            }
        }
    }
}


foreach($List in $ListsToUpdate) 
{
    Write-Host $List.Title
    #Create the view in the destination list
    $newview = $List.Views.Add($viewTitle, $viewFields, $viewQuery, $viewRowLimit, $viewPaged, $viewDefaultView)
}
...