使用CAML查询的SharePoint级联下拉列表,可过滤选项之一

问题描述

|| 我已经使用http://spservices.codeplex.com制作了一个级联下拉列表,但想在第三个级联下拉列表中添加一个过滤器。因此,SPServices具有一个名为CAMLQuery的函数,可以在其中添加此过滤器,但我希望使用表单顶部下拉菜单中的值来指定该过滤器。 页面上给出的一个示例是:
            CAMLQuery: \"<Eq><FieldRef Name=\'Status\'/><Value Type=\'Text\'>Active</Value></Eq>\"
我希望此“状态”列从表单上的字段中选择的选择中获取其值。这可能吗,我该怎么写? 编辑:我正在尝试通过级联选择制作资产清单,以在选择部门和部门后找到合适的资产。 尝试以下答案且在“资产”选择器中未显示任何内容之后的代码示例。有两个列表,一个包含单位和部门,一个包含资产以及要过滤的部门和单位键的列表。 如果我用静态查询替换\“ dynamic \”查询,例如:
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\",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\",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\",CAMLQuery: sCamlQuery
    });

});
</script>
部门清单: 标题单位 IT部门1 销售单位1 IT部门2 销售部门2 资产数据库标题部门*单位* 资产1 IT部门1 Asset2 IT Unit2 大卫     

解决方法

查看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\",parentColumn: \"State\",childColumn: \"City\",CAMLQuery: sCamlQuery
});
这是一个非常幼稚的jQuery选择器,用于查找SELECT元素(查看TITLE属性),但是您应该明白这一点。每当更改父列(\“ Region \”)时,都应运行为
completefunc
定义的匿名函数,并更新全局变量
sCamlQuery
的值。当\“ City \”级联运行时,它将使用生成的CAML查询。 编辑:更新了示例以更好地匹配OP方案。当最上面的级联运行时(\“ Region \”),它将触发\“ State \”级联中的
completefunc
匿名方法。这将设置“ 7”变量的值,并将在运行“ City”级联时使用。 编辑#2:更新了示例代码,以使用更具通用性的jQuery选择器;它将检索所选“ 10”的文本值。如果您想要
OPTION
的值,则可以将其简化为:
$(\"select[title=\'Region\']\").val()
    ,大卫: 您确实应该在“讨论”中的SPServices网站上问这个问题! 上面的代码中显示的内容不是必需的。如果按照显示的顺序对SPCascadeDropdowns进行了两次调用,则不需要
CAMLQuery: \"<Eq><FieldRef Name=\'Unit\'/><Value Type=\'Text\'>Unit 1</Value></Eq>\" 
这就是级联的工作方式。在选择单位时,第一个呼叫将把部门限制为所选单位中的部门。在选择部门时,第二次调用将把资产限制为所选部门中的资产。 如果没有得到期望的结果,则您的RelationshipLists中可能没有所需的值。 M. 根据有关列表内容的其他信息进行编辑: 绝对是数据问题。您正在合并部门列表和资产列表中的关系。您应该具有以下列表: 部门-各个部门 仅列出一次。 单位-每个单位 在列表中只出现一次,并带有 列作为对标题的查找 部门指示该单位的 部门。 资产-每项资产 列表仅一次,带有一列 作为单位标题的查找 指示该资产的单位。 这使您的列表真正具有关系性,然后对SPCascadeDropdowns的调用将完成您想要的操作,就像“国家/地区/州/城市”文档中的示例一样。