Расширение или изменение представления таблицы данных SharePoint
Кто-нибудь обнаружил способ расширить или изменить функциональность представления таблицы данных SharePoint (представление, используемое при редактировании списка в режиме таблицы данных, который выглядит как базовый лист Excel)?
Мне нужно сделать несколько вещей, если это возможно, но мне еще предстоит найти достойный нехакерский способ изменить любую функциональность в нем.
РЕДАКТИРОВАТЬ: Пример того, что я хочу сделать, - включить каскадную фильтрацию для полей поиска - поэтому выбор в одном поле ограничивает доступные варианты в другом. Есть способ сделать это в стандартной форме представления, но представление таблицы данных полностью отделено.
С уважением
мычание
2 ответа
Я не думаю, что вы можете изменить его любым нехакерским способом, но вы можете создать новый вид таблицы данных с нуля. Это можно сделать, создав новый элемент управления ActiveX, выставив его как объект COM и изменив файл web.config, чтобы сделать ссылку на новый элемент управления ActiveX.
Вот пример: создание пользовательского элемента управления таблицей данных.
На самом деле, вы можете сделать это. Вот фрагмент кода, который я раздобыл где-то, где я делаю только то, что вы просили. Я пытался убрать конкретику.
var gridFieldOverrideExample = (function (){
function fieldView(ctx){
var val=ctx.CurrentItem[curFieldName];
var spanId=curFieldName+"span"+ctx.CurrentItem.ID;
if (ctx.inGridMode){
handleGridField(ctx, spanId);
}
return "<span id='"+spanId+"'>"+val+"</span>";
}
function handleGridField(ctx, spanID){
window.SP.SOD.executeOrDelayUntilScriptLoaded(function(){
window.SP.GanttControl.WaitForGanttCreation(function (ganttChart){
var gridColumn = null;
var editID = "EDIT_"+curFieldName+"_GRID_FIELD";
var columns = ganttChart.get_Columns();
for(var i=0;i<columns.length;i++){
if(columns[i].columnKey == curFieldName){
gridColumn = columns[i];
break;
}
}
if (gridColumn){
gridColumn.fnGetEditControlName = function(record, fieldKey){
return editID;
};
window.SP.JsGrid.PropertyType.Utils.RegisterEditControl(editID, function (ctx) {
editorInstance = new SP.JsGrid.EditControl.EditBoxEditControl(ctx, null);
editorInstance.NewValue = "";
editorInstance.SetValue = function (value) {
_cellContext = editorInstance.GetCellContext();
_cellContext.SetCurrentValue({ localized: value });
};
editorInstance.Unbind = function () {
//This happens when the grid cell loses focus - hide controls here, do cleanup, etc.
}
//Below I grabbed a reference to the original 'BindToCell' function so I can prepend to it by overwriting the event.
var origbtc = editorInstance.BindToCell;
editorInstance.BindToCell = function(cellContext){
if ((cellContext.record) &&
(cellContext.record.properties) &&
(cellContext.record.properties.ID) &&
(cellContext.record.properties.ID.dataValue)){
editorInstance.ItemID = cellContext.record.properties.ID.dataValue;
}
origbtc(cellContext);
};
//Below I grabbed a reference to the original 'OnBeginEdit' function so I can prepend to it by overwriting the event.
var origbte = editorInstance.OnBeginEdit;
editorInstance.TargetID;
editorInstance.OnBeginEdit = function (cellContext){
this.TargetID = cellContext.target.ID;
/*
. . .
Here is where you would include any custom rendering
. . .
*/
origbte(cellContext);
};
return editorInstance;
}, []);
}
});
},"spgantt.js");
}
return{
fieldView : fieldView
}
})();
(function () {
function OverrideFields(){
var overrideContext = {};
overrideContext.Templates = overrideContext.Templates || {};
overrideContext.Templates.Fields = {
'FieldToOverride' : {
'View': gridFieldOverrideExample.fieldView
}
};
SPClientTemplates.TemplateManager.RegisterTemplateOverrides(overrideContext);
}
ExecuteOrDelayUntilScriptLoaded(OverrideFields, 'clienttemplates.js');
})();
Также есть пара других примеров. Извините, у меня больше нет ссылок: