具有CAML查询的SharePoint级联下拉列表可过滤其中一个选项

问题描述 投票:0回答:2

我使用http://spservices.codeplex.com制作了一个级联下拉表单,但想在第三个级联下拉列表中添加一个过滤器。所以SPServices有一个名为CAMLQuery的函数,我可以在其中添加这个过滤器,但我希望使用表单顶部下拉列表中的值指定过滤器。

页面上给出的一个示例是:

            CAMLQuery: "<Eq><FieldRef Name='Status'/><Value Type='Text'>Active</Value></Eq>"

我希望此状态列从表单上的字段选择的选项中获取其值。这有可能,我该怎么写呢?


编辑:我正在尝试使用级联选项创建资产列表,以便在选择单位和部门后找到正确的资产。尝试以下答案后的代码示例,并且未在“资产”选择器中显示任何内容。有两个列表,一个包含Units和Departments,另一个包含具有要过滤的Department和Unit键的资产。如果我用静态查询替换“动态”查询,例如:

CAMLQuery: "<Eq><FieldRef Name='Unit'/><Value Type='Text'>Unit 1</Value></Eq>"

资产显示为该单位过滤。当前代码:

<script language="javascript" type="text/javascript" src="../../Hidden/jquery-1.5.2.min.js"></script>
<script language="javascript" type="text/javascript" src="../../Hidden/jquery.SPServices-0.6.0.min.js"></script>
<script language="javascript" type="text/javascript">
var sCamlQuery = "";

$(document).ready(function() {
    $().SPServices.SPCascadeDropdowns({
        relationshipList: "Departments",
        relationshipListParentColumn: "Unit",
        relationshipListChildColumn: "Title",
        parentColumn: "Unit",
        childColumn: "Department",
        completefunc: function() {
        sCamlQuery = "<Eq><FieldRef Name='Unit'/><Value Type='Text'>" + $("select[title='Unit']").attr("spcascadedropdown_selected_") + "</Value></Eq>";
        }
    });
        $().SPServices.SPCascadeDropdowns({
        relationshipList: "Asset Database",
        relationshipListParentColumn: "Department",
        relationshipListChildColumn: "Title",
        parentColumn: "Department",
        childColumn: "Asset",
        CAMLQuery: sCamlQuery
    });

});

HTML:

<tr>
<td width="190px" valign="top" class="ms-formlabel">
    <H3 class="ms-standardheader"><nobr>Unit</nobr></H3>
</td>
<td width="400px" valign="top" class="ms-formbody">
    <span dir="none">
        <select name="ctl00$PlaceHolderMain$g_c482307d_1a31_4129_8a0a_376d70562746$ff3_1$ctl00$Lookup" id="ctl00_PlaceHolderMain_g_c482307d_1a31_4129_8a0a_376d70562746_ff3_1_ctl00_Lookup" title="Unit">
            <option selected="selected" value="0">(None)</option>
            <option value="1">Unit 1</option>
            <option value="2">Unit 2</option>
        </select>
    </span>¨
</td>
</tr>

<tr>
<td width="190px" valign="top" class="ms-formlabel">
    <H3 class="ms-standardheader"><nobr>Department</nobr></H3>
</td>
<td width="400px" valign="top" class="ms-formbody">
    <span dir="none">
        <select name="ctl00$PlaceHolderMain$g_c482307d_1a31_4129_8a0a_376d70562746$ff4_1$ctl00$Lookup" id="ctl00_PlaceHolderMain_g_c482307d_1a31_4129_8a0a_376d70562746_ff4_1_ctl00_Lookup" title="Department">
            <option selected="selected" value="0">(None)</option>
            <option value="5">Administration</option>
            <option value="4">IT</option>
            <option value="1">Kitchen</option>
            <option value="2">Production</option>
            <option value="7">Production</option>
            <option value="6">Sales</option>
            <option value="3">Warehouse</option>
        </select>
    </span>
</td>
</tr>

<tr>    
<td width="190px" valign="top" class="ms-formlabel">
    <H3 class="ms-standardheader"><nobr>Asset</nobr></H3>
</td>
<td width="400px" valign="top" class="ms-formbody">
    <span dir="none">
        <select name="ctl00$PlaceHolderMain$g_c482307d_1a31_4129_8a0a_376d70562746$ff5_1$ctl00$Lookup" id="ctl00_PlaceHolderMain_g_c482307d_1a31_4129_8a0a_376d70562746_ff5_1_ctl00_Lookup" title="Asset">
            <option selected="selected" value="0">(None)</option>
            <option value="3">Computer</option>
            <option value="2">Copy machine</option>
            <option value="1">Dishwasher</option>
            <option value="5">Dishwasher</option>
            <option value="4">Oven</option>
        </select>
    </span>
