Задать вопрос
  • Битрикс 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 раз и вытаскиваете все что нужно, но Вам нужно переделывать структуру Вашего приложения.
    Ответ написан
  • Как сделать несколько возращаемых типов?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Есть 3 способа решения Вашего вопроса:

    1) Топрный: Не использовать указание возвращаемого типа функции
    2) Костыльный: Сделать класс обертку на PartnersPhotoModel, который могла бы возвращать пустой объект данного класса
    3) Прямой: при вызове $this->findOne($criteria); проверять есть ли значение, и в случае его отсутствия бросать исключение
    Ответ написан
    Комментировать
  • Каким способом изучать API Битрикса?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Добрый день,

    Давайте начнем с того, что названия переменных значения не играют. Т.е. Вы можете поменять в коде местами $arSelect и $arFilter и результат от этого не изменится (если Вы все сделали правильно). Что касается их названий - они помогают лично Вам понять что в них находятся и работают по принципу венгерской нотации, с типами и camelCase. То есть в переменной $arFilter находится массив полей, по которому производится фильтрация, а в $arSelect - массив полей, который нужно получить.

    Что касается документации - вранье, она обширная и разжевана до мелочей. Если Вы хотите получить план по развитию, то:
    1) Пройдите всю цепочку битрикса от "Контент-менеджера" до "Администратора" (все 3) и поймите как это работает в админке
    2) Пройдите курс Bitrix Framework и поймите как с этим работать с точки зрения разработчика
    3) Активно читайте справочную литературу - https://dev.1c-bitrix.ru/api_help/ и https://dev.1c-bitrix.ru/api_d7/
    4) Смотрите на официальные курсы по битриксу https://academy.1c-bitrix.ru/training/course/
    5) Сдавайте официальные экзамены (там примеры заданий и четкие решения) https://academy.1c-bitrix.ru/certification/exams.php

    Я Вас уверяю, при сдаче и первого и второго экзамена, Вы уже будете понимать все что нужно для уровня Junior-Middle
    Ответ написан
    6 комментариев
  • Битрикс CRM Где находиться форма смена ответственного из сделки?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Вам не нужно для этого изменять внешний вид сделки и crm.entity.quickpanelview Вам тоже трогать не нужно.

    Вы должны подписаться на событие OnAfterCrmDealUpdate и уже в нем инициировать поиск и смену ответственных у привязанных вещей. Так же если вы хотите, чтобы при смене ответственного за компанию менялись ответственные за сделки, нужно подписаться и на событие OnAfterCrmCompanyUpdate.

    P.S. Я как практикующий Битрикс24 разработчик, могу с уверенностью сказать, что из-за решения которое Вы хотели реализовать (через crm.entity.quickpanelview) битрикс и не любят. Т.е. кто-то кастомит компонент, а другим потом разбираться.
    Ответ написан
    2 комментария
  • Как сделать безопасный запрос к БД?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Смотря что именно Вы хотите сделать.
    Если Вас интересует как правильно это делать, то смотрите сообщение от Ильдар Гизетдинов, там подробно описано
    Если Вас интересует как исправить Ваш запрос, то перед вставкой значений в запрос, нужно использовать метод ForSql()
    Ответ написан
    Комментировать
  • Как узнать правильное время выполнения php скрипта?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Правильно ли я понимаю, что Вы хотите узнать все время, которое прошло с момента получения веб-серверов/веб-прокси запроса, до момента его выдачи клиенту?
    Если да, то это можно настроить в Apache и Nginx - в access_log будут не просто указаны запросы, но и время, которое потребовалось на их обработку и php тут не причем.

    Если смотреть на Selenium-тест, то на него еще и скорость соединения с интернетом будет играть роль. А если вы будете еще и dom load событие ждать, то еще и сервер selenium (время обработки страницы, загрузки доп. ресурсов и т.п.)
    Ответ написан
    Комментировать
  • Urlrewrite битрикс. Как написать правило исключающее из url символьный код элемента?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если Вы действительно хотите реализовать подобное (и если я вас правильно понял), то Вам нужно будет сделать не только это.

    Шаг 1.
    1) Создайте страницу /catalog/index.php, на этой странице выведите $_REQUEST
    2) Создайте правило (взял из примера выше, у пользователя Артём Лучников )

    array(
        "CONDITION" => "#^/([a-zA-Z0-9_-]*)/catalog/.*#",
        "RULE" => "city_code=\$1",
        "PATH" => "/catalog/index.php",
    )


    3) Проверьте, что при заходе, например на /moscow/catalog/, открывается страница и в выведенном массиве есть city_code=moscow

    Шаг 2.
    1) Скопируйте в свое пространство компонент catalog (комплексный) [например custom:catalog], вынесите его на страницу /catalog/index.php
    2) Добавьте в component.php еще одну разделяемую переменную в arComponentVariables - назовите ее, например CITY_CODE, напишите обработчики в тело комплексного компонента, которые будут "переваривать" введенный текст и будут перенаправлять на нужные страницы. В шаблоне sections.php сделайте вывод $_REQUEST
    3) Проверьте, что при заходе, например на /moscow/catalog/, открывается страница и в выведенном массиве есть city_code=moscow

    Шаг 3.
    1) В вынесенном компоненте (из примера выше это custom:catalog), сделайте обработчик указанной переменной city_code, которая и определяет, есть ли указанный город в инфоблоке
    2) Проверьте что все работает корректно

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

    gromdron
    @gromdron
    Работаю с Bitrix24
    Для технической реализации стартапа у Вас есть 2 пути:
    1) Найти партнера/сотрудника (далее компаньон) для разработки технической части проекта
    2) Самому разобраться в технической части проекта

    Оба подхода хоть и оттакливаются от одного и того же минимального набора знаний, но являются противоположными.
    Если Вы ищите компаньона, то Вы должны в первую очередь быть в нем уверены, потому что ПОЧТИ ВСЮ техническую часть Вы отдадите ему. Ваша задача - идеи, маркетинг, бизнес и т.п. Вы обсуждаете с ним чего хотите, а у него уже болит голова как это сделать чтобы всем было хорошо
    Если Вы хотите все контролировать, то увы, но Вам придется разобраться во многих тонкостях работы IT-специалиста (языки программирования, технологии, базы данных и т.п.)

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

    gromdron
    @gromdron
    Работаю с Bitrix24
    Я бы порекомендовал бы Вам литературку для расширения кругозора: https://www.arbinada.com/node/25
    Особое внимание обратить на "Маршрут обхода".

    Что касается Вашего вопроса то зависит от того как нужно получить результат - плоско или объемно.
    Для простоты, предположим мы хотим получить результат плоским

    <?php
    
    /* @var array[] Плоский массив вложенных нод */
    $arTree = [];
    
    collectTree( 3, $arTree );
    
    /*
    Если сделать var_dump($arTree);
    Мы рассчитываем получить следующий массив:
    
    array
    {
    	{
    		id: 3
    		title: Cat3
    		slug: cat3	
    		parent: 0
    	},
    	{
    		id: 6
    		title: lodki
    		slug: lodki	
    		parent: 3
    	},
    	{
    		id: 7
    		title: Samolety
    		slug: lodki	
    		parent: 6
    	}
    }
    
    */
    
    function collectTree( $iRootId, $nodeList = [] )
    {
    	/* @var array Массив описывающий ноду $iRootId */
    	$nodeList[ $iRoot ] = getRootData($iRootId);
    
    	/* @var int[] Массив id категорий, который является вложенным по отношению к текущей ноде */
    	$arRootIncludedNodeId = getSubTreeNodeIds( $iRootId );
    
    	if ( !empty( $arRootIncludedNodeId ) )
    	{
    		foreach ($arRootIncludedNodeId as $iNode)
    		{
    			collectTree( $iNode, $nodeList );
    		}
    	}
    
    }
    
    /**
     * Возвращает данные по конкретной ноде
     * @param  int $iRoot 
     * @return array
     */
    function getRootData( $iRoot )
    {
    	// ...
    }
    
    /**
     * Возвращает ID всех нод, являющихся наследниками $iRoot ноды
     * @param  int $iRoot 
     * @return int[]
     */
    function getSubTreeNodeIds( $iRoot )
    {
    	// ...
    }
    ?>


    Соответственно для объемного нужно немного изменить метод collectTree, чтобы он не дополнял список, а дописывал в нужный элемент
    Ответ написан
    Комментировать
  • Как вывести цену товара?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Например, если вывод у Вас через CIblockElement::GetList происходит, а тип базовой цены имеет идентификатор 1, то можно в select параметр добавить: CATALOG_PRICE_1 - и он достанет цену.
    Вообще есть достаточно много материалов на эту тему. Если немного поискать, то сразу всплывает:
    https://dev.1c-bitrix.ru/support/forum/forum6/topi...
    Ответ написан
    Комментировать