Listing Handler

- added a Listing Handler class to take care of listing params
- added status column to Subscriber
- added specific methods to both Newsletter & Subscriber models for listing
This commit is contained in:
Jonathan Labreuille
2015-09-02 14:47:18 +02:00
parent 12a664f44e
commit 3fe895a7fe
7 changed files with 153 additions and 120 deletions

View File

@ -119,7 +119,7 @@ define(
'has-row-actions'
);
var status;
var status = '';
switch(parseInt(subscriber.status, 10)) {
case 1:

View File

@ -44,6 +44,7 @@ class Migrator {
'first_name tinytext NOT NULL,',
'last_name tinytext NOT NULL,',
'email varchar(150) NOT NULL,',
'status tinyint(1) NOT NULL DEFAULT 0,',
'created_at TIMESTAMP NOT NULL DEFAULT 0,',
'updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,',
'PRIMARY KEY (id),',

65
lib/Listing/Handler.php Normal file
View File

@ -0,0 +1,65 @@
<?php
namespace MailPoet\Listing;
if(!defined('ABSPATH')) exit;
class Handler {
private $data = array();
private $model = null;
function __construct($model, $data = array()) {
$this->model = $this->getModel($model);
$this->data = array(
// pagination
'offset' => (isset($data['offset']) ? (int)$data['offset'] : 0),
'limit' => (isset($data['limit']) ? (int)$data['limit'] : 50),
// searching
'search' => (isset($data['search']) ? $data['search'] : null),
// sorting
'sort_by' => (isset($data['sort_by']) ? $data['sort_by'] : 'id'),
'sort_order' => (isset($data['sort_order']) ? $data['sort_order'] : 'asc'),
// grouping
'group' => (isset($data['group']) ? $data['group'] : null)
);
$this->setSearch();
$this->setOrder();
$this->setGroup();
}
private function getModel($model) {
return \Model::factory('\MailPoet\Models\\'.$model);
}
private function setSearch() {
if($this->data['search'] === null) {
return;
}
return $this->model->filter('search', $this->data['search']);
}
private function setOrder() {
return $this->model
->{'order_by_'.$this->data['sort_order']}($this->data['sort_by']);
}
private function setGroup() {
if($this->data['group'] === null) {
return;
}
return $this->model->filter('group', $this->data['group']);
}
function get() {
return array(
'count' => $this->model->count(),
'filters' => [],
'groups' => $this->model->filter('groups'),
'items' => $this->model
->offset($this->data['offset'])
->limit($this->data['limit'])
->find_array()
);
}
}

View File

@ -18,4 +18,21 @@ class Newsletter extends Model {
'isString' => 'body_is_not_string'
));
}
static function search($orm, $search = '') {
return $orm->where_like('subject', '%'.$search.'%');
}
static function groups() {
return array(
array(
'name' => 'all',
'label' => __('All'),
'count' => Newsletter::count()
)
);
}
static function group($orm, $group = null) {
}
}

View File

@ -5,6 +5,7 @@ if (!defined('ABSPATH')) exit;
class Subscriber extends Model {
public static $_table = MP_SUBSCRIBERS_TABLE;
const STATE_SUBSCRIBED = 1;
const STATE_UNCONFIRMED = 0;
const STATE_UNSUBSCRIBED = -1;
@ -17,4 +18,61 @@ class Subscriber extends Model {
'isEmail' => __('Your email address is invalid.')
));
}
static function search($orm, $search = '') {
return $orm->where_raw(
'(`email` LIKE ? OR `first_name` LIKE ? OR `last_name` LIKE ?)',
array('%'.$search.'%', '%'.$search.'%', '%'.$search.'%')
);
}
static function groups() {
return array(
array(
'name' => 'all',
'label' => __('All'),
'count' => Subscriber::count()
),
array(
'name' => 'subscribed',
'label' => __('Subscribed'),
'count' => Subscriber::where(
'status',
Subscriber::STATE_SUBSCRIBED
)->count()
),
array(
'name' => 'unconfirmed',
'label' => __('Unconfirmed'),
'count' => Subscriber::where(
'status',
Subscriber::STATE_UNCONFIRMED
)->count()
),
array(
'name' => 'unsubscribed',
'label' => __('Unsubscribed'),
'count' => Subscriber::where(
'status',
Subscriber::STATE_UNSUBSCRIBED
)->count()
)
);
}
static function group($orm, $group = null) {
switch($group) {
case 'subscribed':
return $orm->where('status', Subscriber::STATE_SUBSCRIBED);
break;
case 'unconfirmed':
return $orm->where('status', Subscriber::STATE_UNCONFIRMED);
break;
case 'unsubscribed':
return $orm->where('status', Subscriber::STATE_UNSUBSCRIBED);
break;
}
}
}

