• Как задать сортировку в catalog.section.list по id в прямом или обратном порядке?

    gromdron
    @gromdron
    Работаю с Bitrix24
    $arSort - это ассоциативный массив, для сортировки значения, в формате "Код поля" => "Порядок".
    Причем порядок может быть только ASC (по возрастанию) или DESC (по убыванию)
    В Вашем случае должно быть так:

    $arSort = array(
    	"LEFT_MARGIN" => "ASC",
    );
    Ответ написан
    Комментировать
  • Как получить количество элементов?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Во-первых, прекратите совокуплять мертвецов. Для каждой задачи есть отдельный инструмент, со строго определенными канонами. То что вы делаете в result_modifier.php делается через расширение меню и компонент bitrix:menu.sections.

    Во-вторых, количество активных элементов получается через доп. операции внутри итерирования. См. справочную литературу: coder-diary.ru/programming/bitrix-kolichestvo-akti...
    Ответ написан
  • Групповая смена ответственного из сделки в контакте и компании в CRM Битрикс, коробочная версия?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Вы правильно нашли, за это отвечает компонент bitrix:crm.deal.list, который лежит в /bitrix/components/bitrix/crm.deal.list/component.php.
    Код несколько запутанный, но работает следующим образом:

    На ~614 сроке ( ~ 614 - 679 ) находится код, который парсит полученные данные и собирает их в массив $actionData
    //region Try to extract user action data
    // We have to extract them before call of CGridOptions::GetFilter() or the custom filter will be corrupted.
    $actionData = array(
    	'METHOD' => $_SERVER['REQUEST_METHOD'],
    	'ACTIVE' => false
    );
    
    if(check_bitrix_sessid())
    {
    	$postAction = 'action_button_'.$arResult['GRID_ID'];
    	$getAction = 'action_'.$arResult['GRID_ID'];
    	//We need to check grid 'controls'
    	$controls = isset($_POST['controls']) && is_array($_POST['controls']) ? $_POST['controls'] : array();
    	if ($actionData['METHOD'] == 'POST' && (isset($controls[$postAction]) || isset($_POST[$postAction])))
    	{
    		CUtil::JSPostUnescape();
    
    		$actionData['ACTIVE'] = true;
    
    		if(isset($controls[$postAction]))
    		{
    			$actionData['NAME'] = $controls[$postAction];
    		}
    		else
    		{
    			$actionData['NAME'] = $_POST[$postAction];
    			unset($_POST[$postAction], $_REQUEST[$postAction]);
    		}
    	...
    	...
    	...
    		$actionData['AJAX_CALL'] = $arResult['IS_AJAX_CALL'];
    	}
    }
    //endregion


    А с ~915 строки начинается непосредственная обработка ( ~915 - 1457):

    // POST & GET actions processing -->
    if($actionData['ACTIVE'])
    {
    	if ($actionData['METHOD'] == 'POST')
    	{
    		if($actionData['NAME'] == 'delete')
    		{
    		...
    		elseif($actionData['NAME'] == 'assign_to')
    		{
    			if(isset($actionData['ASSIGNED_BY_ID']))
    			{
    				$arIDs = array();
    				if ($actionData['ALL_ROWS'])
    				{
    					$arActionFilter = $arFilter;
    					$arActionFilter['CHECK_PERMISSIONS'] = 'N'; // Ignore 'WRITE' permission - we will check it before update.
    					$dbRes = CCrmDeal::GetListEx(array(), $arActionFilter, false, false, array('ID'));
    					while($arDeal = $dbRes->Fetch())
    					{
    						$arIDs[] = $arDeal['ID'];
    					}
    				}
    				elseif (isset($actionData['ID']) && is_array($actionData['ID']))
    				{
    					$arIDs = $actionData['ID'];
    				}
    
    				foreach($arIDs as $ID)
    				{
    					if (!CCrmDeal::CheckUpdatePermission($ID, $userPermissions))
    					{
    						continue;
    					}
    
    					$DB->StartTransaction();
    
    					$arUpdateData = array(
    						'ASSIGNED_BY_ID' => $actionData['ASSIGNED_BY_ID']
    					);
    
    					if($CCrmDeal->Update($ID, $arUpdateData, true, true, array('DISABLE_USER_FIELD_CHECK' => true)))
    					{
    						$DB->Commit();
    
    						$arErrors = array();
    						CCrmBizProcHelper::AutoStartWorkflows(
    							CCrmOwnerType::Deal,
    							$ID,
    							CCrmBizProcEventType::Edit,
    							$arErrors
    						);
    					}
    					else
    					{
    						$DB->Rollback();
    					}
    				}
    			}
    		}
    		...
    	}
    }
    // <-- POST & GET actions processing


    Но есть маленький нюанс, если Вам нужно менять ответственного в связанных сущностях, кастомизация данного кода будет не лучшим решением.
    В таком случае у Вас будет задвоение, например ответственного можно поменять через массовую смену ответственного в списке, через редактирование сделки, через блок действия бизнес-процесса и так далее. И все это разные механизмы. Общее у них только одно - они все используют события на изменения/добавление.
    Ответ написан
  • В какой кодировке возвращать данные при ajax запросе?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Так как JSON кодируется символами Юникода, то наилучшим вариантом является UTF-8 кодировка.
    Как практикующий разработчик на 1С-Битрикс строго рекомендую Вам переводить проекты на UTF-8.

    P.S. У вас неймпсейс
    use Bitrix\TestPartner\TestPartnerModule\TestPartnerModuleListTable;

    А должен быть:
    use TestPartner\TestPartnerModule\TestPartnerModuleListTable;

    Так как Вы не Bitrix и не нужно никого вводить в заблуждение :)
    Ответ написан
    Комментировать
  • Как вывести товары, если нет категорий?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Все круто, но куда он должен их вывести? У каталога есть иерархия Список разделов -> уточнение(*) -> Список элементов.
    Когда я последний раз с ним работал, он не умел выводить mixed content (когда и разделы и элементы выводились вместе).

    Но вы можете использовать не комплексный компонент, а отдельно catalog.section и выводить там
    Ответ написан
    Комментировать
  • Как массово загрузить и вставить на страницу много файлов?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Можно ли это сделать встроенными средствами битрикса?


    Относительно. Вы можете использовать инфоблок и news.list для вывода с доп. свойством, но это не будет лучшим решением.

    Может есть готовые дополнения?


    Это нишевая задача и вряд ли есть готовые решения.

    Что касается исходной задачи, то есть масса способов это сделать:
    1) Положить в папку и выводить простым скриптом (в лоб, но может быть долго и из админки не поправить)
    2) Загрузить из в битрикс и доставать через CFile - уже лучше, но если их много, может не выдержать сервер и браузер
    3) Разработать свое решение.
    Ответ написан
    Комментировать
  • Как написать такое регулярное выражение?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Немножечко быдло-регулярка, но результат кода:

    /* @var string Регулярное выражение для проверки */
    $regex = '#^http(s?):\/\/domain\.com\/?(index\.html|test\.html)?$#';
    
    /* @var array Проверяемые варианты */
    $arVariant = [
    	'http://domain.com',
    	'https://domain.com',
    	'http://domain.com/',
    	'https://domain.com/',
    	'http://domain.com/index.html',
    	'https://domain.com/index.html',
    	'http://domain.com/test.html',
    	'https://domain.com/test.html',
    	'http://domain.com/blabla.html',
    	'https://domain.com/blabla.html',
    	'https://domain.com/test.html?page=1',
    ];
    
    foreach( $arVariant as $variant )
    {
    	if ( preg_match($regex, $variant) )
    	{
    		echo "Ссылка '{$variant}' не прошла валидацию".PHP_EOL;
    	}
    }


    Следующий:

    Ссылка 'http://domain.com' не прошла валидацию
    Ссылка 'https://domain.com' не прошла валидацию
    Ссылка 'http://domain.com/' не прошла валидацию
    Ссылка 'https://domain.com/' не прошла валидацию
    Ссылка 'http://domain.com/index.html' не прошла валидацию
    Ссылка 'https://domain.com/index.html' не прошла валидацию
    Ссылка 'http://domain.com/test.html' не прошла валидацию
    Ссылка 'https://domain.com/test.html' не прошла валидацию
    Ответ написан
    Комментировать
  • Почему PHP вместо скрипта запускает интерактивную консоль?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Только что провел данный эксперимент - результат - отработало.
    Единственное - моя комманда отличается от Вашей.

    1) Я не стал вводить path, я указал рабочую директорию (при создании задачи вы можете это сделать)
    2) Я указал явно какую программу использовать

    У меня получилось:

    1) Название программы: php.exe
    2) Переданные параметры: "E:\test\test.php"
    3) Рабочая папка E:\PHP-7\

    Открыл список задач, нашел нужную задачу, посмотрел на вкладке "Действия" комманду которая выполняется ( у меня вывело 'php.exe "E:\test\test.php"' )
    Комманда отрабатала прекрасно.

    P.S. просто так ничего не бывает - кто и что делал? Возможно задача зависла и новая не запустилась, потому как старая не закончилась
    Ответ написан
  • Битрикс CRM Получить ID контакта?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Есть как минимум 2 варианта (без прямых запросов в базу) как это сделать:

    1) Высокоуровневый (работает всегда). Метод с поддержкой обратной совместимости: CCrmContact::GetList (bxapi.ru/src/?id=183244)

    Применение (за основу взял код описанный Артем):

    /* @var array Список контактов */
    $arContacts = array();
    
    if ( \Bitrix\Main\Loader::IncludeModule('crm') )
    {
    	/* @var array Сортировка полученного списка контактов */
    	$arOrder  = array('ID' => 'DESC');
    
    	/* @var array Условия получаемого списка контактов */
    	$arFilter = array(
    		"NAME"      => "Имя",
    		"LAST_NAME" => "Фамилия",
    		'CHECK_PERMISSIONS' => 'N' // Данный ключ необходим для того чтобы получить всех пользоватей,
    								   // иначе, будет найден только если ответственным за него является тот,
    								   // под кем запускается скрипт в битриксе
    	);
    
    	/* @var array Получаемые поля для списка контактов */
    	$arSelect = array(
    		'ID'
    	);
    
    	// NOTE: Запрашивайте только необходимые поля
    	$res = CCrmContact::GetList( $arOrder, $arFilter, $arSelect );
    
    	while( $arContact = $res->fetch() )
    	{
    		$arContacts[ $arContact['ID'] ] = $arContact['ID'];
    	}
    }
    
    // Тут в $arContacts либо пустой массив, либо массив с ID контактами, которые соответствуют условию поиска


    2) Низкоуровневый DataMapper (новый подход d7)

    use \Bitrix\Main\Loader;
    use \Bitrix\Crm;
    
    /* @var array Список контактов */
    $arContacts = array();
    
    if ( Loader::IncludeModule('crm') )
    {
    
    	$resContacts = Crm\ContactTable::getList(array(
    		'select' => array('ID'),
    		'filter' => array(
    			"NAME"      => "Имя",
    			"LAST_NAME" => "Фамилия",
    		),
    		'order' => array('ID' => 'DESC')
    	));
    
    	while( $arContact = $resContacts->fetch() )
    	{
    		$arContacts[ $arContact['ID'] ] = $arContact['ID'];
    	}
    
    	/*
    	Начиная с 17 версии (вроде бы), можно делать так:
    	foreach( $resContacts as $arContact)
    	{
    		$arContacts[ $arContact['ID'] ] = $arContact['ID'];
    	}
    	вместо while цикла
    	*/
    }


    Преимущество первого подхода:
    - Работает всегда, как для новых, так и для старых проектов
    - Можно использовать уровни доступа

    Преимущество нового подхода:
    - Технологически универсален за счет d7 (можно в runtime прибавлять связи, доставать связанные сущности и т.п.)
    - В DataMapper есть технология кеширования, т.е. можно закешировать результат просто добавив в массив getList еще один ключик
    - Субъективно код легче воспринимается
    Ответ написан
    3 комментария
  • Как при создании таблицы поставить полю значение null?

    gromdron
    @gromdron
    Работаю с Bitrix24
    За создание таблицы в MySQL отвечает метод MysqlCommonConnection::createTable(), где в не зависимости от ситуации включается - NOT NULL
    Ответ написан
    2 комментария
  • Как сделать так чтобы бала активная ссылка?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Я так понял, у вас есть какое-то меню, например:

    /top/index.php
    /root/index.php
    /test/index.php

    И в /root/ есть пункт меню (вложенного) меню, в котором есть ссылка на /catalog/index.php
    И вы хотите, чтобы при заходе на /catalog/index.php пункт меню /root/index.php выделялся??

    Если да, то в 3 параметр меню у /root/index.php укажите ссылку /catalog/index.php

    См. комментарий Пётр Невенчанный
    https://dev.1c-bitrix.ru/api_help/main/reference/c...
    Ответ написан
    Комментировать
  • Curl php + прокси не работает?

    gromdron
    @gromdron
    Работаю с Bitrix24
    А все ли вы правильно делаете? Почему у вас CURLOPT_PROXY аж 2 штуки?
    Посмотрите на примеры: https://stackoverflow.com/questions/5211887/how-to...
    Возможно он с паролем
    Ответ написан
    Комментировать
  • Как войти на сайт через CURL с CSRF токеном?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если сайт построен не на js клиент-фреймворке, то делайте 2 хита:

    Шаг 1 - заходите на страницу, собираете csrf запрос, cookie
    Шаг 2 - отправляете данные своей авторизации
    Ответ написан
    6 комментариев
  • Где битрикс хранит данные из корзины?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Содержимое корзины Битрикс записывает в базу данных, но напрямую доставать из нее не советую - лучше используйте API.

    Если интересует прямо таблица с товарами, то b_sale_basket и b_sale_basket_props. Они вяжутся в sale_user из таблицы b_sale_fuser
    Ответ написан
  • Как найти ошибку в битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Наилучшим решением служит обращение в техническую поддержку Битрикса, но только после того как перенесете/развернете сайт штатными средствами битрикса.
    Ответ написан
    1 комментарий
  • PHP скрипт не авторизируется, какие параметры передавать?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Для того чтобы провести авторизацию необходимо сделать следующее:

    1) Скачать страницу.
    1.1) Нужно получить COOKIE, которые вернутся со страницей
    1.2) Достать ВСЕ поля из формы (там передаются еще 2 доп. параметра, которых у тебя нет)
    2) Отправить запрос с COOKIE, параметрами из п.1.2 на url авторизации (на ту же страницу с которой производил загрузку)
    Ответ написан
  • Работа с Closure в php?

    gromdron
    @gromdron
    Работаю с Bitrix24
    А вы точно ничего не перепутали?
    Рекомендую ознакомиться со статьей: https://habrahabr.ru/post/147620/
    Ответ написан
    Комментировать
  • Вытащить данные из массива без цикла?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Снизу передать переменную наверх нельзя.
    В Битриксе этот механизм называется "Отложенные функции" (погуглите на эту тему, там много чего расскажут).

    Делается это так:

    // Готовим значение titile по-умолчанию
    $title = '';
    
    // Начинаем буферизация
    ob_start();
    echo "<html><head><title>#title#</title></head>";
    
    // получаем статьи
    $articles = Model::GetArticles();
    
    $iSetTitle = false;
    foreach($articles as $v)
    {
    	if ( ! $iSetTitle ) 
    	{
    		$title = $v['title'];
    		$iSetTitle = true;
    	}
    	echo '<div class="title"><p><?=$v["title"]; ?></p></div>';
    	// вывод контента
    }
    
    $page = ob_get_clean();
    echo str_replace('#title#',$title, $page);


    Получается вы итерируетесь 1 раз и вытаскиваете все что нужно, но Вам нужно переделывать структуру Вашего приложения.
    Ответ написан