вторник, 30 августа 2011 г.

Метаданные для SPField на стороне клиента

В недавнем посте я предлагал способ для запоминания метаданных SPField. И вот сегодня еще раз убедился, что пошел правильным путем.

Возникла задача, получить метаданные поля на стороне клиента, используя SharePoint Client Object Model. Конкретно, нужно было получить все поля, помеченные как содержащие E-mail - у пользователей для простановки этих отметок есть соответствующий интерфейс.

В итоге, пришел вот к такой простейшей функции:

function getFieldAttribute(field, metadataKey) {
    /// <summary>
    /// This function gets metadata key
    /// </summary>
    var xml = field.get_schemaXml();
    var domElement = CUI.NativeUtility.createXMLDocFromString(xml);
 
    var attribute;
 
    if (domElement.firstChild.getAttributeNS != null && domElement.firstChild.getAttributeNS != undefined)
        attribute = domElement.firstChild.getAttributeNS('my', metadataKey);
    else
        attribute = domElement.firstChild.getAttribute('p1:' + metadataKey);
 
    return attribute;
}
 

Как видите, всё довольно просто. Когда расширять и интегрировать созданное решение просто - это хороший признак того, что делаешь правильно.

Использовать - примерно так:

var ctx = new SP.ClientContext.get_current();
var list = ctx.get_web().get_lists().getById(SP.ListOperation.Selection.getSelectedList());
 
var fields = list.get_fields();
ctx.load(fields);
 
// ... load items or whatever you need here
 
ctx.executeQueryAsync(onSuccess, onFailure);
 
function onSuccess() {
    var emailFields = new Array();
 
    var fieldEnumerator = fields.getEnumerator();
    while (fieldEnumerator.moveNext()) {
 
        var field = fieldEnumerator.get_current();
        var attribute = getFieldAttribute(field,'MyFieldType');
        if (attribute == 'Email')
            emailFields.push(field.get_internalName());
    }
}
 

Комментариев нет:

Отправить комментарий

Внимание! Реклама и прочий спам будут беспощадно удаляться.