Как сделать Update пользователя в обработчике OnAfterUserUpdate без зацикливания.

В обычной ситуации при вызове функции Update класса CUser в обработчике OnAfterUserUpdate приведёт к повторному вызову OnAfterUserUpdate и так по кругу. Таким образом получается замкнутый цикл и скрипт начинает вызывать сам себя бесконечное число раз.

Как же выйти из этой ситуации?

Вариант 1:

А вот как:

В init.php вызываем обработчик:

А вот в самом классе CUserHandler делаем такую хитрость:

Смысл в том, что при первом вызове OnAfterUserUpdateHandler всё, что ниже условия проверки значений $disableHandler и $element_id выполняется, а при последующих вызовах — нет.

Вариант 2:

Обновлять св-во по ссылке (т.к. на вход функции подаётся &$arFields )

Полезности о input -ах типа file в Битрикс

Обычно народ просто ставит

Но это не по нашему! Выглядит стандартно, да и нет никакой валидации по типу файла, если мы, к примеру, хотим загружать только файлы определённого типа.

Итак, для начала давайте подумаем, что мы хотим:

  1. Реализовать в форме input типа file, принимающий только картинки
  2. Около input -а должна быть надпись с названием файла, который мы будем загружать после выбора оного в диалоговом окне
  3. Файл-картинку из этого input-а нужно загружать в инфоблок
  4. Предусмотреть обработку ошибки, когда физический размер картинки больше установленного в php.ini

Давайте для начала реализуем пункт 2.

Как это должно выглядеть в идеале:

Joxi

Пример вёрстки: ТЫК

Листинг кода:

Read more

Получение иерархии разделов средствами Битрикс API

Приведу небольшой примерчик как одним запросом и одним циклом получить иерархию разделов в виде:

На мой взгляд, с такой структурой работать в большинстве случаев удобнее, чем со списком, отсортированном по LEFT_MARGIN

Итак код:

Read more

Яндекс карты: расстояние до ближайшего полигона

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

Основная «фишка» в алгоритме. После клика по некой точке вне полигона происходит следующее:

  1. Определяется индекс полигона, расстояние до которого минимально. (просто берём все вершины полигона и ищем расстояние от них до той точки, на которую кликнули. Ищем минимальное расстояние. Сравниваем с минимальными расстояниями других полигонов.)
  2. Определяем геометрический центр ближайшего полигона (к примеру, по оси X — это центр линии с вершинами самой левой и самой правой вершины полигона; аналогично — с осью Y)
  3. Строим маршрут от точки, куда кликнули до этого геометрического центра.
  4. Делим маршрут на отрезки и для каждого отрезка определяем — лежит ли он внутри полигона или нет
  5. Все отрезки, лежащие вне полигона — добавляем в некий массив отрезков, который и будет искомым маршрутом
  6. Находим тот отрезок, который пересекает наш полигон (перебираем каждую грань полигона и проверяем функцией пересечения отрезков с заранее известными координатами)
  7. Находим точку пересечения этого отрезка и полигона и её добавляем в искомый массив отрезков.
  8. Строим маршрут.

Read more

Живой поиск на Битрикс. Пример реализации.

49a91a4ebb

Основные задачи:

  • реализовать поиск таким образом, чтобы после ввода поискового запроса в строку, ниже этой строки появились результаты поиска
  • запрос на получение результата должен происходить только после окончания ввода поискового запроса

Окей, поехали!

Примерная вёрстка самого блока с поисковой строкой и div-ником, куда будем добавлять результаты поиска:

Read more