Ответы пользователя по тегу 1С-Битрикс
  • Как определить что класс подключился?

    @Firsov36
    full-stack web developer

    Поместил класс mailing в папку /local/php_interface/lib
    отрывок класса mailing


    Пишете, что подключили класс mailing, а в коде класса такого нет, но есть MailingTable

    class MailingTable extends Entity\DataManager

    К слову сказать, есть такой же класс от Битрикса. Вы пытаетесь переписать стандартный класс Битрикса? Классы начинаются с Большой буквы.

    Если уж пишите свой класс, то используйте свое пространство имен, зачем городить огород в чужом поле?

    Ну и отвечая на вопрос: "Как определить что класс подключился?"
    В php есть метод для проверки существования класса
    if (class_exists('MyClass')) {
        $myclass = new MyClass();
    }
    Ответ написан
    Комментировать
  • Как добавлять один и тот же товар в корзину, как новую позицию, а не добавлять в количество?

    @Firsov36
    full-stack web developer
    Ну видимо у вас реализованная логика так работает, что добавляется количество к "работа 1, работа 2" ...
    По сути, если я правильно понял, то у вас эти "работа1, работа2" они же "пошив, разрез"... пробовали не Комплектами, а Торговыми предложениями сделать? Например товар1 может быть красный, синий, белый... в то же время он из дерева, металла, пластика и примерно таким образом обыграть ваши "пошив, порез" и, например "разрез, выкройка, без услуг".
    Ответ написан
  • Как вывести статус доставки в составе заказа в 1с битрикс?

    @Firsov36
    full-stack web developer
    Вы какой-то компонент меняете или свое что-то пишете? Код хотя бы приведите или название компонента, который правите из стандартных, не понятно же. Отталкиваться от "знакомого" $shipment как-то не верно, нужно понимать что в этой переменной.

    Как я поняла нужно переписывать класс Basket либо Shipment


    Точно не нужно.

    Вот накидал код, как получить текст статуса для отгрузок заказа

    $orderId = 57024;
    
    \Bitrix\Main\Loader::includeModule('sale');
    
    $order = \Bitrix\Sale\Order::load($orderId);
    $shipmentCollection = $order->getShipmentCollection();
    
    /** @var \Bitrix\Sale\Shipment $shipment */
    foreach ($shipmentCollection as $shipment) {
        if($shipment->isSystem()) {
            continue;
        }
        
        $statusCode = $shipment->getField('STATUS_ID');
        $statusLang = \Bitrix\Sale\StatusLangTable::getList(
            [
                'filter' => [
                    'ID' => $statusCode,
                    'LID' => LANGUAGE_ID
                ]
            ]
        )->fetchAll();
        
        var_dump($statusLang);
    }


    Результат выполнения
    array (size=1)
      0 => 
        array (size=4)
          'STATUS_ID' => string 'DN' (length=2)
          'LID' => string 'ru' (length=2)
          'NAME' => string 'Ожидает обработки' (length=33)
          'DESCRIPTION' => string 'Ожидает обработки' (length=33)
    Ответ написан
  • Как в письмо с данными о заказе отправляемое покупателю добавить текстовый файл с данными о заказе?

    @Firsov36
    full-stack web developer
    Подписываемся на событие OnBeforeEventAdd
    (брал из очень старого рабочего кода, вырезая часть кода не для общего обозрения, но идея должна быть понятна)

    AddEventHandler("main", "OnBeforeEventAdd", array("NewOrderWithPdf", "OnBeforeEventAddHandler"));
    
    class NewOrderWithPdf
    {
        public function OnBeforeEventAddHandler($event, $lid, $arFields)
        {
            if ($event == "SALE_NEW_ORDER" && $arFields['ORDER_ID'] > 0) {
                $arrMailProps["EVENT_NAME"] = $event;
                $arrMailProps["LID"] = $lid;
                $arrMailProps["C_FIELDS"] = $arFields;
                $arrMailProps['FILE'] = [$pathToFile];
    
                \Bitrix\Main\Mail\Event::send($arrMailProps);
    
                return false;
            }
    
            return true;
        }
    }
    Ответ написан
    Комментировать
  • Как добавить статус заказа “Изменен"?

    @Firsov36
    full-stack web developer
    Что мешает просто в админке Битрикса, в таблице статусов (Админка - Магазин - Настройки - Статусы) создать новый статус со своим шаблоном письма? И проверяющий (админ, по вашему), после проверки заказа, изменения информации, добавления товаров и т.п., просто выставит этот статус для заказа? Система изменит статус заказа и автоматом отправил письма по прикрепленным к этому статусу шаблонам.

    А если далее нужно динамически менять данные в шаблоне письма, то цепляться к событию отправки письма при смене статуса, менять/изменять поля для письма, добавлять новые и использовать в письме.

    $eventManager->addEventHandler('sale', 'OnOrderStatusSendEmail', ['MyClass', 'onOrderStatusSendEmailHandler']);
    
    class MyClass
    {
        public function onOrderStatusSendEmailHandler($id, &$event, &$arFields, $val) {
            if($event == 'SALE_STATUS_CHANGED_NB') {
                //do something
                $arFields = [..fields..]
            }
        }
    }
    Ответ написан
    Комментировать
  • Невозможно войти в админку Битрикс, что делать?

    @Firsov36
    full-stack web developer
    Если уверены, что доступ у Вас имеется в админку Битрикса и чистка кеша не помогла, то стоит еще удалить Куки браузера относящиеся к сайту.
    Ответ написан
    Комментировать
  • Правильный подход к разработке на Bitrix?

    @Firsov36
    full-stack web developer
    Просили советов, вот:

    Переходите на Phpstorm. Папку bitrix/ зачем в игнор? А как же подсказки IDE для написания кода? Как минимум bitrix/modules/, bitrix/component/, bitrix/js/ - я оставляю. Также код Битрикса много ответов дает не документированного API. Или пользоваться bitrix cli и генерить файл orm:annotation для подсказок.

    через git checkout обновляем боевой


    опечатка, прикалываетесь или серьезно так делаете? загрузить изменения на сайт это git pull, а checkout это переключиться на другую ветку и переключение на другую ветку не загружает новых данных. да и ветки иногда закрывать надо.

    Пробовали openserver, самостоятельную настройку windows, короче все на так работает.


    Тут скачайте образ для VMWare Player или VirtualBox (оба бесплатные), установите туда BitrixEnv поверх CentOs minimal и создавайте на базе этого виртуального сервера хоть десяток сайтов. Там их можно мучать как угодно, а снимки сервера позволяют все в считанные минуты вернуть назад, если очень обрушили даже не сайт, а сервер.

    Разрабатываете на виртуальном сервере в новой ветке репозитория (например issue-1). Тестируете на своем виртуальном сервере, потом завершаете разработку, мержите ветку issue-1 в production (или master) в рабочую и выгружаете на боевой сервер (или предбоевой). все ок? ветку issue-1 можно удалить.

    p.s. Начало вашего вопроса порадовало)))
    Ответ написан
    Комментировать
  • Как донастроить модуль СДЭК - Битрикс?

    @Firsov36
    full-stack web developer
    Вы можете эти поля оставить пустыми. Они используются для того, чтобы указать id блока, куда выводить информацию после выбора посетителем пункта самовывоза или постамата, в том случае, если вы написали собственный компонент оформления заказа. При стандартном компоненте, будут использоваться стандартные блоки и в этом случае поля оставлять пустыми.
    Ответ написан
    Комментировать
  • Как скрыть товар у которого картинка называется "000.jpg"?

    @Firsov36
    full-stack web developer
    Как скрыть товар у которого картинка называется «000.jpg»


    Вы спрашиваете про "товар", а код показываете компонента, которые выводит разделы Инфоблока

    $APPLICATION->IncludeComponent("bitrix:catalog.section.list")


    Но могу ответить на ваш вопрос.
    Первый способ: В настройках компонента каталога, раздела или элементов и т.д. (выбрать нужное) есть поле: "Имя массива со значениями фильтра"... вписываете название массива. Далее, перед компонентом определяете этот массив, который поможет отфильтровать выводимое.

    Второй способ: Копируете шаблон компонента к себе, добавляете файл result_modifier.php и перебирая массив $arResult, удаляете ненужные записи. Ссылка на документацию.
    Ответ написан
    Комментировать
  • Включить редактор страниц в Bitrix?

    @Firsov36
    full-stack web developer
    Нажмите на кнопку "Изменить страницу" (на иконку выше текста "изменить страницу") и появится редактор, в котором можно редактировать содержимое страницы.

    Или в админке битрикса Контент -> Структура сайта -> файлы и папки - нажать на три палочки напротив нужного файла и в меню выбрать "редактировать как html" или тест или php...

    А вообще, реально, вы что хотите добавиться то? Подробнее распишите свой вопрос.
    Ответ написан
    Комментировать
  • Как изменить текст Нет в наличии у товаров в Битрикс?

    @Firsov36
    full-stack web developer
    Если компонент стандартный, то в настройках компонента каталога можно поменять настройки:

    605b32f8ec970903359623.png
    Ответ написан
    Комментировать
  • Как использовать AJAX в Битрикс?

    @Firsov36
    full-stack web developer
    BX.ajax это тот же Ajax, только в обертке Битрикса. Используйте его почти точно также как и обычный Ajax с некоторыми нюансами от Битрикса.

    Вот на хабре пост Ajax для новичков
    Документация Битрикс BX.ajax

    Не совсем понятно, что имеется в виду "примеры обработки формы". Обработки полей формы на валидность? Или сбор данных, манипуляция данных формы перед отправкой? Или куда отправить запрос и что за скрипт написать в бэкэнде? Или как из бэкэнда получить данные, а потом что-то с ними сделать?

    Если с Ajax знакомы плохо, то лучше начать с изучения этой технологии. Там ничего сложного.

    Если очень кратко пример, то вот 2 файла. Специально использовал Битриксовские обертки для js.

    простая страница сайта с формой /ajax.php
    <?php
    
    require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
    CJSCore::Init(array('ajax'));
    ?>
    
    <div id="my-form">
        <input id="my-input"></div>
        <button id="my-button">send ajax request</button>
        <div id="my-result" style="margin:10px 0;padding:.5em;border:1px solid #ececec;"></div>
    </div>
    
    <script>
        const input = BX('my-input')
        const button = BX('my-button')
        const result = BX('my-result')
        
        BX.bind(button, 'click', () => {
          BX.ajax({
            url: '/ajaxhandler.php',
            data: {
              text: input.value,
            },
            method: 'POST',
            dataType: 'json',
            timeout: 10,
            onsuccess: function( res ) {
              console.log('res: ', res)
              result.innerText = res.text;
            },
            onfailure: e => {
              console.error( e )
            }
          })
        })
    </script>
    
    <?
    require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");


    и скрипт, куда обращается ajax (/ajaxhandler.php):
    <?php
    
    $result = [
        'isSuccess' => true,
        'text' => "user was typing: {$_POST['text']}",
    ];
    
    header("Content-type: application/json; charset=utf-8");
    echo json_encode($result);


    В поле вводим текст. Нажимаем на кнопку и ниже в поле появляется текст 'user was typing' + текст что ввели в поле.

    Изучайте. На вопрос я ответил, у вас скорее всего появилось куча дополнительных вопросов. Но все ответы в изучении js, php и ajax в частности..
    Ответ написан
  • Что делать, если в битриксе не отправляется тело письма?

    @Firsov36
    full-stack web developer
    Раз письмо приходит, но пустое, то с вероятностью 98% у вас скрипты подменяют тело письма. Начните проверку с проверки кода в Событиях (всевозможные init.php в разных местах) и Агентах (ну тут искать там, как разработчик Агента решил, подсказки в Битриксе). Для теста, можно все init.php удалить и выключить Агенты не от Битрикса. Проверить, что все заработало и вернуть все как было и начать поиск плохого кода.

    И 1%, что дело в перекодировке между utf-8 и windows-1251 (в любую сторону), когда все тело превращается в false;

    Ну и оставшийся 1% - это то, что я не угадал))
    Ответ написан
    4 комментария
  • Как при клике на элемент менять значение в массиве $arParams?

    @Firsov36
    full-stack web developer
    Если рассматривать именно задачу поменять параметр в компоненте, то это не "простой" вопрос. Как минимум и к Вам и от Вас куча вопросов дополнительных появится, а без видимости кода тут можно долго гадать. Тем более Вы привели код из php скрипта, а этот код как исполняется? По запросу ajax или при загрузке страницы? У загружаемой страницы есть какие-то параметры на входе? ... и т.д.

    А в целом у Вас не правильный подход к решению задачу. Во-первых, уверен, что точно не из-за параметра "CHANGE_CITY_MANUAL" => "Y" у Вас снова вылезает табличка, а скорее всего из-за того, что система по какой-то причине не может сохранить выбранное или подтвержденное местоположение пользователем.

    В коде у Вас есть закомменченный участок:
    // $('.' + obClass.params.CLASS.WRAP_QUESTION_REASAPEKT).remove();
    - почему он закомменчен? Трудно сказать, но похоже он нужен в коде. К тому же слово REASAPEKT написано с ошибкой, если брать во внимание, сравнивать с названием компоненты reaspekt:reaspekt.geoip.

    Так что Вы изучите ошибки в DevTools, проверьте код php и закомментированные строки в том числе. В основном логика местоположения такая: смотрится куки местоположения. если не сохранено или вышел срок куки, то определяется местоположение. Как определили местоположение по каким-то алгоритмам, то спрашиваем пользователя - правильно ли? Пользователь выбирает что правильно или нет, указывая правильный город. Куки сохраняется для повторного использования на время сессии или просто на какое-то свое время, не только на текущую сессию.
    Ответ написан
    6 комментариев
  • Как узнать ID картинки в медиагалерее?

    @Firsov36
    full-stack web developer
    Так можно загрузить Коллекции (папки) и файлы по отдельности.. фильтр можно разнообразить под Ваши нужды.

    use Bitrix\Main\Loader;
    Loader::includeModule('fileman');
    CMedialib::Init();
    
    // Папки, разделы
    $ar = CMedialibCollection::GetList(
        [
            'filter' => ['ACTIVE' => 'Y']
        ]
    );
    \Bitrix\Main\Diag\Debug::dump($ar);
    
    // Элементы
    $ar = CMedialibItem::GetList(
        [
            'filter' => ['ACTIVE' => 'Y']
        ]
    );
    \Bitrix\Main\Diag\Debug::dump($ar);
    Ответ написан
    Комментировать
  • Как правильно настроить категории и карточки?

    @Firsov36
    full-stack web developer
    Для настроек компонента на странице в секции "Дополнительные настройки" поставьте галочки:
    - Использовать основной раздел для показа элемента
    - Строгая проверка раздела для детального показа элемента
    Ответ написан
  • Непонятное поведение Битрикса, как исправить?

    @Firsov36
    full-stack web developer
    Права доступа к инфоблоку на чтение стоит? И проверьте, что в $category_xmlid именно то, что должно быть, возможно он пуст или не равняется XML_ID инфоблока.
    Ответ написан
    1 комментарий
  • Как отредактировать поле дополнительные валидаторы для поля в Битрикс?

    @Firsov36
    full-stack web developer
    Я же Вам написал в прошлом вопросе: удалить существующий валидатор (справа колонка удалить, там иконка). Если нет валидаторов, то они не применяются, либо можно после удаления создать новый выбрав тип валидатора чуть выше вашей стрелки.
    Ответ написан
  • Как отключить проверку некоторых полей в форме на битрикс в компоненте form.result.new?

    @Firsov36
    full-stack web developer
    Админка - Сервисы - Веб-формы - Настройка форм - {нужная форма} - щелкнуть в колонке "вопросы" на цифру и в списке вопросов пройтись по тем пунктам для которых не надо делать проверку. Отключаете "Поле ответа обязательно для заполнения", если есть и смотрите/редактируете закладку "Валидаторы" - все для каждого отдельного вопроса-поля на форме.
    Ответ написан
  • Где класс CCurrencyRates берет курс валют?

    @Firsov36
    full-stack web developer
    Сначала заполняете список валют. Они находятся: Настройки - Валюты - Список Валют, а далее курсы валют тут: Настройки - Валюты - Курсы Валют
    Ответ написан
    3 комментария