вторник, 28 октября 2014 г.

Битрикс. Сбор карты секций для брендов.


В одном из дизайнов пришла страничка, где для бренда собираются показываются секции, подсекции и показываются счётчики.
В проекте используются инфоблоки версии два, для каждого города создан свой Тип ИБ, внутри которого уже и существуют каталоги, и внутри них соответственно секции и подсекции ИБ. Элементы могут находиться где угодно как на верхнем уровне, так и в секциях/подсекциях  (но не одновременно).
Помимо карты секций, у бренда должна быть возможность добавления описания, картинки, ссылки на официальный сайт и некоторых специфичных выключателей.

вторник, 26 августа 2014 г.

Битрикс КП. Запуск бизнес процессов для элементов универсального списка, добавленных через экспорт.

Проблема: при добавлении элементов универсального списка через систему экспорта csv не запускаются приписанные этому списку бизнес-процессы.
Техподы ответили, что проблему можно решить добавлением кода, который сразу после создания элементов определенных ИБ (массив должен быть редактируемым), будет проверять, если ли у текущего элемента запущенный экземпляр бизнес-процесса, если нет, то запускать бизнес-процесс. Вы можете использовать метод CBPDocument::StartWorkflow() в событии OnAfterIBlockElementAdd

Короче, проблему знаем, решите уж как-нибудь сами.

UPD: приведённое решение (и вы сами должны это понимать) не годится для закачек скажем более 50 элементов. продолжение следует...

пятница, 22 августа 2014 г.

Битрикс КП. Копирование универсальных списков и бизнес-процессов.

Прикатило мне очередное интересное задание от насяльникама. Необходимо написать инструмент, позволяющий копировать универсальные списки для социальных групп (без контента, только схему). А также и бизнес-процессы принадлежащие этому списку.
Хто здесь? 0_0
Прикинуться куском обоев не получилось, поэтому пришлось делать. И писать статью, иначе я всё забуду.

Сегодня на обсуждении:
  1. копирование универсальных списков для социальных групп
  2. копирование бизнес-процессов этих списков
Обсуждаемый инструмент можно найти в конце статьи. Правда, вы сами должны понимать, что за сотворённое вами с его помощью я ответственности не несу =)

Далее:
  • БП - бизнес-процесс
  • УС - универсальный список (в рамках статьи подразумеваются УС для социальных групп)
  • ИБ - инфоблок
  • КП - корпоративный портал
  • СГ - социальная группа

четверг, 24 апреля 2014 г.

Яндекс.Карты API. Расстояние от МКАД до указанной точки: увеличиваем точность.


Если вы потыкаете пример из прошлого поста про вычисление расстояния от МКАД, то увидите, что ближайшая точка - не всегда точка нужного съезда, и маршрут рисуется от неё. И как бы правильно мы не расставляли точки съездов, всегда найдётся неправильная точка, которая ближайшая к кликнутой точке, но не является нужным съездом.
Для приблизительных расчётов это нормально, но для пользователей это будет выглядеть некрасиво. А мы хотим вот так
маршрут от мкада (без развязок)


среда, 16 апреля 2014 г.

Яндекс.Карты API. Ищем расстояние от МКАД до указанной точки.

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


Благодаря широким возможностям Yandex.maps API это сделать достаточно просто.

Итак, задача. Показать карту, дать возможность пользователю кликнуть по какому-либо месту на карте, посчитать расстояние от мкада до этой точки.
Главная проблема тут - найти ближайшую точку мкада. Автоматизировать это можно достаточно приблизительно, но нам и не нужна точность до метра.

Сегодня: рисуем Яндекс.карту; учимся рисовать на ней полигоны и метки; ищем ближайшие точки из списка объектов; составляем маршрут и считаем дистанцию между двумя точками.

Ссылки на примеры и доки в конце статьи.
UPD. Продолжение остросюжетного сериала по вычислению расстояний читайте в следующей статье:  Яндекс.Карты API. Расстояние от МКАД до указанной точки: улучшаем точность.

пятница, 10 января 2014 г.

Битрикс. Бизнес-процессы. PHP-код.

Недавно ко мне обратился насяльника с просьбой помочь в написании бизнес-процесса (далее в статье БП) для автоматической отсылки писем клиентам, у которых подходит срок оплаты хостинга.
Для полноценной работы с дизайнером шаблонов БП потребуется администраторский доступ к корп-порталу.
Все картинки в статье кликабельны, а ссылки открываются в новом окне.

вторник, 12 ноября 2013 г.

Битрикс. Зависимые по содержанию блоки.

Допустим, нам надо сделать блок в шаблоне сайта с содержанием, зависимым от того, где мы сейчас находимся и что показываем. Сформулируем более чёткие требования:
  1. На детальной странице новости мы показываем в требуемом блоке пару новостей из этого же раздела и с хотя бы с одним совпадением тегов из показываемой новости.
  2. Если совпадений нет, то просто показываем новости из того же раздела. Показываем новости из этого же раздела на странице списка новостей раздела.
  3. Если и сейчас не хватает - показываем любые из ИБ Новости.
  4. Не забыть про кеширование.