</td>
</tr>

验证功能:

<script language="javascript" type="text/javascript" src="../../Hidden/jquery-1.5.2.min.js"></script>
<script language="javascript" type="text/javascript" src="../../Hidden/jquery.SPServices-0.6.0.min.js"></script>
<script language="javascript" type="text/javascript">
var sCamlQuery = "";

$(document).ready(function() {

    $().SPServices.SPCascadeDropdowns({
        relationshipList: "Departments",
        relationshipListParentColumn: "Unit",
        relationshipListChildColumn: "Title",
        parentColumn: "Unit",
        childColumn: "Department",
        completefunc: function() {
        sCamlQuery = window.alert("completefunc");//"<Eq><FieldRef Name='Unit'/><Value Type='Text'>"+ $("select[title='Unit'] option:selected").text() +"</Value></Eq>";
                                }
    });

        $().SPServices.SPCascadeDropdowns({
        relationshipList: "Asset Database",
        relationshipListParentColumn: "Department",
        relationshipListChildColumn: "Title",
        parentColumn: "Department",
        childColumn: "Asset",
        CAMLQuery: sCamlQuery
    });

});
</script>

部门名单:

标题单位

IT部门1

销售单位1

IT部门2

销售单位2

资产数据库:

标题部门*单位*

Asset1 IT Unit1

资产2 IT部门2

大卫

sharepoint caml
2个回答
0
投票

查看SPCascadeDropdowns的文档,您可以指定在父列更改时执行的回调函数。这似乎是你需要连接你所要求的钩子。

你没有发布代码样本,所以我只需要做些什么。他们的演示页面使用了Region,State和City,所以让我们来玩吧。

如果我想根据所选的“Region”值为“City”添加一个过滤器,我可能会使用这个:

var sCamlQuery = "";

// Cascade definition for State dropdown
$().SPServices.SPCascadeDropdowns({
    relationshipList: "States",
    relationshipListParentColumn: "Region",
    relationshipListChildColumn: "Title",
    relationshipListSortColumn: "Title",
    parentColumn: "Region",
    childColumn: "State" 
    completefunc: function() {
        sCamlQuery = "<Eq><FieldRef Name='Status'/><Value Type='Text'>" + $("select[title='Region'] option:selected").text() + "</Value></Eq>";
    })
});

// Cascade definition for City dropdown
$().SPServices.SPCascadeDropdowns({
    relationshipList: "Cities",
    relationshipListParentColumn: "State",
    relationshipListChildColumn: "Title",
    parentColumn: "State",
    childColumn: "City",
    CAMLQuery: sCamlQuery
});

这是一个非常天真的jQuery选择器来查找SELECT元素(查看TITLE属性),但你应该明白这个想法。只要更改了父列(“Region”),就会运行为completefunc定义的匿名函数,并更新全局变量sCamlQuery的值。当“City”级联运行时,它将使用生成的CAML查询。


编辑:更新示例以更好地匹配OP方案。当最顶级的级联运行(“区域”)时,它将触发“状态”级联中的completefunc匿名方法。这将设置sCamlQuery变量的值,并在“City”级联运行时使用。


编辑#2:更新了示例代码以使用更通用的jQuery选择器;它将检索所选OPTION的文本值。如果你想要OPTION值,你可以将它简化为:$("select[title='Region']").val()


0
投票

大卫:

你真的应该在SPServices site in the Discussions上问这个开头!

您在上面的代码中显示的内容不是必需的。如果按照显示的顺序对SPCascadeDropdowns进行两次调用,则不需要

CAMLQuery: "<Eq><FieldRef Name='Unit'/><Value Type='Text'>Unit 1</Value></Eq>" 

这就是级联的工作原理。第一次调用将部门限制为选择单位时所选单位的部门。第二次调用将资产限制为选择部门时所选部门的资产。

如果您没有得到预期的结果,那么您的关系列表可能没有您需要的值。

M.

根据列表内容的其他信息进行编辑:

这绝对是一个数据问题。您正在组合部门列表和资产列表中的关系。你应该有这些清单:

  • 部门 - 列表中的每个部门只有一次。
  • 单位 - 列表中的每个单位只有一次,其中一列作为对部门中标题的查找,表示单位的部门。
  • 资产 - 列表中的每个资产只需一次,其中一列作为单位标题的查找,表示资产的单位。

这使您的列表真正成为关系,然后对SPCascadeDropdowns的调用将按照您所需的方式执行,就像国家/地区/州/市的文档中的示例一样。

© www.soinside.com 2019 - 2024. All rights reserved.