Как правильно отобразить вычисленное значение поля без базы данных в ListView? - PullRequest
0 голосов
/ 05 марта 2019

В Suitecrm / SugarCRM 6.5

Мне нужно изменить ListView.Отображение значения поля на основе определенного условия.

В модуле Учетная запись поле name может быть пустым в зависимости от определенных условий, я требую, чтобы при этом отображалось значение настраиваемого поля.Чтобы сделать это, сначала я попытался использовать 'customCode' + smarty как обычно в Edit / Detail vies, но в нескольких постах упоминалось, что это невозможно в ListView.Концессия заключается в использовании логических хуков + поля не-db для хранения вычисленного поля.После этого SO ответ я написал следующее:

Пользовательское поле на custom/Extension/modules/Accounts/Ext/Vardefs/custom_field_name_c.php

<?php

$dictionary['Account']['fields']['name_c']['name'] = 'account_name_c';
$dictionary['Account']['fields']['name_c']['vname'] = 'LBL_ACCOUNT_NAME_C';
$dictionary['Account']['fields']['name_c']['type'] = 'varchar';
$dictionary['Account']['fields']['name_c']['len'] = '255';
$dictionary['Account']['fields']['name_c']['source'] = 'non-db';
$dictionary['Account']['fields']['name_c']['dbType'] = 'non-db';
$dictionary['Account']['fields']['name_c']['studio'] = 'visible';

Метка на suitecrm/custom/Extension/modules/Accounts/Ext/Language/es_ES.account_name_c.php

<?php

$mod_strings['LBL_ACCOUNT_NAME_C'] = 'Nombre de cuenta';

Логическая запись в custom/modules/Accounts/logic_hooks.php

$hook_array['process_record'] = Array();
$hook_array['process_record'][] = Array(
    2,
    'Get proper name',
    'custom/modules/Accounts/hooks/ListViewLogicHook.php',
    'ListViewLogicHook',
    'getProperName'
);

Логическая запись в custom/modules/Accounts/hooks/ListViewLogicHook.php

<?php

class ListViewLogicHook
{
    public function getProperName(&$bean, $event, $arguments)
    {
        if (empty($bean->fetched_row['name'])) {
            $bean->account_name_c = $bean->fetched_row['person_name_c'];
        } else {
            $bean->account_name_c = $bean->fetched_row['name'];
        }

        // Here I also tried, but same result
        // $bean->account_name_c = empty($bean->name) ? $bean->person_name_c : $bean->name;
    }
}

listviewdefs.php в custom/modules/Accounts/metadata/listviewdefs.php

Я добавил поле

'NAME_C' =>
  array (
      'width' => '20%',
      'label' => 'LBL_ACCOUNT_NAME_C',
      'default' => true,
  ),

После этих модификаций и ремонта я надеюсь увидеть поле заполненным с правильным значением.Но это кажется пустым.Я проверил, что логический хук вызывается правильно, но поля name и person_name_c всегда пусты.Если это уместно, я проверил в Studio, что поля name в учетной записи имеют тип name Я не знаю, что это значит, когда речь заходит о получении его значения.

Я ценю ваши комментарии

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Мы достигли того, что сделали after_retrieve ловушку, очень быструю и простую - это взято из рабочего примера.

public function RemoveCost(&$bean, $event, $arguments)
{
 global $current_user;
 include_once(‘modules/ACLRoles/ACLRole.php’);
 $roles =  ACLRole::getUserRoleNames($current_user->id);
 if(!array_search("CanSeeCostRoleName",$roles)){
  $bean->cost = 0;
  $bean->cost_usdollar = 0;
 }
}

Все, что вам нужно, это определить и добавить эту функцию в модуль logic_hooks.php

Вы можете даже адаптировать к конкретным вызовам:

if (isset($_REQUEST['module'],$_REQUEST['action']) && $_REQUEST['module'] == 'Opportunities' && $_REQUEST['action'] == 'DetailView')

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

0 голосов
/ 05 марта 2019

Проблема в логике связана с тем, что сначала $bean не имеет доступа к настраиваемым полям, поэтому я должен вызывать их, используя $bean->custom_fields->retrieve(); Также поле имени всегда пусто, мне пришлось использовать DBManager для получения только поля имени .

Логика окончательной логической ловушки следующая:

<?php

class ListViewLogicHook
{
    public function getProperName($bean, $event, $arguments)
    {
        // Get access to custom fields from $bean
        $bean->custom_fields->retrieve();

        // Get access to name property using DBManager because $bean->name return null
        $sql = "SELECT name FROM accounts WHERE id = '{$bean->id}'";
        $name = $GLOBALS['db']->getOne($sql);

        // Assign a value to non-db field
        $bean->name_c = empty($name) ? $bean->nombre_persona_c : $name;
    }
}

Я не был знакомс помощью метода $bean->custom_fields->retrieve() и в настоящий момент я не знаю, почему пустое поле name, и я понимаю, что другие поля остаются пустыми.

Надеюсь, это полезно

...