Задать вопрос
  • Как закодировать строку в Unicode последовательность?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если Вы уверены что на входе будут только a-zA-Z0-9-=+- (похоже на base64) то можно упростить и не перекодировать, например так:

    $uncomingString = 'W+I4zLZyeJDAhQMe33tYRcXC+Falj9baMfjJw5yOijaPNHDYcnNlRlTGm3rvA6cn2hXMmW4ZKEyTphwzNMQlOlnNiCHK2LLpJLgXK6JHKuTYeParwqCud5Vn2dZXpxctrQf8OkbCqF12u0GcBR2or2HFBrEV13Jd5YAX4bRbUBk=';
    
    
    function forceUnicode( $str = '' )
    {
    	$result = '';
    
    	for( $i=0,$length=strlen($str); $i<$length; $i++)
    	{
    		$result .= "\\u".str_pad(bin2hex($str[$i]), 4, '0', STR_PAD_LEFT);
    	}
    
    	return $result;
    }
    
    echo forceUnicode($uncomingString);
    
    /*
    Выведет: 
    \u0057\u002b\u0049\u0034\u007a\u004c\u005a\u0079\u0065\u004a\u0044\u0041\u0068\u0051\u004d\u0065\u0033\u0033\u0074\u0059\u0052\u0063\u0058\u0043\u002b\u0046\u0061\u006c\u006a\u0039\u0062\u0061\u004d\u0066\u006a\u004a\u0077\u0035\u0079\u004f\u0069\u006a\u0061\u0050\u004e\u0048\u0044\u0059\u0063\u006e\u004e\u006c\u0052\u006c\u0054\u0047\u006d\u0033\u0072\u0076\u0041\u0036\u0063\u006e\u0032\u0068\u0058\u004d\u006d\u0057\u0034\u005a\u004b\u0045\u0079\u0054\u0070\u0068\u0077\u007a\u004e\u004d\u0051\u006c\u004f\u006c\u006e\u004e\u0069\u0043\u0048\u004b\u0032\u004c\u004c\u0070\u004a\u004c\u0067\u0058\u004b\u0036\u004a\u0048\u004b\u0075\u0054\u0059\u0065\u0050\u0061\u0072\u0077\u0071\u0043\u0075\u0064\u0035\u0056\u006e\u0032\u0064\u005a\u0058\u0070\u0078\u0063\u0074\u0072\u0051\u0066\u0038\u004f\u006b\u0062\u0043\u0071\u0046\u0031\u0032\u0075\u0030\u0047\u0063\u0042\u0052\u0032\u006f\u0072\u0032\u0048\u0046\u0042\u0072\u0045\u0056\u0031\u0033\u004a\u0064\u0035\u0059\u0041\u0058\u0034\u0062\u0052\u0062\u0055\u0042\u006b\u003d
    */


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

    gromdron
    @gromdron
    Работаю с Bitrix24
    Расширение административного раздела доступно не во всех случаях.

    Например, можно разработать собственные страницы для админки и на события обработки меню заменить их на свои. Или вы можете работать через JS (а в некоторых случаях и php) расширяя какие-то страницы через события, например OnAdminListDisplay.
    Есть и легальные хаки - например кастомизация заказа в админке.
    Ответ написан
    Комментировать
  • Как исправить фильтр?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Замените
    if (isset($brand)){
    На
    if ( !empty($brand) ) {
    И еще:
    $query = "SELECT * FROM products WHERE brand =  '".$_POST["category"]."' ";

    Почитайте про SQL Injection
    Ответ написан
    Комментировать
  • Почему не удается получить ответ от сервера soap wsdl php Curl?

    gromdron
    @gromdron
    Работаю с Bitrix24
    А зачем Вы вручную это делаете?
    Начнем с того, что в php есть расширение php-soap, которому только скормить адрес wsdl и вызывать уже готовые методы.

    В крайнем случае, можно воспользоваться готовой библиотекой nusoap
    Ответ написан
    Комментировать
  • Где и как лучше всего хранить актуальные БД для проектов?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Очень интересный и животрепещущий вопрос в мире Битрикса :)
    Дело в том, что пока увы нормально никто так и не научился работать с системами контроля версий в Битриксе).

    Традиционно не так много решений:
    1) "Миграции для разработчиков" от Рябина Андрей marketplace.1c-bitrix.ru/solutions/sprint.migration

    2) Migrato от Интерволги https://github.com/intervolga/intervolga.migrato пост в поддержку https://www.intervolga.ru/blog/projects/bitrix-dat...

    3) Прочие кастомные автоматизированные решения миграций (например скрипт который после коммита запускает какое-то свое ПО)

    4) Традиционный подход "ручками" (когда каждый записывает какие изменения внес и при переносе их все повторяют)

    Увы, как мы не бились, с Битрикс24 пока не удалось ничего подружить - то отваливаются crm-статусы, то БП не отрабатывают (все-таки там тоже могут быть и параметры и константы и код), поэтому у нас работает подхо 3+4 (плохо, но что делать)
    Ответ написан
    Комментировать
  • Как убрать фильтр по цене в каталоге битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Вырезав в коде.
    Насколько я помню, единственный параметр который нельзя убрать - это ползунок цены.
    Ответ написан
    Комментировать
  • 500 ошибка при симлинках?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Проблема НЕ в Битриксе, а в настройках php Вашего веб-сервера.
    Конкретнее Вам запрещено открывать в open_basedir другую директорию.

    Можно попытаться установить значение open_basedir в none, но так как у Вас нетиповая конфигруация (вижу по путям что не Bitrix Env), то наилучшим способом будет обратиться к Вашему системному администратору / хостеру.
    Ответ написан
  • Получить значения чекбоксов из базы данных?

    gromdron
    @gromdron
    Работаю с Bitrix24
    А что Вы хотите? Вы же его явно затираете в строке:
    $data[$row['question_id']] = $row['answer_id'] ;
    Запихивайте массив:
    $data[$row['question_id']][] = $row['answer_id'] ;

    При складывании 1к1 (1 вопрос = 1 ответ) - Ваша структура подойдет, а при 1 вопрос => много ответов уже нет.
    Ответ написан
    Комментировать
  • $_POST принимает NULL при AJAX запросе и мешает использовать PDO, как исправить?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если Вы НЕ отметили ни одного чек-бокса, то Вам ничего и не прилетит.
    Т.е. если отправить форму из моего примера, в $_POST будет:
    array(2) {
      ["a"]=>
      string(1) "0"
      ["b"]=>
      string(1) "5"
    }

    Т.е. никакого day у Вас и нет.
    Я так понимаю, Вы делаете вывод данных на основе значения этого day. А значит ничего не и должно вывестись.

    То есть, Ваш код сведется к:
    $result = [];
    
    $a = (int) $_POST['a'];
    $b = (int) $_POST['b'];
    
    $c = array_filter( (array) $_POST['day'] );
    
    if ( !empty($c) )
    {
    	$c = implode(',', $_POST['day']);
    	$in = str_repeat('?,', count($c) - 1) . '?';
    	$sql = "SELECT * FROM table WHERE day IN ($in) ASC LIMIT :a, :b";
    	$stmt = $pdo->prepare($sql);
    	$stmt->execute($с, [$a, $b]);
    	$data = $stmt->fetchAll();
    
    	$result = $data;
    }
    
    echo json_encode($result);


    P.S. А так ли Вам нужна именно ручная сборка значений? Почему бы не вынести в саму форму?

    <form id="filter">
    	<input type='hidden' name='a' value='0' />
    	<input type='hidden' name='b' value='5' />
    	<input type="checkbox" name="day[]" value="1"> 
    	<input type="checkbox" name="day[]" value="2">
    	<input type="checkbox" name="day[]" value="3"> 
    </form>


    $.ajax({
        url: 'index.php',
        method: 'POST',
        data: $("#filter").serialize()
    });
    Ответ написан
    1 комментарий
  • Перестала работать авторизация через соц.сети на 1C-Bitrix. Что делать?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Как не парадоксально звучит, но нужно обновиться.
    Дело в том, что Вконтакте и Facebook в одностороннем порядке изменяют свое API. Например FB изменил протокол, а VK теперь явно требует указывать номер версии.

    Авторизация ВК исправлена в версии 17.5.4 (обновления будет достаточно)
    Авторизация FB исправлена в версии 17.5.3 (помимо обновления, нужно еще и настройки в кабинете разработчика Facebook изменить)
    Ответ написан
    1 комментарий
  • Интерактивная карта на js?

    gromdron
    @gromdron
    Работаю с Bitrix24
    В приведенном Вами примере используется Raphaël. В принципе, при наличии знаний и опыта, не составит труда собрать ее на любой библиотеке.

    Но наиболее простым будет использование одного из существующих библиотек:
    Ответ написан
    Комментировать
  • Как менять SEO - данные в зависимости от города?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Это очень интересная задача.
    Как и Никита, мы объявили маркер #CITY_NAME# (ну не прямо объявили, но договорились, что это значение нужно менять на название города пользователя в именительном падеже).
    Далее изменили тексты всех необходимых частей. Затем на событии OnEpilog мы заменяли данный маркер на город.
    Для отложенных функций (например CMain::SetTitle)
    следуя порядку выполнения страницы на том же события переопределяли их значения.

    Ну конечно же не стоит забывать об административной панеле: для них отложенные функции тоже работают, поэтому радуемся константе ADMIN_SECTION, которая true в админке.
    Ответ написан
    5 комментариев
  • Как переопределить заголовок раздела инфоблока в компоненте?

    gromdron
    @gromdron
    Работаю с Bitrix24
    CMain::SetTitle работает по технологии отложенных функций, а это значит что следуя порядку выполнения страницы на событии OnEpilog можно перехватить значение и добавить город или изменить информацию.
    Но помните, событие работает и в административной панеле, так что если не хотите добавлять название и в административной панеле, воспользуйтесь константой ADMIN_SECTION.
    Ответ написан
    Комментировать
  • Как отдельно выдернуть поля из формы, типа обратной связи на сайте Bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Вариантов масса - Выделить это все в компонент или например создать включаемую область и уже ее вывести. Ну или у Вас это уже есть и Вам нужно просто отредактировать страницу.

    Или я не совсем понял вопроса и Вы хотите чтобы кто-то бесплатно это сделал за Вас?
    Ответ написан
    Комментировать
  • Не могу понять почему не работает var_dump?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Меняем:
    if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['edit'])) {
        $editServiceById = $services->editServiceById($_GET['service_id'], $_POST);
    }


    На:
    // Display errors 
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
    // Log values
    echo "<pre>";
    var_dump($_SERVER['REQUEST_METHOD'], $_POST['edit'], isset($_POST['edit']));
    echo "</pre>";
    
    if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['edit'])) {
        $editServiceById = $services->editServiceById($_GET['service_id'], $_POST);
    }


    Повторяем отправку формы и смотрим что и куда не ушло. А дальше учимся дебажить банальные вещи.

    P.S. leni_m - сполерит :P
    Ответ написан
    Комментировать
  • Как объединить три массива?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Как вариант, еще один:

    /**
     * Prepare array for our job
     */
    $arrayOne = [
    	0 => 80,
    	1 => 80,
    	2 => 90,
    ];
    
    $arrayTwo = [
    	0 => [
    		0 => 190,
    		1 => 195,
    	],
    	1 => [
    		0 => 200,
    	],
    	2 => [
    		0 => 190,
    		1 => 195,
    	],
    ];
    
    $arrayThree = [
    	0 => 1,
    	1 => 2,
    	2 => 3,
    ];
    
    /**
     * @var array Array with actual data in our structure
     */
    $arResult = [];
    
    foreach ( $arrayTwo as $iKeyOne => $arrayTwoElement )
    {
    	// if in second array exist unknown key
    	if ( !array_key_exists($iKeyOne, $arrayOne) )
    	{
    		continue;
    	}
    
    	// if in third array exist unknown key
    	if ( !array_key_exists($iKeyOne, $arrayThree) )
    	{
    		continue;
    	}
    
    	// if in second array no elements
    	if ( empty($arrayTwoElement) || !is_array($arrayTwoElement) )
    	{
    		continue;
    	}
    
    	/* @var integer Key for first depth level  */
    	$iLevelKey = (int) $arrayOne[ $iKeyOne ];
    
    	/* @var integer Value for second depth level */
    	$iLevelValue = (int) $arrayThree[ $iKeyOne ];
    
    	foreach ($arrayTwoElement as $k => $v)
    	{
    		$arResult[ $iLevelKey ][ $v ] = $iLevelValue;
    	}
    }
    
    var_dump($arResult);
    /*
    Will display:
    array(2) {
      [80]=>
      array(3) {
        [190]=> int(1)
        [195]=> int(1)
        [200]=> int(2)
      }
      [90]=>
      array(2) {
        [190]=> int(3)
        [195]=> int(3)
      }
    }
    */
    Ответ написан
    Комментировать
  • Как реализовать SSO (единый вход) на Laravel?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Есть такая штука, называется ADFS - на Windows Server поднимается соответствующая роль и открывается OpenID / OAuth авторизация.

    Ну а дальше, по принципам что и соц.сети :)
    Ответ написан
    Комментировать
  • Как сделать поиск по свойствам раздела (UF) типа "Файл"?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Из коробки Ваша задача не решается - в поисковой индекс попадают только определенные поля самого элемента (например текст анонса, текст полной новости) и значения(!) пользовательских полей.
    Для поля типа файл, значение пользовательского поля не название, а содержимое (и то, если соответствующий дескриптор для открытия файла найден).

    Но Вашу задачу можно решить технически:

    1) На событиях перед добавлением/изменением элемента инфоблока в SEARCH_CONTENT можно дописывать название файла
    2) Затем подписаться на события индексации и добавлять соответствующие значения в поиск.
    Как пример, можно ознакомиться с https://dev.1c-bitrix.ru/community/blogs/oracle/26...

    Еще например, можно разработать отдельную страницу для более оптимального поиска (на последней конференции Вадим Думбравану чуть больше часа рассказывал про полнотекстовый поиск в своих разработках)
    Ответ написан
    Комментировать
  • Не сохраняются изменения в SEO bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Что делать?

    Пересматривать ЧПУ и структуру разделов. Как вариант - задать везде нужные уровни, т.е. взять вышестоящую маску и у всех дочерних разделов следующего уровня проставить их в соответствии маске.

    Во вкладке SEO, когда меняю пункты META и оставляю галочку на "Изменить для этого раздела и его подразделов", то изменения сохраняются, но они еще сохраняются в подразделов. Мне этого не надо, потому что у каждого подраздела будут свои МЕТА пункты.

    По-умолчанию, SEO-элементы наследуются от родителя.
    Т.е. если у вас структура - 1 - 2 - 3 и вы задали ее у 1, то у 2 и 3 она будет одинаковая, как и у первого уровня.
    Если затем Вы изменили значение для пункта 2, то и у 3 пункт изменится на значение 2.
    Ответ написан
    Комментировать
  • Как правильно создать фасетный велосипед?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Ваше решение вполне имеет место быть, а грабли будут те же самые, что и в Битриксе - перестроение кеша.
    Например у Вас добавилось поле, а это значит, что Вам нужно перестраивать кеш (т.е. удалять и заново строить), а на работающем сайте это занимает прилично времени.
    К тому же, для ускорения Вам придется либо исключить некоторые поля, либо дублировать записи из множественных списков, но с этим частично может помочь разгрузка базы.

    На ум приходят две мысли:
    - при mysql 5.7+ можно проверить как поведет себя json поля (чтобы не пересобирать каждый раз схему, а просто переписывать значения)
    - попробовать вынести куда-нибудь на mongodb это решение (дописывать поля там, не пересобирая).

    Но в целом, Ваш вариант вполне подходит (за исключением того, что вариант с перестроением кеша нужно все-таки проработать).
    Ответ написан
    Комментировать