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

Управление и настройка функционала Полей Relate и поиск связанных записей по полям отличным от name

Recommended Posts

Была задача в CRM системе настроить быструю привязку контрагента к Обращению вводя в поле контрагент либо ИНН или Логин или название организации.

Поиск по ресурсам вывел на статью http://support.sugarcrm.com/Documentation/Sugar_Developer/Sugar_Developer_Guide_6.5/Module_Framework/Metadata/Examples/Adding_QuickSearch_to_a_custom_field/index.html

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

Поискав сам механизм поиска контрагентов пришел к файлу: include/QuickSearchDefaults.php

в котором описывается формат пориска

 function getQSAccount($nameKey, $idKey, $billingKey = null, $shippingKey = null, $additionalFields = null) {

        global $app_strings;


        $field_list = array('name', 'id'); //описывает поля передаваемые в браузер найденных записей
        $populate_list = array($nameKey, $idKey);
        if($billingKey != null) {
            $field_list = array_merge($field_list, array('billing_address_street', 'billing_address_city',
                                                           'billing_address_state', 'billing_address_postalcode', 'billing_address_country'));

            $populate_list = array_merge($populate_list, array($billingKey . "_address_street", $billingKey . "_address_city",
                                                                $billingKey . "_address_state", $billingKey . "_address_postalcode", $billingKey . "_address_country"));
        } //if

        if($shippingKey != null) {
            $field_list = array_merge($field_list, array('shipping_address_street', 'shipping_address_city',
                                                           'shipping_address_state', 'shipping_address_postalcode', 'shipping_address_country'));

            $populate_list = array_merge($populate_list, array($shippingKey . "_address_street", $shippingKey . "_address_city",
                                                                $shippingKey . "_address_state", $shippingKey . "_address_postalcode", $shippingKey . "_address_country"));
        }

        if(!empty($additionalFields) && is_array($additionalFields)) {
           $field_list = array_merge($field_list, array_keys($additionalFields));
           $populate_list = array_merge($populate_list, array_values($additionalFields));
        }

        $qsParent = array(
					'form' => $this->form_name,
                    'method' => 'query',
                    'modules' => array('Accounts'),
                    'group' => 'or',
                    'field_list' => $field_list,
                    'populate_list' => $populate_list,
                    'conditions' => array(array('name'=>'name','op'=>'like_custom','end'=>'%','value'=>'')), // условия выборки нужной записи в нашем случае это выглядело бы array(array('name'=>'name','op'=>'like_custom','end'=>'%','value'=>'') or array('name'=>'inn_c','op'=>'like_custom','end'=>'%','value'=>'') or array('name'=>'login_c','op'=>'like_custom','end'=>'%','value'=>''))
                    'required_list' => array($idKey),
                    'order' => 'name',
                    'limit' => '30',
                    'no_match_text' => $app_strings['ERR_SQS_NO_MATCH']
                    );

        return $qsParent;
    }

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

дальнейший поиска привел к тому что формат поиска указывается джаваскриптом  на каждой странице для всех полей отдельно

</script><script language="javascript">if(typeof sqs_objects == 'undefined'){var sqs_objects = new Array;}sqs_objects['EditView_account_name']={"form":"EditView","method":"query","modules":["Accounts"],"group":"or","field_list":["name","id"],"populate_list":["EditView_account_name","account_id"],"conditions":[{"name":"name","op":"like_custom","end":"%","value":""}],"required_list":["account_id"],"order":"name","limit":"30","no_match_text":"\u041d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043e"};sqs_objects['EditView_assigned_user_name']={"form":"EditView","method":"get_user_array","field_list":["user_name","id"],"populate_list":["assigned_user_name","assigned_user_id"],"required_list":["assigned_user_id"],"conditions":[{"name":"user_name","op":"like_custom","end":"%","value":""}],"limit":"30","no_match_text":"\u041d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043e"};</script>

таким образом нам необходимо просто переписать данный код  либо добавить ниже необходимый нам , что я и сделал:

создал хук для вывод в конце страницы custom/Extension/modules/Cases/Ext/LogicHooks/quickSearch.php:

