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

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  

×