Каскадный выпадающий список SharePoint с запросом CAML, который фильтрует один из вариантов - PullRequest
0 голосов
/ 14 апреля 2011

Я создал каскадную раскрывающуюся форму, используя http://spservices.codeplex.com, но хочу добавить фильтр в третий каскадный раскрывающийся список.Таким образом, в SPServices есть функция CAMLQuery, в которую я могу добавить этот фильтр, но я хочу, чтобы фильтр был указан со значением из верхнего выпадающего списка в форме.

Один пример, приведенный на странице:

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

Я хочу, чтобы этот столбец Status получал свое значение из выбора, выбранного в полях формы.Возможно ли это и как мне это написать?


Редактировать: Я пытаюсь составить список активов с каскадным выбором, чтобы найти правильный актив после выбора единицы и отдела.Пример кода после попытки ответа ниже и ничего не появляется в окне выбора «Актив».Существует два списка, один из которых содержит подразделения и отделы, а другой содержит активы с ключом отдела и подразделения для фильтрации.Если я заменю «динамические» запросы статическими, такими как:

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>

Список отделов:

Название Единица

Единица ИТ1

Единица продаж1

Единица ИТ2

Единица продаж2

База данных активов:

Заголовок Отдел * Единица *

Актив1 ИТ-единица1

Asset2 IT Unit2

Дэвид

Ответы [ 2 ]

0 голосов
/ 11 мая 2011

Давид:

Вы действительно должны были спросить об этом на сайте SPServices в Обсуждениях , чтобы начать с!

То, что вы показываете в своем коде выше, не обязательно. Если вы сделаете два вызова SPCascadeDropdowns в указанном порядке, вам не нужно

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

Вот так работает каскадирование. Первый вызов ограничит отделы теми, которые находятся в выбранной единице при выборе единицы. Второй вызов ограничит активы теми, которые находятся в выбранном отделе при выборе отдела.

Если вы не получаете ожидаемых результатов, то в ваших отношениях списков могут отсутствовать те значения, которые вам нужны.

М.

Редактировать на основе дополнительной информации о содержимом списка:

Это определенно проблема с данными. Вы объединяете отношения в списке отдела и в списке активов. Вы должны иметь эти списки:

  • Отделы - Каждый отдел в список ровно один раз.
  • Единицы - Каждая единица в списке ровно один раз, с столбец как поиск к названию в Департамент, указывающий, что подразделение Департамент.
  • Активы - каждый актив в список ровно один раз, с колонкой как поиск заголовка в единицах что указывает на Единицу Актива.

Это делает ваши списки действительно реляционными, и тогда вызовы SPCascadeDropdowns будут делать то, что вы хотите, так же, как в примере в документации для страны / региона / штата / города.

0 голосов
/ 14 апреля 2011

Глядя на документацию для SPCascadeDropdowns , вы можете указать функцию обратного вызова, которая выполняется при изменении родительского столбца. Это похоже на тот крюк, который вам нужен, чтобы соединить то, о чем вы просите.

Вы не опубликовали примеры кода, так что мне просто нужно что-то придумать. Их демонстрационная страница использует Регион, Штат и Город, так что давайте поиграем с этим.

Если бы я хотел добавить фильтр в «Город» на основе выбранного значения «Регион», я мог бы использовать это:

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), но вы должны понять это. Анонимная функция, определенная для completefunc, должна запускаться всякий раз, когда изменяется родительский столбец («Регион»), и обновляет значение глобальной переменной sCamlQuery. При запуске каскада «Город» он будет использовать сгенерированный запрос CAML.


Редактировать: Обновлен пример, чтобы лучше соответствовать сценарию ОП. Когда запускается самый верхний каскад («Регион»), он запускает анонимный метод completefunc в каскаде «Состояние». Это устанавливает значение переменной sCamlQuery и будет использоваться при запуске каскада "Город".


Редактирование # 2: обновлен пример кода, чтобы использовать более универсальный селектор jQuery; он получит текстовое значение выбранного OPTION. Если вы хотите вместо OPTION значение , вы можете упростить его до: $("select[title='Region']").val()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...