/**
 * Created by PhpStorm.
 * User: SeedTeam
 * Date: 14.03.2018
 * Time: 19:14
 */

$hook_array['after_ui_frame'][] = Array(
    99,
    'быстрый поиск по ИНН, Логину, Названию',
    'custom/modules/Cases/quicksearchaccount.php',
    'QuickSearchCasesAccount',
    'QuickSearchCasesAccountUpdateScript'
);

далле сам файл обработчик custom/modules/Cases/quicksearchaccount.php который подключает tpl ку в конце страницы:

/**
 * Created by PhpStorm.
 * User: SeedTeam
 * Date: 14.03.2018
 * Time: 19:19
 */
class QuickSearchCasesAccount {

    public function QuickSearchCasesAccountUpdateScript($event, $arguments) {
        $smarty = new Sugar_Smarty();
        $smarty->display("custom/modules/Cases/tpl/QuickSearchCasesAcc.tpl");

    }
}

и наконец сама tpl  custom/modules/Cases/tpl/QuickSearchCasesAcc.tpl с джаваскриптом:

<script type="text/javascript">
    {literal}
    if(typeof sqs_objects == 'undefined'){var sqs_objects = new Array;}sqs_objects['EditView_account_name']={"form":"EditView","method":"query","modules":["Accounts"],"group":"or","field_list":["name","id","login_c","inn_c"],"populate_list":["EditView_account_name","account_id"],"conditions":[{"name":"name","op":"like_custom","end":"%","value":""}, {"name":"id","op":"like_custom","end":"%","value":""}, {"name":"login_c","op":"like_custom","end":"%","value":""}, {"name":"inn_c","op":"like_custom","end":"%","value":""}],"required_list":["account_id"],"order":["id"," ","id"],"limit":"30","no_match_text":"\u041d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043e"};
    {/literal}
</script>

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

для этого идем в файл modules/Home/QuickSearch.php который отвечает за выдачу json обекта в браузер и чуть чуть корректируем формат построения массива: 

 

$modifide = false; //создаем логическую переменную
if(in_array('inn_c',$args['field_list'])) {
    $modifide = true;  // присваиваем ей true если в формате полей присутствует требуемые нам поля в нашем случае inn_c,  $args['field_list'] данный массив содержит переменные которые необходимы для передачи в браузер и которые мы указали в джаваскрипте 
}

и изменяем значение name  которое выводится в полое, следующим образом :

if(($field == 'name') and ($modifide))
{$data['fields'][$i][$field]= "<p><b>Название:</b> ".$results[$i]->name."</p><p><b>Логин: </b> ".$results[$i]->login_c."</p><p><b>ИНН: </b> ".$results[$i]->inn_c."</p>";}

получаем что в modules/Home/QuickSearch.php  функция formatResults выглядит следующим образом

 

