简体   繁体   中英

How to properly display a calculated value of a non-db field in the ListView?

In Suitecrm/SugarCRM 6.5

I need to modify the ListView. Showing the value of a field based on a certain condition.

In the Account module, the name field may be empty based on certain conditions, I require that when this occurs show the value of a custom field. To do this, first I tryied using 'customCode' + smarty as usual in Edit/Detail vies, but in several posts mention that this is not possible in the ListView. The concession is to use logic hooks + a non-db field to store the calculated field. Following this SO answer I have written the following:

Custom field at 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';

Label at suitecrm/custom/Extension/modules/Accounts/Ext/Language/es_ES.account_name_c.php

<?php

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

Logic hook entry at 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'
);

Logic hook at 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 at custom/modules/Accounts/metadata/listviewdefs.php

I added the field

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

After these modifications and repair I hope to see the field full with the right value. But it appears empty. I have verified that the logic hook is properly called, but the name and person_name_c fields are always empty. In case it is relevant I have verified in Studio that the name fields in Account is type name I do not know what this means when it comes to obtaining its value.

I appreciate your comments

The problem is in the logic hook is due to first that the $bean does not have access to the custom fields, so I have to invoke them using $bean->custom_fields->retrieve(); Also the name field is always empty, I had to use DBManager to get only the name field .

The logic of the final logic hook is the following:

<?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;
    }
}

I was not familiar with the method $bean->custom_fields->retrieve() and at the moment I do not know why is empty the name field and I understand others fields remain empty.

I hope this is useful

We achieved that doing an after_retrieve hook, very fast and simple - This is taken from a working example.

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;
 }
}

All you need is to define and add this function to the module logic_hooks.php

You can even tailor down to specific calls:

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

As some times there are views you do want to show the field, for example quicksearch popup.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM