Евгений Жуков написал: Это код, оставшийся чисто для совместимости. Делайте свою доставку как наследника \Bitrix\Sale\Delivery\Services\Base. В качестве примера - \Bitrix\Sale\Delivery\Services\Configurable. Учебный курс (с него надо было начинать).
Спасибо за пример. Я понимаю, что сейчас это уже по другому работает, но я не могу переписывать всё, что уже там было только из-за инсталлятора. Это же всё работает в другом файле. Что там такого может вызываться, что не вызывается во время установки?
Спасибо за вопросы, Евгений. Я понял, что вообще не туда копал. Последний, так сказать, кусочек пазла. Получается, что профили - это просто обрезанные службы, без настроек? Хотя если озадачиться, можно и добавить туда отдельные настройки, верно? Вот что я имею ввиду: Так выглядит полноценная служба:
В общем-то я так и делал, но в этом случае вылезает ошибка во время создания служб доставки.
Код
Can't initialize service with code"dellindev.shipping
Я так понимаю, что в этот момент наш модуль ещё не зарегистрирован, хотя если после этого перейти в службы доставки, то мы можем выбрать его вручную, при добавлении новой службы. Может я не правильно добавляю сами службы?
Добрый день, я разрабатываю модуль доставки и хочу чтобы после регистрации обработчика, автоматически создавались службы доставки. Проблема заключается в том, что RegisterModule($this->MODULE_ID); сразу отправляет нас на страницу со списком установленных модулей, а мне надо перед этим сделать ещё один шаг - создание служб доставки. Я нашел в ядре событие OnAfterRegisterModule, но, похоже, неправильно его применяю. Если это возможно, подскажите, пожалуйста. Сейчас я делаю так.
Код
class my_module extends CModule{
var $MODULE_ID ="mymodule";
function DoInstall()
{
$this->InstallEvents();
}
function InstallEvents(){
//какие-то действия...
AddEventHandler("mymodule", "OnAfterRegisterModule", array('my_module','AfterInstall'));
return true;
}
function AfterInstall(){
//создаем службы доставки
}
}
Я понимаю, что где-то ошибаюсь, но может кто подскажет, где именно
Если вдруг вы как и я не смогли найти, как вытащить настройки службы/служб доставки в адекватном виде, вот рабочий способ (возможно не единственный) Нужны 2 класса: Вверху файла вставляем:
Код
use \Bitrix\Sale\Delivery\Services\Manager as DeliveryManager;
use \Bitrix\Sale\Delivery\Services\Automatic as Automatic;
Получаем список активных служб доставки:
Код
$deliveries = DeliveryManager::getActiveList();
В цикле пробегаем по службам и используем метод класса Automatic
Код
foreach(deliveries as $delivery){
var_dump(Automatic::convertNewServiceToOld($delivery)['CONFIG']);
}
В общем помощи не дождешься, даже воспроизводить проблему не стали или не смогли, не знаю. Отправлял им исходники, а они всё одно: Какие у вас браузеры? У вас последние версии браузеров? А какие? Остается уповать на описанный метод: Помещать скрипты компонента в onload
Доброго времени суток, Форумчане! Дорабатываю кастомную службу доставки, копаюсь в доках, но не могу найти решение. Написано, что в настройках GetConfig можно задать тип поля PASSWORD, но в интерфейсе настроек оно приобретает тип "hidden"
Андрей Николаев, нет, эта не информация для конкретной сущности. Компонент - это настройки отображения полей в зависимости от выбранных значений других полей. Он относится ко всем сущностям ЦРМ и для удобства восприятия, хотелось его выделить в отдельном окне, которое не будет трогать рабочую область карточки. С одной стороны вкусовщина, с другой стороны - стандартный функционал, должен одинаково работать, согласитесь, без костылей и обходов.
Залил это успешно на сайт. Текст из примера подтянулся, я обрадовался, что всё так просто и решил, как и указано в доке, ajax'ом подтянуть свой компонент. Вот тут-то веселье и началось. Создал вкладку, повесил на неё событие BX.SidePanel.Instance.open, добавил вызов ajax. Зашел в карточку и всё чудом заработало. Обрадовался такому простому решению и, с чувством выполненного долга, закрыл браузер, вырубил комп и пошел домой с работы.
На следующий день, перед тем, как выкатить это дело для внешнего теста, решил еще раз проверить. Зашел в список компаний, открыл карточку ЦРМ, которая, из списка, тоже открывается в sidePanel, нажал на свою вкладку и...увидел голый HTML без стилей и скриптов.
И вот тогда началась моя личная война. Я перепробовал очень много разных подходов. И таймеры вешал, чтобы ждать прогруза, мало ли, там же всё ajax, и события все обрабатывал. И вручную вызывал скрипты на странице, файлики подгружал вне компонента. Ничего.
Потом решил покопаться в функции, bx.ajax.get, которую решил использовать, чтобы не пилить совместимость jquery и BX. Её так расхваливали разработчики, что прям захотелось попробовать.
Описание в документации такое: processData: true|false – нужно ли сразу обрабатывать данные? Думаю, ну выключу, посмотрим, что там происходит. А дальше начал читать описание других параметров и вот что увидел:
. Если параметр processData установлен в true, то обработка будет в зависимости от типа данных:
html: результат будет очищен от js-кода. Код будет выполнен после передачи данных обработчику. Перед передачей будут выполнены все скрипты с атрибутом bxrunfirst, или все скрипты, если параметр scriptsRunFirst установлен в true;
Угадайте, какой по-умолчанию тип данных стоит? Ага, он самый.
"Код будет выполнен после передачи данных обработчику" - где это работает, я не понял, если честно.
После этого я начал тестить функцию (bx.ajax) с processData: false, и сразу заметил, что подгружаются стили, но скрипты всё еще не поддавались.
После дня разбора, я заметил, что ни в одном компоненте в crm, которые я посмотрел, нет script.js, и это навело на мысль, что бьюсь я зря.
Тогда я засунул скрипты из компонента в обработчик "onload" из выше упомянутого примера.
Скрипты начали заводиться, понятное дело, мы ж их уже не загружаем извне.
Но и тут я наткнулся на очень жесткие подводные камни.
Ни к одному нужному мне элементу вне iframe, который загружен в данный момент, у меня не было доступа.
Пришлось искать выход, как управлять iframe извне.
Помогло использование конструкции window.parent. Так мы работаем не с конкретным фреймом, а с окном, в котором он вызван. Доступ к заветным полям был получен и я уже было вздохнул спокойно, !НО!
Мне нужно было не только взаимодействовать с полями в окне, которое я сделал, но и с полями в карточке ЦРМ при закрытии этого окна.
Затык тут почти такой же, да не совсем.
Если у нас открыта карточка в sidePanel и мы открываем своё окно в sidePanel, то при его закрытии, мы попадаем не на предыдущую вкладку, как это логично было бы предположить, а в общее окно. А значит для доступа в айфрейм надо использовать конструкцию:
$('body').find(''iframe").contents().find('наш дом элемент в карточке CRM');
Т.е. для случая открытия карточки CRM в iframe и случая открытия карточки в полном окне, нужно написать отдельный поиск контейнера, в котором лежат нужные нам поля.
Попутно я пытался с тех. поддержкой что-то прояснить, но из этого ничего не получилось. "У нас всё работает".
Прикреплю пару скринов с проблемой загрузки скриптов для ясности, с чего всё это началось.