• В чем отличия catalog.item и catalog.element и для чего надо их использовать?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    catalog.element - это компонент который предназначен для вывода детальной информации о товаре. Внутри него идёт запросы к БД, и формируется массив arResult с описанием товара.

    catalog.item - это компонент который, обычно, используется для вывода информации о товаре внутри списка товаров. Он отличается от catalog.element тем, что сам не получает ни какой информации о товаре. По сути это обертка, в параметры которой передается УЖЕ СФОРМИРОВАННЫЙ набор данных. Его удобно использовать в разных списочных компонентах, например в catalog.section.
    Ответ написан
    Комментировать
  • Рабочий вариант фильтрации всего каталога (bitrix:catalog.smart.filter в sections.php)?

    @pavelmosin Автор вопроса
    В итоге сработал вот этот код фильтра + указать в параметрах catalog.section после фильтра
    "BY_LINK"=> "Y",
    "SHOW_ALL_WO_SECTION" => "Y",
    "SECTION_ID" => '0',
    <?
    			$arFilter = array(
    				"IBLOCK_ID" => $arParams["IBLOCK_ID"],
    				"ACTIVE" => "Y",
    				"GLOBAL_ACTIVE" => "Y",
    			);
    			if (0 < intval($arResult["VARIABLES"]["SECTION_ID"])) {
    				$arFilter["ID"] = $arResult["VARIABLES"]["SECTION_ID"];
    			}
    			elseif ('' != $arResult["VARIABLES"]["SECTION_CODE"]) {
    				$arFilter["=CODE"] = $arResult["VARIABLES"]["SECTION_CODE"];
    			}
    
    			$obCache = new CPHPCache();
    			if ($obCache->InitCache(36000, serialize($arFilter), "/iblock/catalog")) {
    				$arCurSection = $obCache->GetVars();
    			} elseif ($obCache->StartDataCache()) {
    				$arCurSection = array();
    				if (Loader::includeModule("iblock")) {
    					$dbRes = CIBlockSection::GetList(array(), $arFilter, false, array("ID"));
    
    					if(defined("BX_COMP_MANAGED_CACHE")) {
    						global $CACHE_MANAGER;
    						$CACHE_MANAGER->StartTagCache("/iblock/catalog");
    
    						if ($arCurSection = $dbRes->Fetch()) {
    							$CACHE_MANAGER->RegisterTag("iblock_id_".$arParams["IBLOCK_ID"]);
    						}
    						$CACHE_MANAGER->EndTagCache();
    					} else {
    						if(!$arCurSection = $dbRes->Fetch()) {
    							$arCurSection = array();
    						}
    					}
    				}
    				$obCache->EndDataCache($arCurSection);
    			}
    			if (!isset($arCurSection)) {
    				$arCurSection = array();
    			}
    
    
    
    			$APPLICATION->IncludeComponent(
    				"bitrix:catalog.smart.filter",
    				".default",
    				array(
    					"PREFILTER_NAME" => $arParams["FILTER_NAME"],
    					"IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
    					"IBLOCK_ID" => $arParams["IBLOCK_ID"],
    					"SECTION_ID" => '0',
    					"FILTER_NAME" => $arParams["FILTER_NAME"],
    					"PRICE_CODE" => $arParams["PRICE_CODE"],
    					"CACHE_TYPE" => $arParams["CACHE_TYPE"],
    					"CACHE_TIME" => $arParams["CACHE_TIME"],
    					"CACHE_GROUPS" => $arParams["CACHE_GROUPS"],
    					"SAVE_IN_SESSION" => "N",
    					"FILTER_VIEW_MODE" => $arParams["FILTER_VIEW_MODE"],
    					"XML_EXPORT" => "Y",
    					"SECTION_TITLE" => "NAME",
    					"SECTION_DESCRIPTION" => "DESCRIPTION",
    					'HIDE_NOT_AVAILABLE' => $arParams["HIDE_NOT_AVAILABLE"],
    					"TEMPLATE_THEME" => $arParams["TEMPLATE_THEME"],
    					'CONVERT_CURRENCY' => $arParams['CONVERT_CURRENCY'],
    					'CURRENCY_ID' => $arParams['CURRENCY_ID'],
    					"SEF_MODE" => $arParams["SEF_MODE"],
    					"PAGER_PARAMS_NAME" => $arParams["PAGER_PARAMS_NAME"],
    					"SEF_RULE" => '/catalog/filter/#SMART_FILTER_PATH#/apply/',
    					"SMART_FILTER_PATH" => $arResult["VARIABLES"]["SMART_FILTER_PATH"],
    					'SHOW_ALL_WO_SECTION'=>'Y',
    				),
    				$component,
    				array('HIDE_ICONS' => 'Y')
    			);
    		?>
    Ответ написан
    Комментировать
  • Как узнать с помощью Chrome Dev Tools какой Event в JS меняет свойства элемента?

    Alexious_sh
    @Alexious_sh
    Если меняется непоследственно аттрибут style, или заменяется класс, то можно повесить breakpoint на изменение атрибутов. Просто нажать ПКМ на нужном элементе в дереве, и выбрать Break On/Attributes Modifications. Выполнение скрипта будет останавливаться при любой попытке изменить аттрибуты элемента, и в правой колонке будет виден стек вызовов.
    Ответ написан
    Комментировать
  • Почему при выборке данных через D7 ElementTable::getList свойство инфоблока «привязка к элементу» дублирует данные?

    @KukuRuku
    Из документации:

    https://dev.1c-bitrix.ru/learning/course/index.php...
    В примере выше видно принципиальное преимущество объектной модели перед массивами. Несмотря на то, что фактически выбрано две записи (для одного Издателя нашлось две книги), по факту из результата получается только один объект. Система самостоятельно распознала этот случай и склеила все книги издателя в одну Коллекцию.


    $objListOfDoctors = ElementDoctorsAPITable::getList([
        'select' => [
            'ID',
            'NAME',
            'SERVICESLIST.ELEMENT',
        ],
        'filter' => ['ID' => $arParams['LIST_OF_DOCTOR'], 'ACTIVE' => 'Y'],
        'order'  => ['DATE_CREATE' => 'ASC'],
    ])->fetchCollection();
    
    foreach ($objListOfDoctors as $doctor) {
        foreach ($doctor->getServiceslist() as $service) {
            var_dump($service->getElement()->getId());
            var_dump($service->getElement()->getName());
            ...
        }
        // или
        var_dump($doctor->getServiceslist()->getIdList());
    }


    Сложности начнутся, если добавить limit в выборку данных. Но для этого есть метод
    \Bitrix\Main\ORM\Query\QueryHelper::decompose()
    https://dev.1c-bitrix.ru/learning/course/index.php...
    Ответ написан
    5 комментариев
  • Почему при выборке данных через D7 ElementTable::getList свойство инфоблока «привязка к элементу» дублирует данные?

    no_one_safe
    @no_one_safe
    В первом случае у вас 1 запрос в бд с присоединением таблицы множественного свойства (PROPERTY_GETSERVICESLIST). Результат ожидаемый - сколько значений у одного элемента, столько и результатов.

    Во втором случае у вас 100500 запросов к бд и группировка свойств под капотом CIBlockElement::GetList.

    Предпочтительнее выбирать через D7 и группировать элементы, всяко быстрее будет.
    Ответ написан
    2 комментария
  • Преобразование строки в число jquery?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Чтобы строку преобразовать в число достаточно поставить перед строкой знак плюса:
    var s = "36.000";
    console.log(typeof s); // string
    
    var n = +s; 
    console.log(typeof n); // number
    console.log(n); // 36   нули после точки и не будет показывать – зачем
    
    // показать ровно X позиций числа после точки:
    var formatted = n.toFixed(3);
    console.log(formatted); // 36.000 но это опять строка!
    console.log(typeof formatted); // string
    Ответ написан
    2 комментария
  • Как форматировать дату и время из mysql в php?

    Ivanq
    @Ivanq
    Знаю php, js, html, css
    echo date("d-m-Y H:i:s", strtotime("2015-12-12 12:12:12"));
    Ответ написан
    Комментировать
  • Как правильно реализовать поиск по каталогу?

    babarun
    @babarun Куратор тега 1С-Битрикс
    Безумный план моих идей в руках больных людей
    Что бы правильно реализовать, нужно разобраться как catalog.search работает - введённый поисковый запрос отправляется в модуль поиска, а из него возвращается массив айдишников элементов инфоблока(товаров), который уже подаётся на вход компоненту catalog.section (без s !).

    а результаты поиска отображаются во всплывающем окне прямо под компонентом поиска
    - вы имеете ввиду подсказки?
    Ответ написан
    8 комментариев
  • Почему изображение для элемента инфоблока сохраняется с 3 или 4 раза?

    @mletov
    Нужно не гадать, а диагностировать.

    Смотрите версию PHP, смотрите нет ли фаервола на сервере, который что-нибудь блочит.
    Попробуйте развернуть сайт локально у себя на компьютере, посмотреть, воспроизведутся ошибки или нет.

    При сохранении картинки в консоль браузера посмотрите, какие ошибки, погуглите их.

    Вот это почитайте
    https://dev.1c-bitrix.ru/support/forum/forum32/top...

    Ну и доступ, конечно, требуйте, что значит "доступ к серверу дать не может", как работать-то?
    Ответ написан
    1 комментарий
  • Как в админке битрикса подключить дополнительные JS и CSS?

    smilingcheater
    @smilingcheater
    В init.php
    if (defined('ADMIN_SECTION') && ADMIN_SECTION === true) {
        $asset = \Bitrix\Main\Page\Asset::getInstance();
        $asset->addCss('/local/css/admin/style.css');
        $asset->addJs('/local/js/admin/admin.js');
    }
    Ответ написан
    1 комментарий
  • Что ознает Blockout в создании уровня?

    Blockout — это когда ты грубо накидываешь на уровень параллелепипеды вместо всех объектов, чтобы примерно прикинуть масштабы и что где будет расположено.
    Ответ написан
    Комментировать
  • Как Решать каптчу подобного вида (Puzzle Slider)?

    @mamsdeveloper
    from PIL import Image, ImageEnhance
    import cv2
    import numpy as np
    
    
    def get_rectangle(path):
        image = Image.open(path)
        scale_value = 2
        image = ImageEnhance.Contrast(image).enhance(scale_value)
        image = image.crop((
            50, 0,
            image.width, image.height
        ))
    
        image = np.array(image)
        image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
        image = cv2.GaussianBlur(image, (5, 5), cv2.BORDER_DEFAULT)
        mid = np.mean(image)
        _, thresh = cv2.threshold(
            image, mid//2.2, mid, 
            cv2.THRESH_BINARY_INV
        )
        thresh = cv2.cvtColor(thresh, cv2.COLOR_BGR2GRAY)
        contours, _ = cv2.findContours(
            thresh, 
            cv2.RETR_EXTERNAL,
            cv2.CHAIN_APPROX_SIMPLE
        )
    
        # перебираем все найденные контуры в цикле
        for cnt in sorted(contours, key=lambda x: x[0][0][0]):
            rect = cv2.minAreaRect(cnt)  # пытаемся вписать прямоугольник
            box = cv2.boxPoints(rect)  # поиск четырех вершин прямоугольника
            box = np.int0(box)  # округление координат
            area = int(rect[1][0]*rect[1][1])  # вычисление площади
            angle = rect[-1]
            ratio = max(rect[1][1], rect[1][0])/min(rect[1][1], rect[1][0]) if area else 0
            if (400 < area < 10000) and (-5 < angle < 5 or 85 < angle < 95) and ratio < 1.5:
                cv2.drawContours(image, [box], 0, (255, 0, 0), 2)  # рисуем прямоугольник
                cv2.imshow('image', image)  # вывод обработанного кадра в окно
                cv2.imshow('thresh', thresh)
                cv2.waitKey(1)
                input()
                cv2.destroyAllWindows()
                return box[0][0] + 50
        return None
        
    
    for i in range(1, 13):
        x = get_rectangle(f'images\\{i}.png')
    Ответ написан
    1 комментарий
  • Почему catalog.section.list не попадает в цепочку навигации?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Перед catalog.section.list или catalog.section добавьте хлебную крошку через API $APPLICATION->AddChainItem. Стандартные компоненты catalog.section и catalog.section.list не добавляют ИБ в хлебные крошки. Они добавляют информацию из разделов и элементов.
    Ответ написан
    Комментировать
  • Как наладить поддержку fetch в internet explorer?

    dimovich85
    @dimovich85 Куратор тега JavaScript
    https://u-academy.net/
    function myFetch(params){
        return new Promise(function(resolve, reject){
           const xhr = new XMLHttpRequest();
            xhr.open(params.method, params.url, true);
            xhr.send();
            xhr.addEventListener('readystatechange', function(e){
                  if( xhr.readyState != 4  ) return;
                  if( xhr.status == 200 ){
                       resolve( xhr.responseText );
                   } else{ reject( xhr.statusText ); }
            });
    }
    myFetch(//parameters...).then(//...... код который у Вас в then).
    Ответ написан
    Комментировать
  • Проблема с полем и маской ввода для телефона?

    @PetrPo
    Похоже на нормализацию номера телефона, попробуй в компоненте параметр USE_PHONE_NORMALIZATION = N поставь
    Ответ написан
    Комментировать
  • Корзина в popup окне при добавлении товара в каталоге?

    @PetrPo
    Решение в комментариях
    Ответ написан
    Комментировать
  • Проблемы с версткой на Mac в браузере Safari?

    @cheeroque
    Как обычно, кривой флексбокс в Сафари.
    Если добавить блоку с кнопками flex-shrink: 0, всё вроде ок:

    .block-extra-options {
      flex: 1 0 100%;
    }
    Ответ написан
    1 комментарий
  • Как убрать повторяющиеся слэши в .htaccess?

    @ShamblerR
    Дааю сразу все поскольку в свое время задолбало для каждого проекта делать все заново, по этому сейчас просто вставляю кусок и все.
    ############################################################################
    #### Cтандартный .htaccess для проектов студии Клондайк, версия 2.3     ####
    ############################################################################
    RewriteEngine On
       #  Директива включает редиректы.
    RewriteBase / 
       # Без директивы (.*) = /$1 будет /var/wwww/site/web/$1  с директивой  = /$1
    Options +FollowSymLinks
       # Разрешает переход по символическим ссылкам.
    
    ############################################################################
    #### Перенаправляем протокол https на http                              ####
    ############################################################################
    RewriteCond %{HTTPS} on
       # Проверяем наличие https в URL.
    RewriteRule ^.*$ http://%{SERVER_NAME}%{REQUEST_URI}
       # Перенаправляем протокол на http.
    
    ############################################################################
    #### Выбор основного зеркала (или с www или без www)                    ####
    ############################################################################
       # 1. Редирект с www на без www. (раскоментировать директивы пункта 1)
    #RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
       # Проверяем, содержит ли домен www (в начале URL).
    #RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
       # Перенаправляем URL на домен без www.
    ####
       # 2. Редирект без www на www. (раскоментировать директивы пункта 2)
    #RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
       # Проверяем, не содержит ли домен www (в начале URL).
    #RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
       # Перенаправляем URL на домен c www.
    
    ############################################################################
    #### Убираем повторяющиеся слеши (/) в URL                              ####
    ############################################################################
    RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
       # Проверяем, повторяется ли слеш (//) более двух раз.
    RewriteRule . %1/%2 [R=301,L]
       # Исключаем все лишние слеши.
    
    ############################################################################
    #### Убираем слеши в конце URL для статических файлов (содержит точку)  ####
    ############################################################################
    RewriteCond %{REQUEST_URI} \..+$  
       # Если файл содержит точку.
    RewriteCond %{REQUEST_FILENAME} !-d   
       # И это не директория.
    RewriteCond %{REQUEST_FILENAME} -f
       # Является файлом.
    RewriteCond %{REQUEST_URI} ^(.+)/$      
       # И в конце URL есть слеш.
    RewriteRule ^(.+)/$ /$1 [R=301,L]     
       # Исключить слеш.
    
    ############################################################################
    #### Добавляем слеш(/), если его нет, и это не файл.                    ####
    ############################################################################
    RewriteCond %{REQUEST_URI} !(.*)/$
       # Если слеша в конце нет.
    RewriteCond %{REQUEST_FILENAME} !-f
       # Не является файлом.
    RewriteCond %{REQUEST_URI} !\..+$
       # В URL нет точки (файл).
    RewriteRule ^(.*)$ $1/ [L,R=301]
       # Добавляем слеш в конце.
    
    ############################################################################
    #### Убираем index.php, если он есть в конце URL                        ####
    ############################################################################
    RewriteCond %{REQUEST_METHOD} =GET
       # Выявляем GET запрос в URL (не POST).
    RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
       # URL cодержит index.php в конце.
    RewriteRule ^(.*)$ %1/ [R=301,L]
       # Удалить index.php из URL.
    
    ############################################################################
    #### Конец общей части, далее следует собственные директивы .htaccess   ####
    ############################################################################
    Ответ написан
    5 комментариев
  • Как дублировать свойства товара по нажатию кнопки на странице редактирования товара?

    KlVV
    @KlVV
    битриксоид
    В Битрикс есть возможность создавать специфические свойства, но здесь можно обойтись без этого.
    Создайте отдельный инфоблок в котором размещайте элементами содержимое отдельного блока, а в основном элементе использовать множественное свойство "привязка к элементам".
    Ответ написан
    Комментировать