View File

@ -1,7 +1,9 @@
<?php
namespace MailPoet\Router;
use \MailPoet\Models\Newsletter;
use \MailPoet\Models\Subscriber;
use \MailPoet\Mailer\Bridge;
use \MailPoet\Listing;
if(!defined('ABSPATH')) exit;
@ -10,47 +12,8 @@ class Newsletters {
}
function get($data = array()) {
// pagination
$offset = (isset($data['offset']) ? (int)$data['offset'] : 0);
$limit = (isset($data['limit']) ? (int)$data['limit'] : 50);
// searching
$search = (isset($data['search']) ? $data['search'] : null);
// sorting
$sort_by = (isset($data['sort_by']) ? $data['sort_by'] : 'id');
$sort_order = (isset($data['sort_order']) ? $data['sort_order'] : 'asc');
// grouping
$group = (isset($data['group']) ? $data['group'] : null);
$groups = array(
array(
'name' => 'all',
'label' => __('All'),
'count' => Newsletter::count()
)
);
// instantiate subscriber collection
$collection = Newsletter::{'order_by_'.$sort_order}($sort_by);
// handle search
if($search !== null) {
$collection->where_like('subject', '%'.$search.'%');
}
// handle filters
$filters = array();
// return result
$collection = array(
'count' => $collection->count(),
'filters' => $filters,
'groups' => $groups,
'items' => $collection
->offset($offset)
->limit($limit)
->find_array()
);
wp_send_json($collection);
$listing = new Listing\Handler('Newsletter', $data);
wp_send_json($listing->get());
}
function getAll() {
@ -80,7 +43,7 @@ class Newsletters {
function send($id) {
$newsletter = Newsletter::find_one($id)->as_array();
$subscribers = Newsletter::find_array();
$subscribers = Subscriber::find_array();
$mailer = new Bridge($newsletter, $subscribers);
wp_send_json($mailer->send());
}

View File

@ -1,6 +1,7 @@
<?php
namespace MailPoet\Router;
use \MailPoet\Models\Subscriber;
use \MailPoet\Listing;
if(!defined('ABSPATH')) exit;
@ -9,80 +10,8 @@ class Subscribers {
}
function get($data = array()) {
// pagination
$offset = (isset($data['offset']) ? (int)$data['offset'] : 0);
$limit = (isset($data['limit']) ? (int)$data['limit'] : 50);
// searching
$search = (isset($data['search']) ? $data['search'] : null);
// sorting
$sort_by = (isset($data['sort_by']) ? $data['sort_by'] : 'id');
$sort_order = (isset($data['sort_order']) ? $data['sort_order'] : 'asc');
// grouping
$group = (isset($data['group']) ? $data['group'] : null);
$groups = array(
array(
'name' => 'all',
'label' => __('All'),
'count' => Subscriber::count()
),
array(
'name' => 'subscribed',
'label' => __('Subscribed'),
'count' => Subscriber::where('status', Subscriber::STATE_SUBSCRIBED)->count()
),
array(
'name' => 'unconfirmed',
'label' => __('Unconfirmed'),
'count' => Subscriber::where('status', Subscriber::STATE_UNCONFIRMED)->count()
),
array(
'name' => 'unsubscribed',
'label' => __('Unsubscribed'),
'count' => Subscriber::where('status', Subscriber::STATE_UNSUBSCRIBED)->count()
)
);
// instantiate subscriber collection
$collection = Subscriber::{'order_by_'.$sort_order}($sort_by);
// handle group
switch($group) {
case 'subscribed':
$collection = $collection->where('status', Subscriber::STATE_SUBSCRIBED);
break;
case 'unconfirmed':
$collection = $collection->where('status', Subscriber::STATE_UNCONFIRMED);
break;
case 'unsubscribed':
$collection = $collection->where('status', Subscriber::STATE_UNSUBSCRIBED);
break;
}
// handle search
if($search !== null) {
$collection->where_raw(
'(`email` LIKE ? OR `first_name` LIKE ? OR `last_name` LIKE ?)',
array('%'.$search.'%', '%'.$search.'%', '%'.$search.'%')
);
}
// handle filters
$filters = array();
// return result
$collection = array(
'count' => $collection->count(),
'filters' => $filters,
'groups' => $groups,
'items' => $collection
->offset($offset)
->limit($limit)
->find_array()
);
wp_send_json($collection);
$listing = new Listing\Handler('Subscriber', $data);
wp_send_json($listing->get());
}
function getAll() {