Задать вопрос
  • По каким причинам file_get_contents может возвращать null при верном url?

    @pingvin156 Автор вопроса
    Проверил:
    allow_url_fopen On On

    Самое забавное, что не со всеми сайтами такое случается...
  • Почему зависает фильтрация при умном фильтре, если включить режим AJAX?

    @pingvin156 Автор вопроса
    Добавил вручную включить в шаблоне CJSCore::Init(array('ajax'));
    Фильтрация пошла, хотя "крутящееся колесо" процесса фильтрации никуда не ушло.
    Вот что повылезало консоли:
    BX.debug:  Arguments(2) ["BX.ready error: ", TypeError: Cannot read property 'OPENER' of null
        at BX.CMenuOpener.setParent (http://medialavka.…, callee: ƒ, Symbol(Symbol.iterator): ƒ]0: "BX.ready error: "1: TypeError: Cannot read property 'OPENER' of null
        at BX.CMenuOpener.setParent (http://medialavka.ru/bitrix/cache/js/s1/template.main/kernel_main/kernel_main.js?1524771215288214:63:24883)
        at new BX.CMenuOpener (http://medialavka.ru/bitrix/cache/js/s1/template.main/kernel_main/kernel_main.js?1524771215288214:63:20937)
        at HTMLDocument.<anonymous> (http://medialavka.ru/address-program/?bitrix_include_areas=Y&clear_cache=Y:6092:67)
        at runReady (http://medialavka.ru/bitrix/cache/js/s1/template.main/kernel_main/kernel_main.js?1524771215288214:15:28152)
        at HTMLDocument.__readyHandler (http://medialavka.ru/bitrix/cache/js/s1/template.main/kernel_main/kernel_main.js?1524771215288214:15:27287)message: "Cannot read property 'OPENER' of null"stack: "TypeError: Cannot read property 'OPENER' of null↵    at BX.CMenuOpener.setParent (http://medialavka.ru/bitrix/cache/js/s1/template.main/kernel_main/kernel_main.js?1524771215288214:63:24883)↵    at new BX.CMenuOpener (http://medialavka.ru/bitrix/cache/js/s1/template.main/kernel_main/kernel_main.js?1524771215288214:63:20937)↵    at HTMLDocument.<anonymous> (http://medialavka.ru/address-program/?bitrix_include_areas=Y&clear_cache=Y:6092:67)↵    at runReady (http://medialavka.ru/bitrix/cache/js/s1/template.main/kernel_main/kernel_main.js?1524771215288214:15:28152)↵    at HTMLDocument.__readyHandler (http://medialavka.ru/bitrix/cache/js/s1/template.main/kernel_main/kernel_main.js?1524771215288214:15:27287)"__proto__: Errorcallee: ƒ ()length: 2Symbol(Symbol.iterator): ƒ values()__proto__: Object
  • Как победить ошибку PuTTY: Software caused connection abort?

    @pingvin156 Автор вопроса
    Действительно, IP сменился и заработало!
  • Как победить ошибку PuTTY: Software caused connection abort?

    @pingvin156 Автор вопроса
    Вчера я заходил с теми же настройками, что и сейчас, но помню до того помучился. Похоже, под бан я мог попасть, т.к. IP генерится. За это время он сменился... С другого провайдера попробую через удаленку, но это вообще изврат какой-то...
  • Как настроить произвольные значения в умной фильтре 1с-битрикс?

    @pingvin156 Автор вопроса
    Тупо отключил ветку с hidden. И всё заработало)
  • Как настроить произвольные значения в умной фильтре 1с-битрикс?

    @pingvin156 Автор вопроса
    нашел вот что:
    а файле component_epilog.php формируется addressProgramData
    <?
        define(PROP_AREA_ID, 52);// id свойства "Район"
        define(PROP_STREET_ID, 53);// id свойства "Адрес"
        define(PROP_TYPE_ID, 54);// id свойства "Тип"
        define(PROP_USING_ID, 90);// id свойства "Занятость" SIA 02.05.2018
        $usedPropertyIds = array(PROP_AREA_ID, PROP_STREET_ID, PROP_TYPE_ID, PROP_USING_ID);
    
        $combo = array();
        foreach ($arResult['COMBO'] as $comboItem) {
            $comboItemRes = array();
            foreach ($usedPropertyIds as $propertyId) {
    
                $comboItemRes[$propertyId] = array(
                    'value' => $comboItem[$propertyId],
                    'control_id' => $arResult['ITEMS'][$propertyId]['VALUES'][$comboItem[$propertyId]]['CONTROL_ID']
                );
            }
            $combo[] = $comboItemRes;
        }
    ?>
    <script>
        'use strict';
    
        var addressProgramData = {
            combo: <?= json_encode($combo) ?>
        }
    </script>


    В js скрипте устанавливается hidden по addressProgramData:
    function doFiltrenCheckbox(){
            try {
                var filtrenCheckedCheckboxList = smartFilter.querySelectorAll('.b-filtren .b-filtren_item input[type="checkbox"]:checked');
                var arFiltrenCheckedCheckbox = {};
                Array.prototype.forEach.call(filtrenCheckedCheckboxList, function(filtrenCheckedCheckbox){
                    if (filtrenCheckedCheckbox.dataset.filtrenId in arFiltrenCheckedCheckbox) {
                        arFiltrenCheckedCheckbox[filtrenCheckedCheckbox.dataset.filtrenId].push(filtrenCheckedCheckbox.id);
                    } else {
                        arFiltrenCheckedCheckbox[filtrenCheckedCheckbox.dataset.filtrenId] = [filtrenCheckedCheckbox.id];
                    }
                });
    
                var activeFiltrenCheckboxList = {};
                addressProgramData.combo.forEach(function(comboItem){
                    var isPassed = true;
                    var passedControlIds = [];
    
                    var currentFiltrenId = document.querySelector('.b-advanced-select.open');
                    if (currentFiltrenId) {
                        currentFiltrenId = currentFiltrenId.dataset.filtrenId;
                    }
    
                    for (filtrenId in comboItem) {
                        if (filtrenId in arFiltrenCheckedCheckbox) {
                            if (
                                currentFiltrenId !== filtrenId &&
                                arFiltrenCheckedCheckbox[filtrenId].indexOf(comboItem[filtrenId]['control_id']) === -1
                            ) {
                                isPassed = false;
                            }
                        }
                        passedControlIds.push(comboItem[filtrenId]['control_id']);
                    }
    
                    if (isPassed) {
                        for (indx in passedControlIds) {
                            activeFiltrenCheckboxList[passedControlIds[indx]] = true;
                        }
                    }
                });
    
                // var advSelectSelection = filtrenCheckboxList.item(0).parentNode.parentNode.parentNode.querySelector('.b-advanced-select_selection');
                Array.prototype.forEach.call(filtrenCheckboxList, function(filtrenCheckbox){
                    if(filtrenCheckbox.id in activeFiltrenCheckboxList) {
                        filtrenCheckbox.parentNode.classList.remove('hidden');
                    } else {
                        var advSelectSelection = filtrenCheckbox.parentNode.parentNode.parentNode.querySelector('.b-advanced-select_selection');
                        var advSelect_selectionChoice = advSelectSelection.querySelector('[data-id="' + filtrenCheckbox.id + '"]');
                        doUncheckAdvSelectCheckbox(filtrenCheckbox, advSelect_selectionChoice);
                        if(!filtrenCheckbox.parentNode.classList.contains('b-advanced-select_choice_select-all')) {
                            filtrenCheckbox.parentNode.classList.add('hidden');
                        }
                    }
    
                });
    
                // Выбираем те поля фильтра в которых выбрано несколько значение (есть "Выбрано (#SELECTION_COUNT#)")
                // и обновляем значение #SELECTION_COUNT# (число выбранныз элементов)
                var advSelectChoiceList = smartFilter.querySelectorAll('.b-advanced-select_choice[data-id=""]');
                Array.prototype.forEach.call(advSelectChoiceList, function(advSelectChoice) {
                    var advSelectSelection = advSelectChoice.parentNode;
                    updateMultiselectionChoice(advSelectSelection, advSelectChoice);
               });
    
            } catch (error) {
                console.info('Ошибка в функции "doFiltrenCheckbox" (событие "click" на чекбоксах или загрузка страницы).');
                console.error(error);
            }
        };
  • Как настроить произвольные значения в умной фильтре 1с-битрикс?

    @pingvin156 Автор вопроса
    Айнур Валиев, вот так и делал. Проект не мой, трудно понять, что накручено..
    Вот до чего добрался в настройках:

    <ul class="b-advanced-select_choices lsnn check-ul">
    <li class="lvl2 b-advanced-select_choice_select-all">
      <input type="checkbox" value="" data-action="select-all" id="i-select-all_90">
      <label for="i-select-all_90">выбрать всё</label>
    </li>
    <li class="lvl2 hidden">
      <input type="checkbox" value="Y" name="arrFilter_90_1294909896" id="arrFilter_90_1294909896" data-filtren-id="90">
      <label for="arrFilter_90_1294909896"></label></li>
    <li class="lvl2 hidden">
      <input type="checkbox" value="Y" name="arrFilter_90_3483019650" id="arrFilter_90_3483019650" data-filtren-id="90">
      <label for="arrFilter_90_3483019650"></label></li>
    </ul>


    Выходит, он отображает оба варианта выбора с верными идентификаторами, но почему-то скрывает, добавляя класс hidden и не давая текстового наполнения... Почему может быть так?
  • Как настроить произвольные значения в умной фильтре 1с-битрикс?

    @pingvin156 Автор вопроса
    Я попробовал сделать иначе: через справочник и вывел в фильтр поле "Статус". Для теста завел для 3 элементов установил значения "Занято" и "Свободно", остальные остались пустыми.
    Адрес: medialavka.ru/address-program
  • Как настроить произвольные значения в умной фильтре 1с-битрикс?

    @pingvin156 Автор вопроса
    Айнур Валиев, Поставил галочку "Множественное" - в фильтре ничего не изменилось, но теперь вместо конкретного значения выводит слово "Array", т.е. явно настройка не к фильтру относится.
  • Как настроить произвольные значения в умной фильтре 1с-битрикс?

    @pingvin156 Автор вопроса
    Айнур Валиев, это у меня строковое значение, не множественное. Нужно прописывать варианты выбора?.. Я думал, они должны выбираться из значений поля автоматом.
    Сейчас строка разных видов: "Свободна", "Занята до 31.05.2018", "Забронирована" и т.п. - по сути произвольная строка
    5ae827124c234401352580.png
  • Как настроить произвольные значения в умной фильтре 1с-битрикс?

    @pingvin156 Автор вопроса
    Поле "Занятость" я добавил. В фильтре оно есть, но пустое, т.е. есть вариант выбора для нового фильтра только "выбрать всё" и больше никакого..
  • Как кастомизировать вывод элементов инфоблока на карту Yandex?

    @pingvin156 Автор вопроса
    нашел bitrix\components\bitrix\map.yandex.view\component.php

    <?
    if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
    
    $arParams['MAP_ID'] =
    	(strlen($arParams["MAP_ID"])<=0 || !preg_match("/^[A-Za-z_][A-Za-z01-9_]*$/", $arParams["MAP_ID"])) ? 
    	'MAP_'.$this->randString() : $arParams['MAP_ID'];
    
    if (($strPositionInfo = $arParams['~MAP_DATA']) && CheckSerializedData($strPositionInfo) && ($arResult['POSITION'] = unserialize($strPositionInfo)))
    {
    	if (is_array($arResult['POSITION']) && is_array($arResult['POSITION']['PLACEMARKS']) && ($cnt = count($arResult['POSITION']['PLACEMARKS'])))
    	{
    		for ($i = 0; $i < $cnt; $i++)
    		{
    			$arResult['POSITION']['PLACEMARKS'][$i]['TEXT'] = str_replace('###RN###', "\r\n", $arResult['POSITION']['PLACEMARKS'][$i]['TEXT']);
    		}
    	}
    
    	if (is_array($arResult['POSITION']) && is_array($arResult['POSITION']['POLYLINES']) && ($cnt = count($arResult['POSITION']['POLYLINES'])))
    	{
    		for ($i = 0; $i < $cnt; $i++)
    		{
    			$arResult['POSITION']['POLYLINES'][$i]['TITLE'] = str_replace('###RN###', "\r\n", $arResult['POSITION']['POLYLINES'][$i]['TITLE']);
    		}
    	}
    }
    
    $this->IncludeComponentTemplate();
    ?>


    Я не очень понимаю, где это искать
  • Как обновить цены на сайте 1с.битрикс?

    @pingvin156 Автор вопроса
    Айнур Валиев, скорее всего, так и есть! Я уже неделю убил на это...

    Скрипт загрузки. Я не понимаю, почему он может не работать...

    Вот непосредственно загрузка:
    // Обновление существующего элемента
    					$arElement['IBLOCK_ID'] = self::$params['IBLOCK_ID'];
    
    					if ($arElement['STATUS'] == 0 && $arElement['DELETION'] != 'true') {
    						$arElement['ACTIVE'] = "Y";
    					} else {
    						$arElement['ACTIVE'] = "N";
    					}
    
    					$arElement['NAME'] = trim($arElement['NAME']);
    
    					self::log('Обновление существующего элемента "'.$arElement['NAME'].'"');
    
    					$arProps = array();
    					if (!empty($arElement['PROPERTY_VALUES']) && is_array($arElement['PROPERTY_VALUES'])) {
    						$arProps = $arElement['PROPERTY_VALUES'];
    						unset($arElement['PROPERTY_VALUES']);
    					}
    					
    					$ELEMENT_ID = $arExistItemsIDs[$arElement['XML_ID']];
    					if ($el->Update($ELEMENT_ID, $arElement, false, true, true)) {
    						$arChangedItems[] = $ELEMENT_ID;
    
    						//Обновление св-в
    						if (!empty($arProps) && is_array($arProps)) {
    							CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, self::$params['IBLOCK_ID'], $arProps);
    						}
    
    						//Обновление цены
    						$arFields = array(
    						    "PRODUCT_ID" => $ELEMENT_ID,
    						    "CATALOG_GROUP_ID" => self::$params['PRICE_TYPE_ID'],
    						    "PRICE" => $arElement['PRICE'],
    						    "CURRENCY" => "RUB",
    						);
    
    						$obPrice = new CPrice();
    						$obPrice->Update($arFields, true);
    					}
  • Как обновить цены на сайте 1с.битрикс?

    @pingvin156 Автор вопроса
    Айнур Валиев, мб вообще цены иначе выгружаются?..
  • Как обновить цены на сайте 1с.битрикс?

    @pingvin156 Автор вопроса
    Айнур Валиев, ничего не изменилось. :(
  • Как обновить цены на сайте 1с.битрикс?

    @pingvin156 Автор вопроса
    Я просто 1с.битрикс впервые вижу... Это как?
  • Как найти скрипт импорта в iblock для 1с.битрикс?

    @pingvin156 Автор вопроса
    Олег Мифле, при выгрузке создается файл типа MessageFor_30000000385.xml и картинки
    Содержание его такое:
    ОбменССайтом3238502e08e259-a845-11e4-b9f0-001fd05a9a5ffalsefalse00000000-0000-0000-0000-00000000000000000001
    Синяя
    <МестоСоздания>00000000-0000-0000-0000-000000000000МестоСоздания>
    Категории>
    .
    .
    .
    35ecfcfa-75c7-11e7-a62b-001a4d382000falsefalse00000000-0000-0000-0000-00000000000000001901
    Бакинских Комиссаров, 68/A
    <ТипБлока xmlns="" xsi:type="CatalogRef.ТипыРекламныхБлоков">8b3f6c0b-6369-11e6-a3c0-001a4d382000ТипБлока>
    <НомерБлока xsi:type="xsd:string">0769НомерБлока>
    <Район xmlns="" xsi:type="CatalogRef.Районы">0bb76d6c-9a43-11e4-b9c6-001fd05a9a5fРайон>
    <Город xmlns="" xsi:type="CatalogRef.Города">9b79a739-6e20-11e4-a640-5404a6b87cefГород>
    <Освещение xsi:type="xsd:boolean">falseОсвещение>
    <Сторона xmlns="" xsi:type="CatalogRef.ВидыСторон">86e6ced2-2002-49b9-9aef-6dc3f08f92f9Сторона>
    <Алкоголь xsi:type="xsd:boolean">falseАлкоголь>
    <Табак xsi:type="xsd:boolean">falseТабак>
    <ДатаУстановки xsi:type="xsd:dateTime">2017-08-01T00:00:00ДатаУстановки>
    <ДатаУдаления xsi:type="xsd:dateTime">0001-01-01T00:00:00ДатаУдаления>
    <Описание xsi:type="xsd:string">ПП Бакинских КомиссаровОписание>
    35ecfcfa-75c7-11e7-a62b-001a4d382000
    <Размер xmlns="" xsi:type="CatalogRef.РазмерыРекламныхБлоков">8b3f6c0a-6369-11e6-a3c0-001a4d382000Размер>
    <Координаты xsi:type="xsd:string">56.907220, 60.590651Координаты>
    <Цена xsi:type="xsd:decimal">3300Цена>
    РекламныеБлоки>
    .
    .
    .

    3d4ab3f9-5e71-4de1-b67c-266cfea7d3a0false00000007
    B1
    <Описание/>
    ВидыСторон>



    Я нашел обработчик (как я думаю):

    public static function parseXML($filePath) {
    /*
    Открываем файл, парсим как массив значений по строкам.
    На выходе получаем структурированный массив рекламных блоков и св-в
    После вызываем добавление элементов
    */
    if (!CModule::IncludeModule('iblock')) die();
    self::log('START parseXML()');

    set_time_limit(0);
    ignore_user_abort(true);

    $data = implode("", file($filePath));
    $work_dir = dirname($filePath);
    $parser = xml_parser_create();
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($parser, $data, $values, $tags);
    xml_parser_free($parser);

    // Get vals
    $arRes = array();
    $arRawItems = array();
    $arRawProps = array();
    $arPrices = array();

    // return $values;
    foreach ($values as $rowIterator => $arRow) {
    $CUR_LVL = '';
    $CUR_ITEM = '';

    $arRow['tag'] = str_replace("CatalogObject.", "", $arRow['tag']);
    if ($arRow['tag'] == 'РекламныеБлоки' && $arRow['type'] == 'open') {
    $CUR_LVL = $arRow['level'];
    $CUR_ITEM = $rowIterator;
    for ($rowIterator++; $values[$rowIterator]['level'] != $CUR_LVL && $values[$rowIterator]['type'] != 'close'; $rowIterator++) {
    $arRawItems[$CUR_ITEM][] = $values[$rowIterator];
    }
    }
    else if ($arRow['tag'] != 'РекламныеБлоки' && $arRow['tag'] != 'TableVoz' && $arRow['type'] == 'open' && $arRow['level'] == 3) {
    $CUR_LVL = $arRow['level'];
    $PROP_REF_CODE = '';
    for ($rowIterator++; $values[$rowIterator]['level'] != $CUR_LVL && $values[$rowIterator]['type'] != 'close'; $rowIterator++) {
    if ($values[$rowIterator]['tag'] == 'Ref') {
    $PROP_REF_CODE = $values[$rowIterator]['value'];
    }
    if (!empty($PROP_REF_CODE)) {
    $arRawProps[$PROP_REF_CODE][$values[$rowIterator]['tag']] = $values[$rowIterator];
    }
    }
    } else if ($arRow['tag'] == 'TableVoz') {
    $CUR_LVL = $arRow['level'];
    for ($rowIterator++; $values[$rowIterator]['level'] != $CUR_LVL && $values[$rowIterator]['type'] != 'close'; $rowIterator++) {
    $CUR_ROW_LVL = $values[$rowIterator]['level'];
    $PROP_REF_CODE = '';
    $ROW_DATE = '';
    $DATE_OK = false;
    $CUR_DATE = date('m.Y');
    for ($rowIterator++; $values[$rowIterator]['level'] != $CUR_ROW_LVL && $values[$rowIterator]['type'] != 'close'; $rowIterator++) {
    if ($values[$rowIterator]['tag'] == 'ID') {
    $PROP_REF_CODE = $values[$rowIterator]['value'];
    }
    if ($values[$rowIterator]['tag'] == 'Month') {
    $ROW_DATE = strtotime($values[$rowIterator]['value']);
    $ROW_DATE = date('m.Y', $ROW_DATE);
    if ($ROW_DATE == $CUR_DATE) {
    $DATE_OK = true;
    }
    }
    if ($DATE_OK) {
    $arPrices[$PROP_REF_CODE][$values[$rowIterator]['tag']] = $values[$rowIterator];
    }
    }
    }
    }
    }

    // return $arPrices;
    // return $arRawItems;
    // return $arRawProps;

    /*
    Необходимые данные:

    Название V
    Номер блока V
    Тип блока
    Район V
    Адрес V
    Сторона V
    Описание V
    Координаты V
    Размер V
    Освещение V
    Изображения V
    Цена за месяц V
    */

    // Construct our elements array
    foreach ($arRawItems as $key => $arElement) {
    $CUR_REF = '';
    $tempArr = array();
    foreach ($arElement as $arProperty) {
    // If property is list item - get list item value
    if (strpos($arProperty['attributes']['xsi:type'], 'CatalogRef.') !== false && $arProperty['attributes']['xsi:type'] != 'CatalogRef.РекламныеБлоки' && $arProperty['tag'] != 'ID') {
    $arProperty['value'] = $arRawProps[$arProperty['value']]['Description']['value'];
    }

    $arProperty['value'] = trim($arProperty['value']);

    // Construct element array to add / update
    switch ($arProperty['tag']) {
    case 'DeletionMark':
    $tempArr['DELETION'] = $arProperty['value'];
    break;
    case 'ТипБлока':
    $tempArr['PROPERTY_VALUES']['TYPE'] = $arProperty['value'];
    $tempArr['NAME'] .= $arProperty['value'].' ';
    break;
    case 'НомерБлока':
    $tempArr['PROPERTY_VALUES']['NUMBER'] = $arProperty['value'];
    $tempArr['NAME'] .= $arProperty['value'];
    break;
    case 'Освещение':
    if ($arProperty['value'] == 'true') {
    $tempArr['PROPERTY_VALUES']['LIGHT'] = 28; //Yes
    } else {
    $tempArr['PROPERTY_VALUES']['LIGHT'] = 29; //No
    }
    break;
    case 'Description':
    $tempArr['PROPERTY_VALUES']['STREET'] = $arProperty['value'];
    break;
    case 'Координаты':
    $tempArr['PROPERTY_VALUES']['MAP'] = $arProperty['value'];
    break;
    case 'Размер':
    $tempArr['PROPERTY_VALUES']['SIZE'] = $arProperty['value'];
    break;
    case 'Сторона':
    $tempArr['PROPERTY_VALUES']['SIDE'] = $arProperty['value'];
    break;
    case 'Район':
    $tempArr['PROPERTY_VALUES']['AREA'] = $arProperty['value'];
    break;
    case 'ОсновноеИзображение':
    $tempArr['DETAIL_PICTURE'] = CFile::MakeFileArray($work_dir.'/'.$arProperty['value']);
    case 'ID':
    $tempArr['XML_ID'] = $arProperty['value'];
    $CUR_REF = $arProperty['value'];
    break;
    case 'Описание':
    $tempArr['DETAIL_TEXT'] = $arProperty['value'];
    break;
    case 'Цена':
    $tempArr['PRICE'] = $arProperty['value'];
    break;

    }
    }
    if ($arPrices[$CUR_REF]['Price']['value']) {
    $tempArr['PRICE'] = $arPrices[$CUR_REF]['Price']['value'];
    }
    if ($arPrices[$CUR_REF]['Status']['value']) {
    $tempArr['STATUS'] = $arPrices[$CUR_REF]['Status']['value'];
    }

    if (!empty($CUR_REF)) {
    $arRes['ITEMS'][$CUR_REF] = $tempArr;
    }
    }

    // self::saveTodoFile($arRes['ITEMS']);// Не используется

    // return $arRes;
    self::log('BEFORE END parseXML: return self::addItems($arRes[\'ITEMS\']');
    return self::addItems($arRes['ITEMS']);
    }
  • Как найти скрипт импорта в iblock для 1с.битрикс?

    @pingvin156 Автор вопроса
    Vitaly Musin, нет. Там только картинки и файл выгрузки MessageFor_30000000385.xml. Здесь какая-то кастомная выгрузка, похоже...