protected function formatResults($results, $args)
{
    global $sugar_config;

    $app_list_strings = null;
    $data['totalCount'] = count($results);
    $data['fields']     = array();

    for ($i = 0; $i < count($results); $i++) {
        $data['fields'][$i] = array();
        $data['fields'][$i]['module'] = $results[$i]->object_name;

        //C.L.: Bug 43395 - For Quicksearch, do not return values with salutation and title formatting
        if($results[$i] instanceof Person)
        {
            $results[$i]->createLocaleFormattedName = false;
        }
        $listData = $results[$i]->get_list_view_data();
        //print_array($listData);
        //print_array($args['field_list']);
        $modifide = false;
        if(in_array('inn_c',$args['field_list'])) {
            $modifide = true;
        }
        //print_array($modifide);
        foreach ($args['field_list'] as $field) {
            if ($field == "user_hash") {
                continue;
            }
            // handle enums
            if ((isset($results[$i]->field_name_map[$field]['type']) && $results[$i]->field_name_map[$field]['type'] == 'enum')
                || (isset($results[$i]->field_name_map[$field]['custom_type']) && $results[$i]->field_name_map[$field]['custom_type'] == 'enum')) {

                // get fields to match enum vals
                if(empty($app_list_strings)) {
                    if(isset($_SESSION['authenticated_user_language']) && $_SESSION['authenticated_user_language'] != '') $current_language = $_SESSION['authenticated_user_language'];
                    else $current_language = $sugar_config['default_language'];
                    $app_list_strings = return_app_list_strings_language($current_language);
                }

                // match enum vals to text vals in language pack for return
                if(!empty($app_list_strings[$results[$i]->field_name_map[$field]['options']])) {
                    $results[$i]->$field = $app_list_strings[$results[$i]->field_name_map[$field]['options']][$results[$i]->$field];
                }
            }


            if (isset($listData[$field])) {
                $data['fields'][$i][$field] = $listData[$field];
            } else if (isset($results[$i]->$field)) {
                $data['fields'][$i][$field] = $results[$i]->$field;
                if(($field == 'name') and ($modifide))
                {$data['fields'][$i][$field]= "<p><b>Название:</b> ".$results[$i]->name."</p><p><b>Логин: </b> ".$results[$i]->login_c."</p><p><b>ИНН: </b> ".$results[$i]->inn_c."</p>";}
            } else {
                $data['fields'][$i][$field] = '';
            }
        }
    }

    if (is_array($data['fields'])) {
        foreach ($data['fields'] as $i => $recordIn) {
            if (!is_array($recordIn)) {
                continue;
            }

            foreach ($recordIn as $col => $dataIn) {
                if (!is_scalar($dataIn)) {
                    continue;
                }

                $data['fields'][$i][$col] = html_entity_decode($dataIn, ENT_QUOTES, 'UTF-8');
            }
        }
    }

    return $data;
}

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

YAHOO.widget.AutoComplete.prototype._updateValue = function(elListItem) {
    if(!this.suppressInputUpdate) {
        var elTextbox = this._elTextbox;
        var sDelimChar = (this.delimChar) ? (this.delimChar[0] || this.delimChar) : null;
        var sResultMatch = elListItem._sResultMatch;

        // Calculate the new value
        var sNewValue = "";
        if(sDelimChar) {
            // Preserve selections from past queries
            sNewValue = this._sPastSelections;
            // Add new selection plus delimiter
            sNewValue += sResultMatch + sDelimChar;
            if(sDelimChar != " ") {
                sNewValue += " ";
            }
        }
        else {
            sNewValue = sResultMatch;
        }
        sNewValue = sNewValue.replace("<p><b>Название:</b> ",""); // удаляем заголовки вместе с тегами
        sNewValue = sNewValue.replace("</p><p><b>Логин: </b>","");// удаляем заголовки вместе с тегами
        sNewValue = sNewValue.replace("</p><p><b>ИНН: </b>","");// удаляем заголовки вместе с тегами
        sNewValue = sNewValue.replace("</p>","");// удаляем заголовки вместе с тегами
        // Update input field
        elTextbox.value = sNewValue;

        // Scroll to bottom of textarea if necessary
        if(elTextbox.type == "textarea") {
            elTextbox.scrollTop = elTextbox.scrollHeight;
        }

        // Move cursor to end
        var end = elTextbox.value.length;
        this._selectText(elTextbox,end,end);

        this._elCurListItem = elListItem;
    }
};

в итоге получаем следующий вид авто заполнения ячейки с контрагентом :

CDxsz8XPU4s.jpg

Share this post


Link to post
Share on other sites

Hello, I have followed the instructions but it does not work for me.
I replaced the "YAHOO.widget.AutoComplete.prototype._updateValue = function (elListItem)" in the include / javascript / yui / build / autocomplete / autocomplete.js file.
Can you support me or send me the files edits.
Thanks

Share this post


Link to post
Share on other sites

Hi nvnam1 !

You must copy the minimize code from  include / javascript / yui / build / autocomplete / autocomplete.js  in  include / javascript / yui / build / autocomplete / autocomplete-min.js 

Data in the cache comes from there.

After you need to delete the cache folder or js filles which contain

YAHOO.widget.AutoComplete.prototype._updateValue

 function

you might need to clear your browser cache.

Sorry for bad english.

 

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
Sign in to follow this  

×