deleted_at) && strlen(trim($this->deleted_at)) === 0) { $this->set_expr('deleted_at', 'NULL'); } return parent::save(); } function delete() { // delete all relations to segments NewsletterSegment::where('newsletter_id', $this->id)->deleteMany(); return parent::delete(); } function segments() { return $this->has_many_through( __NAMESPACE__.'\Segment', __NAMESPACE__.'\NewsletterSegment', 'newsletter_id', 'segment_id' ); } function options() { return $this->has_many_through( __NAMESPACE__.'\NewsletterOptionField', __NAMESPACE__.'\NewsletterOption', 'newsletter_id', 'option_field_id' )->select_expr(MP_NEWSLETTER_OPTION_TABLE.'.value'); } function getQueue() { return SendingQueue::where('newsletter_id', $this->id) ->orderByDesc('updated_at') ->findOne(); } static function search($orm, $search = '') { return $orm->where_like('subject', '%' . $search . '%'); } static function filters() { $segments = Segment::orderByAsc('name')->findMany(); $segment_list = array(); $segment_list[] = array( 'label' => __('All lists'), 'value' => '' ); foreach($segments as $segment) { $newsletters_count = $segment->newsletters()->count(); if($newsletters_count > 0) { $segment_list[] = array( 'label' => sprintf('%s (%d)', $segment->name, $newsletters_count), 'value' => $segment->id() ); } } $filters = array( 'segment' => $segment_list ); return $filters; } static function filterBy($orm, $filters = null) { if(empty($filters)) { return $orm; } foreach($filters as $key => $value) { if($key === 'segment') { $segment = Segment::findOne($value); if($segment !== false) { $orm = $segment->newsletters(); } } } return $orm; } static function filterWithOptions($orm) { $orm = $orm->select(MP_NEWSLETTERS_TABLE.'.*'); $optionFields = NewsletterOptionField::findArray(); foreach ($optionFields as $optionField) { $orm = $orm->select_expr( 'IFNULL(GROUP_CONCAT(CASE WHEN ' . MP_NEWSLETTER_OPTION_FIELDS_TABLE . '.id=' . $optionField['id'] . ' THEN ' . MP_NEWSLETTER_OPTION_TABLE . '.value END), NULL) as "' . $optionField['name'].'"'); } $orm = $orm ->left_outer_join( MP_NEWSLETTER_OPTION_TABLE, array(MP_NEWSLETTERS_TABLE.'.id', '=', MP_NEWSLETTER_OPTION_TABLE.'.newsletter_id')) ->left_outer_join( MP_NEWSLETTER_OPTION_FIELDS_TABLE, array(MP_NEWSLETTER_OPTION_FIELDS_TABLE.'.id','=', MP_NEWSLETTER_OPTION_TABLE.'.option_field_id')) ->group_by(MP_NEWSLETTERS_TABLE.'.id'); return $orm; } static function groups() { return array( array( 'name' => 'all', 'label' => __('All'), 'count' => Newsletter::getPublished()->count() ), array( 'name' => 'trash', 'label' => __('Trash'), 'count' => Newsletter::getTrashed()->count() ) ); } static function groupBy($orm, $group = null) { if($group === 'trash') { return $orm->whereNotNull('deleted_at'); } return $orm->whereNull('deleted_at'); } static function createOrUpdate($data = array()) { $newsletter = false; if(isset($data['id']) && (int)$data['id'] > 0) { $newsletter = self::findOne((int)$data['id']); } if($newsletter === false) { $newsletter = self::create(); $newsletter->hydrate($data); } else { unset($data['id']); $newsletter->set($data); } $newsletter->save(); return $newsletter; } }