Jump to content
SpravkaCRM.ru - Ваш справочник по CRM

Recommended Posts

Всем привет!

Столкнулся только что с ситуацией, когда в карточку Контрагента добавили поле с пользователем (связанная запись из Users), пытаемся в дашлете это поле использовать как фильтр, а оно не работает.

Поле добавляли через файлы в /custom/Extensions/modules/Accounts/Ext/Vardefs/

В дашлете это выглядит примерно так:

2018-05-10_10-40-37.thumb.png.2bf490515373b13845863a02f6958f78.png

В карточке контрагента это же поле:

2018-05-10_10-42-46.thumb.png.38f35782602acbc81ec0e0a59a5e5314.png

 

После того, как в дашлете я выбираю это поле в виде фильтра, SuiteCRM формирует для выборки записей SQL-запрос примерно такого содержания:

SELECT  accounts.id , accounts.user_id2_c , LTRIM(RTRIM(CONCAT(IFNULL(jt0.first_name,''),' ',IFNULL(jt0.last_name,'')))) fixed_accountant_c  , LTRIM(RTRIM(CONCAT(IFNULL(jt1.first_name,''),' ',IFNULL(jt1.last_name,'')))) fixed_accountant_c , jt1.created_by fixed_accountant_c_owner  , 'Users' fixed_accountant_c_mod, accounts.assigned_user_id  FROM accounts  LEFT JOIN users jt0 ON accounts.user_id2_c = jt0.id AND jt0.deleted=0   LEFT JOIN  users jt1 ON accounts.user_id2_c=jt1.id AND jt1.deleted=0

 AND jt1.deleted=0 where (user_id2_c='d3c33565-3030-cebd-2db4-592308bd456b' ) AND accounts.deleted=0

Как мы видим ((accounts.id IN (''))) - совсем не то, что нам нужно.

В результате анализа и поиска места, где это все собирается и как так получается был  найден файл /include/Dashlets/DashletGeneric.php и в нем функция buildWhere() с таким участком:

                switch($widgetDef['type']) {// handle different types
                    case 'date':
                    case 'datetime':
                    case 'datetimecombo':
                        if(is_array($params) && !empty($params)) {
                            if(!empty($params['date']))
                                $widgetDef['input_name0'] = $params['date'];
                            $filter = 'queryFilter' . $params['type'];
                        }
                        else {
                            $filter = 'queryFilter' . $params;
                        }
                        array_push($returnArray, $widgetClass->$filter($widgetDef, true));
                        break;
                    case 'assigned_user_name':
                        // This type runs through the SugarWidgetFieldname class, and needs a little extra help to make it through
                        if ( ! isset($widgetDef['column_key']) ) {
                            $widgetDef['column_key'] = $name;
                        }
                        // No break here, we want to run through the default handler
                    case 'relate':
                        if (isset($widgetDef['link']) && $this->seedBean->load_relationship($widgetDef['link'])) {
                            $widgetLink = $widgetDef['link'];
                            $widgetDef['module'] = $this->seedBean->$widgetLink->focus->module_name;
                            $widgetDef['link'] = $this->seedBean->$widgetLink->getRelationshipObject()->name;
                        }
                        // No break - run through the default handler
                    default:
                        $widgetDef['input_name0'] = $params;
                        if(is_array($params) && !empty($params)) { // handle array query
                            array_push($returnArray, $widgetClass->queryFilterone_of($widgetDef, false));
                        }
                        else {
                            array_push($returnArray, $widgetClass->queryFilterStarts_With($widgetDef, true));
                        }
                        $widgetDef['input_name0'] = $params;
                    break;
                }

Поле, по которому мы пытаемся в дашлете искать, создано при помощи такого массива:

$dictionary['Account']['fields']['fixed_accountant_c'] = array (
    'required' => false,
    'source' => 'non-db',
    'name' => 'fixed_accountant_c',
    'vname' => 'LBL_FIXED_ACCOUNTANT_C',
    'type' => 'relate',
    'massupdate' => 0,
    'no_default' => false,
    'comments' => '',
    'help' => '',
    'importable' => 'true',
    'duplicate_merge' => 'disabled',
    'duplicate_merge_dom_value' => '0',
    'audited' => false,
    'inline_edit' => true,
    'reportable' => true,
    'unified_search' => false,
    'merge_filter' => 'disabled',
    'len' => '255',
    'size' => '20',
    'id_name' => 'user_id2_c',
    'ext2' => 'Users',
    'module' => 'Users',
    'rname' => 'name',
    'quicksearch' => 'enabled',
    'studio' => 'visible',
);

Судя по всему получается так, что в функции buildWhere() срабатывает case = 'relate'. Но так же выяснил, что НЕ срабатывает блок 

if (isset($widgetDef['link']) && $this->seedBean->load_relationship($widgetDef['link'])) {}

просто по причине отсутствия 'link' в описании нашего поля. Решил добавить 'link', и ВСЕ ПОЛУЧИЛОСЬ!!!

За основу для добавления link взял поле assigned_user_id, так как эти поля получились очень похожими: эти поля находятся в таблице `accounts` и ссылаются на таблицу и модуль с Пользователями (`users`)

Таким образом в файл, в котором я описал мое поле, я добавил еще следующие блоки:

$dictionary['Account']['fields']['fixed_accountant_c_link'] = array (
	'name' => 'fixed_accountant_c_link',
	'type' => 'link',
	'relationship' => 'fixed_accountant_c',
	'vname' => 'LBL_FIXED_ACCOUNTANT_C_LINK',
	'link_type' => 'one',
	'module' => 'Users',
	'bean_name' => 'User',
	'source' => 'non-db',
	'duplicate_merge' => 'enabled',
	'rname' => 'fixed_accountant_c',
	'id_name' => 'user_id2_c',
	'table' => 'users',
);
$dictionary['Account']['relationships']['fixed_accountant_c'] = array (
	'lhs_module' => 'Users',
	'lhs_table' => 'users',
	'lhs_key' => 'id',
	'rhs_module' => 'Accounts',
	'rhs_table' => 'accounts',
	'rhs_key' => 'user_id2_c',
	'relationship_type' => 'one-to-many'
);

А в описание нашего поля вставляю link:

$dictionary['Account']['fields']['fixed_accountant_c'] = array (
    'required' => false,
    'source' => 'non-db',
    'name' => 'fixed_accountant_c',
    'vname' => 'LBL_FIXED_ACCOUNTANT_C',
    'type' => 'relate',
	'link'=>'fixed_accountant_c_link' ,
    'massupdate' => 0,
    'no_default' => false,
    'comments' => '',
    'help' => '',
    'importable' => 'true',
    'duplicate_merge' => 'disabled',
    'duplicate_merge_dom_value' => '0',
    'audited' => false,
    'inline_edit' => true,
    'reportable' => true,
    'unified_search' => false,
    'merge_filter' => 'disabled',
    'len' => '255',
    'size' => '20',
    'id_name' => 'user_id2_c',
    'ext2' => 'Users',
    'module' => 'Users',
    'rname' => 'name',
    'quicksearch' => 'enabled',
    'studio' => 'visible',
);

После этих манипуляций делаю быстрое восстановление и смотрим что получилось с генерацией SQL-запроса:

SELECT  accounts.id , accounts.name , accounts.renewal_date_c , accounts.time_zone_c , accounts.tariff_c , accounts.assigned_user_id  FROM accounts  where ((accounts.id IN ('d924c25c-7ab0-25c8-f5cd-5a58c168620a'))) AND accounts.deleted=0 ORDER BY accounts.date_entered DESC

Что уже то, что нам нужно...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×