Задать вопрос
  • На чем создать интернет-магазин в 2023?

    @PetrPo
    Рассматриваем сейчас следующий пакет: Bitrix + МойСклад + 1С Бухгалтерия + СберЭквайринг.

    Нормальный вариант, если
    - НЕ хайлоад
    - НЕ сотни-тысячи свойств товаров

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

    Итого (без нагрузки конечно):
    - показатели google page speed
    Неправильно размещенные изображения удалены модератором.

    Плюсы от использования битрикса:
    - большинство интеграций, тотже "Мой склад" пишутся разрабами систем и предоставляются бессплатно под битрикс.
    - есть маркетплейс с платными(в основном)/бесплатными решениями, в основном хуево написанными, но со своими задачами справляются
    - дофига возможностей кастома, если разобраться
    - если не хочешь разбираться, дофига контор тебе готовы помочь

    Минусы:
    - если не разобраться как делать (а это немало времени), то будет говно
    - про обещанную техподдержку можешь забыть, в лучшем случаее неделя на решение вопроса. Написал - 200-й в очереди, получил ответ и он тебя не устроил - сново 200-й в очереди
    - есть дыры, но критичные они стараются латать, все-таки денег стоит система
    - и еше куча всего
    Ответ написан
    2 комментария
  • Как реализовать разные карточки товаров(деталка), для разных разделов каталога?

    @PetrPo
    Корректен ли такой вариант?

    Нет

    Самый простой вариант - для разделов добавить пользовательское свойство тпа "Список", в котром в качестве XML_ID указать название шаблона и перед выводом детальной страницы получать значения этого свойства и подставлять в вызов компонента
    Ответ написан
    2 комментария
  • Как получить трек номер из заказа в битриксе?

    @PetrPo
    \Bitrix\Main\Loader::includeModule('sale');
    
    $orderId = 1;
    
    $order = \Bitrix\Sale\Order::load($orderId);
    $shipmentCollection = $order->getShipmentCollection();
    
    foreach($shipmentCollection as $shipment) {
    	if($shipment->isSystem()) {
    		continue;
    	}
    
    	$trackingNumber = $shipment->getField('TRACKING_NUMBER');
    }
    Ответ написан
    Комментировать
  • Ошибка HTTP ERROR 500 при запуске основного файла для установки 1с Битрикс?

    @PetrPo
    В php.ini включить short_open_tag
    Ответ написан
    Комментировать
  • Простой компонент внутри простого компонента Битрикс?

    @PetrPo
    Зависит от компонента:
    1. Если подключение шаблона (result_modifier.php и template.php) находится в кешироемой области (см. как написан компонент) то проблемы будут при изменении/добавлении/удалении элементов инфоблока к которому подключен вложенный компонент
    2. Файл component_epilog.php всегда находится в НЕкешируемой области. Если только это НЕ случай из твоего вопроса, поэтому размещать простые компоненты в нем можно

    Цитата в ответе Елена
    Вот этот $component решает проблему кеширования.

    Этот параметр никак не влияет на кеширование))

    что делать если вызов компонента, внутри простого компонента необходим, переделывать компонент родитель под комплексный компонент?!?

    Зависит от ситуации, например
    - получать нужные данные в result_modifier
    - или вызывать компонент в component_epilog, а потом закидывать js-ом в нужное место
    Ответ написан
    2 комментария
  • Как сделать элементы инфоблоков в виде лендингов?

    @PetrPo
    в целом, из простого, вижу 2 варианта:
    1. С использование нового инфоблока
    - например создаешь новый ИБ "Лендинги", настраиваешь как тебе надо, добавляешь свойства
    - настраиваешь форму редактирования элемента: таб = блок у лендинга (в каждом табе соответствующие свойства)
    - добавляешь лендинг

    - в своем старом ИБ создаешь свойство привязка к элементу, например LANDING_ELEMENT_ID
    - в нем создаешь пустой элемент (заполняешь только обязательные поля) и привязываешь свой лендинг, тогда в публичке в списке у тебя выводится этот элемент с ссылкой на деталку
    - дальше, на примере комплексного компонента catalog, в шаблоне в файле element.php делаешь запрос на получение свойства LANDING_ELEMENT_ID текущего элемента (в $arResult['VARIABLES'] будеи или ID или CODE элемента) и если его значение не пустое то выводишь другой шаблон деталки

    - дальше уже дело техники, сделать новый шаблон, с выводом нужных блоков с соответствующими им свойствами

    2. Статические разделы
    - создаешь в своем ИБ опять же пустой элемент, чтобы была ссылка на деталку
    - например, если у тебя ссылка на деталку строится из символьного кода, то в папке раздела физически создаешь папку (название = символьный код элемента), тогда по этому адресу деталки элемента у тебя выведется index.php из этой папки. Ну а там уже можешь городить что хочешь, например руками верстать)) или на каждый блок делать шаблон какого-то компонента, инфу передавать через параметры компонента, или опять же делать какой-то инфоблок, тут уже на что фантазии хватит))
    Ответ написан
    Комментировать
  • Как в интернет-магазине на Битрикс закрыть показ категории товаров для неавторизированных пользователей?

    @PetrPo
    1. В настройках инфоблока на вкладке "доступ", включаешь "расширенное управление доступом".
    Скрин joxi.ru/1A5pl45sDqBD42
    2. Переходишь в изменение раздела, на вкладке "доступ" появится кнопка добавить, в попапе выбираешь "другое" и добавляешь:
    - "Все посетители" - нет доступа
    - "Все авторизованные пользователи" - чтение
    Скрин joxi.ru/l2Z6JBXfzbKze2
    3. В настройках компонента должна стоять галка "Учитывать права доступа"

    P.S.
    Хз че-то не дает ссылки на joxi вставлять, так что копируй
    Ответ написан
    1 комментарий
  • Как в Битриксе отключить авторизацию для внешних запросов на роуты (routing_index.php)?

    @PetrPo
    prolog_before.php не требует авторизаию.

    Авторизацию требует controller (так по умолчанию сделано), в нем должен быть метод configureActions, в котором отменяешь необходимость авторизации

    public function configureActions()
    {
      return [
        'addBook' => [
          'prefilters' => [
    
          ],
          '-prefilters' => [
            \Bitrix\Main\Engine\ActionFilter\Authentication::class
          ],
        ]
      ];
    }


    P.S.
    addBook = ...function addBookAction()
    Ответ написан
  • Как правильно сделать namespace для BX.ajax.runAction?

    @PetrPo
    evsyukov:main - вместо этого должно быть название модуля. По соглашениям битрикса самописные модули должны состоять из двух слов разделенных точкой, например evsyukov.testmodules, где первая часть - это условно говоря PARTNER_NAME, а вторая название модуля

    Тогда вызов будет выглядеть так:
    BX.ajax.runAction('evsyukov:testmodules.api.book.addbook', {});


    В этом методе, надо конфигурировать свои экшены, чтобы твой экшен срабатывал в публичке для всех пользователей надо написать так
    public function configureActions()
    {
    	return [
    		'addBook' => [
    			'prefilters' => [
    
    			],
    			'-prefilters' => [
    				\Bitrix\Main\Engine\ActionFilter\Authentication::class
    			],
    		]
    	];
    }
    Ответ написан
    6 комментариев
  • Как изменить размер изображения?

    @PetrPo
    Ну это конечно ппц как страно, но как-то так
    $resize = [];
    
    $filePath = '/upload/iblock/0ff/jvdg3y94o8fhfgjmzxj0c3vodb7eosd8.png';
    $arFilePath = explode('/', $filePath);
    $fileName = $arFilePath[array_key_last($arFilePath)];
    
    $iterator = \Bitrix\Main\FileTable::getList([
    	'select' => ['ID'],
    	'filter' => ['FILE_NAME' => $fileName],
    ]);
    
    if($row = $iterator->fetch()) {
    	$resize = CFile::ResizeImageGet($row['ID'], ['width'=>260, 'height'=>260], BX_RESIZE_IMAGE_EXACT, true);
    }
    
    print_r($resize);
    Ответ написан
    Комментировать
  • Как использовать Bitrix\Main\Diag\Debug::dumpToFile?

    @PetrPo
    Путь от корня сайта указывается
    Ответ написан
    Комментировать
  • 1с-битрикс: почему требует авторизацию при оформлении заказа?

    @PetrPo
    В главном модуле настройки
    1. Позволять ли пользователям регистрироваться самостоятельно - Y
    2. Запрашивать подтверждение регистрации по email - N
    Ответ написан
    Комментировать
  • В каком месте компонента sale.order.ajax заполняется письмо?

    @PetrPo
    В редактировании почтового шаблона в режиме "визуальный редактор" справа есть панель с компонентами, вместо #ORDER_LIST# можно вставить
    Магазин -> Персональный раздел -> Подробная информация о заказе для почты
    bitrix:sale.personal.order.detail.mail

    Можно подключить свой шаблон компонента, размещать надо в шаблоне сайта .default
    /bitrix/templates/.default/components/bitrix/
    или
    /local/templates/.default/components/bitrix/
    Ответ написан
    Комментировать
  • Как в Битрикс отфильтровать элементы по артикулу?

    @PetrPo
    use Bitrix\Iblock\ElementPropertyTable;
    use Bitrix\Main\ORM\Fields\Relations\Reference;
    use Bitrix\Main\ORM\Query\Join;
    
    \Bitrix\Main\Loader::includeModule('catalog');
    
    $propertyId = 20;
    $propertyValue = ['188-12-07'];
    
    $result = \Bitrix\Catalog\StoreProductTable::getList([
    	'filter' => [
    		'ELEMENT_PROPERTIES.IBLOCK_PROPERTY_ID' => $propertyId,
    		'ELEMENT_PROPERTIES.VALUE' => $propertyValue,
    	],
    	'runtime' => [
    		new Reference('ELEMENT_PROPERTIES', ElementPropertyTable::class, Join::on('this.PRODUCT_ID', 'ref.IBLOCK_ELEMENT_ID'))
    	]
    ])->fetchAll();
    
    print_r($result);


    Если точно известно, что значения свойства артикул и других не совпадают, можно не передавать
    'ELEMENT_PROPERTIES.IBLOCK_PROPERTY_ID' => $propertyId,
    Ответ написан
  • Как устанавливать плагины Vue в битрикс?

    @PetrPo
    Опережая ответ, бросай это неблагодарное дело)

    youtube, лучше смотри после прочтения ответа

    Думаю первые два пункта очевидны, но напишу
    1. Устанавливаешь node.js
    Через консоль
    2. Устанавливаешь bitrix cli
    npm install -g @bitrix/cli

    Дальше судя по логике человека из видоса, если у тебя не SPA, а у тебя наверняка не SPA:
    3. Создаешь экстеншен для vue (или другого) плагина, в консоли переходишь в папку /local/js/имя_модуля/
    bitrix create
    отвечаешь на вопросы, имя твоего экстеншена должно быть без точек

    4. Переходишь в папку с экстеншеном, пишешь
    npm init

    5. Скачиваешь нужный плагин
    npm i названиепакета
    проверь что в package.json он добавился

    6. В редакторе открываешь bundle.config.js в нем добавляешь
    plugins: {
    	resolve: true,
    },


    7. Открываешь файл в папке src, который создался через bitirx create, в нем все стираешь и пишешь import плагина, как пример
    import React from 'react'
    
    export {React}


    8. В консоли (проверь что находишься в папке со своим экстеншеном , а не где-нибудь в корне, иначе ядро сбандлишь и будет плохо)
    bitrix build

    9. Смотришь bundle в папке dist, если все ок, там должен быть транспилированный код твоего плагина

    Теперь можешь юзать через битриксовое api
    \Bitrix\Main\UI\Extension::load("имя_модуля.имя_экстеншена")


    import React from 'имя_модуля.имя_экстеншена';
    
    loadExtension('имя_модуля.имя_экстеншена').then(() => {
        // Код который использует `main.loader`
    });


    P.S.
    Сам я пробовал react устанавливать, но у него в файлах используются переменные окружения node.js и т.к. они не определены js валится, как с этим быть я не разобрался и поэтому забил, может с другими плагинами норм будет.

    И опять же судя по словам человека из видоса, так нужно делать для каждого плагина, чтобы код не дублировался в других твоих бандлах
    Ответ написан
    4 комментария
  • Кастомная сортировка по динамическим значениям в catalog.section?

    @PetrPo
    ELEMENT_SORT_FIELD поддерживает сортировку по списку id

    "ELEMENT_SORT_FIELD" => "ID",
    "ELEMENT_SORT_ORDER" => $arElements // массив ID в нужном порядке
    Ответ написан
    Комментировать
  • Почему вылетает ошибка агента битрикс?

    @PetrPo
    Предположу, что вызывается $USER->GetID(), в документации указано, что Переменная $USER в агентах отсутствует.. По всей видимости, в этом модуле есть событие на добавление элемента инфоблока, в котором вызывается $USER->GetID() и т.к. $USER=null, а не объект класса CUser получаешь ошибку.
    Ответ написан
    Комментировать
  • Кэширование и передача данных внутри комплексного компонента?

    @PetrPo
    или все таки 2 раза передавать это так себе затея?

    Ты же сам видишь что так себе затея. В целом ставить компонент в компонент (в кешируемую область) - это неправильно.

    Если передашь значение через параметры компонента - работать будет, но не избавит от других проблем с кешем
    Ответ написан