- Adds global filter to search custom fields
- Updates tests
This commit is contained in:
@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace MailPoet\Models;
|
namespace MailPoet\Models;
|
||||||
|
|
||||||
if (!defined('ABSPATH')) exit;
|
if(!defined('ABSPATH')) exit;
|
||||||
|
|
||||||
class Model extends \Sudzy\ValidModel {
|
class Model extends \Sudzy\ValidModel {
|
||||||
function __construct() {
|
function __construct() {
|
||||||
@ -11,7 +11,6 @@ class Model extends \Sudzy\ValidModel {
|
|||||||
|
|
||||||
function save() {
|
function save() {
|
||||||
$this->setTimestamp();
|
$this->setTimestamp();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
parent::save();
|
parent::save();
|
||||||
return true;
|
return true;
|
||||||
@ -23,8 +22,20 @@ class Model extends \Sudzy\ValidModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private function setTimestamp() {
|
private function setTimestamp() {
|
||||||
if ($this->created_at === null) {
|
if($this->created_at === null) {
|
||||||
$this->created_at = date('Y-m-d H:i:s');
|
$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));
|
||||||
|
}
|
||||||
|
}
|
@ -123,15 +123,14 @@ class Subscriber extends Model {
|
|||||||
return $orm->where('status', $group);
|
return $orm->where('status', $group);
|
||||||
}
|
}
|
||||||
|
|
||||||
static function withCustomFields($orm) {
|
static function filterWithCustomFields($orm) {
|
||||||
$orm = $orm->select(MP_SUBSCRIBERS_TABLE.'.*');
|
$orm = $orm->select(MP_SUBSCRIBERS_TABLE.'.*');
|
||||||
$customFields = CustomField::findArray();
|
$customFields = CustomField::findArray();
|
||||||
foreach ($customFields as $customField) {
|
foreach ($customFields as $customField) {
|
||||||
$orm = $orm->select_expr(
|
$orm = $orm->select_expr(
|
||||||
'IFNULL(GROUP_CONCAT(CASE WHEN ' .
|
'IFNULL(GROUP_CONCAT(CASE WHEN ' .
|
||||||
MP_CUSTOM_FIELDS_TABLE . '.id=' . $customField['id'] . ' THEN ' .
|
MP_CUSTOM_FIELDS_TABLE . '.id=' . $customField['id'] . ' THEN ' .
|
||||||
MP_SUBSCRIBER_CUSTOM_FIELD_TABLE . '.value END), NULL) as ' .
|
MP_SUBSCRIBER_CUSTOM_FIELD_TABLE . '.value END), NULL) as "' . $customField['name'].'"');
|
||||||
$customField['name']);
|
|
||||||
}
|
}
|
||||||
$orm = $orm
|
$orm = $orm
|
||||||
->left_outer_join(
|
->left_outer_join(
|
||||||
@ -253,4 +252,4 @@ class Subscriber extends Model {
|
|||||||
|
|
||||||
return $listing->getSelection()->deleteMany();
|
return $listing->getSelection()->deleteMany();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -119,7 +119,7 @@ class SubscriberCest {
|
|||||||
->findOne();
|
->findOne();
|
||||||
expect($subscriberSegment->id)->equals($segment->id);
|
expect($subscriberSegment->id)->equals($segment->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
function itCanHaveCustomFields() {
|
function itCanHaveCustomFields() {
|
||||||
$customFieldData = array(
|
$customFieldData = array(
|
||||||
'name' => 'DOB',
|
'name' => 'DOB',
|
||||||
@ -133,10 +133,135 @@ class SubscriberCest {
|
|||||||
$association->custom_field_id = $customField->id;
|
$association->custom_field_id = $customField->id;
|
||||||
$association->value = '12/12/2012';
|
$association->value = '12/12/2012';
|
||||||
$association->save();
|
$association->save();
|
||||||
$subscriber = Subscriber::filter('withCustomFields')
|
$subscriber = Subscriber::filter('filterWithCustomFields')
|
||||||
->findOne($this->subscriber->id);
|
->findOne($this->subscriber->id);
|
||||||
expect($subscriber->DOB)->equals($association->value);
|
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() {
|
function itCanCreateOrUpdate() {
|
||||||
$data = array(
|
$data = array(
|
||||||
|
Reference in New Issue
Block a user