Задать вопрос
  • Как добавить свое поле в контакт Б24?

    @kudis
    Bitrix developer
    Если вы о коробке, то по ссылке:
    <домен коробки>/crm/configs/fields/ вы получаете страницу с добавлением пользовательских полей.
    Если хотите с этими полями работать через собственные скрипты, то советую создать их из админки <домен коробки>/bitrix/admin/userfield_admin.php, иначе коды свойств не будут осмысленными.
    Объект для контактов, при создании поля из админки CRM_CONTACT
    Ответ написан
    Комментировать
  • Bitrix, как для постраничной навигации задать кастомное количество новостей?

    @kudis
    Bitrix developer
    Стандартным news.list - это не решить
    можете написать свой компонент. вот основа:
    CModule::IncludeModule("iblock");
    
    $arSelect = [
        'ID',
        'NAME',
    ];
    
    $arFilter = [
        'IBLOCK_CODE' => 'news',
    ];
    
    if ($_REQUEST['PAGEN_1'] > 1) {
        $arNavStartParams = [
            'iNumPage' => $_REQUEST['PAGEN_1'] - 1,
            'nPageSize' => 6,
        ];
        $arFilter['!ID'] = [1, 2, 3, 4]; // TODO: получить эти данные в запросе и закешировать
    } else {
        $arNavStartParams = [
            'nTopCount' => 0,
            'iNumPage' => 1,
            'nPageSize' => 10,
        ];
    }
    
    $obFields = CIBlockElement::GetList(
            ['ID' => 'asc'],
            $arFilter,
            false,
            $arNavStartParams,
            $arSelect
    );
    
    $arCurrentData = [];
    
    while($arField = $obFields->Fetch()) {
        print_r($arField);
    }


    Обратите внимание на TODO - это id первых 4-х новостей - их получайте из этого же компонента, показывающего 1-ю страницу
    начиная со второй страницы мы делаем, некий, offset, запрещая показывать уже выведенные новости в 1-й четвёрке и сдвигая пагинатор.
    Ответ написан
  • Как сделать валидацию перед переходом в следующее модальное окно?

    @kudis
    Bitrix developer
    Смею предположить что Ваши popupOpenButtons и должны сабмитить форму?
    Но в текущей реализации они просто показывают popupWindow!
    Убирайте Ваши popupOpenButtons.forEach...,
    атрибут 'data-popup' перемещайте в форму
    и дополняйте валидацию submitHandler-ом
    form.validate({
          rules: {
            ...
          },
          messages: {
            ...
          },
          submitHandler: function() {
            const popupId = this.currentForm.getAttribute('data-popup');
            const popupWindow = document.querySelector(`.popup[id='${popupId}']`);
    
            popupWindow.style.display = 'block';
            document.body.classList.add('scroll-hidden');
          }
    });

    Как-то так!
    Ответ написан
    Комментировать
  • Не работает jquery cookie?

    @kudis
    Bitrix developer
    Без подключения jq cookie можно сделать так, как советуют здесь

    function setCookie(cname, cvalue, exdays) {
        var d = new Date();
        d.setTime(d.getTime() + (exdays*24*60*60*1000));
        var expires = "expires="+ d.toUTCString();
        document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
    }
    
    function getCookie(cname) {
        var name = cname + "=";
        var decodedCookie = decodeURIComponent(document.cookie);
        var ca = decodedCookie.split(';');
        for(var i = 0; i <ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') {
                c = c.substring(1);
            }
            if (c.indexOf(name) == 0) {
                return c.substring(name.length, c.length);
            }
        }
        return "";
    }
    
    $(function () {
        // Проверяем запись в куках о посещении
        // Если запись есть - ничего не происходит
        if (!getCookie('hideModal')) {
            // если cookie не установлено появится окно
            // с задержкой 5 секунд
            var delay_popup = 5000;
            setTimeout("document.getElementById('overlay').style.display='block'", delay_popup);
        } else {
            console.log('no way');
        }
        setCookie('hideModal', true, 7);
    });

    Естественно все функции определяйте не инлайново
    Ответ написан
    Комментировать
  • Как вытянуть чекнут ли чекбокс "Установка для разработки" в Битриксе?

    @kudis
    Bitrix developer
    С большой долей вероятности Вам нужна вот эта опция:
    COption::GetOptionString("main", "update_devsrv", "");
    Ответ написан
    Комментировать
  • Как создать форму для добавления элементов в инфоблок с помощью Bitrix API?

    @kudis
    Bitrix developer
    Можете воспользоваться стандартным компонентом iblock.element.add.form
    Он делает ровно то, что Вы описали
    Ответ написан
    Комментировать
  • Как получить вывод местоположения на кириллице (ru) и латинице (en) в Битрикс?

    @kudis
    Bitrix developer
    Если вы ещё не исчерпали лимит бесплатных запросов или оплатили платный пакет провайдеру geo данных из тех, что есть в Битриксе из коробки (ниже используем бесплатную часть Sypex), то запрос:
    use \Bitrix\Main\Service\GeoIp;
    $result = GeoIp\Manager::getDataResult('178.219.187.10', 'en');
    if ($result->isSuccess()) {
        $obGeoData = $result->getGeoData();
        print_r($obGeoData);
    }

    даст вам такой ответ:
    [ip] => 178.219.187.10
    [lang] => en
    [countryName] => Russia
    [regionName] => Moskva
    [subRegionName] => 
    [cityName] => Moscow
    [countryCode] => RU
    [regionCode] => RU-MOW
    [zipCode] => 
    [latitude] => 55.75222
    [longitude] => 37.61556
    [timezone] => Europe/Moscow
    [asn] => 
    [ispName] => 
    [organizationName] => 
    [handlerClass] => Bitrix\Main\Service\GeoIp\SypexGeo

    заменив 'en' на 'ru' в запросе, получите:
    [ip] => 178.219.187.10
    [lang] => ru
    [countryName] => Россия
    [regionName] => Москва
    [subRegionName] => 
    [cityName] => Москва
    [countryCode] => RU
    [regionCode] => RU-MOW
    [zipCode] => 
    [latitude] => 55.75222
    [longitude] => 37.61556
    [timezone] => Europe/Moscow
    [asn] => 
    [ispName] => 
    [organizationName] => 
    [handlerClass] => Bitrix\Main\Service\GeoIp\SypexGeo
    Ответ написан
  • Как добавить фразу в статистику поиска?

    @kudis
    Bitrix developer
    У Вас включена опция сбора статистики Настройки / Настройки продукта / Настройки модулей / Поиск, вкладка Статистика, чекбокс Собирать статистику по поисковым фразам?
    Если да, то добавить фразу в статистику можно также, как это делает сам Битрикс
    CModule::IncludeModule("search");
    if (COption::GetOptionString("search", "stat_phrase") == "Y")
    {
        $statistic = new CSearchStatistic('kudis.ru', '1С-Битрикс,Битрикс24');
        $statistic->PhraseStat(12, 3);
    }

    PhraseStat(количество найденных элементов, количество страниц пагинации)
    Ответ написан
    Комментировать
  • Как в PHP исправить ошибку mb_strpos(): Empty delimiter?

    @kudis
    Bitrix developer
    В Вашем случае нужно проверить на не false переменные $textarea и $text
    в этот if
    if (mb_strpos($textarea, $text) !== false)
    дописать
    if ($textarea && $text && mb_strpos($textarea, $text) !== false)
    Ответ написан
    Комментировать
  • Как сериализовать информацию из input type="file"?

    @kudis
    Bitrix developer
    Берём форму с id, myform.
    Создаём объект data = new FormData(document.getElementById('myform'));
    И отправляем эту data в адрес принимающего скрипта каким-нибудь fetch-ем или XMLHttpRequest.
    На стороне принимающего скрипта, например php, файлы придут в массиве $_FILES.
    Незабудьте у input-ов name прописать
    Ответ написан
    Комментировать
  • Как передать значение datetimepicker элементу?

    @kudis
    Bitrix developer
    $('#datetimepicker2').datetimepicker({
    date: new Date(1434544882775)
    });
    Ответ написан
  • Как вызвать функцию php из другого файла?

    @kudis
    Bitrix developer
    1. Файл index1.php обязан начинаться с <?php или <?
    2. require_once должен выглядеть как:
    __DIR__ . DIRECTORY_SEPARATOR . 'index1.php'
    Сам require_once обязательно оберните в:
    if (file_exists(__DIR__ . DIRECTORY_SEPARATOR . 'index1.php') ) {}
    Ответ написан
  • Как оптимизировать несколько reCaptcha на одной странице?

    @kudis
    Bitrix developer
    Проблема в том, что Вы грузите капчу сразу, даже если она не понадобится.
    Начинайте грузить капчу при открытии модалки с формой, или тогда, когда пользователь начал заполнять форму.
    Ответ написан
    Комментировать
  • Как позволить набирать input только числа и "+"?

    @kudis
    Bitrix developer
    Используйте плагин inputmask от jQuery
    $(function () {
       $(".js-form__input--tel").inputmask("mask", {"mask": "+7 (999) 999-9999"});
    });

    если хотите, чтобы формат был "российский мобильный" +7(9xx)xxx-xxxx (где x-любая цифра)
    то jQuery inputmask позволит сделать маску так:
    $(function () {
        $('.js-form__input--tel').inputmask({
            mask: "+7 (X99) 999-9999",
            definitions: {
                'X': {
                    validator: "9",
                    placeholder: "9"
                }
            }
        });
    });

    Теперь пользователь может вводить 89123456789 или +79123456789 или 79123456789
    Вы получите весь телефон в нужном формате
    Ответ написан
    Комментировать
  • Можно ли как-то обратиться к удалённому серверу подменив свой ip?

    @kudis
    Bitrix developer
    Есть 3 решения:
    1. Открыть доступ для Вашего IP (можно маске, но лучше получить статический)
    2. Можно поднять прокси, тунель, VPN на сервере, локально подключаться к нему и работать от IP сервера
    3. Положить на рабочий сервер "костыльный тунельчик", чторый за Вас будет обращаться к серверу, просто зеркаля Ваши запросы. Типа такого, только, возможно, вам ещё строку запроса нужно будет получать и передавать, чтобы отправлять методы, раз у Вас SOAP
    if (!in_array($_REQUEST['token'],[
        'vremenniitoken' // нужен для ботов и недоброжелателей
    ])) {
        die();
    }
    
    header('Content-Type: application/json');
    echo file_get_contents('http://url/?' . http_build_query($_REQUEST['params']));

    может file_get_contents замените на CURL.
    Ответ написан
    Комментировать
  • Как создать новое предложение через php в bitrix?

    @kudis
    Bitrix developer
    Можно посмотреть почему не работает, вызвав LAST_ERROR у экземпляра класса.
    В Вашем случае не верные даты
    для подготовки дат в битриксе используйте
    ConvertTimeStamp(time(), 'FULL', SITE_ID);
    Ответ написан
    Комментировать
  • Генерация метатегов, как реализовать?

    @kudis
    Bitrix developer
    В component_epilog setPageProperty() работает, если до этого файла ваши данные доходят.
    Не забывайте про кэш и про необходимость выноса данных из него:
    $this->setResultCacheKeys([
            'YOUR_PARAM',
        ]);

    а вообще, все свойства раздела, если вы именно так вынесли Ваши данные, доступны в компоненте каталог. Вот только заполнять данные в мета-поля нужно, используя методы отложенных функций.
    пример из доков:
    $APPLICATION->AddBufferContent('ShowCondTitle');
    function ShowCondTitle()
    {
      global $APPLICATION;
     if (!$APPLICATION->GetTitle())
        return "Стандартная страница";
     else
        return $APPLICATION->GetTitle();
    }
    Ответ написан
  • Как в Битрикс запретить вывод элемента на определенных страницах?

    @kudis
    Bitrix developer
    Оберни вызов компонента в условия:
    например:
    if ($APPLICATION->GetCurDir() !== '/about/') {}
    если нужно с подразделами:
    if (substr('/vacancies/', $APPLICATION->GetCurDir()) === 0) {}

    или условие посложнее:
    if (preg_match('/^\/news\/[\d]+\/.*/', $APPLICATION->GetCurDir()) === 1 ) {}
    Ответ написан
    1 комментарий
  • Как вывести разделы с элементами инфоблока в разных местах на одной странице Bitrix?

    @kudis
    Bitrix developer
    В нужных местах используйте news.list.
    Можете фильр использовать, если нужно больше свойств учесть, не забудьте, только FILTER_NAME указать для каждого компонента тот, в котором нужные значения.
    А, если только по секции, тогда у news.list есть параметр PARENT_SECTION_CODE.

    Если решите пользовать комплексный компонент, то всё это перенесите в news.php этого компонента
    Ответ написан
    3 комментария
  • Как отсортировать данные в корзине по алфавиту?

    @kudis
    Bitrix developer
    В файл basket-item.php товары чаще всего приходят в массиве $arResult['GRID']['ROWS']
    потому Ваш result_modifer.php должен содержать что-то подобное
    class Kudis
    {
        public static function sortByNameAsc($arrA, $arrB)
        {
            $a = $arrA['NAME'];
            $b = $arrB['NAME'];
    
            if ($a == $b) {
                return 0;
            }
            return ($a < $b) ? -1 : 1;
        }
    }
    
    uasort($arResult['GRID']['ROWS'], ['Kudis', 'sortByNameAsc']);

    ну, или, можете сортировать через multisort. Кому как нравится.
    Ответ написан