• Как выводить описание торгового предложения Битрикс, вместо описания основного товара?

    @PetrPo
    На примере стандартного шаблона:
    1. В index.php своего каталога проверь, чтобы в параметре DETAIL_OFFERS_FIELD_CODE был отмечен DETAIL_TEXT
    2. Файл template.php
    - в самом начале есть массив $itemIds добавь в него
    'DESCRIPTION' => $mainId.'_description',
    - найди где выводится детальный текст (ориентир data-value="description" и $arResult['DETAIL_TEXT']) и оберни в div-ку
    <div id="<?=$itemIds['DESCRIPTION']?>"><?=$arResult['DETAIL_TEXT_TYPE'] === 'html' ? $arResult['DETAIL_TEXT'] : '<p>'.$arResult['DETAIL_TEXT'].'</p>';?></div>

    - найди где-то в конце есть
    if ($haveOffers)
    {
    //...................
    	foreach ($arResult['JS_OFFERS'] as $ind => &$jsOffer)
    	{

    внутри цикла добавь (код ниже примерный, типа если у ТП есть описание то его берем, если нет то с основного товара, ты можешь подправить как тебе надо)
    $jsOffer['DETAIL_TEXT'] = (isset($arResult['OFFERS'][$ind]['DETAIL_TEXT']) && $arResult['OFFERS'][$ind]['DETAIL_TEXT'] ? $arResult['OFFERS'][$ind]['DETAIL_TEXT'] : $arResult['DETAIL_TEXT']);

    3. Файл script.js
    - нади функцию
    changeInfo: function()
    - в этой функции ближе к концу, где идет установка данных через функции, типа
    this.setPrice();
    добавь свою функцию, например так
    this.setDetailText(this.offers[index].DETAIL_TEXT);

    - ну и прямо после функции changeInfo опиши свою функцию
    setDetailText: function(text) {
    	if(typeof(this.visual.DESCRIPTION) !== 'undefined') {
    		BX.adjust(BX(this.visual.DESCRIPTION), {html: text});
    	}
    },
    Ответ написан
    Комментировать
  • Как удалить доступ у администраторов в 1С-БИТРИКС?

    @PetrPo
    На уровне администрирования никак. Можно подписаться на событие OnBuildGlobalMenu и там в зависимости от группы убрать пункт меню, но по прямой ссылке все равно зайти можно будет
    В событии, чтобы убрать пункт меню, например "Маркетплейс"
    // .........
    foreach($aModuleMenu as $key => $menu) {
    	if($menu['parent_menu'] == 'global_menu_marketplace')
    		unset($aModuleMenu[$key]);
    }
    // .........
    Ответ написан
    Комментировать
  • Как через getlist выводить элементы по порядку?

    @PetrPo
    но при перезагрузке страницы выводились следущие 50 элементов

    что это значит? ты же понимаешь что, для того чтобы запрос выдал что-то другое, в нем должно что-то изменится? Например параметр в GET-е (как собственно в битриксе и сделано, параметр ?PAGEN_1=2) или у тебя в куке какой-то инкремент, от чего зависит показ следующих 50 элементов?

    В общем случае запрос будет выглядеть так
    \Bitrix\Main\Loader::includeModule('iblock');
    
    $iblockId = 2;
    $nPageSize = 50;
    $iNumPage = 1;
    
    $arElements = array();
    $dbRes = CIBlockElement::GetList(array('ID' => 'ASC'), array('IBLOCK_ID' => $iblockId), false, array('nPageSize' => $nPageSize, 'iNumPage' => $iNumPage), array('ID', 'NAME'));
    
    while($arRes = $dbRes->Fetch()) {
    	$arElements[] = $arRes;
    }
    
    echo '<pre>';
    print_r($arElements);
    echo '</pre>';

    Увеличиваай $iNumPage и будешь получать сдвиг $nPageSize записей
    Ответ написан
    Комментировать
  • Почему в Битриксе не выводятся результаты фильтрации через умный фильтр?

    @PetrPo
    Код файла section.php комплексного компонента bitrix:catalog автора вопроса:
    spoiler

    <?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
    $this->setFrameMode(true);
    ?>
    <?$APPLICATION->IncludeComponent(
      "bitrix:catalog.section.list",
      "",
      Array(
        "IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
        "IBLOCK_ID" => $arParams["IBLOCK_ID"],
        "SECTION_ID" => $arResult["VARIABLES"]["SECTION_ID"],
        "SECTION_CODE" => $arResult["VARIABLES"]["SECTION_CODE"],
        "DISPLAY_PANEL" => "N",
        "CACHE_TYPE" => $arParams["CACHE_TYPE"],
        "CACHE_TIME" => $arParams["CACHE_TIME"],
        "CACHE_GROUPS" => $arParams["CACHE_GROUPS"],
    
        "SECTION_URL" => $arResult["FOLDER"].$arResult["URL_TEMPLATES"]["section"],
      ),
      $component
    );?>
    
    
          <?
                    if (CModule::IncludeModule("iblock")) {
                        $arFilter = array(
                            "ACTIVE" => "Y",
                            "GLOBAL_ACTIVE" => "Y",
                            "IBLOCK_ID" => $arParams["IBLOCK_ID"],
                        );
                        if (strlen($arResult["VARIABLES"]["SECTION_CODE"]) > 0) {
                            $arFilter["=CODE"] = $arResult["VARIABLES"]["SECTION_CODE"];
                        } elseif ($arResult["VARIABLES"]["SECTION_ID"] > 0) {
                            $arFilter["ID"] = $arResult["VARIABLES"]["SECTION_ID"];
                        }
                        $obCache = new CPHPCache;
                        if ($obCache->InitCache(36000, serialize($arFilter), "/iblock/catalog")) {
                            $arCurSection = $obCache->GetVars();
                        } else {
                            $arCurSection = array();
                            $dbRes = CIBlockSection::GetList(array(), $arFilter, false, array("ID"));
                            $dbRes = new CIBlockResult($dbRes);
                            if (defined("BX_COMP_MANAGED_CACHE")) {
                                global $CACHE_MANAGER;
                                $CACHE_MANAGER->StartTagCache("/iblock/catalog");
    
                                if ($arCurSection = $dbRes->GetNext()) {
                                    $CACHE_MANAGER->RegisterTag("iblock_id_" . $arParams["IBLOCK_ID"]);
                                }
                                $CACHE_MANAGER->EndTagCache();
                            } else {
                                if (!$arCurSection = $dbRes->GetNext())
                                    $arCurSection = array();
                            }
                            $obCache->EndDataCache($arCurSection);
                        }
                        ?>
                            <? $APPLICATION->IncludeComponent(
                                "bitrix:catalog.smart.filter",
                                ".default",
                                Array(
                                    "PRICE_CODE" => $arParams["PRICE_CODE"],
                                    "IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
                                    "IBLOCK_ID" => $arParams["IBLOCK_ID"],
                                    "SECTION_ID" => $arCurSection['ID'],
                                    "FILTER_NAME" => 'searchFilter',
                                    "CACHE_TYPE" => $arParams["CACHE_TYPE"],
                                    "CACHE_TIME" => $arParams["CACHE_TIME"],
                                    "CACHE_GROUPS" => $arParams["CACHE_GROUPS"],
                                    "SAVE_IN_SESSION" => "N",
                                    "XML_EXPORT" => "Y",
                                    "SECTION_TITLE" => "NAME",
                                    "SECTION_DESCRIPTION" => "DESCRIPTION",
                                    'HIDE_NOT_AVAILABLE' => $arParams["HIDE_NOT_AVAILABLE"],
                                    "TEMPLATE_THEME" => 'wood'
                                ),
                                $component,
                                array('HIDE_ICONS' => 'Y')
                            ); ?>
                        <? 
                    } ?>
    
    
    
    
    <?$APPLICATION->IncludeComponent(
      "bitrix:catalog.section",
      "",
      Array(
        "IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
        "IBLOCK_ID" => $arParams["IBLOCK_ID"],
        "ELEMENT_SORT_FIELD" => $arParams["ELEMENT_SORT_FIELD"],
        "ELEMENT_SORT_ORDER" => $arParams["ELEMENT_SORT_ORDER"],
     		"PROPERTY_CODE" => $arParams["LIST_PROPERTY_CODE"],
        "META_KEYWORDS" => $arParams["LIST_META_KEYWORDS"],
        "META_DESCRIPTION" => $arParams["LIST_META_DESCRIPTION"],
        "BROWSER_TITLE" => $arParams["LIST_BROWSER_TITLE"],
        "INCLUDE_SUBSECTIONS" => $arParams["INCLUDE_SUBSECTIONS"],
        "BASKET_URL" => $arParams["BASKET_URL"],
        "ACTION_VARIABLE" => $arParams["ACTION_VARIABLE"],
        "PRODUCT_ID_VARIABLE" => $arParams["PRODUCT_ID_VARIABLE"],
        "SECTION_ID_VARIABLE" => $arParams["SECTION_ID_VARIABLE"],
        "FILTER_NAME" => $arParams["FILTER_NAME"],
        "DISPLAY_PANEL" => $arParams["DISPLAY_PANEL"],
        "CACHE_TYPE" => $arParams["CACHE_TYPE"],
        "CACHE_TIME" => $arParams["CACHE_TIME"],
        "CACHE_FILTER" => $arParams["CACHE_FILTER"],
        "CACHE_GROUPS" => $arParams["CACHE_GROUPS"],
        "SET_TITLE" => $arParams["SET_TITLE"],
        "SET_STATUS_404" => $arParams["SET_STATUS_404"],
        "DISPLAY_COMPARE" => $arParams["USE_COMPARE"],
        "PAGE_ELEMENT_COUNT" => $arParams["PAGE_ELEMENT_COUNT"],
        "LINE_ELEMENT_COUNT" => $arParams["LINE_ELEMENT_COUNT"],
        "PRICE_CODE" => $arParams["PRICE_CODE"],
        "USE_PRICE_COUNT" => $arParams["USE_PRICE_COUNT"],
        "SHOW_PRICE_COUNT" => $arParams["SHOW_PRICE_COUNT"],
    
        "PRICE_VAT_INCLUDE" => $arParams["PRICE_VAT_INCLUDE"],
    
        "DISPLAY_TOP_PAGER" => $arParams["DISPLAY_TOP_PAGER"],
        "DISPLAY_BOTTOM_PAGER" => $arParams["DISPLAY_BOTTOM_PAGER"],
        "PAGER_TITLE" => $arParams["PAGER_TITLE"],
        "PAGER_SHOW_ALWAYS" => $arParams["PAGER_SHOW_ALWAYS"],
        "PAGER_TEMPLATE" => $arParams["PAGER_TEMPLATE"],
        "PAGER_DESC_NUMBERING" => $arParams["PAGER_DESC_NUMBERING"],
        "PAGER_DESC_NUMBERING_CACHE_TIME" => $arParams["PAGER_DESC_NUMBERING_CACHE_TIME"],
        "PAGER_SHOW_ALL" => $arParams["PAGER_SHOW_ALL"],
    
        "OFFERS_CART_PROPERTIES" => $arParams["OFFERS_CART_PROPERTIES"],
        "OFFERS_FIELD_CODE" => $arParams["LIST_OFFERS_FIELD_CODE"],
        "OFFERS_PROPERTY_CODE" => $arParams["LIST_OFFERS_PROPERTY_CODE"],
        "OFFERS_SORT_FIELD" => $arParams["OFFERS_SORT_FIELD"],
        "OFFERS_SORT_ORDER" => $arParams["OFFERS_SORT_ORDER"],
        "OFFERS_LIMIT" => $arParams["LIST_OFFERS_LIMIT"],
    
        "SECTION_ID" => $arResult["VARIABLES"]["SECTION_ID"],
        "SECTION_CODE" => $arResult["VARIABLES"]["SECTION_CODE"],
        "SECTION_URL" => $arResult["FOLDER"].$arResult["URL_TEMPLATES"]["section"],
        "DETAIL_URL" => $arResult["FOLDER"].$arResult["URL_TEMPLATES"]["element"],
      ),
      $component
    );
    ?>


    Параметр FILTER_NAME у компонента bitrix:catalog.smart.filter равен searchFilter, а у компонента bitrix:catalog.section берется с параметров комплексного компонента $arParams["FILTER_NAME"] и он не равен searchFilter, потому и не работает
    Ответ написан
    Комментировать
  • Как сделать еще одно поле поле для сортировки в каталоге одно для фильтра другое для секций?

    @PetrPo
    С версии модуля iblock 20.0.400 в компоненте catalog.section.list стал доступен параметр CUSTOM_SECTION_SORT и он работает - сам проверил.
    В версиях модуля ниже чем указано в ддокументации этот параметр работать не будет

    Можешь в файле /bitrix/components/bitrix/catalog.section.list/component.php найти
    //ORDER BY
    	$arSort = array(
    		"left_margin"=>"asc",
    	);


    и заменить на то как в новой версии
    //ORDER BY
    	$arSort = array();
    	if (!empty($this->arParams['CUSTOM_SECTION_SORT']) && is_array($this->arParams['CUSTOM_SECTION_SORT']))
    	{
    		foreach ($this->arParams['CUSTOM_SECTION_SORT'] as $field => $value)
    		{
    			if (!is_string($value))
    			{
    				continue;
    			}
    			$field = strtoupper($field);
    			if (isset($arSort[$field]))
    			{
    				continue;
    			}
    			if (!preg_match('/^(asc|desc|nulls)(,asc|,desc|,nulls)?$/i', $value))
    			{
    				continue;
    			}
    			$arSort[$field] = $value;
    		}
    		unset($field, $value);
    	}
    
    	if (empty($arSort))
    	{
    		$arSort = array(
    			"LEFT_MARGIN" => "ASC",
    		);
    	}


    ну и к параметрам вызова компонента catalog.section.list добавить
    $sectionListParams = array(
    	//.......
    	"CUSTOM_SECTION_SORT" => array("UF_SORT" => "ASC")
    );


    По красивому конечно надо в компонент каталога добавить параметр выбора сортировки и от него передавать в catalog.section.list
    Ответ написан
    Комментировать
  • Как обновить только поле ACTIVE у элемента инфоблока?

    @PetrPo
    Если ты не обновляешь пропсы, то при обновление полей они и не должны затираться. У тебя где-то есть обработчик OnBeforeIBlockElementUpdate (вероятно в init.php или какой-то модуль сторонний стоит)
    Ответ написан
  • Где хранить город посетителя Битрикс?

    @PetrPo
    useCookieToStoreInfo deprecated, там внутри функции просто return

    Этого будет достаточно
    $city = GeoIp\Manager::getCityName('', 'ru');

    GeoIp\Manager::getRealIp() не нужен, этот метод будет вызван, если в getCityName первый параметр - пустая строка.
    Все данные записываются в сессию
    $_SESSION['BX_GEO_IP']
    Ответ написан
    Комментировать
  • Каким образом добавить собственный параметр в catalog.element?

    @PetrPo
    .parameters.php и нужен для того чтобы видеть параметры через визуальный редактор для удобства администрирования, но в сам компонент попадают параметры, которые передаются в вызов компонента (метод). Т.е. надо
    - или пересохранить компонент через визуальный редактор
    - или ручками добавить название и значение параметра в код вызова компонента

    Если компонент комплексный, то параметр надо передавать и в код вызова простого компонента
    "DISCOUNT_FOR_RECRUITMENT" => $arParams["DISCOUNT_FOR_RECRUITMENT"]
    Ответ написан
  • Как сделать что бы Bitrix искал по привязанным элементам?

    @PetrPo
    $eventManager = \Bitrix\Main\EventManager::getInstance();
        $eventManager->addEventHandler('search', 'BeforeIndex', array('MySearch', 'BeforeIndex'));
    
        class MySearch {
          private static $catalogIblockId = 2;
          private static $docsIblockId = 4;
          const PROPERTY_DOCUMENTS = 'PROPERTY_FILE';
    
          public static function BeforeIndex($arFields) {
            if(intval($arFields['PARAM2']) == self::$catalogIblockId && intval($arFields['ITEM_ID']) > 0 && isset($arFields['BODY'])) {
              \Bitrix\Main\Loader::includeModule('iblock');
              
              $arDocsId = array();
    
              $dbRes = CIBlockElement::GetList(array(), array('IBLOCK_ID' => $arFields['PARAM2'], 'ID' => $arFields['ITEM_ID']), false, false, array(self::PROPERTY_DOCUMENTS));
              while($arRes = $dbRes->Fetch()) {
                  if($arRes[self::PROPERTY_DOCUMENTS.'_VALUE'])
                      $arDocsId[] = $arRes[self::PROPERTY_DOCUMENTS.'_VALUE'];
              }
    
              if($arDocsId) {
                  $dbRes = CIBlockElement::GetList(array(), array('IBLOCK_ID' => self::$docsIblockId, 'ID' => $arDocsId), false, false, array('NAME'));
                  while($arRes = $dbRes->Fetch()) {
                      $arFields['BODY'] .= PHP_EOL.$arRes['NAME'];
                  }
              }
             
              return $arFields;
            }
          }
        }

    - две переменные и константу в классе свои укажи
    - название файла = название элемента в инфоблоке с файлами
    Ответ написан
    Комментировать
  • Как отфильтровать по множественному свойству в Highload-блоках?

    @PetrPo
    Вообщем, озадачил ты интересным вопросом, в тонкостях разобраться пока нет возможности. Напиши вместо
    UF_DIRECTIONS
    UF_DIRECTIONS_SINGLE
    Ответ написан
    Комментировать
  • Как проверить несколько полей на уникальность?

    @PetrPo
    Делаешь getList, с фильтром по ISBN и TITLE.
    Дальше условие, если запись есть update, если нет add
    Ответ написан
    5 комментариев
  • Как добавить новый элемент в справочник?

    @PetrPo
    Зайди Контент-->Highload-блоки-->выбери свой справочник-->Добавить запись
    Ответ написан
    8 комментариев
  • Возможно ли вывести элементы инфоблока, используя название раздела?

    @PetrPo
    Затея, конечно, так себе, но если уж очень надо
    $iblockId = 2;
    
    $arElements = \Bitrix\Iblock\ElementTable::getList([
        'select' => ['IBLOCK_ID', 'ID', 'NAME', 'SECTION.NAME'],
        'filter' => ['IBLOCK_ID' => $iblockId, 'SECTION.NAME' => 'Мягкая мебель'],
        'order' => [],
        'runtime' => [
            'SECTION' => [
                'data_type' => '\Bitrix\Iblock\Section',
                'reference' => ['this.IBLOCK_SECTION_ID' => 'ref.ID'],
                'join_type' => 'LEFT'
            ]
        ]
    ])->fetchAll();
    
    print_r($arElements);

    $iblockId измени, фильтр подправь под свой
    Ответ написан
    Комментировать
  • Как вывести комментарии из CBlogComment и связать их с CBlogPost?

    @PetrPo
    Что-то типа того
    \Bitrix\Main\Loader::includeModule('iblock');
    \Bitrix\Main\Loader::includeModule('blog');
    
    $iblockId = 2;
    $arPostsId = $arElements = $arPosts = [];
    
    $dbRes = \Bitrix\Iblock\PropertyTable::getList([
        'select' => ['ID', 'CODE'],
        'filter' => [
            '=IBLOCK_ID' => $iblockId,
            '=PROPERTY_TYPE' => \Bitrix\Iblock\PropertyTable::TYPE_NUMBER,
            '=MULTIPLE' => 'N',
            '=CODE' => [CIBlockPropertyTools::CODE_BLOG_POST]
        ]
    ]);
    
    if($arRes = $dbRes->Fetch()) {
        $propertyPostId = $arRes['ID'];
    }
    
    $dbRes = CIBlockElement::GetList(
        [],
        ['=IBLOCK_ID' => $iblockId, '!PROPERTY_'.$propertyPostId => false],
        false,
        false,
        ['ID', 'NAME', 'DETAIL_PAGE_URL', 'PROPERTY_'.$propertyPostId]
    );
    
    while($arRes = $dbRes->GetNext()) {
        $propertyPostValue = $arRes['PROPERTY_'.$propertyPostId.'_VALUE'];
    
        $arPostsId[] = $propertyPostValue;
        $arElements[$propertyPostValue] = $arRes;
    }
    
    $arPostsId = array_unique($arPostsId);
    
    $dbRes = CBlogPost::GetList(
        ['ID' => 'DESC'],
        ['ID' => $arPostsId]
    );
    
    while($arRes = $dbRes->Fetch()) {
        $arPosts[$arRes['ID']] = $arRes;
    }
    
    $dbRes = CBlogComment::GetList(
        ['ID' => 'DESC'],
        ['POST_ID' => $arPostsId]
    );
    
    while($arRes = $dbRes->Fetch()) {
        $arPosts[$arRes['POST_ID']]['COMMENTS'][] = $arRes;
        $arPosts[$arRes['POST_ID']]['ELEMENT'] = $arElements[$arRes['POST_ID']];
    }
    
    print_r($arPosts);


    UPD добавил CBlogPost::GetList
    Ответ написан
  • Как использовать разную сортировку элементов в зависимости от категорий?

    @PetrPo
    Примерно в правильном направлении думаешь, про марджины, но тебе надо узнать это перед вызовом компонента, как бы последовательность выполнения кода она последовательна)) параметры компонента->компонент->шаблон компонента (в том числе файл template.php)
    Компонент каталога комплексный?
    Ответ написан
  • Как в ЧПУ на страницах разделов убрать /catalog/?

    @PetrPo
    1. Убери из настроек инфоблока "урл страницы инфоблока" /catalog/
    2. Открой через публичку настройки компонента (через публичку, чтобы при сохранении urlrewrite сам переписался) в "управление адресами страниц" -> "Каталог ЧПУ (относительно корня сайта)" (SEF_FOLDER) тоже убери catalog, оставь просто /

    Если так сделаешь, то урлы станут, как тебе надо, но перестанет корректно работать корень раздела.
    Чтобы исправить в index.php пишешь условие
    <?if(CSite::InDir('/catalog/index.php')):?>
    // здесь будет вызов простого компонента из файла sections.php компонента catalog
    <?else:?>
    // здесь твой компонент catalog
    <?endif;?>


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

    Уточню почему корень каталога будет некорректно работать, так как адрес раздела /код раздела/ и компонент размещен в разделе /catalog/, то Битрикс будет думать, что catalog - это тоже раздел в инфоблоке с символьным кодом catalog, и соответственно раз такого раздела нет, то будет 404, поэтому придется немного делать костыль.
    Ответ написан
  • Как вывести изображение раздела в шапке header?

    @PetrPo
    1. В header.php
    <section class="smt-page-header" style="background-image: url(<?$APPLICATION->ShowProperty('SECTION_BACKGROUND');?>);">
    тут блок с заголовком
    </section>

    2. В шаблоне компонента catalog.section, файл result_modifier.php
    $component = $this->getComponent();
    $component->SetResultCacheKeys(array('PICTURE'));

    3. В том же шаблоне файл component_epilog.php
    $APPLICATION->SetPageProperty('SECTION_BACKGROUND', $arResult['PICTURE']['SRC']);
    Ответ написан
    Комментировать
  • Как получить массив с информацией о заказе Bitrix?

    @PetrPo
    $arOrderProps = [];
    
    $dbRes = \Bitrix\Sale\PropertyValue::getList([
        'select' => ['CODE', 'VALUE'],
        'filter' => ['=ORDER_ID' => 6, 'CODE' => ['FIO', 'PHONE']]
    ]);
    
    while($arRes = $dbRes->fetch()) {
        $arOrderProps[$arRes['CODE']] = $arRes['VALUE'];
    }
    
    print_r($arOrderProps);

    Коды свойств и id заказа на нужные замени
    Ответ написан
    Комментировать