Sharepoint Custom Field Select List Items

В SharePoint 2007 нет возможности выбирать элементы (на форме поиска) как это сделано в версии 2010.

Но можно создать свое кастомное поле. Для этого создадим пустой проект и добавим туда FieldControl. Нам не придется сегодня писать код на C#, весь функционал будет заключен в файле fldtypes_IdAsCheckBoxField.xml.

<?xml version="1.0" encoding="utf-8"?>
<FieldTypes>
  <FieldType>
    <Field Name="TypeName">IdAsCheckBoxFieldType</Field>
    <Field Name="ParentType">Text</Field>
    <Field Name="TypeDisplayName">Поле выбора ID чек-бокс</Field>
    <Field Name="TypeShortDescription"> Поле выбора ID чек-бокс</Field>
    <Field Name="UserCreatable">TRUE</Field>
    <Field Name="Sortable">FALSE</Field>
    <Field Name="AllowBaseTypeRendering">TRUE</Field>
    <Field Name="Filterable">FALSE</Field>
    <Field Name="ShowOnColumnTemplateCreate">FALSE</Field>
    <Field Name="ShowOnListCreate">TRUE</Field>
    <Field Name="ShowOnDocumentLibraryCreate">FALSE</Field>
    <Field Name="ShowOnSurveyCreate">FALSE</Field>
    <Field Name="CAMLRendering">FALSE</Field>
    <Field Name="FieldTypeClass">IdAsCheckBoxField.IdAsCheckBoxFieldControlField, IdAsCheckBoxField, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e23d8e7bd9476393</Field>
    <PropertySchema>
      <Fields>       
      </Fields>
    </PropertySchema>
    <RenderPattern Name="HeaderPattern">
      <HTML>
        <![CDATA[
         <script type="text/javascript">     
           if (typeof getElementsByAttributeValue == 'function') { 
              function getElementsByAttributeValue (attribute, value){
                  var dom = document.getElementsByTagName("*");
                  var match = new Array();
                  for (var i in dom) {
                      if ((typeof dom[i]) === "object"){
                          if (dom[i].getAttribute(attribute) === value){
                              match.push(dom[i]);
                          }
                      }
                  }
                  return match;
              };
            }
            if (typeof ToggleSelection == 'function') { 
              function ToggleSelection(sender, ColumnDisplayName){
                var chkboxes = getElementsByAttributeValue('Column', ColumnDisplayName);
                var cur=sender.getAttribute('tgl').toString() == true.toString();              
                for (var i = 0; i < chkboxes.length; i++) {
                  chkboxes[i].checked = !cur;
                }        
                sender.setAttribute('tgl',!cur);        
              };
            }
            
            if (typeof GetCheckedItems == 'function') { 
              function GetCheckedItems(ColumnDisplayName)
              {
                var jsonArr = [];                
                var chkboxes = getElementsByAttributeValue('Column', ColumnDisplayName);
                for (var i = 0; i < chkboxes.length; i++) {
                    if(chkboxes[i].checked==true)
                    {
                       jsonArr.push({
                          'ItemId':chkboxes[i].getAttribute('ItemId'),
                          'Title':chkboxes[i].getAttribute('Title')
                       });
                    }
                }                 
                return jsonArr;                
              }
            }
            
         </script>
      ]]>
      </HTML>
      <HTML><![CDATA[<a tgl='false' onclick='ToggleSelection(this,"]]></HTML>
      <Property Select='DisplayName' HTMLEncode='TRUE'/>
      <HTML><![CDATA[");return false;' href="Javascript:ToggleSelection(this,']]></HTML>
      <Property Select='DisplayName' HTMLEncode='TRUE'/>
      <HTML><![CDATA[')"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px;" alt="Выбрать или очистить все" src="/_layouts/images/unchecka.gif" /></a>]]></HTML>
      <HTML><![CDATA[  ]]></HTML>
      <Property Select='DisplayName' HTMLEncode='TRUE'/>
      
    </RenderPattern>
    <RenderPattern Name="DisplayPattern">
      <HTML><![CDATA[<input type="checkbox" ]]></HTML>
      <HTML><![CDATA[ItemId="]]></HTML>
      <Column Name="ID" HTMLEncode="TRUE" />
      <HTML><![CDATA[" ]]></HTML>
      <HTML><![CDATA[Title="]]></HTML>
      <Column Name="Title" HTMLEncode="TRUE" />
      <HTML><![CDATA[" ]]></HTML>
      <HTML><![CDATA[Column="]]></HTML>
      <Property Select='DisplayName' HTMLEncode='TRUE'/>
      <HTML><![CDATA[" ]]></HTML>
      <HTML><![CDATA[ /> ]]></HTML>
    </RenderPattern>
  </FieldType>
</FieldTypes>

Сразу хочу сказать что FieldTypeClass в принципе не нужен, он ссылается на пустой проект.

В коде есть 3 javascript функции: 

  • getElementsByAttributeValue - получает все элементы чекбоксы нужой группы 
  • ToggleSelection - переключает чекбоксы
  • и GetCheckedItems - получает все выбранные элементы в виде JSON массива

Для удобства в сам чекбок вшита вся нужная информация:

ID строки, заголовок и название колонки к которой оно относится. 

Получение выделенных элементов:

Надеюсь что кому-то пригодится и поможет. Спасибо

Добавить комментарий

Loading