Возможно ли при помощи компонента «фильтр» реализовать такую задачу:
У объектов в базе есть свойства: город, район, улица Нужно что бы в фильтре пользователь сначала из выпадающего списка выбирал город, затем район, затем улицу, а далее остальные свойства уже просто вводил.
Можно ли такое сделать на AJAX? Если да - то как? Если нет, то возможно ли такое сделать средствами Битрикса?
В компоненте catalog.filter аякс не реализован. Но самому сделать можно. Я когда делал, от компонента мало что осталось, пользовался библиотекой extjs. Там есть класс для работы с формами. Для каждого из ваших полей вы загружаете список значений из Битрикса, связываете между собой города районы и улицы и можно легко фильтровать районы по городу и улицы по районам.
Все чем могу помочь - дать ссылочку на примеры реализации, попросите лично , если надумаете делать...
Дима еще один вопрос - вы программируете на Java? (дело в том что я могу дать примеры на GWT-ext, они на джаве, потом компилируются в джаваскрипт). Посмотрите пока тут http://gwt-ext.com/demo
Далее слева выбираете раздел Combobox/Linked combobox
Код этого примера
Код
public class LinkedComboBoxSample implements EntryPoint {
public void onModuleLoad() {
Panel panel = new Panel();
panel.setBorder(false);
panel.setPaddings(15);
FormPanel form = new FormPanel();
form.setTitle("Linked ComboBox");
form.setFrame(true);
form.setWidth(350);
// countries store
Object[][] countries = new Object[][]{
new Object[]{"USA", "United States of America"},
new Object[]{"D", "Germany"},
new Object[]{"F", "France"},
new Object[]{"GB", "Great Britain"},
};
final Store countriesStore = new SimpleStore(new String[]{"cid", "country"}, countries);
countriesStore.load();
//cities store
Object[][] cities = new Object[][]{
new Object[]{new Integer(1), "USA", "New York"},
new Object[]{new Integer(2), "USA", "Cleveland"},
new Object[]{new Integer(3), "USA", "Austin"},
new Object[]{new Integer(4), "USA", "Los Angeles"},
new Object[]{new Integer(5), "D", "Munich"},
new Object[]{new Integer(6), "D", "Bonn"},
new Object[]{new Integer(7), "F", "Paris"},
new Object[]{new Integer(8), "F", "Nice"},
new Object[]{new Integer(9), "GB", "London"},
new Object[]{new Integer(10), "GB", "Glasgow"},
new Object[]{new Integer(11), "GB", "Liverpool"}
};
final Store citiesStore = new SimpleStore(new String[]{"id", "cid", "city"}, cities);
citiesStore.load();
final ComboBox countryCB = new ComboBox();
countryCB.setFieldLabel("Select Country");
countryCB.setStore(countriesStore);
countryCB.setDisplayField("country");
countryCB.setMode(ComboBox.LOCAL);
countryCB.setTriggerAction(ComboBox.ALL);
countryCB.setForceSelection(true);
countryCB.setValueField("cid");
countryCB.setReadOnly(true);
final ComboBox cityCB = new ComboBox();
cityCB.setFieldLabel("Select City");
cityCB.setStore(citiesStore);
cityCB.setDisplayField("city");
cityCB.setValueField("id");
cityCB.setMode(ComboBox.LOCAL);
cityCB.setTriggerAction(ComboBox.ALL);
cityCB.setLinked(true);
cityCB.setForceSelection(true);
cityCB.setReadOnly(true);
countryCB.addListener(new ComboBoxListenerAdapter() {
public void onSelect(ComboBox comboBox, Record record, int index) {
cityCB.setValue("");
citiesStore.filter("cid", comboBox.getValue());
}
});
form.add(countryCB);
form.add(cityCB);
panel.add(form);
RootPanel.get().add(panel);
}
}
Суть в том, что тут значнеия для комбобокса загружаються локально, прямо из переменных, тебе же нужно будет достать их из битрикса...
Для этого используеться объект httpProxy, который загружает данные с Битрикса в Store. Фактически он просто посылает запрос на страничку сайта и получает ответ в JSON либо XML. Твоя задача сделать так, чтобы страничка отдавала варианты значений для выпадающих списков в таком формате.
Если видишь что справишься - я помогу, расскажу как и что. А так пока углубляться не буду. Но все просто...
А как Вы относитесь, если реализовать примерно так: Суть в том, что PHP построит на основе данных из базы нижеследующее, которое я представляю примерно так (скрипт просто не показывает то что не относитя к выбранному объекту (display:none)). Допустим, список стран будет одинаков, а города надо брать из базы. Или я туплю? Может это не рациональный способ и сложный?
Отлично, спасибо, с тем что на стороне клиента я почти разобрался, JAVA SDK+GWT поставил (благо книг в Инете хватает), а может есть пример, что на стороне сервера может наиболее грамотно извлечь данные из Битрикса? Я нашел только примеры с SQL напрямую. Но в этом случае структура азы движка не очень подойдет.
Сам массив придется формировать с определенной структурой, я в блоге опишу как - долговато(
Нужно чтобы страница отдавала чистый JSON без любого другого html. Делаете пустой шаблон с пустым header-ом, который применяется при каком-то параметре в url (request_type=java).И из Java будут делать запросы именно с этим параметром.
Java не дает посылать запрос на другой сервер, а пока вы тестируете, вы работаете на APACHE, который создает сам GWT (localhost:8888), то есть посылать запросы во время тестирования на Битрикс не выйдет, так как JAVA не разрешает запросы на другой сервер(разве что использовать ScripttagProxy вместо httpProxy, но не стоит). Генерируйте JSON на Битриксе и копируйте в файлик в папку public проекта. На него и шлите запросы на получение JSON на этапе тестирования.
Вечером я Дам Вам знать написал ли подробнее все или нет.
Кстати помимо самого GWT придется подключать GWT-ext. А лучше плагин Cypal Studio.
Пока все, извините, что коротко, первый пост канул не известно куда(