• Битрикс загибается?

    @PetrPo
    Не вижу особой разницы между тем чтобы написать модуль или написать тоже самое просто в отдельной папке. Создаешь папку со своим namespace в папке php_interface, там файл include.php с autoload-ом классов и подключаешь в init.php свой include.php Сейчас это тебе сэкономит время (не писать и не тестить установку и другие мелочи), а уж если получится реально переиспользуемой крутой код, потратишь немного времени, чтобы завернуть это в модуль.

    P.S. Написание модуля никак не исправит твое желание писать говнокод)
    Ответ написан
    Комментировать
  • Как перезаписать правило ЧПУ для собственнего компонента Битрикс при сохранении настроек?

    @PetrPo
    У тебя комплексный компонент, он все правильно переписывает urlrewrite. Когда включаешь SEF_MODE у тебя есть доп. параметр SEF_URL_TEMPLATES, вот он и будет твоими правилами, которые ты хочешь вот так записать #^/somedir/([^/]+)/([^/]+)?/?(.*)$#
    Сохрани свой компонент через визуальный редактор, потом вручную (пока что) замени в индексном файле
    "SEF_URL_TEMPLATES" => array(
    	"element" => "#CODE#/",
    	"articles" => "#CODE#/articles/",
    	"articles2" => "#CODE#/articles2/",
    	"articles3" => "#CODE#/articles3/",
    ),

    Теперь по запросу /somedir/#CODE#/articles/ у тебя будет подключаться страница articles.php (остальные соответственно - /somedir/#CODE#/articles2/ будет articles2.php ), которую тебе надо создать в шаблоне комплексного компонента. в $arResult['VARIABLES']['CODE'] у тебя будет код твоего элемента, можешь доставать нужные связи - тут уже как считаешь правильным, хоть тут запросы делай, хоть на уровень комплексного компонента это выноси, я бы для таких связей написал еще простой компонент.

    Ну и остается сделать, чтобы твои SEF_URL_TEMPLATES можно было через визуальный редактор редактировать, в любом комплексном компоненте в файле .parameters.php можешь посмотреть (ориентир, все что с SEF_MODE связано)

    Примерчик на основе компонента news:
    5f3a8ffb3d32e894639962.jpeg
    стандартный битриксовый eshop, раздел новости, компонент news, все работает как надо

    Правки в файле .parameters.php компонента, раздел SEF_MODE
    // ...............
    "SEF_MODE" => Array(
    	"element" => array(
    		"NAME" => GetMessage("T_IBLOCK_SEF_PAGE_NEWS_DETAIL"),
    		"DEFAULT" => "#CODE#/",
    		"VARIABLES" => array("CODE"),
    	),
    	"articles" => array(
    		"NAME" => "Страница связанных articles",
    		"DEFAULT" => "search/",
    		"VARIABLES" => array(),
    	),
    
    	"articles2" => array(
    		"NAME" => "Страница связанных articles2",
    		"DEFAULT" => "search/",
    		"VARIABLES" => array(),
    	),
    
    	"articles3" => array(
    		"NAME" => "Страница связанных articles3",
    		"DEFAULT" => "search/",
    		"VARIABLES" => array(),
    	),
    
    ),
    // ................
    
    в конце по вкусу можно добавить, что-то типа
    if($arCurrentValues["SEF_MODE"]=="Y")
    {
    	$arComponentParameters["PARAMETERS"]["VARIABLE_ALIASES"] = array();
    	$arComponentParameters["PARAMETERS"]["VARIABLE_ALIASES"]["CODE"] = array(
    		"NAME" => GetMessage("CP_BC_VARIABLE_ALIASES_ELEMENT_ID"),
    		"TEMPLATE" => "#CODE#",
    	);
    }


    В файле component.php можно добавить
    $arDefaultUrlTemplates404 = array(
    	"news" => "",
    	"element" => "#CODE#/",
    );
    Ответ написан
    Комментировать
  • Как определить проблему с веб-формами?

    @PetrPo
    Предположу, что в статусах не проставлен доступ
    Ответ написан
  • Как в умном фильтре в ЧПУ выводить NAME свойства в не XML_ID?

    @PetrPo
    Кастомить catalog.smart.filter файл class.php
    1. В методе makeSmartUrl найди
    //Numbers && calendar == ranges
    				if (
    					$arItem["PROPERTY_TYPE"] == "N"
    					|| $arItem["DISPLAY_TYPE"] == "U"
    				)
    				{
    					if (strlen($arItem["VALUES"]["MIN"]["HTML_VALUE"]) > 0)
    						$smartPart["from"] = $arItem["VALUES"]["MIN"]["HTML_VALUE"];
    					if (strlen($arItem["VALUES"]["MAX"]["HTML_VALUE"]) > 0)
    						$smartPart["to"] = $arItem["VALUES"]["MAX"]["HTML_VALUE"];
    				}
    				else
    				{
    					foreach($arItem["VALUES"] as $key => $ar)
    					{
    						if (
    							(
    								$ar["CHECKED"]
    								|| $ar["CONTROL_ID"] === $checkedControlId
    							)
    							&& strlen($ar["URL_ID"])
    						)
    						{
    							$smartPart[] = $ar["URL_ID"];
    						}
    					}
    				}

    в else замени два $ar["URL_ID"] на $ar["VALUE"]

    2. Метод searchValue замени на
    public function searchValue($item, $lookupValue)
    	{
    		$error = "";
    		$searchValue = \Bitrix\Main\Text\Encoding::convertEncoding($lookupValue, LANG_CHARSET, "utf-8", $error);
    		if (!$error)
    		{
    			$encodedValue = rawurlencode($searchValue);
    			foreach($item as $itemId => $arValue)
    			{
    				$convertValue = \Bitrix\Main\Text\Encoding::convertEncoding($arValue['VALUE'], LANG_CHARSET, "utf-8", $error);
    				if ($encodedValue === rawurlencode($convertValue))
    					return $itemId;
    			}
    		}
    		return false;
    	}
    Ответ написан
    Комментировать
  • Как проверить, оформлял ли пользователь заказы в интернет магазине Bitrix?

    @PetrPo
    \Bitrix\Main\Loader::includeModule('sale');
    
    global $USER;
    
    $userId = $USER->GetID();
    $productId = 45;
    
    $order = \Bitrix\Sale\Order::getList([
        'select' => ['ID'],
        'filter' => ['USER_ID' => $userId, 'BASKET.PRODUCT_ID' => $productId],
        'limit' => 1
    ])->fetch();
    Ответ написан
  • Как создать URL для перехода при клике на изображении?

    @PetrPo
    Полазил, вообщем не знаю почему у тебя это дело коряво работает, у меня все норм, да ссылка подменяется на rk.php но потом происходит редирект на указанный урл (твой случай надо точечно смотреть).
    Вообщем покапал ядро и выяснил, что есть вот такая галочка в настройках баннера, за счет которой и происходит подмена указанного урла для сбора статистика переходов с баннера, если ее отключить, то будет твоя обычная ссылка, но без сбора статов
    5f2a90d23df51205976053.jpeg
    Ответ написан
    Комментировать
  • Как создать привязку к элементу инфоблока? Как получить SEO в старом ядре?

    @PetrPo
    К вопросу привязывается ответ через свойство элемента
    К вопросу я могу привязать ответы, а к ответу вопрос?
    Мне нужно реализовать привязку ответа к вопросу.

    Ответ на твой вопрос в вопросе. Ты чё несешь?
    Ответ написан
  • Как узнать id пользователя пр ирегистрации?

    @PetrPo
    AddEventHandler("main", "OnBeforeUserRegister", "OnBeforeUserRegisterHandler"); 
    
    function OnBeforeUserRegisterHandler(&$arFields) {
      $arFields['ACTIVE'] = 'N';
    }
    Ответ написан
    Комментировать
  • Как вывести цену в подробное описание?

    @PetrPo
    В детальном описании пишешь текст текст текст ... Вы можете купить этот товар по цене #PRICE_1# руб. .... текст текст текст
    #PRICE_1# - это макрос, в котором 1 - это ID нужного типа цены (тут по желанию можно и символьный код цены)

    Если на примере простых товаров, код выглядит примерно так
    if($arResult['DETAIL_TEXT']) {
    	$arPrices = $aSearch = $aReplace = array();
    
    	preg_match_all('/#PRICE_\d#/', $arResult['DETAIL_TEXT'], $matches);
    	
    	if($matches[0]) {
    		$iterator = \Bitrix\Catalog\PriceTable::getList([
    			'select' => ['CATALOG_GROUP_ID', 'PRICE', 'CURRENCY'],
    			'filter' => ['PRODUCT_ID' => $arResult['ID']]
    		]);
    
    		while($row = $iterator->fetch()) {
    			$arPrices[$row['CATALOG_GROUP_ID']] = CCurrencyLang::CurrencyFormat($row['PRICE'], $row['CURRENCY']);
    		}
    		
    		$aSearch = $matches[0];
    		
    		foreach($aSearch as $key => $str) {
    			$priceId = str_replace(['#', 'PRICE_'], '', $str);
    			$aReplace[$key] = $arPrices[$priceId];
    		}
    		
    		$arResult['DETAIL_TEXT'] = str_replace($aSearch, $aReplace, $arResult['DETAIL_TEXT']);
    	}
    }
    Ответ написан
    Комментировать
  • Не получается найти работу на фриланс. Сможете подсказать?

    @PetrPo
    Мне кажется у тебя просто завышенная самооценка)
    Вот это дело bootstrap, css, sass, scss, html, js, jquery = сверстал несколько страничек, посмотрел ссылка 5 маленьких блоков, в каждом есть до чего докопаться (норм заказчик не примет такую работу)
    mysql - заказчикам на фрилансе насрать на такие твои знания
    php - ты явно плохо знаешь

    Full stack разработчик, предприниматель, фрилансер - смотри как удобно можешь сам у себя заказывать))
    Ответ написан
    Комментировать
  • Как сделать popap окно при нажатии на кнопку купить на детальной странице товара bitrix?

    @PetrPo
    В комплексном компоненте bitrix:catalog есть параметры для настройки действий кнопки купить/в корзину:
    1. Параметр DETAIL_ADD_TO_BASKET_ACTION = BUY/ADD, для показа попапа ADD
    2. Параметр USE_COMMON_SETTINGS_BASKET_POPUP = Y/N, если Y из документации При отмеченной опции на всех страницах каталога будут использоваться одинаковые настройки отображения кнопок для добавления в корзину или покупки. Если поставить Y, то параметр из пункта один не будет учитываться, а в параметре COMMON_ADD_TO_BASKET_ACTION указать значение ADD также получим попап.

    Приведенные настройки работают с дефолтными шаблонами
    Ответ написан
    Комментировать
  • Как создать меню и подменю в битрикс для кастомных ссылок?

    @PetrPo
    У пунктов меню есть раширенная настройка, где можно для каждого пункта добавить доп. параметры
    5f1530c991831596350843.jpeg
    Ну и например у ссылки первого уровня ставишь параметр PARENT = CHILD_1
    У ссылок второго уровня ставишь параметр CHILD = CHILD_1

    В компоненте меню все эти параметры попадают в массив PARAMS каждого пункта, ну и там в result_modifier.php компонуешь как тебе надо, образно зависит уже от того как ты вывод хочешь сделать в template.php
    Пример
    foreach($arResult as $key => &$arItem) {
    	if(isset($arItem['PARAMS']['PARENT']) && $arItem['PARAMS']['PARENT']) {
    		$parents[$arItem['PARAMS']['PARENT']] = &$arItem;
    	}
    	
    	if(isset($arItem['PARAMS']['CHILD']) && $arItem['PARAMS']['CHILD']) {
    		$parents[$arItem['PARAMS']['CHILD']]['CHILDS'][$key] = $arItem;
    		unset($arResult[$key]);
    	}
    }

    Если надо больше 2-х уровней, можно это дело в функцию вынести и рекурсивно вызывать
    Ответ написан
    Комментировать
  • Как показать все варианты свойств товара в умном фильтре?

    @PetrPo
    1. Отключи фасетный индекс для нужного инфоблока
    2. Сделай кастомный компонент catalog.smart.filter
    - в файле component.php найди строчку
    foreach($arElements as $arElement)
    - перед этой строчкой добавь
    if(isset($this->arResult['PROPERTY_ID_LIST']) && $this->arResult['PROPERTY_ID_LIST']) {
      $propertiesList = array();
      
      foreach($this->arResult['PROPERTY_ID_LIST'] as $propertyId) {
        $dbRes = CIBlockPropertyEnum::GetList(array('ID' => 'ASC'), array('PROPERTY_ID' => $propertyId));
        
        while($arRes = $dbRes->Fetch()) {
          $this->fillItemValues($arResult['ITEMS'][$arRes['PROPERTY_ID']], $arRes['ID']);
        }
      }
    }


    UPD
    немного поправил код
    Ответ написан
    Комментировать
  • Как сделать автоматическое переключение с одного input на другой input?

    @PetrPo
    Не в курсе про такой input
    <InputMask   mask="9" onkeyup="testJump(this);" maxlength="1" alwaysShowMask type="text" />

    С обычным input это выглядит так
    <input type="text" onInput={e => testJump(e.target)} maxLength="1" />
    Ответ написан
  • Почему данные по корзине то приходят, то нет?

    @PetrPo
    Ориентир - у тебя несколько ajax-ов срабатывает. js - асинхронный. И хоть ты и думаешь, что первый раз у тебя правильно работает, а второй не правильно - это не так, в одной из n-цать попыток первый раз тоже сработает неправильно
    1-ый ajax
    $.ajax({
                    url: '/bitrix/templates/dveri/ajax/basket.php'

    2-ой ajax
    $.get('/bitrix/templates/dveri/ajax/count_basket.php').done(function(data){


    По-умолчанию $.ajax параметр async = true, поэтому у тебя есть 3 варианта решения проблемы
    1. Переделать вызов функции $.get на $.ajax и в обоих вызовах добавить параметр
    $.ajax({
    //.............
    async: false,
    //.............

    2. Перенести вызов функции $.get в success $.ajax({
    3. Сделать через async await (равносильно, если прописать промисы, но это не круто), выглядит это так
    //.............
     $("#send").on("click", async function () {
    //.............
    await  $.ajax({
    //.............
    await $.get('/bitrix/templates/dveri/ajax/count_basket.php').done(function(data){
    //.............
    Ответ написан
    Комментировать
  • Как вставить элемент инфоблока в свойство другого элемента - другого инфоблока?

    @PetrPo
    в доках черным по белому написано

    arFields
    Массив вида Array("поле"=>"значение", ...), содержащий значения полей элемента инфоблоков и дополнительно может содержать поле "PROPERTY_VALUES" - массив со всеми значениями свойств элемента в виде массива Array("код свойства"=>"значение свойства"). Где "код свойства" - числовой или символьный код свойства, "значение свойства" - одиночное значение, либо массив значений если свойство множественное


    Ты создаешь новый элемент $el->Add($arLoadProductArray)

    В $arLoadProductArray у тебя написано
    $arLoadProductArray = Array(
    //........................
            "SPRAV" => $arResult["ID"], // отзыв клиента
    //........................


    А надо
    1. Если свойство НЕ множественное
    $arLoadProductArray = Array(
    //........................
            "PROPERTY_VALUES" => array(
    			"SPRAV" => $arResult["ID"]
    		),
    //........................

    2. Если свойство множественное
    $arLoadProductArray = Array(
    //........................
            "PROPERTY_VALUES" => array(
    			"SPRAV" => array($arResult["ID"])
    		),
    //........................
    Ответ написан
    Комментировать
  • Как сделать номер заказа у формы связи?

    @PetrPo
    В почтовом шаблоне пишешь типа Ваш заказ номер #ORDER_ID# и потом делаешь реплейс на ID элемента инфоблока
    а если хочу с порядковым номером то ?

    Сделай свойство в инфоблоке, перед добавлением нового элемента получай последний элемент и значение этого свойства, +1 и готово, потом по схеме описанной выше.
    Просто по логике номер заявки должен предполагать уникальное значение, а это ID элемента или тогда добавляй обработчик чтобы вручную нельзя было менять значение этого свойства, а только при добавлении нового элемента
    Ответ написан
  • Как передавать в результат формы название товара в Битрикс?

    @PetrPo
    1. В админке Настройки-->Настройки модулей-->Веб-формы надо снять галку "Использовать упрощённый режим редактирования форм", чтобы полям можно было задавать символьный код.
    2. В настройках своей веб-формы создаешь "вопрос", например "Название товара", с символьным кодом ELEMENT_NAME, добавляешь "ответ" тип поля hidden
    3. В вызов компонента веб-формы добавляешь параметр, например так
    "ELEMENT_NAME" => array(
    	"VALUE" => $arResult["NAME"],
    	"AUTOCOMPLETE" => "Y"
    )

    4. В шаблоне вывода формы где идет цикл по вопросам
    foreach ($arResult["QUESTIONS"] as $FIELD_SID => $arQuestion)
    	{

    внутрь добавляешь
    if(isset($arParams[$FIELD_SID]) && $arParams[$FIELD_SID]['VALUE'] && $arParams[$FIELD_SID]['AUTOCOMPLETE'] == 'Y') {
    	$arQuestion['HTML_CODE'] = str_replace('name=', 'value="'.$arParams[$FIELD_SID]['VALUE'].'" name=', $arQuestion['HTML_CODE']);
    }
    Ответ написан
  • Как сделать сортировку в catalog.comment?

    @PetrPo
    Компонент blog.post.comment он отвечает за вывод отзывов, ориентировочно его шаблон находится /catalog.comments/templates/.default/bitrix/blog.post.comment/adapt, если нет, найди свой шаблон, вот его result_modifier тебе надо править.

    Эмпирическим путем было вычислено, что надо пересортировать два массива (что немного странно, но вот так)
    - $arResult['CommentsResult'] - в цикле, с помощью функции usort сортируется без проблем
    - $arResult['PagesComment'] - в массиве отзывы делятся по страницам, сначала в обратном порядке пересортировываешь - функция krsort, затем по аналогии с первым массивом также в цикле делаешь usort
    - для usort надо написать свою функцию сравнения
    Ответ написан
    Комментировать