Не так давно появилась такая замечательная возможность API, как использование подзапросов при выборе элементов ИБ. Как все знают, она позволяет в одном запросе к БД выстроить ещё более сложную логику - вложенную выборку из другого связанного ИБ.
Примечание: применимо только к полю ID элемента основного запроса.
В документации приведен пример
Выбрать авторов написавших книги в 21-ом веке
По коду очевидно, что есть два инфоблока "Авторы" и "Книги". У "Книг" есть привязка к "Авторам".
А как быть, если необходимо получить не авторов, по параметрам книг, а книги, по параметрам авторов (со сложной логикой)?..
Например, задача:
Есть инфоблоки "Книги", "Авторы", "Страны".
У книг есть привязка к авторам, у авторов - к странам.
Нужно одним запросом (имеется в виду CIBlockElement::GetList()) выбрать все книги, имя автора которых начинается на букву "К", а страна (место рождения автора) - на букву "И".
Конечно, задача синтетическая и скорее придумана именно для этого поста, нежели взята из реальной жизни. На больших проектах задачи обычно более сложные и способы фильтрации не просто по имени, а со сложной логикой (И/ИЛИ), множеством условий для каждой сущности и т.д.
Оговорюсь сразу: стандартными средствами этого сделать нельзя, и вот здесь тоже есть одно "НО", позволяющее всё-таки решить задачу "малой кровью".
Первая мысль:
Зная, что есть такая штука как подзапросы, пытаемся сделать выборку по инфоблоку Книги и фильтром по имени автора
Всё работает, гуд. Следующий шаг (фильтровать по имени страны, к которой привязан автор) ставит в тупик - сделать так не получится, потому как конструкции вида
"PROPERTY_AUTHOR.PROPERTY_COUNTRY.NAME" => "И%"
работать не будут...
Вторая мысль:
Использовать подзапросы, сконструировать что-то типа
Но тут мы упираемся в то самое примечание, которое есть в документации: мы не можем использовать PROPERTY_AUTHOR, только ID. При этом, если всё-таки вписать PROPERTY_AUTHOR, то возникает ошибка
Warning: mb_strlen() expects parameter 1 to be string, object given in /var/www/html/bitrix/modules/iblock/classes/general/iblock.php on line 2234
которая даёт пищу для размышления и небольшую подсказку в какую сторону копать...
Решение:
Путем непродолжительных изучений вышеуказанного файла находим в файле
Тем самым мы обходим примечание из документации и теперь можем строить "матрешки", теоретически, любой вложенности, например, для решения поставленной в самом начале поста задачи будет работать вот такой код:
Озвученный подход внедрен на нескольких проектах (да-да, мы знаем, что модифицировать ядро нельзя) и пока проблем не наблюдается. Нагрузку решение выдерживает, "подводных камней" не обнаружено, возможностей фильтрации добавилось, мягко говоря, очень много
Примечание:
Нашелся только один баг фича): Если у ИБ "Книги" свойство "Авторы" множественное, то будет дублирование выбранных книг (по каждому элементу столько раз, сколько нашлось совпадений по значению множественного свойства).
О, знакомая тематика:) Писал подобное пару лет назад, только пошел по пути допила а-ля
"PROPERTY_AUTHOR.PROPERTY_COUNTRY.NAME" => "И%"
http://dev.1c-bitrix.ru/community/web.../blog/sku/ Тоже создавал идею И подобных предложений/запросов на данный функционал там и на форуме довольно много. Жаль, что битрикс очень медленно развивает ядро, которое постепенно морально устаревает.
Хак, описанный выше, не сработает с версии модуля Информационные блоки 16.5.6. Кроме описанных в блоге действий, придется в коде класса CIblockElement добавлять (возвращать) функцию _sql_in, менять GetList и PrepareGetList. В общем, дело это неблагодарное и невеселое (сама в шоке что сработало). Предлагаю настаивать на выпуск официального релиза с возможностью использовать подзапросы для свойств, а не ломать чужие велосипеды((
Ирина Анатольевна Дороган написал: Хак, описанный выше, не сработает с версии модуля Информационные блоки 16.5.6. Кроме описанных в блоге действий, придется в коде класса CIblockElement добавлять (возвращать) функцию _sql_in, менять GetList и PrepareGetList. В общем, дело это неблагодарное и невеселое (сама в шоке что сработало)
вот так, похоже, работает. достаточно "малой кровью"
Ирина Анатольевна Дороган написал: Предлагаю настаивать на выпуск официального релиза с возможностью использовать подзапросы для свойств, а не ломать чужие велосипеды((
это да... но идее уже почти 4 года, неплохой рейтинг и даже статус "на голосовании", но когда сделают - не понятно https://idea.1c-bitrix.ru/8080/
С сегодняшнего дня доступно очередное обновление DEFA.Tools.
Добавлено два важных инструмента:
Копирование инфоблока Позволяет скопировать инфоблок, сохранив все его параметры и набор свойств элементов.
У администратора сайта на странице просмотра списка элементов инфоблока в верхней панели появляется дополнительная кнопка. При клике открывается диалог выбора типа инфоблока, к которому будет привязан созданный инфоблок. Удобно использовать при дублировании инфоблоков для многоязычных сайтов.
Автоматическое наполнение инфоблока демо данными Позволяет буквально в два клика наполнить инфоблок тестовыми данными.
У администратора сайта на странице просмотра списка элементов инфоблока в верхней панели появляется дополнительные кнопки «Наполнить инфоблок демо данными» и «Удалить демо данные». Можно указать количество создаваемых элементов и разделов, максимальный уровень вложенности разделов, управлять их активностью и т.п. Поддерживаются признаки обязательности и множественности для всех типов свойств и параметров элементов. Кнопка «Удалить демо данные» удаляет все элементы и разделы, созданные при помощи модуля DEFA Tools.
В настоящее время подавляющее число российских компаний испытывает сложности в организации регулярной работы в социальных сетях. Чаще всего это связано с отсутствием соответствующего персонала и с неумением выстроить процессы по поддержке собственных каналов в социальных сетях. Имея значительной опыт в производстве и поддержке корпоративных сайтов, агентство DEFA Interaktiv разработало технологическое решение, позволяющее упростить данную задачу и сделать ее частью регулярной контент-поддержки веб-сайтов, работающих на 1С-Битрикс.
Решение предполагает использование сотрудниками, отвечающими за обновление информационных блоков на корпоративных сайтах, как работающих внутри компании, так и в агентствах и студиях, осуществляющих традиционную поддержку сайтов. Публикация информации в социальных сетях при помощи модуля не требует дополнительного времени и специальных навыков. Модуль распространяется БЕСПЛАТНО. Надеемся, что он поможет в работе вам и вашим клиентам.
у меня два сервера - тестовый и боевой. с тестового в фэйсбук постится на ура, а на проде никак не могу заставить работать причем на тесте использetncz недавний бэкап с продуктива. из этого могу единственное предположить, что проблема в настройках сервера. может быть нужно уделить особое внимание крону? в документации про это не сказано, а догадывалка моя уже совсем не догадывается
Благодаря нововведениям HTML5 появилась возможность работать с объектом history и менять урл текущей страницы без её непосредственного обновления.
Не секрет, что компоненты, работающие в режиме AJAX, при переходе по страницам меняют якорь, то есть получается что-то типа http://domain.ru/news/#view/news/?PAGEN_1=2 и т.п. Конечно внешне смотрится это не очень хорошо. К тому же при обновлении страницы в браузере выполняется сам компонент, после чего аяксом загружается соответствующий контент, исходя из установленного в урле хеша.
Путем простой доработки файла /bitrix/js/main/ajax.js (в общей сложности добавлено ~30 строк) мы получаем ПРАВИЛЬНЫЕ урлы для аякс-компонентов. То есть урл вида
http://domain.ru/news/#view/news/?PAGEN_1=2
превращается в совсем правильный
http://domain.ru/news/?PAGEN_1=2
Естественно сохраняется история переходов и обратная совместимость со старыми браузерами.
ВАЖНО: Предоставленное решение является теоретическим (экспериментальным). Создано с целью обратить внимание разработчиков на эту возможность HTML5 (возможно команда 1С-Битрикс внедрит эту "фичу" в ближайших обновлениях продукта)
очень ждем возможности прописать в настройках компонента аякс-идентификатор в ручную чтобы было возможным обратиться конкретно к нему из события и обновить.
если не понятно могу поискать тему на форуме где подробно обсуждали года 3 назад...
Эм.. Вообще-то, имеется в виду библиотека, которая пошла в ход вместе с эрмитажем, просто пока без пользовательской документации. Впрочем, народ уже и без документации вовсю пользуется. На лавры jQuery никто покушаться не собирается, каждый инструмент служит своей цели.
Макс, ждать ли документацию по js-либе. Точнее - когда? Смотрел тут взаимодействие компонента выбора юзеров в таске с формой редактирования таска, да и вообще их скрипты, довольно интересно, структурировано, многое понятно и так, но много моментов, по которым очень хотелось бы увидеть доку для упрощения понимания и без необходимости куда-то лезть в код и тратить кучу времени на разборки.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».
Тоже создавал идею
Жаль, что битрикс очень медленно развивает ядро, которое постепенно морально устаревает.
Кроме описанных в блоге действий, придется в коде класса CIblockElement добавлять (возвращать) функцию _sql_in, менять GetList и PrepareGetList.
В общем, дело это неблагодарное и невеселое (сама в шоке что сработало). Предлагаю настаивать на выпуск официального релиза с возможностью использовать подзапросы для свойств, а не ломать чужие велосипеды((
Хак, описанный выше, не сработает с версии модуля Информационные блоки 16.5.6.
Кроме описанных в блоге действий, придется в коде класса CIblockElement добавлять (возвращать) функцию _sql_in, менять GetList и PrepareGetList.
В общем, дело это неблагодарное и невеселое (сама в шоке что сработало)
вот так, похоже, работает. достаточно "малой кровью"
Предлагаю настаивать на выпуск официального релиза с возможностью использовать подзапросы для свойств, а не ломать чужие велосипеды((