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

Фильтр в дашлете по relate-полю

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...