From ea7a30b436ccca42e398e511c731010b7e36f162 Mon Sep 17 00:00:00 2001 From: scottshipman Date: Thu, 29 Mar 2018 17:11:46 -0400 Subject: [PATCH 1/4] [ENG-177] fix when saving new leads and no fields array exists --- Entity/ExtendedFieldRepositoryTrait.php | 28 ++++++++++--------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/Entity/ExtendedFieldRepositoryTrait.php b/Entity/ExtendedFieldRepositoryTrait.php index 75ea201..3725fa8 100644 --- a/Entity/ExtendedFieldRepositoryTrait.php +++ b/Entity/ExtendedFieldRepositoryTrait.php @@ -231,25 +231,19 @@ public function saveExtendedEntity($entity, $flush = true) // Get Extended Fields to separate from standard Update statement. $extendedFields = []; - $entityConfig = $entity->getFields(); + $fieldList = $this->getCustomFieldList('lead'); foreach ($fields as $fieldname => $formData) { - foreach ($entityConfig as $group) { - if (isset($group[$fieldname]) && isset($group[$fieldname]['object']) && false !== strpos( - $group[$fieldname]['object'], - 'extendedField' - )) { - $extendedFields[$fieldname]['value'] = $formData; - $extendedFields[$fieldname]['type'] = $group[$fieldname]['type']; - $extendedFields[$fieldname]['id'] = $group[$fieldname]['id']; - $extendedFields[$fieldname]['name'] = $fieldname; - $extendedFields[$fieldname]['secure'] = false !== strpos( - $group[$fieldname]['object'], - 'Secure' - ) ? true : false; - unset($fields[$fieldname]); - break; - } + if ($fieldList[0][$fieldname]['object'] == 'extendedField' || $fieldList[0][$fieldname]['object'] == 'extendedFieldSecure' ) + { + $extendedFields[$fieldname]['value'] = $formData; + $extendedFields[$fieldname]['type'] = $fieldList[0][$fieldname]['type']; + $extendedFields[$fieldname]['id'] = $fieldList[0][$fieldname]['id']; + $extendedFields[$fieldname]['name'] = $fieldname; + $extendedFields[$fieldname]['secure'] = $fieldList[0][$fieldname]['object'] == 'extendedFieldSecure' ? true : false; + unset($fields[$fieldname]); + break; } + } $changes = []; From bf6938244fe0f15aad5b496675eabf938c539074 Mon Sep 17 00:00:00 2001 From: scottshipman Date: Thu, 29 Mar 2018 17:13:23 -0400 Subject: [PATCH 2/4] [ENG-177] that whole array_key_diff on changes --- Entity/ExtendedFieldRepositoryTrait.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Entity/ExtendedFieldRepositoryTrait.php b/Entity/ExtendedFieldRepositoryTrait.php index 3725fa8..e6ec78b 100644 --- a/Entity/ExtendedFieldRepositoryTrait.php +++ b/Entity/ExtendedFieldRepositoryTrait.php @@ -252,11 +252,6 @@ public function saveExtendedEntity($entity, $flush = true) // remove the fields that are part of changes as they were already saved via a setter $fields = array_diff_key($fields, $changes); - // Overriden to check a deeper recursion in changes since fields may already have been saved that - // are not company fields, IE - extended fields and extended fields secure - if (isset($changes['fields'])) { - $fields = array_diff_key($fields, $changes['fields']); - } } if (!empty($fields)) { @@ -301,7 +296,7 @@ public function saveExtendedEntity($entity, $flush = true) isset($changes['fields']) && isset($changes['fields'][$values['name']]) && isset($changes['fields'][$values['name']][0]) - && $changes['fields'][$values['name']][0] === null + && $changes['fields'][$values['name']][0] == null && !empty($changes['fields'][$values['name']][1])) { // need to do an insert, no previous value for this lead id $column['lead_id'] = $entity->getId(); From 4ee9d99c303e968e051dd47d0c1a54a0a8410555 Mon Sep 17 00:00:00 2001 From: heathdutton Date: Thu, 29 Mar 2018 17:50:30 -0400 Subject: [PATCH 3/4] PHPCS fixes. --- Entity/ExtendedFieldRepositoryTrait.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Entity/ExtendedFieldRepositoryTrait.php b/Entity/ExtendedFieldRepositoryTrait.php index e6ec78b..790644d 100644 --- a/Entity/ExtendedFieldRepositoryTrait.php +++ b/Entity/ExtendedFieldRepositoryTrait.php @@ -231,10 +231,9 @@ public function saveExtendedEntity($entity, $flush = true) // Get Extended Fields to separate from standard Update statement. $extendedFields = []; - $fieldList = $this->getCustomFieldList('lead'); + $fieldList = $this->getCustomFieldList('lead'); foreach ($fields as $fieldname => $formData) { - if ($fieldList[0][$fieldname]['object'] == 'extendedField' || $fieldList[0][$fieldname]['object'] == 'extendedFieldSecure' ) - { + if ($fieldList[0][$fieldname]['object'] == 'extendedField' || $fieldList[0][$fieldname]['object'] == 'extendedFieldSecure') { $extendedFields[$fieldname]['value'] = $formData; $extendedFields[$fieldname]['type'] = $fieldList[0][$fieldname]['type']; $extendedFields[$fieldname]['id'] = $fieldList[0][$fieldname]['id']; @@ -243,7 +242,6 @@ public function saveExtendedEntity($entity, $flush = true) unset($fields[$fieldname]); break; } - } $changes = []; From 6b360604d55173d53bf1f70b7f041e8d7865ec56 Mon Sep 17 00:00:00 2001 From: heathdutton Date: Thu, 29 Mar 2018 18:59:00 -0400 Subject: [PATCH 4/4] Fix initial save. And support more than one extended field at a time. --- Entity/ExtendedFieldRepositoryTrait.php | 76 +++++++++++++------------ 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/Entity/ExtendedFieldRepositoryTrait.php b/Entity/ExtendedFieldRepositoryTrait.php index 790644d..d79e1d3 100644 --- a/Entity/ExtendedFieldRepositoryTrait.php +++ b/Entity/ExtendedFieldRepositoryTrait.php @@ -223,36 +223,40 @@ public function saveExtendedEntity($entity, $flush = true) $this->getEntityManager()->flush($entity); } - // Includes prefix - $fields = $entity->getUpdatedFields(); - $table = $this->getEntityManager()->getClassMetadata( - $this->getClassName() - )->getTableName(); + // Get updated fields, and include changes so that we have everything. + $fields = $entity->getUpdatedFields(); + $changes = []; + if (method_exists($entity, 'getChanges')) { + $changes = $entity->getChanges(); + + // remove the fields that are part of changes as they were already saved via a setter + $fields = array_diff_key($fields, $changes); + } // Get Extended Fields to separate from standard Update statement. $extendedFields = []; $fieldList = $this->getCustomFieldList('lead'); - foreach ($fields as $fieldname => $formData) { - if ($fieldList[0][$fieldname]['object'] == 'extendedField' || $fieldList[0][$fieldname]['object'] == 'extendedFieldSecure') { - $extendedFields[$fieldname]['value'] = $formData; + foreach ($fields as $fieldname => $value) { + if ( + $fieldList[0][$fieldname]['object'] == 'extendedField' + || $fieldList[0][$fieldname]['object'] == 'extendedFieldSecure' + ) { + $extendedFields[$fieldname]['value'] = $value; $extendedFields[$fieldname]['type'] = $fieldList[0][$fieldname]['type']; $extendedFields[$fieldname]['id'] = $fieldList[0][$fieldname]['id']; $extendedFields[$fieldname]['name'] = $fieldname; $extendedFields[$fieldname]['secure'] = $fieldList[0][$fieldname]['object'] == 'extendedFieldSecure' ? true : false; unset($fields[$fieldname]); - break; + // I'm leaving this in here, commented out, as a life lesson :) + // break; } } - $changes = []; - if (method_exists($entity, 'getChanges')) { - $changes = $entity->getChanges(); - - // remove the fields that are part of changes as they were already saved via a setter - $fields = array_diff_key($fields, $changes); - } - + // Save standard/core fields. if (!empty($fields)) { + $table = $this->getEntityManager()->getClassMetadata( + $this->getClassName() + )->getTableName(); $this->prepareDbalFieldsForSave($fields); $this->getEntityManager()->getConnection()->update( $table, @@ -273,36 +277,36 @@ public function saveExtendedEntity($entity, $flush = true) $extendedTable = 'lead_fields_leads_'.$dataType.($values['secure'] ? '_secure' : '').'_xref'; $this->prepareDbalFieldsForSave($column); - // insert (no pre-existing value per lead) or update - if ( isset($changes['fields']) - && !empty($changes['fields'][$values['name']][0]) - && empty($changes['fields'][$values['name']][1])) { - // need to delete the row from db table because new value is empty - $lead_id = $entity->getId(); - $column = [ - 'lead_field_id' => $values['id'], - 'lead_id' => $lead_id, - ]; - $this->getEntityManager()->getConnection()->delete( + && isset($changes['fields'][$values['name']]) + && is_null($changes['fields'][$values['name']][0]) + && !empty($changes['fields'][$values['name']][1]) + ) { + // Need to do an insert, no previous value for this lead id + $column['lead_id'] = $entity->getId(); + $this->getEntityManager()->getConnection()->insert( $extendedTable, $column ); } else { if ( isset($changes['fields']) - && isset($changes['fields'][$values['name']]) - && isset($changes['fields'][$values['name']][0]) - && $changes['fields'][$values['name']][0] == null - && !empty($changes['fields'][$values['name']][1])) { - // need to do an insert, no previous value for this lead id - $column['lead_id'] = $entity->getId(); - $this->getEntityManager()->getConnection()->insert( + && !empty($changes['fields'][$values['name']][0]) + && empty($changes['fields'][$values['name']][1]) + ) { + // Need to delete the row from db table because new value is empty + $lead_id = $entity->getId(); + $column = [ + 'lead_field_id' => $values['id'], + 'lead_id' => $lead_id, + ]; + $this->getEntityManager()->getConnection()->delete( $extendedTable, $column ); } else { + // Update the lead. $this->getEntityManager()->getConnection()->update( $extendedTable, $column, @@ -325,8 +329,6 @@ public function saveExtendedEntity($entity, $flush = true) * @param null $resultsCallback * * @return array - * - * @throws \Doctrine\DBAL\DBALException */ public function getEntitiesWithCustomFields( $object,