Кстати, сортировка рандомная.

Разговор сегодня будет долгий. Обсуждаем новые отложенные функции, которые почему-то в документации не рекомендуют использовать, а на курсах учили использовать. Также используем для своих вполне понятных целей встроенный класс кеширования, чтобы управлять кешированием нашего блока с помощью стандартных инструментов администрирования.

четверг, 31 октября 2013 г.

Битрикс. Фильтрация нецензурных слов при добавлении элемента ИБ.

Я как настоящий ленивый программист люблю готовые решения =) Битрикс часто мне их предоставляет, и не надо городить свои велосипеды с пятью квадратными колёсиками.
Итак, стоит задача при добавлении элемента инфоблока проверять содержимое поля DETAIL_TEXT на наличие нецензурных слов и заменять их звёздочками.
В принципе, это стандартная функциональность модуля Форум. Её и будем использовать.

Во мне ещё живы порывы нативщика писать свои несколько усложнённые решения, поэтому в данном случае я была несколько удивлена внешней простотой решения поставленной задачи.

1. В init.php на событие OnBeforeIBlockElementAdd вешаем функцию обработчик.
2. Подключаем модуль форум CModule::IncludeModule('forum')
3. Проверяем нужные поля методом CFilterUnquotableWords::Filter($arFields['DETAIL_TEXT']) Он возвращает уже отцензуренный текст, где слова, подходящие под его фильтры, заменены на звёздочку *.

четверг, 24 октября 2013 г.

Стиль кодинга. Что меня может вымораживать =)

Список того, что меня вымораживает. Это не пост для холиваров, это моё личное шизофреническое =) Периодически будет пополняться.

  1. Самое наверное затасканное. Фигурная скобка на той же строке, что и название функции/оператора. Это сильное имхо, но скобка должна быть на следующей строке. Возражения принимаются при личной встрече. Я объясню свой взгляд на эстетическое построение кода.
  2. При создании массива первая буква - большая. Для меня надо array(), а не Array(). В этом смысле код битрикса меня иногда просто пришибает на месте.
  3. Аналогично в битриксе меня вымораживает повсеместное использование альтернативного синтаксиса типа if endif. Наследие предков...
  4. Неотформатированный красиво код. Он же нечитабелен потом! Да и форматировать надо ОТСТУПАМИ, а не пробелами! У нас файл конфига в одном из проектов отформатирован пробелами. Убила бы, чесслово...
  5. Названия классов с маленькой буквы. Простите, но это уже просто неуважение. Всё равно что имя человека написать с маленькой буквы.
  6. Использование echo  в короткой записи. <? echo $ar; ?>. Если используете короткую запись - так используйте короткую! <?=$ar?>
  7. Использование фигурных скобок в однострочных условиях/циклах. В однострочных они неообязательны. Например
    foreach($ar as $key=>$value)
    {
      echo $value.' ';
    }
    Ну и нафига здесь фигурные скобки? Они только засоряют внешне код. Мне возражают, что мол программист если надо добавить ещё строку к циклу может просто подписать её под строкой, не заметив, что цикл однострочный, ибо фигурных скобок нет. Если код чётко отформатирован, то такого никогда не случится, поверьте мне.
  8. Неоткомментированный код. Простите, а вы сами читали, что у вас написано? =) А если через полгодика? А если ваш коллега успел добавить что-нибудь своё?
  9. Стопиццот вложений. Иф внутри ифа внутри цикла внутри ифа внутри ифа. Ну вы поняли. Вообще больше 4-5 уже считается плохим тоном и говнокодом. Да и просто - такой код относительно нечитабелен. Используйте return, continue и break =)
  10. Использование некорректных префиксов. Если уж написали $arResult, то будьте добры использовать эту переменую как массив, а не как булев переключатель. (В пункте номер 6 ничего не заметили?)

среда, 23 октября 2013 г.

DateTime. Интервал между датами.


Допустим, в проекте требуется указывать сколько ещё элемент будет активен. Или например сколько времени пользователь уже зарегистрирован на сайте. Или сколько дней назад он заходил последний раз... Да мало ли применений отформатированному интервалу?

Читаем документацию по классу DateTime. Его конструктор вполне радостно воспримет стандартный битриксовый формат типа 26.02.2013 12:34:02, поэтому спокойно подаём его на вход при создании объекта. Метод diff возвращает объект класса DataInterval.
//текущая датавремя
$current_date = new DateTime();
//датавремя с которым надо вычислить интервал
$date = new DateTime('26.02.2013 12:34:02');
//интервал разницы между текущим и нужным датавременем
$interval = $current_date->diff($date);

Давайте заглянем внутрь объекта $interval.
DateInterval Object
(
    [y] => 0      //сколько лет
    [m] => 7      //месяцев
    [d] => 25     //дней
    [h] => 5      //часов
    [i] => 7      //минут
    [s] => 5      //секунд
    [invert] => 1 //дата в прошлом (минусовая)
    [days] => 239 //всего дней в интервале
)

Вот и всё, никаких тонн кода. Пусть PHP сам старается. Кстати, далее объект $interval можно использовать либо в своём велосипеде, либо отформатировать методом format.