#sharepoint #caml
#sharepoint #caml
Вопрос:
Я создал каскадную выпадающую форму, используя http://spservices.codeplex.com но хочу добавить фильтр в третий каскадный выпадающий список. Итак, в SPServices есть функция под названием CamlQuery, в которую я могу добавить этот фильтр, но я хочу, чтобы фильтр указывался значением из верхнего выпадающего списка формы.
Один из примеров, приведенных на странице, является:
CAMLQuery: "<Eq><FieldRef Name='Status'/><Value Type='Text'>Active</Value></Eq>"
Я хочу, чтобы этот столбец состояния получал свое значение из выбора, выбранного в одном из полей формы. Возможно ли это и как мне это написать?
Редактировать: я пытаюсь составить список активов с каскадными вариантами, чтобы найти нужный ресурс после выбора подразделения и отдела. Пример кода после попытки ответа ниже и не получения ничего, что появляется в окне выбора «Ресурс». Существует два списка, один из которых содержит подразделения и отделы, а другой содержит ресурсы с ключом отдела и подразделения для фильтрации. Если я заменю «динамические» запросы статическими, такими как:
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
База данных ресурсов:
Название отдела * Подразделение*
Asset1 IT Unit1
Asset2 IT Unit2
Дэвид
Ответ №1:
Просматривая документацию для 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()
Комментарии:
1. Спасибо за ваш ответ! Я думаю, что я приближаюсь, но на самом деле это все еще не отфильтровывается, и я предполагаю, что это потому, что я смотрю на каскад, который выше того, с которым я работаю. Если вы смотрите на примеры на сайте, я в основном хочу фильтровать по выбранной стране, а не по городу в вашем примере.
2. Думаю, я понимаю, о чем вы просите. Значение «Регион» должно определять запрос CAML, который выполняется для «Города». Я обновил свой ответ, чтобы отразить этот сценарий.
3. Почти.. Если я сам пишу CAML, он работает, но при использовании вашего нового кода он вообще не выводит никаких значений. Если я напишу этот статический: CamlQuery: «<Eq><FieldRef Name=’Unit’/><Тип значения =’Text’> RP</Value></Eq>», это сработает, но если использовать ваш, например: <Eq><FieldRef Name=’Unit’/><Тип значения =’Text’>» $(«выберите[title =’Unit’]»).attr(» spcascadedropdown_selected_») «</Значение></Эквалайзер> ничего не появляется. Итак, будет ли ваш запрос таким же, как мой «статический»? Я пытаюсь запросить модуль, который я выбрал выше, и использовать в нижнем фильтре. В качестве примера это разные списки, имеет ли это значение?
4. Не имея примера кода, я не уверен, что будет работать в вашем конкретном экземпляре. Я предполагаю, что проблема заключается в селекторе jQuery для извлечения выбранного значения «Единица измерения». Если вы еще не используете их, установите Mozilla Firefox и расширение под названием Firebug . Загрузите свою страницу и включите панель Firebug. На вкладке Firebug «Консоль» вы можете выполнять запросы jQuery и просматривать, что они возвращают. Запустите свой селектор, используя «jQuery» вместо «$»:
jQuery("select[title='Unit']").attr("spcascadedropdown_selected_")
. Посмотрите, какое значение (если таковое имеется) возвращается.5. Спасибо. Я пытаюсь это сделать, но он отображается как «неопределенный». Не уверен, что я делаю это неправильно, поскольку я впервые пытаюсь запускать команды в консоли. Я вставил дополнительную информацию и пример кода, если это поможет вам, помогите мне 😉
Ответ №2:
Дэвид:
Для начала вам действительно следовало задать этот вопрос на сайте SPServices в обсуждениях!
То, что вы показываете в своем коде выше, не обязательно. Если вы выполните два вызова SPCascadeDropdowns в указанном вами порядке, то вам не нужно
CAMLQuery: "<Eq><FieldRef Name='Unit'/><Value Type='Text'>Unit 1</Value></Eq>"
Вот как работает каскадирование. Первый вызов ограничит количество отделов теми, которые находятся в выбранном подразделении при выборе подразделения. Второй вызов ограничит ресурсы теми, которые находятся в выбранном отделе при выборе отдела.
Если вы не получаете ожидаемых результатов, то в ваших списках отношений могут отсутствовать нужные вам значения.
M.
Редактировать на основе дополнительной информации о содержимом списка:
Это определенно проблема с данными. Вы объединяете связи в списке отделов и списке активов. У вас должны быть эти списки:
- Отделы — Каждый отдел в списке отображается ровно один раз.
- Подразделения — Каждое подразделение в списке отображается ровно один раз, со столбцом в качестве подстановки к названию в отделе, указывающим отдел этого подразделения.
- Активы — Каждый ресурс в списке отображается ровно один раз, со столбцом в качестве подстановки к заголовку в единицах, указывающим единицу этого ресурса.
Это делает ваши списки действительно реляционными, и тогда вызовы SPCascadeDropdowns будут выполнять то, что вы хотите, точно так же, как в примере в документах для Country / Region / State / City.
Комментарии:
1. Привет, Марк, спасибо, что ответил на мой вопрос и помог. Я ценю, что мне следовало оставить это на сайте SPServices, но я обнаружил, что вы уже ответили, что это невозможно в текущей реализации. Проблема, с которой я сталкиваюсь, заключается в том, что если я делаю то, что вы предлагаете, я получаю дублирующиеся отделы, поскольку подразделения очень похожи друг на друга. Вот почему мне нужно отфильтровать отделы в столбце unit, чтобы убедиться, что я получаю активы, принадлежащие этому отделу, в этом подразделении, а не в другом подразделении.
2. Это все еще звучит как проблема с данными. У вас есть несколько отделов в одном подразделении с одинаковым названием?
3. Привет, Марк, извиняюсь… Я не получаю дублирующиеся отделы, скорее я получаю ресурсы, принадлежащие отделу в другом подразделении. Таким образом, он каскадируется, как и должен, но поскольку, например, посудомоечная машина есть как в блоке 1, так и в блоке 2, она отображается в списке активов. Это только фильтрация по отделам в последнем разделе.
4. Хорошо, я все еще думаю, что это звучит как проблема с данными, а не проблема с кодом. Можете ли вы привести какие-либо примеры данных?
5. привет, Марк, я добавил пример списков выше. Как вы можете видеть, на втором шаге каскада не будет учитываться столбец Unit в списке базы данных активов.