diff --git a/lib/Models/Model.php b/lib/Models/Model.php index 6528d23f6b..117e5b03f5 100644 --- a/lib/Models/Model.php +++ b/lib/Models/Model.php @@ -1,7 +1,7 @@ setTimestamp(); - try { parent::save(); return true; @@ -23,8 +22,20 @@ class Model extends \Sudzy\ValidModel { } private function setTimestamp() { - if ($this->created_at === null) { + if($this->created_at === null) { $this->created_at = date('Y-m-d H:i:s'); } } -} + + static function filterSearchCustomFields($orm, $searchCriteria = array(), $searchCondition = 'AND', $searchSymbol = '=') { + $havingFields = array_filter( + array_map(function ($customField) use ($searchSymbol) { + return sprintf('`%s` %s ?', $customField['name'], $searchSymbol); + }, $searchCriteria) + ); + $havingValues = array_map(function ($customField) use ($searchSymbol) { + return (strtolower($searchSymbol) === 'like') ? '%' . $customField['value'] . '%' : $customField['value']; + }, $searchCriteria); + return $orm->having_raw(implode(' ' . $searchCondition . ' ', $havingFields), array_values($havingValues)); + } +} \ No newline at end of file diff --git a/lib/Models/Subscriber.php b/lib/Models/Subscriber.php index 33909beaad..0710a94f4e 100644 --- a/lib/Models/Subscriber.php +++ b/lib/Models/Subscriber.php @@ -123,15 +123,14 @@ class Subscriber extends Model { return $orm->where('status', $group); } - static function withCustomFields($orm) { + static function filterWithCustomFields($orm) { $orm = $orm->select(MP_SUBSCRIBERS_TABLE.'.*'); $customFields = CustomField::findArray(); foreach ($customFields as $customField) { $orm = $orm->select_expr( 'IFNULL(GROUP_CONCAT(CASE WHEN ' . MP_CUSTOM_FIELDS_TABLE . '.id=' . $customField['id'] . ' THEN ' . - MP_SUBSCRIBER_CUSTOM_FIELD_TABLE . '.value END), NULL) as ' . - $customField['name']); + MP_SUBSCRIBER_CUSTOM_FIELD_TABLE . '.value END), NULL) as "' . $customField['name'].'"'); } $orm = $orm ->left_outer_join( @@ -253,4 +252,4 @@ class Subscriber extends Model { return $listing->getSelection()->deleteMany(); } -} +} \ No newline at end of file diff --git a/tests/unit/Models/SubscriberCest.php b/tests/unit/Models/SubscriberCest.php index 5edd44ada9..eea973e8ee 100644 --- a/tests/unit/Models/SubscriberCest.php +++ b/tests/unit/Models/SubscriberCest.php @@ -119,7 +119,7 @@ class SubscriberCest { ->findOne(); expect($subscriberSegment->id)->equals($segment->id); } - + function itCanHaveCustomFields() { $customFieldData = array( 'name' => 'DOB', @@ -133,10 +133,135 @@ class SubscriberCest { $association->custom_field_id = $customField->id; $association->value = '12/12/2012'; $association->save(); - $subscriber = Subscriber::filter('withCustomFields') + $subscriber = Subscriber::filter('filterWithCustomFields') ->findOne($this->subscriber->id); expect($subscriber->DOB)->equals($association->value); } + + function itCanFilterCustomFields() { + $customFieldData = array( + array( + 'name' => 'City', + 'type' => 'text', + ), + array( + 'name' => 'Country', + 'type' => 'text', + ) + ); + foreach ($customFieldData as $data) { + $customField = CustomField::create(); + $customField->hydrate($data); + $customField->save(); + $createdCustomFields[] = $customField->asArray(); + } + $subscriberCustomFieldData = array( + array( + 'subscriber_id' => $this->subscriber->id, + 'custom_field_id' => $createdCustomFields[0]['id'], + 'value' => 'Paris' + ), + array( + 'subscriber_id' => $this->subscriber->id, + 'custom_field_id' => $createdCustomFields[1]['id'], + 'value' => 'France' + ) + ); + foreach ($subscriberCustomFieldData as $data) { + $association = SubscriberCustomField::create(); + $association->hydrate($data); + $association->save(); + $createdAssociations[] = $association->asArray(); + } + $subscriber = Subscriber::filter('filterWithCustomFields') + ->filter('filterSearchCustomFields', array( + array( + 'name' => 'City', + 'value' => 'Paris' + ) + )) + ->findArray(); + expect(empty($subscriber))->false(); + $subscriber = Subscriber::filter('filterWithCustomFields') + ->filter('filterSearchCustomFields', array( + array( + 'name' => 'City', + 'value' => 'Paris' + ), + array( + 'name' => 'Country', + 'value' => 'France' + ) + )) + ->findArray(); + expect(empty($subscriber))->false(); + $subscriber = Subscriber::filter('filterWithCustomFields') + ->filter('filterSearchCustomFields', array( + array( + 'name' => 'City', + 'value' => 'Paris' + ), + array( + 'name' => 'Country', + 'value' => 'Russia' + ) + ), 'OR') + ->findArray(); + expect(empty($subscriber))->false(); + $subscriber = Subscriber::filter('filterWithCustomFields') + ->filter('filterSearchCustomFields', array( + array( + 'name' => 'City', + 'value' => 'is' + ) + ), 'AND', 'LIKE') + ->findArray(); + expect(empty($subscriber))->false(); + $subscriber = Subscriber::filter('filterWithCustomFields') + ->filter('filterSearchCustomFields', array( + array( + 'name' => 'City', + 'value' => 'Moscow' + ) + )) + ->findArray(); + expect(empty($subscriber))->true(); + $subscriber = Subscriber::filter('filterWithCustomFields') + ->filter('filterSearchCustomFields', array( + array( + 'name' => 'City', + 'value' => 'Paris' + ), + array( + 'name' => 'Country', + 'value' => 'Russia' + ) + )) + ->findArray(); + expect(empty($subscriber))->true(); + $subscriber = Subscriber::filter('filterWithCustomFields') + ->filter('filterSearchCustomFields', array( + array( + 'name' => 'City', + 'value' => 'Moscow' + ), + array( + 'name' => 'Country', + 'value' => 'Russia' + ) + ), 'OR') + ->findArray(); + expect(empty($subscriber))->true(); + $subscriber = Subscriber::filter('filterWithCustomFields') + ->filter('filterSearchCustomFields', array( + array( + 'name' => 'City', + 'value' => 'zz' + ) + ), 'AND', 'LIKE') + ->findArray(); + expect(empty($subscriber))->true(); + } function itCanCreateOrUpdate() { $data = array(