Вы любите Битрикс? Просто вы не умеете его готовить!

Невозможность восстановления пароля админки, если это не запрограммировано

Самый простой способ восстановить доступ в админку - сброс пароля. Токен для действия высылается на почту.

http://site.ru/auth/index.php?change_password=yes&lang=ru&USER_CHECKWORD=c91de4c3d4e899e286a8a1876924ebf0&USER_LOGIN=admin

Если /auth/index.php не запрограммирован (а из коробки это так), восстановить невозможно.

Это не баг, это фишка.

Неожиданное поведение кеша

Необходимо всегда помнить, что при разработке разумно кеш выключать, а на продакшене он включен. Думали очистили кеш и все в порядке? Вот варианты неожиданного поведения кеша.

Первый. При выводе меню оно внезапно оказалось до <html>.

Лечение: правильно использовать «магию»: http://dev.1c-bitrix.ru/api_help/main/reference/cmain/showtitle.php

Второй. Не добавляются JavaScript-файлы в тело страницы, как результат - неработоспособность. Виновато автокеширование компонента. Подробное описание здесь: http://dev.1c-bitrix.ru/community/blogs/vad/1820.php

Лечение: перенести JS из компонента «на уровень выше», либо не кешировать данный компонент, либо использовать рецепт выше.

Хотите немного уличной магии?

Третий. Не подгружаются блоки на главной странице. В этом виноват вызов метода CIBlockElement::GetList(), причем на dev все работает, значит в каком-то модуле этот столь популярный, казало бы, класс подгружается.

Лечение:

CModule::IncludeModule("iblock");
Автоподгрузка классов. - Не, не слышали!

Медиабиблиотека

Хорошая вещь, позволяет организовать коллекции изображений, видео и аудио. Но без возможности сортировки.

Вы должны были привлечь её внимание простым естественным вопросом. А вы что спросили?
Как пройти в библиотеку?
В три часа ночи?! Идиот!

Хотите удобную сортировку?

Цель: сортировка по рубрикам, внутри рубрики - по областям, внутри области - по названию архива.

Пример:

  • Архивные короба
    • Алтайский край
      • Алтайский отдел по делам архивов
      • Государсвенный архив

Через фильтры это сделать невозможно. Поэтому только SQL-like метод: ORDER BY field1, field3, field3...

Реальное решение Bitrix-style: Выбираем ID элементов (чтобы скормить в arFilter, например), упорядочивая по названию секции элемента, потом по названию одного его свойства, потом по названию элемента.

Вот что получилось:

select-id.sql
SELECT b_iblock_element.ID FROM `b_iblock_element`
JOIN `b_iblock_section` ON (b_iblock_section.ID = b_iblock_element.IBLOCK_SECTION_ID)
LEFT JOIN `b_iblock_element_property` ON
  (b_iblock_element_property.IBLOCK_ELEMENT_ID = b_iblock_element.ID AND b_iblock_element_property.IBLOCK_PROPERTY_ID = 165) -- ID свойства
LEFT JOIN b_iblock_element AS `prop` ON (b_iblock_element_property.VALUE = prop.ID)
WHERE b_iblock_element.IBLOCK_ID = 41 -- ID инфоблока
AND b_iblock_element.ACTIVE = "Y"
AND (b_iblock_element.ACTIVE_FROM IS NULL OR b_iblock_element.ACTIVE_FROM <= NOW())
AND (b_iblock_element.ACTIVE_TO IS NULL OR b_iblock_element.ACTIVE_TO >= NOW())
ORDER BY b_iblock_section.SORT, prop.NAME, b_iblock_element.NAME;
Оставь надежду всяк сюда входящий

А пагинацию?

Продолжение истории...

Запрос select-id.sql работает, полученные ID скармливаем в фильтр, Битрикс при выборке все равно сортирует по-своему, так как нельзя указать чтобы сортировал в том же порядке, что и условие с ID. Другими словами, нельзя через фильтры сделать так:

ORDER BY Field(ID, 500, 301, 404)

Если переложить всю работу по сортировке на result_modifier - забрать все элементы и в нем отсортировать, не будет пагинации, что логично.

Если ограничить в фильтре количество до 10, Битрикс будет плевать на порядок ID, выберет первые, в result_modifier этот десяток можно пересортировать, но по всем страницам он будет неправильный.

Так как же сделать пагинацию?

  • Грубым методом - подключить пагинацию отдельно с заполением кучи запутанных параметров $arResult по документации не получилось.
  • Хитрым методом - вызывать 2 инфоблока - один из них исключительно для пагинации, другой для результатов =)
  • Правильным методом - подсунуть собственно созданный объект класса CIBlockResult:
function BANavString($NavRecordCount, $NavPageSize, $NavPageNomer, $navTemplateName = '', $navTitle = '', $navAlways = false) {
  $rsElement = new CIBlockResult();
  $rsElement->NavRecordCount = $NavRecordCount; // количество записей
  $rsElement->NavPageSize = $NavPageSize; // количество записей на странице
  $rsElement->NavPageNomer = $NavPageNomer; // номер текущей страницы
  $rsElement->NavPageCount = ceil($rsElement->NavRecordCount / $rsElement->NavPageSize); // количество страниц
  return $rsElement->GetPageNavStringEx($navComponentObject, $navTemplateName, $navTitle, $navAlways);
}

Редактор ест текст

При загрузке текста в визуальном редакторе любой аттрибут data-* в теге a «исчезает», однако его возможно вновь прописать и сохранить =)

Глюк в версии 14.0.6, и, скорее всего, в других.

Примечание: аналогичная ситуация в других редакторах исправляется внесением изменений в их настройки.

Интересная каптча

Включить каптчу возможно для регистрации (сразу), либо на вход с определенной попытки после неправильного ввода пароля, но не сразу. Это не предусмотрено, а напрасно! С новыми куками каптча для «второй» попытки не нужна!

Причем каптча не показывается для несуществующих пользователей =)

system.auth.form/component.php
$APPLICATION->NeedCAPTHAForLogin($arResult["USER_LOGIN"])