• Как поулчить XML выгрузку на Битрикс с вложенными атрибутами?

    vhood
    @vhood
    Не забывайте отмечать решения
    Если это (ссылку взял из комментов в документации) и есть класс \Bitrix\Main\XmlWriter, то с его помощью - никак.

    Он пишет сразу в файл, так что и регуляркой итоговый результат не пройти.

    Можно залезть в него рефлексией, но в программировании это моветон и читабельность кода будет ухудшена.

    Самый оптимальный вариант - наследовать этот класс, изменить несколько его функций и использовать унаследованный класс. Примерно так:
    class AppXmlWriter extends XmlWriter
    {
        private $file = '';
        private $charset = '';
        private $tab = 0;
        private $f = null;
        private $lowercaseTag = false;
        private $errors = array();
    
        // конструктор скопирован, т.к. там все private
        public function __construct(array $params)
        {
            if (isset($params['file']))
            {
                $server = \Bitrix\Main\Application::getInstance()->getContext()->getServer();
                $this->file = $server->getDocumentRoot() . trim($params['file']);
                // create new file
                if (
                    isset($params['create_file']) &&
                    $params['create_file'] === true &&
                    is_writable($this->file)
                    )
                {
                    unlink($this->file);
                }
            }
            if (isset($params['charset']))
            {
                $this->charset = trim($params['charset']);
            }
            else
            {
                $this->charset = SITE_CHARSET;
            }
            if (isset($params['lowercase']) && $params['lowercase'] === true)
            {
                $this->lowercaseTag = true;
            }
            if (isset($params['tab']))
            {
                $this->tab = (int)$params['tab'];
            }
        }
    
        public function prepareAttributes(array $attributes): string
        {
            $result = '';
    
            if (empty($attributes)) {
                return $result;
            }
    
            foreach ($attributes as $key => $value) {
                $result .= sprintf(' %s="%s"', $key, $value);
            }
    
            return $result;
        }
    
        public function writeBeginTag($code, array $attributes = [])
        {
            if (!$this->f) {
                return;
            }
    
            fwrite($this->f, str_repeat("\t", $this->tab) . '<' . $this->prepareTag($code) . $this->prepareAttributes($attributes) . '>' . PHP_EOL);
            $this->tab++;
        }
    
        public function writeFullTag($code, $value, array $attributes = [])
        {
            if (!$this->f) {
                return;
            }
    
            $code = $this->prepareTag($code);
            $codeAttributes = $this->prepareAttributes($attributes);
            fwrite($this->f,
                str_repeat("\t", $this->tab) .
                (
                    trim($value) == ''
                    ? '<' . $code . $codeAttributes . ' />' . PHP_EOL
                    :   '<' . $code . $codeAttributes . '>' .
                    $this->prepareValue($value) .
                    '</' . $code . '>' . PHP_EOL
                )
            );
        }
    }
    Ответ написан
    1 комментарий
  • Как исправить create_function на php 8?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    array_walk_recursive(
        $arConfig,
        static function (&$n)
        {
            $n = match($n) {
                "true" => true,
                "false" => false,
                default => $n,
            };
        },
    );
    Ответ написан
    Комментировать
  • Как в Битрикс отфильтровать разделы по свойству товара находящегося в этом разделе?

    @jasper-blondin
    у меня есть страница брендов, и мне нужно вывести разделы в котором они находятся


    1. Получить коллекцию ID товаров, используя фильтр по значению свойства (бренд).
    2. Получить коллекцию ID разделов, используя фильтр по элементам (получили на предыдущем шаге).
    3. Вывести список разделов компонентом bitrix:catalog.section.list, используя фильтр по разделам, полученный на предыдущем шаге.
    Ответ написан
    Комментировать
  • Как в Битрикс отфильтровать разделы по свойству товара находящегося в этом разделе?

    @boris4682
    Backend developer
    Делается это все запросами.
    Для начала получаете по св-ву бренда список товаров.
    Вот источник
    советую юзать fetchCollection, чтобы для товара получить список разделов getSections(). Потом этот список можно прогнать в цикле и для каждого получить и имя и id.
    Это как раз можно сделать в result_modifier.php чтобы кешировались данные выборки
    Ответ написан
    Комментировать
  • Как установить ограничение по нескольким складам Битрикс?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    <?
    $productsAmount = [];
    
    $rsStoreProduct = \Bitrix\Catalog\StoreProductTable::getList(array(
        'filter' => array('PRODUCT_ID' => $arData, 'STORE_ID' => array(31, 33)),
        'select' => array('PRODUCT_ID', 'AMOUNT', 'STORE_ID', 'STORE_TITLE' => 'STORE.TITLE', 'PRODUCT_NAME' => 'PRODUCT.IBLOCK_ELEMENT.NAME'),
    ));
    
    while ($arStoreProduct = $rsStoreProduct->fetch()) {
        if (is_null($productsAmount[$arStoreProduct["PRODUCT_ID"]])) {
            $productsAmount[$arStoreProduct["PRODUCT_ID"]] = 0;
        }
        
        $productsAmount[$arStoreProduct["PRODUCT_ID"]] += $arStoreProduct["AMOUNT"]
    }
    
    return array_search(0, $productsAmount) === false;
    Ответ написан
    Комментировать
  • Динамически адаптивный шрифт html/css?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    line-height: normal;
    Ответ написан
    Комментировать
  • Как исправить ошибку при отправке запроса (php curl) на яндекс маркет?

    @zkrvndm
    Софт для автоматизации
    Попробуй так:
    <?php
    
    header('Content-Type: application/json; charset=UTF-8');
    
    ini_set('error_reporting', E_ALL);
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    
    $authKey = '********************';
    $oauthClientId = '****************';
    $requestURL = 'https://api.partner.market.yandex.ru/v2/campaigns/21614343/hidden-offers.json';
    
    $data = array(
    	'hiddenOffers' => array(
    		array(
    			'offerId' => 146688,
    			'comment' => 'clear markret',
    			'ttlInHours' => 720
    		)
    	),
    );
    
    $data_string = json_encode($data);
    
    $result = file_get_contents($requestURL, null, stream_context_create(array(
    			'http' => array(
    				'method' => 'POST',
    				'header' => array(
    					"Authorization: OAuth oauth_token=$authKey, oauth_client_id=$oauthClientId\r\n" .
    					"Content-Type: application/json; charset=utf-8\r\n" .
    					"Content-Length: " . strlen($data_string) . "\r\n" .
    					"Host: " . parse_url($requestURL)['host']
    				),
    				'content' => $data_string
    			)
    		)
    	)
    );
    
    echo $result;
    Ответ написан
    1 комментарий
  • Почему bitrix:sale.basket.basket.line не меняет счетчик товаров у не авторизованных пользователей?

    @PetrPo
    В шаблоне малой корзины для мобильной версии не хватало вызова
    <script type="text/javascript">
    	<?=$cartId?>.activate();
    </script>
    Ответ написан
    1 комментарий
  • "Ошибка при сохранении файла скрипта. Изменения не сохранены"?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Дело не в правах скрипта (.access.php), а в физических правах на директорию.
    Например в Bitrix Env есть linux пользователь bitrix (UID:600), из-под которого выполняются все операции, но многие неквалифицированные разработчики работают из-под root-доступов.

    В папку созданную root пользователем нельзя скопировать файлы из-под пользователя bitrix, если ей не установить соответствующие права.

    Ознакомьтесь с соответствующей статьей в документации: https://dev.1c-bitrix.ru/learning/course/index.php...
    Ответ написан
    3 комментария
  • Почему не подключается Montserrat (Google fonts) на iOs?

    Факт, какая то "тарабарщина" с Google шрифтами на iOS...
    Советую взять шрифт из исходника, залить на сайт и подключить его в CSS, я сделал так:
    spoiler
    /** Montserrat Light **/
    @font-face {
        font-family: "Montserrat";
        font-weight: 300;
        font-style: normal;
        src: url("../fonts/Montserrat-Light.woff2") format("woff2"),
             url("../fonts/Montserrat-Light.woff") format("woff");
    }
    /** Montserrat Medium **/
    @font-face {
        font-family: "Montserrat";
        font-weight: 500;
        font-style: normal;
        src: url("../fonts/Montserrat-Medium.woff2") format("woff2"),
             url("../fonts/Montserrat-Medium.woff") format("woff");
    }
    /** Montserrat SemiBold **/
    @font-face {
        font-family: "Montserrat";
        font-weight: 600;
        font-style: normal;
        src: url("../fonts/Montserrat-SemiBold.woff2") format("woff2"),
             url("../fonts/Montserrat-SemiBold.woff") format("woff");
    }
    /** Montserrat Bold **/
    @font-face {
        font-family: "Montserrat";
        font-weight: 700;
        font-style: normal;
        src: url("../fonts/Montserrat-Bold.woff2") format("woff2"),
             url("../fonts/Montserrat-Bold.woff") format("woff");
    }
    Ответ написан
    2 комментария
  • Как в админке Битрикс - Заказы, разделить заказы по группе пользователей?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Можно на событии OnSaleAdminOrderList добавить фильтр. Я привожу пример на основе групп пользователей розницы и оптовиков. Можно легко адаптировать под типы плательщика.

    В примере $getListParams это то что будет передано в запрос по OrderTable.

    <?php
    
    \Bitrix\Main\EventManager::getInstance()->addEventHandler( 
        'sale', 
        'OnSaleAdminOrderList', 
        'OnSaleAdminOrderListHandler'
    ); 
    
    
    function OnSaleAdminOrderListHandler(\Bitrix\Main\Event $event) 
    {
        $getListParams = $event->getParameters();
        $reailManagerGroupId = 1; //ID группы менеджеров розницы
        $wholesaleManagerGroupId = 2; //ID группы менеджеров оптовиков
        $optUserGroup = 3; //ID группы оптовых покупателей
        $reatilUserGroup = 4; //ID группы розничных покупателей
        global $USER;
    
        $userGroups = \CUser::GetUserGroup($USER);
        if (in_array($reailManagerGroupId, $userGroups)) {
            $getListParams["filter"]["USER_GROUP.GROUP_ID"] = $reatilUserGroup;
        } else if(in_array($wholesaleManagerGroupId, $userGroups)) {
            $getListParams["filter"]["USER_GROUP.GROUP_ID"] = $optUserGroup;
        }
    
    
        $result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $getListParams);
        return $result;
    }
    Ответ написан
    4 комментария
  • Записать имя в список адресов email маркетинга?

    rpsv
    @rpsv
    делай либо хорошо, либо никак
    Вот не хватило только одного: желания решить задачу!
    Вы пробовали посмотреть метод Subscription::subscribe ? Я думаю если бы пробовали, то увидели бы что там принимается только EMAIL в качестве идентфикатора, а далее ищется или создается контакт через класс ContactTable в котором как раз можно указать имя (после добавления подписки).
    Ответ написан
    3 комментария
  • Как в письмо с данными о заказе отправляемое покупателю добавить текстовый файл с данными о заказе?

    udjin123
    @udjin123
    PHP, Golang, React
    Почтовые события позволяют прикреплять файлы в письмо, но вмешаться в событие SALE_NEW_ORDER отправки письма о новом заказе вы не можете. Как вариант деактивировать штатное почтовое событие SALE_NEW_ORDER, создать свое и вызывать его прикрепляя файл подписавшись на событие в php_interface на создание заказа, событие из d7 - OnSaleOrderSaved проверять флаг IS_NEW. Документация по нему тут
    Ответ написан
    1 комментарий
  • Как в модельное окно Битрикс добавить кнопку?

    @PetrPo
    Самый очевидный вариант
    click:  function() {
        $('#oneclick').modal('show')
    }
    Ответ написан
    Комментировать
  • Почему в card catalog.item нельзя удалить блок с картинками что бы осталось работать добавление в корзину?

    @PetrPo
    Потому что в js написано
    init: function()
    {
    	// ................
    	if (!this.obPict)
    	{
    		this.errorCode = -2;
    	}
    	// ................
    	
    	if (!this.obPictSlider)
    	{
    		this.errorCode = -4;
    	}
    	// ................
    	
    	if (this.errorCode === 0)
    	{
    	// здесь все инициализируется, добавление в корзину в том числе
    Ответ написан
    Комментировать
  • Как перед загрузкой или обновлением товаров из 1с в Битрикс, запретить выгружать товары с ценой 0, или заменить ноль на пусто?

    babarun
    @babarun Куратор тега 1С-Битрикс
    Безумный план моих идей в руках больных людей
    Добавьте проверку на событии OnBeforeIBlockElementUpdate или OnBeforeProductAdd. В обработчике, чтобы определить, что событие вызвано именно во время обмена с 1С, можно использовать такое костыльное условие:
    if (isset($_GET['type'], $_GET['mode']) && $_GET['type'] === 'catalog' && $_GET['mode'] === 'import') {
        // ...
    }

    Вот тут подробнее.
    Ответ написан
    Комментировать
  • Почему не работает запрос на добавление в корзину Битрикс через XMLHttpRequest?

    @PetrPo
    BX.ajax({
    	url: '<?=\CUtil::jsEscape(SITE_TEMPLATE_PATH)?>/ajax/addtobasket.php',
    	method: 'POST',
    	data: {"id": idElements, "count": countElements},
    	dataType: 'json',
    	async: true,
    	onsuccess: BX.delegate(function (response) {
    
    	}, this),
    	onfailure: BX.delegate(function () {
    
    	}, this)
    });


    и еще юзай лучше битриксовое api, тогда и проблем таких не будет
    $request = \Bitrix\Main\HttpApplication::getInstance()->getContext()->getRequest();
    if($request->isPost() && isset($request['id']) && isset($request['count'])) {
    
    }
    Ответ написан
    Комментировать
  • Django или 1С-Битрикс?

    @anton99zel Куратор тега 1С-Битрикс
    29а класс средней школы №7
    Вот стоит ли вообще туда совать свой нос? Как поступить?

    Ох, уж эти разработчики...
    Любят навязывать клиенту не то, что нужно клиенту, закрывая его потребности и задачи, включая возможное масштабирование в будущем, а руководствуясь лишь уровнем знаний в отдельно взятом направлении.
    Если Вы не знаете Битрикс, то за месяц не сделаете проект full. Возможно сделать какой-либо информационный сайт, да и то на уровне инфоблоков и компонентов, а CRM с хорошей админкой как минимум потребует знаний api, а в Битрикс api не очень хорошо документировано.
    Более того, что бы вы не выбрали, наговнокодить можно везде и тогда сайт накроется будь это Битрикс или что-то другое.
    Помимо самого Битрикса, необходимо иметь знания по настройке серверов, оптимизации mysql, nginx. Но это практически везде нужно и к вопросу не относится.
    Отсюда ответ на ваш вопрос:
    Если текущие задачи и будущие удовлетворяют ваши потребности, а вернее потребности клиента, при использовании PostgreSQL + Django + Redis - то нужно использовать его.
    Стоит понимать, что Bitrix Framework это PHP платформа для разработки веб-приложений, и если не обращать внимания на тех, кто просто не умеет его готовить (потому что надо не использовать шаблонное мышление), то это отличная платформа для создания разного рода проектов, будь то интернет-магазин, crm, инфосайт с интеграцией с платежными средствами, доставками, интеграцией 1С и маркетплейсами. Однако, Битрикс больше заточен под Интернет-магазины, и как бы его не ругали (обычно ругают те, кто с Битриксом никак не работает, от силы пару раз видел код 10 лет назад и не сделал ни одного проекта на нем...), для среднего и малого бизнеса альтернатив нет. Те, кто скажут Вордпресс или Опенкарт - ребята, не смешите, на Битриксе без танцев с бубном будут работать доставки, 1с и оплаты, а также ряж выгрузок в маркетплейсы, пока вы ищите модули для опенкарт....или что там у вас... Кеширование, технология композитный сайт и CDN вкупе с хорошо написанным кодом и настроенным сервером - дают достаточно быстрый результат.
    Если Клиенту нужен Битрикс, то стоит найти другого специалиста для решения его бизнес задач, а не навешивать ему Django, только потому что вы его знаете.
    простую crm систему

    А не изобретаете ли вы велосипед?
    1С Предприятие с прикрученной Веб мордой чем не CRM?
    Ответ написан
    1 комментарий
  • Как в выборе местоположения Битрикс изменить плейсхолдер?

    @PetrPo
    Это отдельный компонент sale.location.selector.search
    "Введите название" в языковых файлах находится, а три точки прямо в template.php
    Ответ написан
    1 комментарий