• Как в коробочной версии bitrix24 получить комментарий к лиду?

    Для того, чтобы найти комментарий:
    \Bitrix\Main\Loader::includeModule('crm');
    
    $rs = Bitrix\Crm\Timeline\Entity\TimelineTable::getList(array(
      'order' => array("ID" => "DESC"), 
      'filter' => array('=TYPE_ID' => 7),
    'select'=>array("ID", "BINDINGS")
    ));
    while($ar = $rs->Fetch()) 
    {
       echo '<pre>';
       print_r($ar);
       echo '</pre>';
    }

    Array
    (
       [ID] => 1537
       [CRM_TIMELINE_ENTITY_TIMELINE_BINDINGS_OWNER_ID] => 1537
       [CRM_TIMELINE_ENTITY_TIMELINE_BINDINGS_ENTITY_TYPE_ID] => 1
       [CRM_TIMELINE_ENTITY_TIMELINE_BINDINGS_ENTITY_ID] => 134
       [CRM_TIMELINE_ENTITY_TIMELINE_BINDINGS_IS_FIXED] => 
    )

    ENTITY_TYPE_ID берётся из CCrmOwnerType, например, \CCrmOwnerType::Lead
    ENTITY_ID - собственно ID лида/сделки/где-там-ещё можно комментарии оставлять
    OWNER_ID - это ID который нам нужен для следующего запроса

    $rs = Bitrix\Crm\Timeline\Entity\TimelineTable::getList(array(
       'order' => array("ID" => "DESC"), 
       'filter' => array('=TYPE_ID' => 7)
    ));
    while($ar = $rs->Fetch()) 
    {
       echo '<pre>';
       print_r($ar);
       echo '</pre>';
    }

    Array
    (
        [ID] => 263472
        [TYPE_ID] => 7
        [TYPE_CATEGORY_ID] => 0
        [CREATED] => Bitrix\Main\Type\DateTime Object
            (
                [value:protected] => DateTime Object
                    (
                        [date] => 2019-03-18 15:26:16.000000
                        [timezone_type] => 3
                        [timezone] => Europe/Moscow
                    )
    
            )
    
        [AUTHOR_ID] => 14
        [ASSOCIATED_ENTITY_ID] => 0
        [ASSOCIATED_ENTITY_TYPE_ID] => 0
        [COMMENT] => повторное обращение
        [SETTINGS] => Array
            (
                [HAS_FILES] => N
            )
    
    )
    Ответ написан
    2 комментария
  • Что означает ошибка при установке mysql-server?

    at0m1x
    @at0m1x Автор вопроса
    У меня эксперементальная система, поэтому можно удалять/устанавливать все что угодно, критических данных для потери нет.

    Проблема была в том что в системе были остатки от старых установок других БД, таких как MariaDB, Percona, MySQL. И хотя все предыдущие перечисленные БД были удалены с помощью apt purge, в системе всеравно кое где остались некоторые файлы/директории/скрипты от этих БД. И эти "остатки" каким то образом конфликтовали при новой установки MySQL.

    Поэтому я решил эту проблему так:
    sudo apt-get purge .*mariadb.* .*mysql.*
    sudo apt-get autoremove


    Но самое главное, ищем и удаляем остатки:
    sudo locate mysql
    Эта команда выдаст список оставшихся после удаления файлов/директорий/скриптов прошлых БД. Всех их тоже надо удалить.

    После этого можно устанавливать MySQL как обычно:
    sudo apt install mysql-server mysql-client
    Все должно пройти ОК, без всяких Errors.
    Ответ написан
    Комментировать
  • Битрикс 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 комментария
  • CMS своими руками

    @egorinsk
    Автор, а что гуглить. Есть минимум 3 способа: расковырять простую Open-Source CMS (проблема: найти CMS с хорошей архитектурой и аккуратным кодом), устроиться в компанию, у которой есть своя CMS (а она есть почти у каждой студии), и наконец, написать самому правильно.

    Маны нужны не по написанию CMS, а по используемым продуктам и технологиям.

    Сначала надо определиться с задачей. Установите и попользуйтесь несколькими CMS, просто чтобы увидеть особенности их работы. (если вы не можете это сделать — вам надо изучать основы установки и настройки apache/mysql/whatever, а не CMS писать. Уходите практиковать эти навыки). Также, есть хороший сайт, где установлены демки десятков CMS и можно их посмотреть, не устанавливая.

    Запишите, что вы хотите получить, сделайте наброски страниц. Определитесь с требованиями к вашей CMS. Какие в ней будут модули, как ими можно управлять.

    CMS обычно состоит из 2 частей — т.н. «админки» (запароленный раздел, где меняется конфигурация сайта, добавляются материалы) и публичной части сайта, которую видят пользователи.

    Если вы еще не бросили эту затею, перейдем к следующему пункту. Проектирование архитектуры и написание CMS. Чтобы хорошо писать сложную CMS, нужен опыт и понимание того, как вообще писать сложные программы. Нужно глубокое знание HTTP/HTML/CSS/JS/SQL. А именно:

    — система должна быть модульной, чтобы, написав основу, можно было, не переписывая ее, не спеша добавлять модули и расширять функционал
    — система должна писаться с использованием грамотной архитектуры и аккуратного кода, так как поддержка и переписывание плохого кода будет отнимать у вас слишком много сил. А потом в нем вообще никто не сможет разобраться.

    Что еще надо знать. Во-первых, надо иметь представление что значит MVC или 3-звенная архитектура.

    M в MVC — это Model. CMS скорее всего будет хранить данные в БД — надо знать, что такое и как пишется DBAL (гуглите: PDO), плейсхолдеры в запросах, возможно, Table Gateway, ознакомиться с тем, что такое ORM, и почему PHP-ные ORM так тормозят. Если будете делать модельки, не храните значения полей в публичных свойствах — это неудобно и нарушает инкапсуляцию. Храните их в приватном массиве $attributes.

    V is for View. Надо знать, что такое шаблонизаторы (прочтите мануал по Smarty, Django Templates, HAML и XSLT, чтобы иметь общее представление, какие они бывают). Для PHP хорошие варианты — использовать чистый PHP или XSLT, если осилите. Smarty — устаревший тормозной хлам, Twig тоже имеет недостатки. И не стоит ставить шаблонизатор, только, чтобы писать {$a} вместо [?= $a =].

    Не смешивайте логику (сложные вычисления, обращение к БД) и шаблонизацию. Лучше сделайте 2 файла: один с кодом, другой с шаблоном. В идеале, шаблонизатор получает от контроллера значения переменных и, кроме хелперов, никакого другого кода не вызывает.

    C — контроллеры. Но это самая простая часть, контроллер — это просто класс с методами типа viewAction(), editAction() и роутер, который смотрит на УРЛ и вызывает нужный контроллер. Посмотрите, как устроен Zend_Controller и Zend_Front_Contriller, и сделайте так же, но попроще. выкинув 90% функционала — он вам не понадобится.

    Нужно как-то сделать систему компонентной без сильных связей: чтобы ядро могло работать и без модулей, а добавление модуля не требовало дописывания кода в ядро. Почитайте про Dependency Injection, а также Observer (observer — это когда мы делаем функцию addEventListener()).

    Не используйте хуки, как в Друпал. Это дурной и порочный путь, взятый видимо из древных времен и программирования на Си.

    Что еще. Освоив все эти понятия, у вас в принципе не будет сложностей написать CMS, но почитайте еще мои советы по тому, как писать правильный код с исп. ООП: habrahabr.ru/qa/17158/#answer_70869

    Написание своих велосипедов, в общем, полезно и способствует расширению кругозора разработчика, заставляет его изучать разные подходы к написанию кода.

    Ну что еще. Если (в чем я сильно сомневаюсь) благодаря моему скромного совету вы все же сможете пройти этот нелегкий путь и станете успешным разработчиком, можете заплатить мне денег. Я не против.
    Ответ написан
    Комментировать