Если помимо прочего фильтра в CIBlockSection::GetList передать пустой SECTION_ID ("SECTION_ID" => ""), то в в выборке наверняка ничего не будет, потому что конечный запрос преобразуется в
в продолжение CIBlockSection 1. CIBlockSection::GetByID не выбирает пользовательские свойства для секций даже если они есть в ИБ, которому принадлежит данная секция. 2. CIBlockSection::GetList не будет выбирать пользовательские свойства, даже если их явно указать в 4 аргументе пока в arFilter не пропишешь ID ИБ с которым работаешь.
оффтоп: если тема внезапно начнёт пухнуть, то имхо можно будет разделять на отдельные темы по функциональным блокам.
Следует внимательно относиться к предпоследнему параметру. Туда следует передавать либо массив навигационных параметров (nTopCount, bShowAll, ...), либо строго false. Если вы передадите, например, пустую строку, или пустой массив, всегда будет выводиться 10 элементов. Что сыграет с вами злую шутку, если у вас нет, например, постранички и вы выводите просто все элементы.
, убедитесь, что фильтруемые поля в методе GetList для данного объекта имеют такую возможность.
Так как в обратном случае фильтр по данному полю может сработать "вхолостую" и не будет учтен (но ошибок при этом может не возникнуть за исключением некорректной выборки)
год назад, например, споткнулся на CUser::GetList при фильтре по ID (не уверен что не исправлено) хотя на некоторых других Гетлистах других объектов множественный фильтр по полю ID является нормальным подходом.
По поводу фильтров с CODE/ID. Очень и очень больной камень преткновения.
Для инфоблоков фильтр с "CODE"=>"tra" выведет не только "CODE"="tra", но и "CODE"="tratata". Следует фильтровать так: "=CODE"=>"tra"
Для фильтра пользователей по ID не следует писать ID=>123, а следует ID_EQUAL_EXACT=>123
Подытожу - когда вы хотите дернуть что-то уникальное GetList'ами, обратитесь к документации лишний раз, а после проверьте на соседние ID/CODE. Оплошность может стоить дорого (авторизация не того пользователя, или отправка не того ключа).
Новичком я очень долго путал эти штуки, просто потому что ничего не учил
GetNext - дергает данные в html-безопасном виде, в массиве также возвращает ключ с тильдой (~NAME и т.д.), где содержится оригинал. Fetch - дергает данные как есть, не предназначено для вывода в браузер, элементы с тильдой отсутствуют. GetNextElement - присутствует только у инфоблоков, возвращает объект _CIBElement.
Когда Fetch, а не GetNext? К примеру, вы перегоняете данные из одного ИБ в другой, в таком случае схема должна быть примерно такая:
Код
$rs = CIBlockElement::GetList();
while ($ar = $rs->Fetch())
$el->Add(array('NAME' => $ar['NAME']));
Если вы во второй строчке вставите GetNext, то в новый инфоблок заместо "Название" добавится quot;Названиеquot;. И т.д. Либо в данном примере использовать GetNext, но тогда брать данные из тильд.
Добавлю, что Fetch() в инфоблоках не преобразовывает макросы в полях: DETAIL_PAGE_URL, LIST_PAGE_URL и SECTION_PAGE_URL.
Также все методы GetNext() и для инфоблоков GetNextElement() имеют два очень полезных параметра, которыми я предпочитаю пользоваться. Первый параметр, установленный в false, отменит парсинг текстовых полей (замена ссылок, расстановка переносов и т.п.). Если есть желание оптимизировать парсер, то очень рекомендую. А второй параметр, установленный в false, отменит добавление тильда-полей. Этот параметр очень хорошо экономит память на больших выборках, да и вернуть начальное значение в случае необходимости (а она бывает достаточно редко) можно в любой момент битриксовым методом htmlspecialcharsback(). В общем, вторым параметром я рекомендую пользоваться постоянно.
Изменено: Leshchenko Sergey - 11.03.2011 23:41:44(убрал Fetch(), у него нет параметров)
С одной стороны COption::SetString/GetString хорош для хранения информации, но не забывайте, что GetOptionString происходит на каждом хите (и в самом начале исполнения страницы). А плохо это тем, что все это (причем, настройки всех модулей) загоняется в глобальный массив $MAIN_OPTIONS, который будет тем жирнее, чем больше вы свойств таких оставите.
Ох блин, и наткнулся я на камень агентов, но зато больше об него точно не споткнусь. Добавил агента, только смотрю, что он не выполняется, дата последнего запуска не заполняется по истечении времени.
Гляжу в БД, там поле DATE_CHECK не очищается у моего агента, а только увеличивается через каждые 10 минут на 10 минут.
Проблема была в следующем - функция отрабатывала с ошибкой (злосчастный $USER не был определен), в связи с чем DATE_CHECK увеличивался, а потом системный метод CheckAgents обрывался на моем агенте, и не очищал DATE_CHECK в самом конце.
Страницы:1
Сообщение станет доступным после одобрения модератором.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».