2017-02-14 3 views
1

Я пытаюсь использовать логический крючок after_save, если я являюсь новым правопреемником в Leads, тогда тот же самый цессионарий должен быть привязан к связанным с ним Notes. Ниже приведен код, который я использую. В настоящее время я нахожусь на 6.5 предприятиях. Кто-нибудь имеет представление о том, как я могу сравнить оба значения?Как отличить значение с существующим значением через hook в SugarCRM?

В модулях/Приводит/logic_hook.php

$hook_array['after_save'] = Array(); 
$hook_array['after_save'][] = Array(1, 'Leads edited', 'custom/modules/Leads/ExtraLogic.php', 'ExtraLogic', 'saveAssigneeToNotes'); 

В пользовательских/модулей/Leads/ExtraLogic.php

//check if a fields value has changed 
    if ($assigned_user_id != $bean->assigned_user_id) 
    { 
     // execute logic 
    } else { 
     // Same value 
    } 

Спасибо.

ответ

0

В этом случае было бы проще просто использовать логический крючок before_save. Я бы рекомендовал рассмотреть различные варианты использования в официальной документации: Module Hooks.

Вот как я бы обновить Assigned пользователя Нот, когда Назначенные изменения пользователем соответстующем свинца в:

В custom/modules/Leads/logic_hooks.php включить эту запись,

<?php 
$hook_version = 1; 
$hook_array = array(); 
$hook_array['before_save'] = array(); 
$hook_array['before_save'][] = array(
    50, 
    'Update Assigned User for Notes', 
    'custom/modules/Leads/NotesUpdater.php', 
    'NotesUpdater', 
    'updateOnAssignedUserChange', 
); 

Этот файл задает ссылку на файл, класс и метод для вызова. Теперь создайте custom/modules/Leads/NotesUpdater.php со следующим содержанием,

<?php 
class NotesUpdater 

/** 
* @param $bean Lead 
* @param $event string e.g. 'before_save' 
* @param $arguments array 
*/ 
public function updateOnAssignedUserChange($bean, $event, $arguments){ 
    // skip if this is a new record, since there are no related Notes yet 
    if(empty($bean->fetched_row)) return TRUE; 

    // check for a change on the Assigned User on the Lead 
    if($bean->assigned_user_id != $bean->fetched_row['assigned_user_id]){ 
    $bean->load_relationship('notes'); 
    foreach($bean->notes->getBeans() as $note){ 
     $note->assigned_user_id = $bean->assigned_user_id; 
     // if the Note record was changed, save it 
     // (otherwise there is no need to save) 
     if($note->assigned_user_id != $note->fetched_row['assigned_user_id']){ 
      $note->save(); 
     } 
    } 
    } 
} 

Этот метод обнаружения изменений и действующих на него можно сделать 100% вышеуказанной before_save логики крючке. Использование IMO крюка after_save редко и очень специфично, но если вам это нужно в будущем, запись в блоге разработчика SugarCRM Doing before/after field comparisons in after_save logic hooks описывает, как это сделать.

+0

Я хочу использовать 'after_save', потому что цессионарий должен быть обновлен из' Leads', а затем я хочу совместить со старым цессионарием для той же записи. Если правопреемник такой же для свинца, то я не хочу вызывать код о 'notes', который дается вами. –

+0

Я считаю, что я полностью понимаю эту проблему. Я расширил ответ, чтобы продемонстрировать все записи файла, которые будут предоставлять это, определение логического крючка и весь файл класса и метода. Все это делается в 'before_save', метод' after_save' не требуется. Он не имеет большого значения над 'before_save', и его использование редко встречается в IMO. –

0

Вы не должны сравнивать любые значения (по крайней мере, не в SugarCRM 7, не уверен, 6.5), так как SugarCRM уже сделал это для вас:

Крючки обычно называют с этими аргументами: ($bean, $event, $arguments) ,

В after_save крючками, $arguments будет выглядеть примерно так, при изменении назначенного пользователя:

Array 
(
    [isUpdate] => 1 
    [dataChanges] => Array 
     (
      [date_modified] => Array 
       (
        [field_name] => date_modified 
        [data_type] => datetime 
        [before] => 2016-12-28 22:05:50 
        [after] => 2017-02-21 19:23:42 
       ) 

      [modified_by_name] => Array 
       (
        [field_name] => modified_by_name 
        [data_type] => relate 
        [before] => Administrator 
        [after] => admin 
       ) 

      [assigned_user_id] => Array 
       (
        [field_name] => assigned_user_id 
        [data_type] => id 
        [before] => d4229698-640b-18f9-af63-179b140cfa7a 
        [after] => a4329698-640b-18f9-af63-179b140cfe76 
       ) 

     ) 

) 

(код, генерируемый положить file_put_contents('/tmp/after_save_arguments.txt', print_r($arguments, true)); в after_safe крючок)

Так всю информацию, вам нужно уже должны быть там.

Вы можете просто проверить на array_key_exists('assigned_user_id', $arguments['dataChanges']) и использовать текущие переменные $bean, чтобы сделать некоторую логику нового значения. Если вам также нужно сделать логику относительно старого значения, вам необходимо использовать $arguments['dataChanges']['assigned_user_id']['before'].

О, хорошо, также не забудьте проверить, isUpdate == false, потому что в этом случае только что был создан боб, и dataChanges будет пуст, так как запись раньше не существовала. В таком случае вас интересуют только текущие значения $bean.

Смежные вопросы