From c5bb91d31accaeb16fa76b3cd5d79ee58ae5a912 Mon Sep 17 00:00:00 2001 From: Guillaume Heurtier <guillaume.heurtier@maarch.org> Date: Thu, 10 Sep 2020 10:59:13 +0200 Subject: [PATCH] FEAT #14458 TIME 1:10 empty value in import contact --- .../contact/controllers/ContactController.php | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/app/contact/controllers/ContactController.php b/src/app/contact/controllers/ContactController.php index e70c0ee790f..70a1a8a360e 100755 --- a/src/app/contact/controllers/ContactController.php +++ b/src/app/contact/controllers/ContactController.php @@ -1239,21 +1239,21 @@ class ContactController // Check format of fields foreach ($contactFields as $frontField => $backField) { - if (!empty($contact[$frontField])) { + if (!empty($contact[$frontField]) && $contact[$frontField] !== false) { if (strpos($frontField, 'contactCustomField_') !== false) { $customId = explode('_', $frontField)[1]; // Check custom field format $type = $customTypes[(string)$customId]; - if (in_array($type, ['checkbox', 'radio']) && !Validator::arrayType()->validate($contact[$frontField])) { + if ($type == 'checkbox' && !Validator::arrayType()->validate($contact[$frontField])) { $errors[] = ['error' => "Argument {$frontField} is not an array for contact {$key}", 'index' => $key, 'lang' => 'argumentNotArray']; continue 2; - } elseif ($customTypes[$customId] == 'integer' && !Validator::intVal()->validate($contact[$frontField])) { + } elseif ($type == 'integer' && !Validator::floatVal()->validate($contact[$frontField])) { $errors[] = ['error' => "Argument {$frontField} is not an integer for contact {$key}", 'index' => $key, 'lang' => 'argumentNotInteger']; continue 2; - } elseif ($customTypes[$customId] == 'date' && !Validator::date()->validate($contact[$frontField])) { + } elseif ($type == 'date' && !Validator::date()->validate($contact[$frontField])) { $errors[] = ['error' => "Argument {$frontField} is not a date for contact {$key}", 'index' => $key, 'lang' => 'argumentNotDate']; continue 2; - } elseif (in_array($customTypes[$customId], ['string', 'select']) && !Validator::stringType()->validate($contact[$frontField]) || !Validator::length(1, 255)->validate($contact[$frontField])) { + } elseif (in_array($type, ['string', 'select', 'radio']) && !Validator::stringType()->validate($contact[$frontField]) || !Validator::length(1, 255)->validate($contact[$frontField])) { $errors[] = ['error' => "Argument {$frontField} is not a string for contact {$key}", 'index' => $key, 'lang' => 'argumentNotString']; continue 2; } @@ -1293,7 +1293,7 @@ class ContactController $contactToCreate = ['creator' => $GLOBALS['id'], 'custom_fields' => []]; foreach ($contactFields as $frontField => $backField) { - if (isset($contact[$frontField])) { + if (!empty($contact[$frontField])) { if (strpos($frontField, 'contactCustomField_') !== false) { $contactToCreate['custom_fields'][$backField] = $contact[$frontField]; } else { @@ -1307,25 +1307,32 @@ class ContactController } else { // If id, then we update the contact $set = ['modification_date' => 'CURRENT_TIMESTAMP', 'custom_fields' => []]; + $customsToRemove = []; foreach ($contactFields as $frontField => $backField) { - if (isset($contact[$frontField])) { + if (!empty($contact[$frontField])) { if (strpos($frontField, 'contactCustomField_') !== false) { $set['custom_fields'][$backField] = $contact[$frontField]; } else { $set[$backField] = $contact[$frontField]; } + } elseif ($contact[$frontField] === false && strpos($frontField, 'contactCustomField_') !== false) { + $customsToRemove[] = $backField; + } elseif ($contact[$frontField] === false && strpos($frontField, 'contactCustomField_') === false) { + $set[$backField] = null; } } - if (empty($set['custom_fields'])) { - unset($set['custom_fields']); - } else { - $oldContact = ContactModel::getById(['id' => $contact['id'], 'select' => ['custom_fields']]); - if (!empty($oldContact['custom_fields'])) { - $set['custom_fields'] = $set['custom_fields'] + json_decode($oldContact['custom_fields'], true); + + $oldContact = ContactModel::getById(['id' => $contact['id'], 'select' => ['custom_fields']]); + if (!empty($oldContact['custom_fields'])) { + $set['custom_fields'] = $set['custom_fields'] + json_decode($oldContact['custom_fields'], true); + } + if (!empty($customsToRemove)) { + foreach ($customsToRemove as $item) { + unset($set['custom_fields'][$item]); } - $set['custom_fields'] = json_encode($set['custom_fields']); } + $set['custom_fields'] = !empty($set['custom_fields']) ? json_encode($set['custom_fields']) : '{}'; if (!empty($set)) { ContactModel::update([ -- GitLab