Доброго времени суток! Столкнулся со следующей задачей: при выгрузке товаров в ВК не выгружается ссылка на товар, которая нужна для кнопки "Перейти в магазин" в карточке товара в ВК.
В стандартных настройках не удалось найти этого функционала, почему кстати разрабы этого не сделали - вопрос.
Собственно немного покопавшись в исходниках пришел к следующему решению, не совсем корректному (в ядре лучше не чего не трогать), но проблему решает.
Для начала редактируем файл /home/bitrix/www/bitrix/modules/sale/lib/tradingplatform/vk/feed/data/converters/product.php, в этом файле ищем функцию convert (примерно строка 43). Эта функция конвертирует массив привычных данных полученных например от CIBlockElement::GetList. Массив данных передается в единственном параметре функции в переменной $data Для верности вносить правки я буду в конце функции перед return array($data["ID"] => $this->result);
// validate LENGTH
$this->result['description'] = $this->validateDescription($this->result['description'], $logger);
$this->result['NAME'] = self::convertQuotes($this->result['NAME']);
$this->result['NAME'] = $this->validateName($this->result['NAME'], $logger);
// VK don't understand specialchars-quotes. Change them to the yolochki
$this->result['url'] = $data["DETAIL_PAGE_URL"]; //добавляем передачу URL товара в ВК
return array($data["ID"] => $this->result);
}
Теперь мы можем использовать наш параметр url дальше в экспорте. Осталось изменить скрипт который отвечает за генерацию параметров, которые нужно передать в ВК. Редактируем файл /home/bitrix/www/bitrix/modules/sale/lib/tradingplatform/vk/api/scripts/marketproductaddedit.vks По внешнему виду напоминает JS, но это не точно. Нам тут нужно подправить переменную params ищем ее на 11 строке, так же как и прошлом файле буду добавлять в конец нашу переменную url
Ну вот и все! Далее идем в экспорт товаров и запускаем его, должно пройти все без ошибок. Спасибо за внимание, может кому-то я помог. P.S. лучше все же не трогать файлы в ядре.
У меня есть телеграм канал "Bitrix - это просто! О Битриксе и не только". Он еще молод и зелен. https://t.me/simplybitrix Про 1C-Bitrix, обучение работе с Битриксом, полезное о различных технологиях в сфере веб-разработки. А также малая толика юмора, без которого ну никак.
Это лучший модуль на Маркетплейс, который позволяет гибко настраивать ваши перекрестные предложения, поддерживает наследования и группировки. Легко интегрируется в любой интернет-магазин на базе 1С-Битрикс: Управление сайтом.
Модуль отлично зарекомендовал себя: 1. более года в эксплуатации - с 2018 года входит в состав BXReady: Флагман. Универсальный интернет-магазин 2. более 100 внедрений подтверждают полезность модуля.
Теперь он доступен для любого интернет-магазина!
И мы не оставим данное событие без внимания Будущий ценник решения - 5 900 рублей.
Но в течение 3 дней (с 15 по 17 мая включительно) у вас будет шанс приобрести его намного дешевле! Всего за 3 000 рублей! Только не упустите момент. Предложение ограничено!
Примечания: 1. Действуют партнерские скидки 2. Акция действует до 17 мая или до выполнения условия 3. 3. Акция распространяется ТОЛЬКО НА 10 ЭКЗЕМПЛЯРОВ. Если 10 экземпляров будут проданы ранее 17 мая, АКЦИЯ БУДЕТ ОСТАНОВЛЕНА ДОСРОЧНО!
Поддерживаются статические наборы. Вы можете самостоятельно составить список товаров для кросс-групп.
Поддерживаются динамические наборы. Вы можете подготовить условия, по которым система сама будет формировать наборы кросс-групп.
Поддерживается режим подбора по схожести свойств. Вы можете подготовить условия на основе схожести свойств, и система сама будет подбирать товары с соблюдением этих условий. Поддерживается режим наследования. Просто задайте параметры сборки перекрестных предложений у групп, и ваши товары автоматически унаследуют эти наборы.
Поддерживается режим слияния. Одноименные группы грамотно объединяются в одну.
Поддерживается адаптивность. Вы можете настроить, сколько предложений в строке будет выводиться на различных устройствах.
Наглядно увидеть работу модуля можно в наших видео. Конечно же доступна подробнаядокументация по настройке и работе с модулем.
В базовом варианте достаточно сформировать пять переменных в тэге <form> и отправить форму сабмитом без js вообще. Но плюс к этому есть готовая реализация и примеры использования по поиску местоположений и расчету стоимости доставки. Две самые сложные части оформления на мой взгляд. То есть теоретически компонент должен закрыть прям здоровый пласт проблем и интегратору останется по сути не сложная верстка.
Здравствуйте, я решил использовать Face-трекер в проекте нашего клиента и вот с какими трудностями мы столнулись. Это будет полезно тем кто собирается внедрять и тем кто обеспечивает его "работу" со стороны Битрикс24.
Цель в нашем проекте: Фиксировать реальных посетителей магазина. Считать общий человекопоток. Выявлять существующих клиентов, считать количесвто повторных визитов. (сравниваю потом с продажами, для выявления ситуации посещения, но отсутсвия продажи).
1. 1000 баллов которые даются вначале "бесплатно", даются разово, а не каждый месяц имейте это в виду.
2. На двух порталах у меня произошло следующее - 22 февраля 19г. исчезли неизрасходованные балы. Просто стало 0 и все. По этому поводу было создано обращение в тех. поддрежку №2295293, в котором на явно поставленные вопросы решений не предоставлено. Ваши балы тоже могут пропасть и никаких отчетов система и ТП не предоставляет.
3. Face-трекер - требует постоянно запущенного браузера с подключенной веб-камерой.
4. Face-трекер можно использовать только с веб-камерами подключенными непосредственно к компьютеру с браузером. Т.е. задействовать любую IP-камеру НЕЛЬЗЯ. Если вам надо, например, просматривать вход в магазин, то будьте готовы чтобы прямо возле этого входа была расположенна веб-камера с компьютером на котором запущен браузер с порталом и все равно не факт что все заработает как вы расчитываете. Для себя я частично решил эту задачу использованием программы, которая осуществляет получение видеопотока с IP камеры по протоколу rtsp и транслирует его в виртуальную вебкамеру. Вопервых программу полностью удовлетворяющую этим задачам я нашел только одну!!!, во вторых она платная, в третьих это лишний элемент в связке Битрикс24 - Камера.
5. Сапоставить зафиксированных Face-трекер-ом посетителей с уже имеющимися Контактами в CRM - Нельзя! Казалось бы что проще на основе Посещения или Лида-посещения создать связь с Контактом в CRM и все, нет так нельзя. Штатно можно зафиксировать посетителя, записать Лид, Лид сконвертировать в (новый) контакт и потом зафиксированный посетитель будет узнаваться как этот (новый) контакт. Но связать с уже имеющимся нельзя. К слову тех. поддержка сослалась на API, вроде как через него можно. Я еще проверить не успел, да и это надо городить целое приложение-интерфейс по связи посетителей и (имеющихся) контактов.
6. Фото посетителей доступны только на странице Face-трекер, на которой нет фильтров, ничего. А на странице списка Лидов, которые создаются на посещение, вывести фото никак нельзя, что делает эти данные неинформативными. Обращение №2320205 - уже 8й день нет никакого ответа. (по регламенту максимальное время 5 часов)
7. Фиксируемое время посещений исключительно московское, по этому поводу создано обращение №2320665 - уже 8й день нет никакого ответа. (по регламенту максимальное время 5 часов)
8. Самое интересное. Качество картинки поступаемое в Битрикс24. Путем нескольких итераций, мы пришли к камере 1920*1080 разрешением и 30-кратным !оптическим! зумом и автофокусировкой. Качество и детализация картинки просто супер. Еще определенное время ушло на выбор ракурса захвата посетителей, т.к. нужно фиксировать зону через которую все проходят, не проходят лишние, не мельтешат свои (накручивая платные баллы) и длительное время лицо остается в кадре. (сделать это через веб-камеру, уверен просто невозмжно, если только не фотать посетителей стоящих неподвижно в очереди на кассе). Тестирование картинки проводим через сервис в интернете: https://ru.webcamtests.com/
Т.е. в Битрикс мы направляем картинку хорошего качества FullHD, что подверждает тестовый сервер приемник. Что доходит в Битрикс, мы никак проверить не можем, на странице Face-трекер-а нам показывают, какбы, нашу картинку, которая почему-то, другого разрешения и качества.
Может это урезанная картинка для контроля? А в сам модуль распознования уходит картинка в исходном качестве? Это вопросы подвисшие в возду! Тех. поддержка №2301209 - уже 9й день нет никакого ответа. (по регламенту максимальное время 5 часов) А по факту вот такая картинка отправляемая в Битрикс, не является с точки зрения Битрикса досточно хорошей для распознования.
Как итог, фиксируется около 20% посетителей проходящих в зоне захвата. Картинка которая приведена на странице Face-трекер (две девушки), уверен, в реальных условиях не рабочая и распознать с неё посетителей нельзя.
В связи со всем вышеперечисленным опытом использования Face-трекера, складывается стойкое впечатление, что данный функционал не готов для применения, а временные ресурсы которые требуются для решения этих задач, не оправданы. Следовательно потратив время на это, и не потратив его на другие полезные дела для вашего Бизнеса, вы навредите своему бизнесу.
В пост приглашаются ответственные сотрудники, заинтересованные в улучшении качества сервиса Битрикс24, а также для решения уже поставленных вопросов в рамках заявляемой технической поддержки.
Уважаемые форумчане! Кто настраивал robokass'y на битриксе, помогите плз. Сделал все по гайду https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=42&LESSON_ID=5185&LESSON_PATH=3912.4580.4828.3076.5185, при оформлении заказа (последний этап), нажимаю оформить, вылетает прелоадер (на секунду) и все. Т.е. данные не отправляются, ничего не происходит (заказ не формируется), подскажите, что еще нужно делать. С уважением, Алексей.
Как написать качественный код? Как протестировать максимальное количество вариантов и не сойти с ума?
На эти вопросы есть ответы: PHPUnit и TDD. Я пойду от простого сложного, стараясь не перегружать ваш мозг.
А теперь познакомимся с ними поближе при решении реальной проблемы.
Описание проблемы
На сайте используется стандартный механизм авторизации плюс авторизация внутренних пользователей через Active Directory (AD).
Это сделано через собственные обработчики событий "OnBeforeUserLogin" и "OnUserLoginExternal".
Проблема заключается в особой специфике:
нужно, чтобы можно было войти как "user", "iek\user", "user@iek.ru" (логин), "user@iek.ru" (почта как логин)
люди путают пароль от сайта iek.ru и от AD
куча других не интересных проблем
В общем, мне надоело решать проблемы авторизации на сайте.
Что я сделал:
описал кейсы
использовал TDD
с помощью PHPUnit протестировал все кейсы
Описание кейсов
Тут все просто: что приходит, и что мы ожидаем увидеть в результате выполнения тестируемой функции. Например, "iek\user" должен стать "user".
Для описания я использовал провайдер данных, принимающий список в виде "входное значение", "выходной значение, которое ожидается".
Посмотрите, тут ничего сложного:
public function canonizeProvider() // данные для проверки канонизации логина
{
return [
['iek\\user', 'user'],
['user', 'user'],
['user@iek.ru', 'user'],
['user@iek.com.ua', 'user'],
['user@mail.ru', false] // это не из AD, поэтому false
];
}
Проверяем авторизацию по AD? Доступ должен быть только из локальной сети. Ну и пароль должен быть правильным. Вот провайдер данных для проверки другого метода, в качестве ключа я использую небольшое описание:
PHPUnit 5.7.27 by Sebastian Bergmann and contributors.
.......................................................... 58 / 58 (100%)
Time: 5.72 seconds, Memory: 59.75MB
OK (58 tests, 58 assertions)
В случае возникновения ошибки выводится расширенно сообщение:
1) AuthorizationTest::testLogin with data set "Bitrix by mail success WAN" ('8.8.8.8', array('user@iek.ru', 'password', 'Y'), false)
Failed asserting that false matches expected true.
Таким способом можно вести разработку: дорабатываешь код, запускаешь тест, смотришь результаты.
Тестирование кода
Так зачем я заморочился с PHPUnit? А это позволило:
использовать разработку через тестирование
не запутаться, и не "исправил два бага, в результате появился еще один"
Коллеги, хелп, не пойму почему ошибка вылазиет при регистрации Данные указанные при регистрации не прошли проверку, введите данные заново и повторите попытку, код не мой разбираюсь в нем, вроде все должно работать но...может кто сталкивался?
Друзья, подскажите что нужно сделать, чтобы при выборке "Выбрать из медиабиблиотеки", файл брался именно по той ссылке где он находится на медиабиблиотеки?
Бизнес-процесс автоматической раздачи лидов между менеджерами
Хочу поделиться опытом использования бизнес-процессов Б24 для решения задачи по распределению лидов между менеджерами.
Зачастую лиды в систему поступают, например, из какого-нибудь внешнего ресурса. При этом сущности добавляются в CRM по REST от лица какого-нибудь администратора или бота. Типовая задача для таких случаев - настроить автоматическую раздачу лидов на менеджеров.
Задача, на первый взгляд, довольно тривиальна. Нужно создать бизнес-процесс, срабатывающий по добавлению лида на портал. Далее нужно положить блок “Выбор сотрудника”, перечислить в нем список сотрудников или отделов для выбора, отметить при необходимости учет отсутствий и рабочего времени и сменить ответственного за лид на случайно выбранного в блоке сотрудника.
Однако на практике такая схема имеет один существенный недостаток. Зачастую начальники отделов продаж просят убрать из раздачи некоторых менеджеров по разным причинам. Например менеджер проводит экскурсию для потенциальных клиентов или занимается какой-нибудь документацией.
Такое временное отключение менеджера создаст для администратора или разработчика проблему постоянных просьб залезть в настройки бизнес-процесса и убрать из блока "Выбор сотрудника" определенную группу менеджеров.
Для таких случаев есть может быть неочевидное, но довольно удобное решение - использование универсальных списков. В меню “сотрудники” есть вкладка “списки”. Мы можем создать список сотрудников для раздачи. Поле “Название” элемента является обязательным и добавлено по-умолчанию. Кроме него нас интересует поле типа “Привязка к сотруднику”, которое в нашем случае нужно сделать множественным.
По бизнес-процессу предприятия требовалось, чтобы лиды раздавались на разных сотрудников в зависимости от поля “предпочитаемый язык”. Поэтому в данном случае потребовалось создать три элемента, которые я назвал согласно коду страны:
Теперь перейдем собственно к настройке бизнес-процесса.
Раздача лидов должна происходить автоматически при добавлении лида в систему, поэтому нужно включить соответствующую опцию “автоматически запускать” с параметром “при добавлении”:
В логике БП мы будем использовать блок “чтение элемента списка”. ID элемента придется зашивать статически, но мы можем немного образить это через добавление идентификаторов в константы БП:
Схема БП выглядит следующим образом:
На схеме присутствует блок выбора предпочитаемого языка. Внутри блока все ветки аналогичны.
При выборе элемента списка нас интересует поле “сотрудник”, которое далее передается в блок “Выбор сотрудника” в качестве параметра. Ну, наконец, переводим лид на выбранного менеджера:
Остался последний шаг - настроить права доступа на элементы списка доверенным лицам:
Таким образом администратору нет необходимости открывать доступ к бизнес-процессам для простых пользователей, сохраняя безопасность проекта и предотвращая случайные поломки системы.
В свою очередь руководители могут самостоятельно включать/отключать менеджеров от раздачи лидов в течение дня, не прибегая к помощи администратора или разработчика.
Ничего революционного или изощренного здесь нет, но на мой взгляд решение получилось довольно изящное
Добрый день. Возникла такая задача, с включенным ajax режимом в компоненте catalog, при переходе в карточку товара нужно чтобы страница прокручивалась к топу. В самих настройках компонента catalog есть ф-я прокрутки к началу компонента но не к началу документа. Есть ли какая-то возможность это изменить, и все таки сделать прокрутку к началу документа?
Часто для мобильной версии делают отдельный шаблон и не используют при этом для мобильной версии отдельный поддомен. В результате получается, что по оному урлу могут отдаваться разные страницы, что делает невозможным включить композит на сайте.
Но всё же при определенных действиях, можно сделать корректным работу композита в таких случаях. Это потребует доработки, как со стороны сайта, так и со стороны nginx.
Суть решения - для мобильной версии всегда подставлять в request_urI определенный параметр, и устанавливать куку. Кука нужна, чтобы на стороне nginx можно было определить какую именно страницу отображать из кеша.
А теперь подробнее:
1) В htaccess добавляем php_value auto_prepend_file с пум на файл с таким содержимым:
Тут вызов страницы с параметром set_mobile=Y устанавливает куку mobile=Y и редиректит на ту же станицу, но без параметра set_mobile=Y. Аналогично set_mobile=N устанавливает куку mobile=N. Если в момент загрузки страницы куки mobile не существует, то на основе user-agent определяем десктоп или мобильную версию. Далее, основываясь на куке mobile, при необходимости, в request_uri добавляем параметр mobile=Y.
2) В настройках композита необходимо добавить параметр set_mobile в "Параметры URL, при которых не будет работать композитный режим". Теперь при включении композита для основной и мобильной версии будет создаваться разный кеш.
Осталось настроить nginx. Для этого надо создать два файла конфигурации:
1) Для определения на основе user_agent и куки какую версию кеа отдавать. Если куки нету, то смотрим по user_agent, если кука есть, то смотрим на содержимое куки. /etc/nginx/bx/maps/composite_ex.conf
2) Чуть измененный конфиг, стандартного комозита. /etc/nginx/bx/conf/composite_ex.conf
set $composite_cache "bitrix/html_pages/${host}${composite_key}/index@${mobile}${args}.html";
set $composite_file "${docroot}/${composite_cache}";
set $composite_enabled "${docroot}/bitrix/html_pages/.enabled";
set $use_composite_cache "";
if ($is_global_composite = 1) {set $use_composite_cache "A";}
include bx/conf/bitrix_general.conf;
location / {
if (-f $composite_enabled) { set $use_composite_cache "${use_composite_cache}B"; }
if (-f $composite_file) { set $use_composite_cache "${use_composite_cache}C"; }
if ($use_composite_cache = "ABC") { rewrite .* /$composite_cache last; }
proxy_pass $proxyserver;
}
3) И дальше подключаем наши конфиги в файле виртуального хоста: /etc/nginx/bx/site_avaliable/bx_domain.ru.conf
# Ansible managed
# Additional website http
include bx/maps/composite_ex.conf;
server {
#limit_conn perip 3;
listen 443 http2;
server_name domain.ru www.domain.ru;
# enable SSL connection
include bx/conf/ssl.conf;
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
#charset utf-8;
server_name_in_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host:443;
proxy_set_header HTTPS YES;
proxy_set_header X-Forwarded-Proto https;
set $proxyserver "http://127.0.0.1:8887";
set $imcontenttype "text/html; charset=utf-8";
set $docroot "/home/bitrix/www/domain.ru";
index index.php;
root "/home/bitrix/www/domain.ru";
proxy_ignore_client_abort off;
# Include parameters common to all websites
#include bx/conf/bitrix.conf;
include bx/conf/composite_ex.conf;
# Include munin and nagios web
include bx/server_monitor.conf;
}
Перезагружаем nginx и проверяем работу композита.
Недостатки: При добавлении параметра в request_uri он может потом вылезти в ссылках в компонентах, по этому придется вносить коррекции в шаблоны компонентов, где такое произошло. Либо на обработчике события OnBeforeEndBufferContent убрать лишние параметры mobile=Y.
Здравствуйте. Кто нибудь сталкивался, что бы в службу доставки добавлять свои ограничения? Пытаюсь разобраться как сделать ограничение по "Типам цен" может у кого есть кодик, поделитесь. Метод CCatalogGroup::GetList тут как понял не очень поможет((( как получить в ограничении список "типов цен"(( Пока смогли сделать только
Теперь собственные источники данных можно размещать как в папке "/bitrix/php_interface/grain.links", так и в "/bitrix/php_interface/grain.links" (причем последняя имеет приоритет, т.е. при наличии одинаковых источников в обоих папках, будет использоваться источник из папки local)
Работа самого модуля из папки local
Если вам нужно для чего-то доработать модуль, можете скопировать его в папку local - он будет работать и оттуда.
Появились 2 новых параметра у свойства:
- "Показывать значение (в квадратных скобках)" - при установке этой галочки вместе с названием также будет отображаться значение:
- "Прямое подключение скриптов" - такой же параметр уже был сделан ранее в модуле "Свойства-таблицы". Включайте эту опцию, когда по-другому привязки не работают, скрипты и стили интерфейса будут подключены напрямую в коде. Это позволяет решить проблему в некоторых ситуациях, например, в публичных интерфейсах Битрикс 24.
Новые источники данных
- Типы цен (модуля "Интернет-магазин") - Списки (польз. поля) - источник использует варианты значений типа "Список" для пользовательских полей, причем может брать варианты из нескольких полей сразу и из другой сущности, например, у хайлоадблока можно взять варианты значений некоторого поля объекта "Пользователь" - Хайлоадблоки (можно ограничить выбор только определенными блоками) - Элементы хайлоадблоков (можно выбирать, какое поле будет использоваться как в качестве названия, так и в качестве значения) - Свойства инфоблоков
Исправления и доработки Например, доработка для совместимости с новым интерфейсом фильтра в инфоблоках:
Не завершалась проверка системы, выдавалось сообщение: "Ошибочный ответ сервера. Не удалось завершить тестирование" Это происходило на этапе проверки структуры базы данных. Последние записи в логе проверки выглядели так:
2019-Mar-11 18:26:42 Структура базы данных (check_mysql_table_structure): Ok
35% done
2019-Mar-11 18:26:43 Структура базы данных (check_mysql_table_structure): Ok
37% done
В таблице b_im_message отсутствует индекс IX_IM_MESS_8 (notify_type,date_create)
Не включен полнотекстовый индекс IXF_IM_MESS_1 (message) для таблицы b_im_message
Сайт еще не запущен, нагрузки нет, объем данных в БД небольшой. Не видно причин для ошибок. Обновил bitrix vm до последней версии. Не помогло. Сделал проверку/восстановление таблиц. Тоже без результата. В логе ошибок mysql очень много предупреждений:
[Warning] InnoDB: Table mysql/innodb_index_stats has length mismatch in the column name table_name. Please run mysql_upgrade
mysql_upgrade не помог.
Еще обнаружил вот такую ошибку, она оказалась ключом в решению вопроса:
2019-03-11T15:26:43.492006Z 752 [ERROR] InnoDB: Operating system error number 17 in a file operation.
2019-03-11T15:26:43.492028Z 752 [ERROR] InnoDB: Error number 17 means 'File exists'
2019-03-11T15:26:43.492038Z 752 [Note] InnoDB: Some operating system error numbers are described at http://dev.mysql.com/doc/refman/5.7/en/operating-system-error-codes.html
2019-03-11T15:26:43.492048Z 752 [ERROR] InnoDB: Cannot create file './sitemanager/site_checker_b_iblock_iproperty.ibd'
2019-03-11T15:26:43.492058Z 752 [ERROR] InnoDB: The file './sitemanager/site_checker_b_iblock_iproperty.ibd' already exists though the corresponding table did not exist in the InnoDB data dictionary. Have you moved InnoDB .ibd files around without using the SQL commands DISCARD TABLESPACE and IMPORT TABLESPACE, or did mysqld crash in the middle of CRE ATE TABLE? You can resolve the problem by removing the file './sitemanager/site_checker_b_iblock_iproperty.ibd' under the 'datadir' of MySQL.
В итоге, удаление файла site_checker_b_iblock_iproperty.ibd решило проблему. Проверка стала проходить полностью.
Посмотрев на собственные посты и комментарии в прошлом, посмотрев на сообщество и степень его активности на данный момент, посмотрев на степень развития и направление развития вендора, я решил что постить статьи о разработке в блоги битрикса бессмысленно. Поэтому я решил размещать статьи у себя в блоге (он обязательно появится, руки не доходят), а сюда скидывать ссылку - как это делают все вменяемые разработчики.
К делу.
Я считаю разработку на битриксе неповоротливой и очень долгой, чтобы это ускорить я решил использовать docker. Разворачивание окружения занимает секунды (после первого запуска - сначала подтянутся все зависимости) и позволяет работать с проектом практически мгновенно. Не думаю, что стоит рассказывать о докере много (тема давно известна). Вообще, репозиторий создавался для своих целей, но если кому то поможет в разработке (почему бы не поделиться).
Что в сборке: - PHP 7.3 (в том числе CLI а также composer) - Встроенный xdebug / opcache - nginx 1.14 (apache не нужен, как бы совсем, тем более для разработки) - mysql 5.7 (хочется 8, но пока битрикс на нём не заводится) - smtp сервер (mailhog доступен по локальному адресу для просмотра писем) - memcache (пока нет официального расширения для php 7.3) - redis
Планируется: - bitrix-push-server - mariadb (вместо mysql) - поддержка композитного кэша - поддержка битрикс24
PS Я знаю что есть https://github.com/bitrixdock/bitrixdock - и это очень неплохая сборка докера (на самом деле это лучшая сборка битрикс докера), но у ребят идея сделать это универсальным средством и для прода и для дева - это другой путь. Моя же цель - сделать сборку современной (использовать последние версии ПО), простой, и удобной для разработки в первую очередь (мало кто доверяет докеру на проде, но это вопрос времени)
Ищем специалиста. Нужно привести в порядок сайт a s i a p a r t s.ru Редизайн или новый шаблон (на ваше усмотрение). Адаптивность и т.д. Исправить ошибки, которые появились после переезда на php7 и обновления платформы. Лицензия: Малый бизнес. Ждем ваших предложений, по теме. Заранее благодарим всех.
Сортировка свойств инфоблока для определенного раздела:
Понимаю что это очень специфичная вещь и мало где пригодится, но на форуме несколько раз поднималась тема без каких-либо ответов.
Для начала создаем пользовательское поле с типом "Строка" Далее нам нужно создать свою вкладку в панели редактирования раздела. Читаем курс "Разработчик Bitrix Framework" -> Кастомизация административной формы заказа И по аналогии делаем вкладку для раздела c выводом свойств текущего инфоблока: Используем событие "OnAdminIBlockSectionEdit" для вывода:
<?
//Добавляем к событию редактирования каталога
\Bitrix\Main\EventManager::getInstance()->addEventHandler("main", "OnAdminIBlockSectionEdit", array("orPropTab", "onInit"));
class orPropTab {
public static function onInit() {
return array(
"TABSET" => "orPropTab",
"GetTabs" => array("orPropTab", "orPropTabgetTabs"),
"ShowTab" => array("orPropTab", "orPropTabShowTab"),
"Action" => array("orPropTab", "orPropTabAction"),
"Check" => array("orPropTab", "orPropTabCheck"),
);
}
public static function orPropTabAction($arArgs) {
if ($_POST['orPostSort'] && !empty($_POST['orPostSort'])) {
if (is_array($_POST['orPostSort'])) {
foreach ($_POST['orPostSort'] as $sKey => $sValue) {
if (!empty($sValue)) {
$sortComplite[$sKey] = $sValue;
}
}
} else {
//Если только 1 значение, то не массив
$sortComplite = $_POST['orPostSort'];
}
$sortComplite = serialize($sortComplite);
$arSection = \Bitrix\Iblock\Model\Section::compileEntityByIblock($arArgs['IBLOCK']['ID'])::update($arArgs['ID'], array("UF_PROPSORT" => $sortComplite));
}
// Действие после сохранения заказа. Возвращаем true / false
// Сообщение $GLOBALS["APPLICATION"]->ThrowException("Ошибка!", "ERROR");
return true;
}
public static function orPropTabCheck($arArgs) {
// действия перед сохранением.Возвращаем true / false
return true;
}
public static function orPropTabgetTabs($arArgs) {
//Инфо о табе
return array(
array(
"DIV" => "sortSectionTab",
"TAB" => "ORWO: Сортировка свойств данного раздела",
"TITLE" => "Кастомая сортировка свойств",
),
);
}
public static function orPropTabShowTab($divName, $arArgs, $bVarsFromForm) {
// UF_PROPSORT - пользовательское поле для записи сортировки.
//Контент таба
if ($divName == "sortSectionTab") {
//Делаем класс данной таблицы (для польз. полей) и далее запрос на выборку.
$arSection = \Bitrix\Iblock\Model\Section::compileEntityByIblock($arArgs['IBLOCK']['ID'])::getList(
array(
"select" => array("UF_PROPSORT", "ID", "NAME"),
"filter" => array("ID" => $arArgs['ID'], "IBLOCK_ID" => $arArgs['IBLOCK']['ID']),
)
);
while ($section = $arSection->fetch()) {
//Поле с сериализированным массивом сортировки
$propToSort = unserialize($section['UF_PROPSORT']);
}
//Получаем все свойства инфоблока
$rsProperty = \Bitrix\Iblock\PropertyTable::getList(array(
'filter' => array('IBLOCK_ID' => $arArgs['IBLOCK']['ID'], 'ACTIVE' => 'Y'),
));
while ($prop = $rsProperty->fetch()) {
//Обьединяем массив сортировки инфоблока и нашей сортировки
foreach ($propToSort as $sKey => $sValue) {
if ($prop['ID'] == $sKey) {
$prop['SORT'] = $sValue;
$prop['CUSTOM'] = 'Y';
}
}
//Создаем массив
$arProps[] = $prop;
}
//Сортируем массив
usort($arProps, function ($a, $b) {
return ($a['SORT'] - $b['SORT']);
});
?>
<tr>
<input type="submit" oncl ick="BX.findChild(BX('custom_sort'), {class: 'custom_sort__item'}, true, true).forEach(function(element){ element.value = '';});" name="apply" value="Вернуть сортировку инфоблока">
</tr>
<tr>
<td>
<table class="internal" id="custom_sort" width="100%">
<tbody>
<tr class="heading" mode="tree">
<td class="internal-left">Название</td>
<td>Символьный код</td>
<td>Сортировка</td>
</tr>
<?foreach ($arProps as $prop) {?>
<tr id="PROP_<?=$prop['ID']?>">
<td align="left" class="internal-left">
<?=$prop['NAME']?>
</td>
<td align="left" class="internal-left">
<?=$prop['CODE']?>
</td>
<td align="left" class="internal-left adm-detail-content-cell-r">
<?if ($prop['CUSTOM']) {?>
<input class="adm-input custom_sort__item" type="number" name="orPostSort[<?=$prop['ID']?>]" value="<?=$prop['SORT']?>">
<span style="font-size: 1.5em; line-height: 0; padding-left: .2em; font-weight: bold; color: green;">✓</span>
<?} else {?>
<input class="adm-input" type="number" name="orPostSort[<?=$prop['ID']?>]" placeholder="<?=$prop['SORT']?>">
<?}?>
</td>
</tr>
<?}?>
</tbody>
</table>
</td>
</tr>
<?
}
}
}
?>
После добавления, появляется вкладка: Теперь нужно заставить свойства в карточке отображаться с новой сортирвкой: в SITE_TEMPLATE_PATH/components/bitrix/catalog.element/ВАШ_ШАБЛОН/result_modifier.php добавляем следующий код.
/*** start CUSTOM SORT ***/
//Получаем родительские разделы в виде древа
$nav = CIBlockSection::GetNavChain(false,$arResult['SECTION']['ID']);
while($arSectionPath = $nav->GetNext()){
$sectionParent[] = $arSectionPath['ID'];
}
//Запрашиваем данное поле для выбранных разделов
$arSection = \Bitrix\Iblock\Model\Section::compileEntityByIblock($arResult['IBLOCK_ID'])::getList(
array(
"select" => array("UF_PROPSORT", "NAME"),
"filter" => array("ID" =>$sectionParent, "IBLOCK_ID" => $arResult['IBLOCK_ID']),
)
);
while ($section = $arSection->fetch()) {
if(!empty(unserialize($section['UF_PROPSORT']))){
//Так мы оставляем только последнее заполненное значение
// $propToSort['NAME'] = $section['NAME']; <- на случай определить откуда сортировка тянется
$propToSort['SORT'] = unserialize($section['UF_PROPSORT']);
}
}
foreach ($arResult['DISPLAY_PROPERTIES'] as $propKey => $prop){
foreach ($propToSort['SORT'] as $customPropKey => $customProp){
if($prop['ID'] == $customPropKey){
$arResult['DISPLAY_PROPERTIES'][$propKey]['SORT'] = $customProp;
}
}
}
//Сортируем по значению сортировки
usort($arResult['DISPLAY_PROPERTIES'], function($a,$b){
return ($a['SORT']-$b['SORT']);
});
/*** end CUSTOM SORT ***/
После этого массив с параметрами "$arResult['DISPLAY_PROPERTIES']" отсортирован с значениями сортировки раздела
Подскажите пожалуйста как правильно сформировать путь для детальной страницы компоненту news.list.mail #SITE_DIR#/aktsii-meditsinskogo-tsentra-es-klinik-astrakhan/#js-fancy-action-list-item-detail-#ID# я формирую такую ссылку, но она вызывает ошибку в отправщика писем. Ниже я приложил скриншоты, с ошибкой и с отладочной информацей. Как сделать правильно. Заранее спасибо всем за ответы и советы.
Как решают вопросы с конфигами при командной работе ? Как у Вас решается (если вообще решается) вопрос конфигами? Если несколько разработчиков работает над 1 проектом, каждый пишет свои конфиги кто как может =) Один пишет в ИБ, другой складирует в init.php константы, 3 тий пишет Bitrix\Main\Config\Option )) Кто, как решает такие вопросы ? =)
Битрисы грозятся в этом году перейти на es6?. Интересно они будут его транслировать в es5 или он будет работать в браузере ? =)
Сам хочу писать на es6, но не хочу что бы это работало через webpack, это сложно, увеличивает порог вхождения программиста который будет работать после меня =) Стоит ли уже сегодня писать для клинских браузеров сразу на ES6 ?