Completed
Branch BUG/fix-table-exists-query (b2f8d0)
by
unknown
08:37 queued 43s
created
core/db_classes/EE_Answer.class.php 2 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -61,7 +61,7 @@
 block discarded – undo
61 61
      *    Set Answer value
62 62
      *
63 63
      * @access        public
64
-     * @param mixed $ANS_value
64
+     * @param string $ANS_value
65 65
      */
66 66
     public function set_value($ANS_value = '')
67 67
     {
Please login to merge, or discard this patch.
Indentation   +138 added lines, -138 removed lines patch added patch discarded remove patch
@@ -10,144 +10,144 @@
 block discarded – undo
10 10
 class EE_Answer extends EE_Base_Class
11 11
 {
12 12
 
13
-    /**
14
-     *
15
-     * @param array $props_n_values
16
-     * @return EE_Answer
17
-     */
18
-    public static function new_instance($props_n_values = array())
19
-    {
20
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__);
21
-        return $has_object ? $has_object : new self($props_n_values);
22
-    }
23
-
24
-
25
-    /**
26
-     *
27
-     * @param array $props_n_values
28
-     * @return EE_Answer
29
-     */
30
-    public static function new_instance_from_db($props_n_values = array())
31
-    {
32
-        return new self($props_n_values, true);
33
-    }
34
-
35
-
36
-    /**
37
-     *    Set Question ID
38
-     *
39
-     * @access        public
40
-     * @param int $QST_ID
41
-     */
42
-    public function set_question($QST_ID = 0)
43
-    {
44
-        $this->set('QST_ID', $QST_ID);
45
-    }
46
-
47
-
48
-    /**
49
-     *    Set Registration ID
50
-     *
51
-     * @access        public
52
-     * @param int $REG_ID
53
-     */
54
-    public function set_registration($REG_ID = 0)
55
-    {
56
-        $this->set('REG_ID', $REG_ID);
57
-    }
58
-
59
-
60
-    /**
61
-     *    Set Answer value
62
-     *
63
-     * @access        public
64
-     * @param mixed $ANS_value
65
-     */
66
-    public function set_value($ANS_value = '')
67
-    {
68
-        $this->set('ANS_value', $ANS_value);
69
-    }
70
-
71
-
72
-    /**
73
-     *    get Attendee First Name
74
-     *
75
-     * @access        public
76
-     * @return        int
77
-     */
78
-    public function registration_ID()
79
-    {
80
-        return $this->get('REG_ID');
81
-    }
82
-
83
-
84
-    /**
85
-     *    get Attendee Last Name
86
-     *
87
-     * @access        public
88
-     * @return        int
89
-     */
90
-    public function question_ID()
91
-    {
92
-        return $this->get('QST_ID');
93
-    }
94
-
95
-
96
-    /**
97
-     *    get Attendee Address
98
-     *
99
-     * @access        public
100
-     * @return        string
101
-     */
102
-    public function value()
103
-    {
104
-        return $this->get('ANS_value');
105
-    }
106
-
107
-
108
-    /**
109
-     * Gets a pretty form of the value (mostly applies to answers that have multiple answers)
110
-     *
111
-     * @param null $schema
112
-     * @return string
113
-     */
114
-    public function pretty_value($schema = null)
115
-    {
116
-        return $this->get_pretty('ANS_value', $schema);
117
-    }
118
-
119
-
120
-    /**
121
-     * Echoes out a pretty value (even for multi-choice options)
122
-     *
123
-     * @param string $schema
124
-     */
125
-    public function e_value($schema = null)
126
-    {
127
-        $this->e('ANS_value', $schema);
128
-    }
129
-
130
-
131
-    /**
132
-     * Gets the related EE_Question to this EE_Answer
133
-     *
134
-     * @return EE_Question
135
-     */
136
-    public function question()
137
-    {
138
-        return $this->get_first_related('Question');
139
-    }
140
-
141
-
142
-    /**
143
-     * Gets the related EE_Registration to this EE_Answer
144
-     *
145
-     * @return EE_Registration
146
-     */
147
-    public function registration()
148
-    {
149
-        return $this->get_first_related('Registration');
150
-    }
13
+	/**
14
+	 *
15
+	 * @param array $props_n_values
16
+	 * @return EE_Answer
17
+	 */
18
+	public static function new_instance($props_n_values = array())
19
+	{
20
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__);
21
+		return $has_object ? $has_object : new self($props_n_values);
22
+	}
23
+
24
+
25
+	/**
26
+	 *
27
+	 * @param array $props_n_values
28
+	 * @return EE_Answer
29
+	 */
30
+	public static function new_instance_from_db($props_n_values = array())
31
+	{
32
+		return new self($props_n_values, true);
33
+	}
34
+
35
+
36
+	/**
37
+	 *    Set Question ID
38
+	 *
39
+	 * @access        public
40
+	 * @param int $QST_ID
41
+	 */
42
+	public function set_question($QST_ID = 0)
43
+	{
44
+		$this->set('QST_ID', $QST_ID);
45
+	}
46
+
47
+
48
+	/**
49
+	 *    Set Registration ID
50
+	 *
51
+	 * @access        public
52
+	 * @param int $REG_ID
53
+	 */
54
+	public function set_registration($REG_ID = 0)
55
+	{
56
+		$this->set('REG_ID', $REG_ID);
57
+	}
58
+
59
+
60
+	/**
61
+	 *    Set Answer value
62
+	 *
63
+	 * @access        public
64
+	 * @param mixed $ANS_value
65
+	 */
66
+	public function set_value($ANS_value = '')
67
+	{
68
+		$this->set('ANS_value', $ANS_value);
69
+	}
70
+
71
+
72
+	/**
73
+	 *    get Attendee First Name
74
+	 *
75
+	 * @access        public
76
+	 * @return        int
77
+	 */
78
+	public function registration_ID()
79
+	{
80
+		return $this->get('REG_ID');
81
+	}
82
+
83
+
84
+	/**
85
+	 *    get Attendee Last Name
86
+	 *
87
+	 * @access        public
88
+	 * @return        int
89
+	 */
90
+	public function question_ID()
91
+	{
92
+		return $this->get('QST_ID');
93
+	}
94
+
95
+
96
+	/**
97
+	 *    get Attendee Address
98
+	 *
99
+	 * @access        public
100
+	 * @return        string
101
+	 */
102
+	public function value()
103
+	{
104
+		return $this->get('ANS_value');
105
+	}
106
+
107
+
108
+	/**
109
+	 * Gets a pretty form of the value (mostly applies to answers that have multiple answers)
110
+	 *
111
+	 * @param null $schema
112
+	 * @return string
113
+	 */
114
+	public function pretty_value($schema = null)
115
+	{
116
+		return $this->get_pretty('ANS_value', $schema);
117
+	}
118
+
119
+
120
+	/**
121
+	 * Echoes out a pretty value (even for multi-choice options)
122
+	 *
123
+	 * @param string $schema
124
+	 */
125
+	public function e_value($schema = null)
126
+	{
127
+		$this->e('ANS_value', $schema);
128
+	}
129
+
130
+
131
+	/**
132
+	 * Gets the related EE_Question to this EE_Answer
133
+	 *
134
+	 * @return EE_Question
135
+	 */
136
+	public function question()
137
+	{
138
+		return $this->get_first_related('Question');
139
+	}
140
+
141
+
142
+	/**
143
+	 * Gets the related EE_Registration to this EE_Answer
144
+	 *
145
+	 * @return EE_Registration
146
+	 */
147
+	public function registration()
148
+	{
149
+		return $this->get_first_related('Registration');
150
+	}
151 151
 }
152 152
 
153 153
 /* End of file EE_Answer.class.php */
Please login to merge, or discard this patch.
core/db_classes/EE_CPT_Base.class.php 3 patches
Doc Comments   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -216,7 +216,7 @@  discard block
 block discarded – undo
216 216
      *
217 217
      * @link   http://codex.wordpress.org/Function_Reference/get_the_post_thumbnail
218 218
      * @access protected
219
-     * @param string|array $size (optional) Image size. Defaults to 'post-thumbnail' but can also be a 2-item array
219
+     * @param string $size (optional) Image size. Defaults to 'post-thumbnail' but can also be a 2-item array
220 220
      *                           representing width and height in pixels (i.e. array(32,32) ).
221 221
      * @param string|array $attr Optional. Query string or array of attributes.
222 222
      * @return string HTML image element
@@ -264,7 +264,7 @@  discard block
 block discarded – undo
264 264
      * This is a method for restoring this_obj using details from the given $revision_id
265 265
      *
266 266
      * @param int   $revision_id       ID of the revision we're getting data from
267
-     * @param array $related_obj_names if included this will be used to restore for related obj
267
+     * @param string[] $related_obj_names if included this will be used to restore for related obj
268 268
      *                                 if not included then we just do restore on the meta.
269 269
      *                                 We will accept an array of related_obj_names for restoration here.
270 270
      * @param array $where_query       You can optionally include an array of key=>value pairs
@@ -320,7 +320,7 @@  discard block
 block discarded – undo
320 320
      *
321 321
      * @param string  $meta_key
322 322
      * @param boolean $single
323
-     * @return mixed <ul><li>If only $id is set it will return all meta values in an associative array.</li>
323
+     * @return string|null <ul><li>If only $id is set it will return all meta values in an associative array.</li>
324 324
      * <li>If $single is set to false, or left blank, the function returns an array containing all values of the
325 325
      * specified key.</li>
326 326
      * <li>If $single is set to true, the function returns the first value of the specified key (not in an
@@ -354,8 +354,8 @@  discard block
 block discarded – undo
354 354
     /**
355 355
      * Wrapper for add_post_meta, http://codex.wordpress.org/Function_Reference/add_post_meta
356 356
      *
357
-     * @param mixed $meta_key
358
-     * @param mixed $meta_value
357
+     * @param string $meta_key
358
+     * @param string $meta_value
359 359
      * @param bool  $unique . If postmeta for this $meta_key already exists, whether to add an additional item or not
360 360
      * @return boolean Boolean true, except if the $unique argument was set to true and a custom field with the given
361 361
      *                 key already exists, in which case false is returned.
@@ -372,7 +372,7 @@  discard block
 block discarded – undo
372 372
     /**
373 373
      * Wrapper for delete_post_meta, http://codex.wordpress.org/Function_Reference/delete_post_meta
374 374
      *
375
-     * @param mixed $meta_key
375
+     * @param string $meta_key
376 376
      * @param mixed $meta_value
377 377
      * @return boolean False for failure. True for success.
378 378
      */
@@ -402,7 +402,7 @@  discard block
 block discarded – undo
402 402
      * Gets all the term-taxonomies for this CPT
403 403
      *
404 404
      * @param array $query_params
405
-     * @return EE_Term_Taxonomy
405
+     * @return EE_Base_Class[]
406 406
      */
407 407
     public function term_taxonomies($query_params = array())
408 408
     {
Please login to merge, or discard this patch.
Indentation   +425 added lines, -425 removed lines patch added patch discarded remove patch
@@ -14,429 +14,429 @@
 block discarded – undo
14 14
 abstract class EE_CPT_Base extends EE_Soft_Delete_Base_Class
15 15
 {
16 16
 
17
-    /**
18
-     * This is a property for holding cached feature images on CPT objects.  Cache's are set on the first
19
-     * "feature_image()" method call.  Each key in the array corresponds to the requested size.
20
-     *
21
-     * @var array
22
-     */
23
-    protected $_feature_image = array();
24
-
25
-    /**
26
-     * @var WP_Post the WP_Post that corresponds with this CPT model object
27
-     */
28
-    protected $_wp_post;
29
-
30
-
31
-    abstract public function wp_user();
32
-
33
-
34
-    /**
35
-     * Returns the WP post associated with this CPT model object. If this CPT is saved, fetches it
36
-     * from the DB. Otherwise, create an unsaved WP_POst object. Caches the post internally.
37
-     *
38
-     * @return WP_Post
39
-     */
40
-    public function wp_post()
41
-    {
42
-        global $wpdb;
43
-        if (! $this->_wp_post instanceof WP_Post) {
44
-            if ($this->ID()) {
45
-                $this->_wp_post = get_post($this->ID());
46
-            } else {
47
-                $simulated_db_result = new stdClass();
48
-                foreach ($this->get_model()->field_settings(true) as $field_name => $field_obj) {
49
-                    if ($this->get_model()->get_table_obj_by_alias($field_obj->get_table_alias())->get_table_name()
50
-                        === $wpdb->posts
51
-                    ) {
52
-                        $column = $field_obj->get_table_column();
53
-
54
-                        if ($field_obj instanceof EE_Datetime_Field) {
55
-                            $value_on_model_obj = $this->get_DateTime_object($field_name);
56
-                        } elseif ($field_obj->is_db_only_field()) {
57
-                            $value_on_model_obj = $field_obj->get_default_value();
58
-                        } else {
59
-                            $value_on_model_obj = $this->get_raw($field_name);
60
-                        }
61
-                        $simulated_db_result->{$column} = $field_obj->prepare_for_use_in_db($value_on_model_obj);
62
-                    }
63
-                }
64
-                $this->_wp_post = new WP_Post($simulated_db_result);
65
-            }
66
-            // and let's make retrieving the EE CPT object easy too
67
-            $classname = get_class($this);
68
-            if (! isset($this->_wp_post->{$classname})) {
69
-                $this->_wp_post->{$classname} = $this;
70
-            }
71
-        }
72
-        return $this->_wp_post;
73
-    }
74
-
75
-    /**
76
-     * When fetching a new value for a post field that uses the global $post for rendering,
77
-     * set the global $post temporarily to be this model object; and afterwards restore it
78
-     *
79
-     * @param string $fieldname
80
-     * @param bool   $pretty
81
-     * @param string $extra_cache_ref
82
-     * @return mixed
83
-     */
84
-    protected function _get_fresh_property($fieldname, $pretty = false, $extra_cache_ref = null)
85
-    {
86
-        global $post;
87
-
88
-        if ($pretty
89
-            && (
90
-                ! (
91
-                    $post instanceof WP_Post
92
-                    && $post->ID
93
-                )
94
-                || (int) $post->ID !== $this->ID()
95
-            )
96
-            && $this->get_model()->field_settings_for($fieldname) instanceof EE_Post_Content_Field) {
97
-            $old_post = $post;
98
-            $post = $this->wp_post();
99
-            $return_value = parent::_get_fresh_property($fieldname, $pretty, $extra_cache_ref);
100
-            $post = $old_post;
101
-        } else {
102
-            $return_value = parent::_get_fresh_property($fieldname, $pretty, $extra_cache_ref);
103
-        }
104
-        return $return_value;
105
-    }
106
-
107
-    /**
108
-     * Adds to the specified event category. If it category doesn't exist, creates it.
109
-     *
110
-     * @param string $category_name
111
-     * @param string $category_description    optional
112
-     * @param int    $parent_term_taxonomy_id optional
113
-     * @return EE_Term_Taxonomy
114
-     */
115
-    public function add_event_category($category_name, $category_description = null, $parent_term_taxonomy_id = null)
116
-    {
117
-        return $this->get_model()->add_event_category(
118
-            $this,
119
-            $category_name,
120
-            $category_description,
121
-            $parent_term_taxonomy_id
122
-        );
123
-    }
124
-
125
-
126
-    /**
127
-     * Removes the event category by specified name from being related ot this event
128
-     *
129
-     * @param string $category_name
130
-     * @return bool
131
-     */
132
-    public function remove_event_category($category_name)
133
-    {
134
-        return $this->get_model()->remove_event_category($this, $category_name);
135
-    }
136
-
137
-
138
-    /**
139
-     * Removes the relation to the specified term taxonomy, and maintains the
140
-     * data integrity of the term taxonomy provided
141
-     *
142
-     * @param EE_Term_Taxonomy $term_taxonomy
143
-     * @return EE_Base_Class the relation was removed from
144
-     */
145
-    public function remove_relation_to_term_taxonomy($term_taxonomy)
146
-    {
147
-        if (! $term_taxonomy) {
148
-            EE_Error::add_error(
149
-                sprintf(
150
-                    __(
151
-                        "No Term_Taxonomy provided which to remove from model object of type %s and id %d",
152
-                        "event_espresso"
153
-                    ),
154
-                    get_class($this),
155
-                    $this->ID()
156
-                ),
157
-                __FILE__,
158
-                __FUNCTION__,
159
-                __LINE__
160
-            );
161
-            return null;
162
-        }
163
-        $term_taxonomy->set_count($term_taxonomy->count() - 1);
164
-        $term_taxonomy->save();
165
-        return $this->_remove_relation_to($term_taxonomy, 'Term_Taxonomy');
166
-    }
167
-
168
-
169
-    /**
170
-     * The main purpose of this method is to return the post type for the model object
171
-     *
172
-     * @access public
173
-     * @return string
174
-     */
175
-    public function post_type()
176
-    {
177
-        return $this->get_model()->post_type();
178
-    }
179
-
180
-
181
-    /**
182
-     * The main purpose of this method is to return the parent for the model object
183
-     *
184
-     * @access public
185
-     * @return int
186
-     */
187
-    public function parent()
188
-    {
189
-        return $this->get('parent');
190
-    }
191
-
192
-
193
-    /**
194
-     * return the _status property
195
-     *
196
-     * @return string
197
-     */
198
-    public function status()
199
-    {
200
-        return $this->get('status');
201
-    }
202
-
203
-
204
-    /**
205
-     * @param string $status
206
-     */
207
-    public function set_status($status)
208
-    {
209
-        $this->set('status', $status);
210
-    }
211
-
212
-
213
-    /**
214
-     * This calls the equivalent model method for retrieving the feature image which in turn is a wrapper for
215
-     * WordPress' get_the_post_thumbnail() function.
216
-     *
217
-     * @link   http://codex.wordpress.org/Function_Reference/get_the_post_thumbnail
218
-     * @access protected
219
-     * @param string|array $size (optional) Image size. Defaults to 'post-thumbnail' but can also be a 2-item array
220
-     *                           representing width and height in pixels (i.e. array(32,32) ).
221
-     * @param string|array $attr Optional. Query string or array of attributes.
222
-     * @return string HTML image element
223
-     */
224
-    protected function _get_feature_image($size, $attr)
225
-    {
226
-        // first let's see if we already have the _feature_image property set AND if it has a cached element on it FOR the given size
227
-        $attr_key = is_array($attr) ? implode('_', $attr) : $attr;
228
-        $cache_key = is_array($size) ? implode('_', $size) . $attr_key : $size . $attr_key;
229
-        $this->_feature_image[ $cache_key ] = isset($this->_feature_image[ $cache_key ])
230
-            ? $this->_feature_image[ $cache_key ] : $this->get_model()->get_feature_image($this->ID(), $size, $attr);
231
-        return $this->_feature_image[ $cache_key ];
232
-    }
233
-
234
-
235
-    /**
236
-     * See _get_feature_image. Returns the HTML to display a featured image
237
-     *
238
-     * @param string       $size
239
-     * @param string|array $attr
240
-     * @return string of html
241
-     */
242
-    public function feature_image($size = 'thumbnail', $attr = '')
243
-    {
244
-        return $this->_get_feature_image($size, $attr);
245
-    }
246
-
247
-
248
-    /**
249
-     * This uses the wp "wp_get_attachment_image_src()" function to return the feature image for the current class
250
-     * using the given size params.
251
-     *
252
-     * @param  string|array $size can either be a string: 'thumbnail', 'medium', 'large', 'full' OR 2-item array
253
-     *                            representing width and height in pixels eg. array(32,32).
254
-     * @return string|boolean          the url of the image or false if not found
255
-     */
256
-    public function feature_image_url($size = 'thumbnail')
257
-    {
258
-        $attachment = wp_get_attachment_image_src(get_post_thumbnail_id($this->ID()), $size);
259
-        return ! empty($attachment) ? $attachment[0] : false;
260
-    }
261
-
262
-
263
-    /**
264
-     * This is a method for restoring this_obj using details from the given $revision_id
265
-     *
266
-     * @param int   $revision_id       ID of the revision we're getting data from
267
-     * @param array $related_obj_names if included this will be used to restore for related obj
268
-     *                                 if not included then we just do restore on the meta.
269
-     *                                 We will accept an array of related_obj_names for restoration here.
270
-     * @param array $where_query       You can optionally include an array of key=>value pairs
271
-     *                                 that allow you to further constrict the relation to being added.
272
-     *                                 However, keep in mind that the columns (keys) given
273
-     *                                 must match a column on the JOIN table and currently
274
-     *                                 only the HABTM models accept these additional conditions.
275
-     *                                 Also remember that if an exact match isn't found for these extra cols/val pairs,
276
-     *                                 then a NEW row is created in the join table.
277
-     *                                 This array is INDEXED by RELATED OBJ NAME (so it corresponds with the obj_names
278
-     *                                 sent);
279
-     * @return void
280
-     */
281
-    public function restore_revision($revision_id, $related_obj_names = array(), $where_query = array())
282
-    {
283
-        // get revision object
284
-        $revision_obj = $this->get_model()->get_one_by_ID($revision_id);
285
-        if ($revision_obj instanceof EE_CPT_Base) {
286
-            // no related_obj_name so we assume we're saving a revision on this object.
287
-            if (empty($related_obj_names)) {
288
-                $fields = $this->get_model()->get_meta_table_fields();
289
-                foreach ($fields as $field) {
290
-                    $this->set($field, $revision_obj->get($field));
291
-                }
292
-                $this->save();
293
-            }
294
-            $related_obj_names = (array) $related_obj_names;
295
-            foreach ($related_obj_names as $related_name) {
296
-                // related_obj_name so we're saving a revision on an object related to this object
297
-                // do we have $where_query params for this related object?  If we do then we include that.
298
-                $cols_n_values = isset($where_query[ $related_name ]) ? $where_query[ $related_name ] : array();
299
-                $where_params = ! empty($cols_n_values) ? array($cols_n_values) : array();
300
-                $related_objs = $this->get_many_related($related_name, $where_params);
301
-                $revision_related_objs = $revision_obj->get_many_related($related_name, $where_params);
302
-                // load helper
303
-                // remove related objs from this object that are not in revision
304
-                // array_diff *should* work cause I think objects are indexed by ID?
305
-                $related_to_remove = EEH_Array::object_array_diff($related_objs, $revision_related_objs);
306
-                foreach ($related_to_remove as $rr) {
307
-                    $this->_remove_relation_to($rr, $related_name, $cols_n_values);
308
-                }
309
-                // add all related objs attached to revision to this object
310
-                foreach ($revision_related_objs as $r_obj) {
311
-                    $this->_add_relation_to($r_obj, $related_name, $cols_n_values);
312
-                }
313
-            }
314
-        }
315
-    }
316
-
317
-
318
-    /**
319
-     * Wrapper for get_post_meta, http://codex.wordpress.org/Function_Reference/get_post_meta
320
-     *
321
-     * @param string  $meta_key
322
-     * @param boolean $single
323
-     * @return mixed <ul><li>If only $id is set it will return all meta values in an associative array.</li>
324
-     * <li>If $single is set to false, or left blank, the function returns an array containing all values of the
325
-     * specified key.</li>
326
-     * <li>If $single is set to true, the function returns the first value of the specified key (not in an
327
-     * array</li></ul>
328
-     */
329
-    public function get_post_meta($meta_key = null, $single = false)
330
-    {
331
-        return get_post_meta($this->ID(), $meta_key, $single);
332
-    }
333
-
334
-
335
-    /**
336
-     * Wrapper for update_post_meta, http://codex.wordpress.org/Function_Reference/update_post_meta
337
-     *
338
-     * @param string $meta_key
339
-     * @param mixed  $meta_value
340
-     * @param mixed  $prev_value
341
-     * @return mixed Returns meta_id if the meta doesn't exist, otherwise returns true on success and false on failure.
342
-     *               NOTE: If the meta_value passed to this function is the same as the value that is already in the
343
-     *               database, this function returns false.
344
-     */
345
-    public function update_post_meta($meta_key, $meta_value, $prev_value = null)
346
-    {
347
-        if (! $this->ID()) {
348
-            $this->save();
349
-        }
350
-        return update_post_meta($this->ID(), $meta_key, $meta_value, $prev_value);
351
-    }
352
-
353
-
354
-    /**
355
-     * Wrapper for add_post_meta, http://codex.wordpress.org/Function_Reference/add_post_meta
356
-     *
357
-     * @param mixed $meta_key
358
-     * @param mixed $meta_value
359
-     * @param bool  $unique . If postmeta for this $meta_key already exists, whether to add an additional item or not
360
-     * @return boolean Boolean true, except if the $unique argument was set to true and a custom field with the given
361
-     *                 key already exists, in which case false is returned.
362
-     */
363
-    public function add_post_meta($meta_key, $meta_value, $unique = false)
364
-    {
365
-        if ($this->ID()) {
366
-            $this->save();
367
-        }
368
-        return add_post_meta($this->ID(), $meta_key, $meta_value, $unique);
369
-    }
370
-
371
-
372
-    /**
373
-     * Wrapper for delete_post_meta, http://codex.wordpress.org/Function_Reference/delete_post_meta
374
-     *
375
-     * @param mixed $meta_key
376
-     * @param mixed $meta_value
377
-     * @return boolean False for failure. True for success.
378
-     */
379
-    public function delete_post_meta($meta_key, $meta_value = '')
380
-    {
381
-        if (! $this->ID()) {
382
-            // there are obviously no postmetas for this if it's not saved
383
-            // so let's just report this as a success
384
-            return true;
385
-        }
386
-        return delete_post_meta($this->ID(), $meta_key, $meta_value);
387
-    }
388
-
389
-
390
-    /**
391
-     * Gets the URL for viewing this event on the front-end
392
-     *
393
-     * @return string
394
-     */
395
-    public function get_permalink()
396
-    {
397
-        return get_permalink($this->ID());
398
-    }
399
-
400
-
401
-    /**
402
-     * Gets all the term-taxonomies for this CPT
403
-     *
404
-     * @param array $query_params
405
-     * @return EE_Term_Taxonomy
406
-     */
407
-    public function term_taxonomies($query_params = array())
408
-    {
409
-        return $this->get_many_related('Term_Taxonomy', $query_params);
410
-    }
411
-
412
-
413
-    /**
414
-     * @return mixed
415
-     */
416
-    public function get_custom_post_statuses()
417
-    {
418
-        return $this->get_model()->get_custom_post_statuses();
419
-    }
420
-
421
-
422
-    /**
423
-     * @return mixed
424
-     */
425
-    public function get_all_post_statuses()
426
-    {
427
-        return $this->get_model()->get_status_array();
428
-    }
429
-
430
-
431
-    /**
432
-     * Don't serialize the WP Post. That's just duplicate data and we want to avoid recursion
433
-     *
434
-     * @return array
435
-     */
436
-    public function __sleep()
437
-    {
438
-        $properties_to_serialize = parent::__sleep();
439
-        $properties_to_serialize = array_diff($properties_to_serialize, array('_wp_post'));
440
-        return $properties_to_serialize;
441
-    }
17
+	/**
18
+	 * This is a property for holding cached feature images on CPT objects.  Cache's are set on the first
19
+	 * "feature_image()" method call.  Each key in the array corresponds to the requested size.
20
+	 *
21
+	 * @var array
22
+	 */
23
+	protected $_feature_image = array();
24
+
25
+	/**
26
+	 * @var WP_Post the WP_Post that corresponds with this CPT model object
27
+	 */
28
+	protected $_wp_post;
29
+
30
+
31
+	abstract public function wp_user();
32
+
33
+
34
+	/**
35
+	 * Returns the WP post associated with this CPT model object. If this CPT is saved, fetches it
36
+	 * from the DB. Otherwise, create an unsaved WP_POst object. Caches the post internally.
37
+	 *
38
+	 * @return WP_Post
39
+	 */
40
+	public function wp_post()
41
+	{
42
+		global $wpdb;
43
+		if (! $this->_wp_post instanceof WP_Post) {
44
+			if ($this->ID()) {
45
+				$this->_wp_post = get_post($this->ID());
46
+			} else {
47
+				$simulated_db_result = new stdClass();
48
+				foreach ($this->get_model()->field_settings(true) as $field_name => $field_obj) {
49
+					if ($this->get_model()->get_table_obj_by_alias($field_obj->get_table_alias())->get_table_name()
50
+						=== $wpdb->posts
51
+					) {
52
+						$column = $field_obj->get_table_column();
53
+
54
+						if ($field_obj instanceof EE_Datetime_Field) {
55
+							$value_on_model_obj = $this->get_DateTime_object($field_name);
56
+						} elseif ($field_obj->is_db_only_field()) {
57
+							$value_on_model_obj = $field_obj->get_default_value();
58
+						} else {
59
+							$value_on_model_obj = $this->get_raw($field_name);
60
+						}
61
+						$simulated_db_result->{$column} = $field_obj->prepare_for_use_in_db($value_on_model_obj);
62
+					}
63
+				}
64
+				$this->_wp_post = new WP_Post($simulated_db_result);
65
+			}
66
+			// and let's make retrieving the EE CPT object easy too
67
+			$classname = get_class($this);
68
+			if (! isset($this->_wp_post->{$classname})) {
69
+				$this->_wp_post->{$classname} = $this;
70
+			}
71
+		}
72
+		return $this->_wp_post;
73
+	}
74
+
75
+	/**
76
+	 * When fetching a new value for a post field that uses the global $post for rendering,
77
+	 * set the global $post temporarily to be this model object; and afterwards restore it
78
+	 *
79
+	 * @param string $fieldname
80
+	 * @param bool   $pretty
81
+	 * @param string $extra_cache_ref
82
+	 * @return mixed
83
+	 */
84
+	protected function _get_fresh_property($fieldname, $pretty = false, $extra_cache_ref = null)
85
+	{
86
+		global $post;
87
+
88
+		if ($pretty
89
+			&& (
90
+				! (
91
+					$post instanceof WP_Post
92
+					&& $post->ID
93
+				)
94
+				|| (int) $post->ID !== $this->ID()
95
+			)
96
+			&& $this->get_model()->field_settings_for($fieldname) instanceof EE_Post_Content_Field) {
97
+			$old_post = $post;
98
+			$post = $this->wp_post();
99
+			$return_value = parent::_get_fresh_property($fieldname, $pretty, $extra_cache_ref);
100
+			$post = $old_post;
101
+		} else {
102
+			$return_value = parent::_get_fresh_property($fieldname, $pretty, $extra_cache_ref);
103
+		}
104
+		return $return_value;
105
+	}
106
+
107
+	/**
108
+	 * Adds to the specified event category. If it category doesn't exist, creates it.
109
+	 *
110
+	 * @param string $category_name
111
+	 * @param string $category_description    optional
112
+	 * @param int    $parent_term_taxonomy_id optional
113
+	 * @return EE_Term_Taxonomy
114
+	 */
115
+	public function add_event_category($category_name, $category_description = null, $parent_term_taxonomy_id = null)
116
+	{
117
+		return $this->get_model()->add_event_category(
118
+			$this,
119
+			$category_name,
120
+			$category_description,
121
+			$parent_term_taxonomy_id
122
+		);
123
+	}
124
+
125
+
126
+	/**
127
+	 * Removes the event category by specified name from being related ot this event
128
+	 *
129
+	 * @param string $category_name
130
+	 * @return bool
131
+	 */
132
+	public function remove_event_category($category_name)
133
+	{
134
+		return $this->get_model()->remove_event_category($this, $category_name);
135
+	}
136
+
137
+
138
+	/**
139
+	 * Removes the relation to the specified term taxonomy, and maintains the
140
+	 * data integrity of the term taxonomy provided
141
+	 *
142
+	 * @param EE_Term_Taxonomy $term_taxonomy
143
+	 * @return EE_Base_Class the relation was removed from
144
+	 */
145
+	public function remove_relation_to_term_taxonomy($term_taxonomy)
146
+	{
147
+		if (! $term_taxonomy) {
148
+			EE_Error::add_error(
149
+				sprintf(
150
+					__(
151
+						"No Term_Taxonomy provided which to remove from model object of type %s and id %d",
152
+						"event_espresso"
153
+					),
154
+					get_class($this),
155
+					$this->ID()
156
+				),
157
+				__FILE__,
158
+				__FUNCTION__,
159
+				__LINE__
160
+			);
161
+			return null;
162
+		}
163
+		$term_taxonomy->set_count($term_taxonomy->count() - 1);
164
+		$term_taxonomy->save();
165
+		return $this->_remove_relation_to($term_taxonomy, 'Term_Taxonomy');
166
+	}
167
+
168
+
169
+	/**
170
+	 * The main purpose of this method is to return the post type for the model object
171
+	 *
172
+	 * @access public
173
+	 * @return string
174
+	 */
175
+	public function post_type()
176
+	{
177
+		return $this->get_model()->post_type();
178
+	}
179
+
180
+
181
+	/**
182
+	 * The main purpose of this method is to return the parent for the model object
183
+	 *
184
+	 * @access public
185
+	 * @return int
186
+	 */
187
+	public function parent()
188
+	{
189
+		return $this->get('parent');
190
+	}
191
+
192
+
193
+	/**
194
+	 * return the _status property
195
+	 *
196
+	 * @return string
197
+	 */
198
+	public function status()
199
+	{
200
+		return $this->get('status');
201
+	}
202
+
203
+
204
+	/**
205
+	 * @param string $status
206
+	 */
207
+	public function set_status($status)
208
+	{
209
+		$this->set('status', $status);
210
+	}
211
+
212
+
213
+	/**
214
+	 * This calls the equivalent model method for retrieving the feature image which in turn is a wrapper for
215
+	 * WordPress' get_the_post_thumbnail() function.
216
+	 *
217
+	 * @link   http://codex.wordpress.org/Function_Reference/get_the_post_thumbnail
218
+	 * @access protected
219
+	 * @param string|array $size (optional) Image size. Defaults to 'post-thumbnail' but can also be a 2-item array
220
+	 *                           representing width and height in pixels (i.e. array(32,32) ).
221
+	 * @param string|array $attr Optional. Query string or array of attributes.
222
+	 * @return string HTML image element
223
+	 */
224
+	protected function _get_feature_image($size, $attr)
225
+	{
226
+		// first let's see if we already have the _feature_image property set AND if it has a cached element on it FOR the given size
227
+		$attr_key = is_array($attr) ? implode('_', $attr) : $attr;
228
+		$cache_key = is_array($size) ? implode('_', $size) . $attr_key : $size . $attr_key;
229
+		$this->_feature_image[ $cache_key ] = isset($this->_feature_image[ $cache_key ])
230
+			? $this->_feature_image[ $cache_key ] : $this->get_model()->get_feature_image($this->ID(), $size, $attr);
231
+		return $this->_feature_image[ $cache_key ];
232
+	}
233
+
234
+
235
+	/**
236
+	 * See _get_feature_image. Returns the HTML to display a featured image
237
+	 *
238
+	 * @param string       $size
239
+	 * @param string|array $attr
240
+	 * @return string of html
241
+	 */
242
+	public function feature_image($size = 'thumbnail', $attr = '')
243
+	{
244
+		return $this->_get_feature_image($size, $attr);
245
+	}
246
+
247
+
248
+	/**
249
+	 * This uses the wp "wp_get_attachment_image_src()" function to return the feature image for the current class
250
+	 * using the given size params.
251
+	 *
252
+	 * @param  string|array $size can either be a string: 'thumbnail', 'medium', 'large', 'full' OR 2-item array
253
+	 *                            representing width and height in pixels eg. array(32,32).
254
+	 * @return string|boolean          the url of the image or false if not found
255
+	 */
256
+	public function feature_image_url($size = 'thumbnail')
257
+	{
258
+		$attachment = wp_get_attachment_image_src(get_post_thumbnail_id($this->ID()), $size);
259
+		return ! empty($attachment) ? $attachment[0] : false;
260
+	}
261
+
262
+
263
+	/**
264
+	 * This is a method for restoring this_obj using details from the given $revision_id
265
+	 *
266
+	 * @param int   $revision_id       ID of the revision we're getting data from
267
+	 * @param array $related_obj_names if included this will be used to restore for related obj
268
+	 *                                 if not included then we just do restore on the meta.
269
+	 *                                 We will accept an array of related_obj_names for restoration here.
270
+	 * @param array $where_query       You can optionally include an array of key=>value pairs
271
+	 *                                 that allow you to further constrict the relation to being added.
272
+	 *                                 However, keep in mind that the columns (keys) given
273
+	 *                                 must match a column on the JOIN table and currently
274
+	 *                                 only the HABTM models accept these additional conditions.
275
+	 *                                 Also remember that if an exact match isn't found for these extra cols/val pairs,
276
+	 *                                 then a NEW row is created in the join table.
277
+	 *                                 This array is INDEXED by RELATED OBJ NAME (so it corresponds with the obj_names
278
+	 *                                 sent);
279
+	 * @return void
280
+	 */
281
+	public function restore_revision($revision_id, $related_obj_names = array(), $where_query = array())
282
+	{
283
+		// get revision object
284
+		$revision_obj = $this->get_model()->get_one_by_ID($revision_id);
285
+		if ($revision_obj instanceof EE_CPT_Base) {
286
+			// no related_obj_name so we assume we're saving a revision on this object.
287
+			if (empty($related_obj_names)) {
288
+				$fields = $this->get_model()->get_meta_table_fields();
289
+				foreach ($fields as $field) {
290
+					$this->set($field, $revision_obj->get($field));
291
+				}
292
+				$this->save();
293
+			}
294
+			$related_obj_names = (array) $related_obj_names;
295
+			foreach ($related_obj_names as $related_name) {
296
+				// related_obj_name so we're saving a revision on an object related to this object
297
+				// do we have $where_query params for this related object?  If we do then we include that.
298
+				$cols_n_values = isset($where_query[ $related_name ]) ? $where_query[ $related_name ] : array();
299
+				$where_params = ! empty($cols_n_values) ? array($cols_n_values) : array();
300
+				$related_objs = $this->get_many_related($related_name, $where_params);
301
+				$revision_related_objs = $revision_obj->get_many_related($related_name, $where_params);
302
+				// load helper
303
+				// remove related objs from this object that are not in revision
304
+				// array_diff *should* work cause I think objects are indexed by ID?
305
+				$related_to_remove = EEH_Array::object_array_diff($related_objs, $revision_related_objs);
306
+				foreach ($related_to_remove as $rr) {
307
+					$this->_remove_relation_to($rr, $related_name, $cols_n_values);
308
+				}
309
+				// add all related objs attached to revision to this object
310
+				foreach ($revision_related_objs as $r_obj) {
311
+					$this->_add_relation_to($r_obj, $related_name, $cols_n_values);
312
+				}
313
+			}
314
+		}
315
+	}
316
+
317
+
318
+	/**
319
+	 * Wrapper for get_post_meta, http://codex.wordpress.org/Function_Reference/get_post_meta
320
+	 *
321
+	 * @param string  $meta_key
322
+	 * @param boolean $single
323
+	 * @return mixed <ul><li>If only $id is set it will return all meta values in an associative array.</li>
324
+	 * <li>If $single is set to false, or left blank, the function returns an array containing all values of the
325
+	 * specified key.</li>
326
+	 * <li>If $single is set to true, the function returns the first value of the specified key (not in an
327
+	 * array</li></ul>
328
+	 */
329
+	public function get_post_meta($meta_key = null, $single = false)
330
+	{
331
+		return get_post_meta($this->ID(), $meta_key, $single);
332
+	}
333
+
334
+
335
+	/**
336
+	 * Wrapper for update_post_meta, http://codex.wordpress.org/Function_Reference/update_post_meta
337
+	 *
338
+	 * @param string $meta_key
339
+	 * @param mixed  $meta_value
340
+	 * @param mixed  $prev_value
341
+	 * @return mixed Returns meta_id if the meta doesn't exist, otherwise returns true on success and false on failure.
342
+	 *               NOTE: If the meta_value passed to this function is the same as the value that is already in the
343
+	 *               database, this function returns false.
344
+	 */
345
+	public function update_post_meta($meta_key, $meta_value, $prev_value = null)
346
+	{
347
+		if (! $this->ID()) {
348
+			$this->save();
349
+		}
350
+		return update_post_meta($this->ID(), $meta_key, $meta_value, $prev_value);
351
+	}
352
+
353
+
354
+	/**
355
+	 * Wrapper for add_post_meta, http://codex.wordpress.org/Function_Reference/add_post_meta
356
+	 *
357
+	 * @param mixed $meta_key
358
+	 * @param mixed $meta_value
359
+	 * @param bool  $unique . If postmeta for this $meta_key already exists, whether to add an additional item or not
360
+	 * @return boolean Boolean true, except if the $unique argument was set to true and a custom field with the given
361
+	 *                 key already exists, in which case false is returned.
362
+	 */
363
+	public function add_post_meta($meta_key, $meta_value, $unique = false)
364
+	{
365
+		if ($this->ID()) {
366
+			$this->save();
367
+		}
368
+		return add_post_meta($this->ID(), $meta_key, $meta_value, $unique);
369
+	}
370
+
371
+
372
+	/**
373
+	 * Wrapper for delete_post_meta, http://codex.wordpress.org/Function_Reference/delete_post_meta
374
+	 *
375
+	 * @param mixed $meta_key
376
+	 * @param mixed $meta_value
377
+	 * @return boolean False for failure. True for success.
378
+	 */
379
+	public function delete_post_meta($meta_key, $meta_value = '')
380
+	{
381
+		if (! $this->ID()) {
382
+			// there are obviously no postmetas for this if it's not saved
383
+			// so let's just report this as a success
384
+			return true;
385
+		}
386
+		return delete_post_meta($this->ID(), $meta_key, $meta_value);
387
+	}
388
+
389
+
390
+	/**
391
+	 * Gets the URL for viewing this event on the front-end
392
+	 *
393
+	 * @return string
394
+	 */
395
+	public function get_permalink()
396
+	{
397
+		return get_permalink($this->ID());
398
+	}
399
+
400
+
401
+	/**
402
+	 * Gets all the term-taxonomies for this CPT
403
+	 *
404
+	 * @param array $query_params
405
+	 * @return EE_Term_Taxonomy
406
+	 */
407
+	public function term_taxonomies($query_params = array())
408
+	{
409
+		return $this->get_many_related('Term_Taxonomy', $query_params);
410
+	}
411
+
412
+
413
+	/**
414
+	 * @return mixed
415
+	 */
416
+	public function get_custom_post_statuses()
417
+	{
418
+		return $this->get_model()->get_custom_post_statuses();
419
+	}
420
+
421
+
422
+	/**
423
+	 * @return mixed
424
+	 */
425
+	public function get_all_post_statuses()
426
+	{
427
+		return $this->get_model()->get_status_array();
428
+	}
429
+
430
+
431
+	/**
432
+	 * Don't serialize the WP Post. That's just duplicate data and we want to avoid recursion
433
+	 *
434
+	 * @return array
435
+	 */
436
+	public function __sleep()
437
+	{
438
+		$properties_to_serialize = parent::__sleep();
439
+		$properties_to_serialize = array_diff($properties_to_serialize, array('_wp_post'));
440
+		return $properties_to_serialize;
441
+	}
442 442
 }
Please login to merge, or discard this patch.
Spacing   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -40,7 +40,7 @@  discard block
 block discarded – undo
40 40
     public function wp_post()
41 41
     {
42 42
         global $wpdb;
43
-        if (! $this->_wp_post instanceof WP_Post) {
43
+        if ( ! $this->_wp_post instanceof WP_Post) {
44 44
             if ($this->ID()) {
45 45
                 $this->_wp_post = get_post($this->ID());
46 46
             } else {
@@ -65,7 +65,7 @@  discard block
 block discarded – undo
65 65
             }
66 66
             // and let's make retrieving the EE CPT object easy too
67 67
             $classname = get_class($this);
68
-            if (! isset($this->_wp_post->{$classname})) {
68
+            if ( ! isset($this->_wp_post->{$classname})) {
69 69
                 $this->_wp_post->{$classname} = $this;
70 70
             }
71 71
         }
@@ -144,7 +144,7 @@  discard block
 block discarded – undo
144 144
      */
145 145
     public function remove_relation_to_term_taxonomy($term_taxonomy)
146 146
     {
147
-        if (! $term_taxonomy) {
147
+        if ( ! $term_taxonomy) {
148 148
             EE_Error::add_error(
149 149
                 sprintf(
150 150
                     __(
@@ -225,10 +225,10 @@  discard block
 block discarded – undo
225 225
     {
226 226
         // first let's see if we already have the _feature_image property set AND if it has a cached element on it FOR the given size
227 227
         $attr_key = is_array($attr) ? implode('_', $attr) : $attr;
228
-        $cache_key = is_array($size) ? implode('_', $size) . $attr_key : $size . $attr_key;
229
-        $this->_feature_image[ $cache_key ] = isset($this->_feature_image[ $cache_key ])
230
-            ? $this->_feature_image[ $cache_key ] : $this->get_model()->get_feature_image($this->ID(), $size, $attr);
231
-        return $this->_feature_image[ $cache_key ];
228
+        $cache_key = is_array($size) ? implode('_', $size).$attr_key : $size.$attr_key;
229
+        $this->_feature_image[$cache_key] = isset($this->_feature_image[$cache_key])
230
+            ? $this->_feature_image[$cache_key] : $this->get_model()->get_feature_image($this->ID(), $size, $attr);
231
+        return $this->_feature_image[$cache_key];
232 232
     }
233 233
 
234 234
 
@@ -295,7 +295,7 @@  discard block
 block discarded – undo
295 295
             foreach ($related_obj_names as $related_name) {
296 296
                 // related_obj_name so we're saving a revision on an object related to this object
297 297
                 // do we have $where_query params for this related object?  If we do then we include that.
298
-                $cols_n_values = isset($where_query[ $related_name ]) ? $where_query[ $related_name ] : array();
298
+                $cols_n_values = isset($where_query[$related_name]) ? $where_query[$related_name] : array();
299 299
                 $where_params = ! empty($cols_n_values) ? array($cols_n_values) : array();
300 300
                 $related_objs = $this->get_many_related($related_name, $where_params);
301 301
                 $revision_related_objs = $revision_obj->get_many_related($related_name, $where_params);
@@ -344,7 +344,7 @@  discard block
 block discarded – undo
344 344
      */
345 345
     public function update_post_meta($meta_key, $meta_value, $prev_value = null)
346 346
     {
347
-        if (! $this->ID()) {
347
+        if ( ! $this->ID()) {
348 348
             $this->save();
349 349
         }
350 350
         return update_post_meta($this->ID(), $meta_key, $meta_value, $prev_value);
@@ -378,7 +378,7 @@  discard block
 block discarded – undo
378 378
      */
379 379
     public function delete_post_meta($meta_key, $meta_value = '')
380 380
     {
381
-        if (! $this->ID()) {
381
+        if ( ! $this->ID()) {
382 382
             // there are obviously no postmetas for this if it's not saved
383 383
             // so let's just report this as a success
384 384
             return true;
Please login to merge, or discard this patch.
core/db_classes/EE_CSV.class.php 3 patches
Doc Comments   +6 added lines, -9 removed lines patch added patch discarded remove patch
@@ -326,7 +326,7 @@  discard block
 block discarded – undo
326 326
      * and starts writing the file to PHP's output. Returns the file handle so other functions can
327 327
      * also write to it
328 328
      *
329
-     * @param string $new_filename the name of the file that the user will download
329
+     * @param string|false $filename the name of the file that the user will download
330 330
      * @return resource, like the results of fopen(), which can be used for fwrite, fputcsv2, etc.
331 331
      */
332 332
     public function begin_sending_csv($filename)
@@ -391,10 +391,7 @@  discard block
 block discarded – undo
391 391
      *
392 392
      * @param array   $data                 2D array, first numerically-indexed, and next-level-down preferably indexed
393 393
      *                                      by string
394
-     * @param boolean $add_csv_column_names whether or not we should add the keys in the bottom-most array as a row for
395
-     *                                      headers in the CSV. Eg, if $data looked like
396
-     *                                      array(0=>array('EVT_ID'=>1,'EVT_name'=>'monkey'...), 1=>array(...),...))
397
-     *                                      then the first row we'd write to the CSV would be "EVT_ID,EVT_name,..."
394
+     * @param resource $filehandle
398 395
      * @return boolean if we successfully wrote to the CSV or not. If there's no $data, we consider that a success
399 396
      *                 (because we wrote everything there was...nothing)
400 397
      */
@@ -491,7 +488,7 @@  discard block
 block discarded – undo
491 488
      *                                   next layer is numerically indexed to represent each model object (eg, each
492 489
      *                                   individual event), and the last layer has all the attributes o fthat model
493 490
      *                                   object (eg, the event's id, name, etc)
494
-     * @return boolean success
491
+     * @return boolean|null success
495 492
      */
496 493
     public function write_model_data_to_csv($filehandle, $model_data_array)
497 494
     {
@@ -522,8 +519,8 @@  discard block
 block discarded – undo
522 519
      * and dies (in order to avoid other plugins from messing up the csv output)
523 520
      *
524 521
      * @param string $filename         the filename you want to give the file
525
-     * @param array  $model_data_array 3d array, as described in EE_CSV::write_model_data_to_csv()
526
-     * @return bool | void writes CSV file to output and dies
522
+     * @param boolean  $model_data_array 3d array, as described in EE_CSV::write_model_data_to_csv()
523
+     * @return boolean|null | void writes CSV file to output and dies
527 524
      */
528 525
     public function export_multiple_model_data_to_csv($filename, $model_data_array)
529 526
     {
@@ -537,7 +534,7 @@  discard block
 block discarded – undo
537 534
      * @access public
538 535
      * @param array  $data     - the array of data to be converted to csv and exported
539 536
      * @param string $filename - name for newly created csv file
540
-     * @return TRUE on success, FALSE on fail
537
+     * @return false|null on success, FALSE on fail
541 538
      */
542 539
     public function export_array_to_csv($data = false, $filename = false)
543 540
     {
Please login to merge, or discard this patch.
Indentation   +669 added lines, -669 removed lines patch added patch discarded remove patch
@@ -16,673 +16,673 @@
 block discarded – undo
16 16
 class EE_CSV
17 17
 {
18 18
 
19
-    // instance of the EE_CSV object
20
-    private static $_instance = null;
21
-
22
-
23
-    // multidimensional array to store update & error messages
24
-    // var $_notices = array( 'updates' => array(), 'errors' => array() );
25
-
26
-
27
-    private $_primary_keys;
28
-
29
-    /**
30
-     *
31
-     * @var EE_Registry
32
-     */
33
-    private $EE;
34
-    /**
35
-     * string used for 1st cell in exports, which indicates that the following 2 rows will be metadata keys and values
36
-     */
37
-    const metadata_header = 'Event Espresso Export Meta Data';
38
-
39
-    /**
40
-     *        private constructor to prevent direct creation
41
-     *
42
-     * @Constructor
43
-     * @access private
44
-     * @return void
45
-     */
46
-    private function __construct()
47
-    {
48
-        global $wpdb;
49
-
50
-        $this->_primary_keys = array(
51
-            $wpdb->prefix . 'esp_answer'                  => array('ANS_ID'),
52
-            $wpdb->prefix . 'esp_attendee'                => array('ATT_ID'),
53
-            $wpdb->prefix . 'esp_datetime'                => array('DTT_ID'),
54
-            $wpdb->prefix . 'esp_event_question_group'    => array('EQG_ID'),
55
-            $wpdb->prefix . 'esp_message_template'        => array('MTP_ID'),
56
-            $wpdb->prefix . 'esp_payment'                 => array('PAY_ID'),
57
-            $wpdb->prefix . 'esp_price'                   => array('PRC_ID'),
58
-            $wpdb->prefix . 'esp_price_type'              => array('PRT_ID'),
59
-            $wpdb->prefix . 'esp_question'                => array('QST_ID'),
60
-            $wpdb->prefix . 'esp_question_group'          => array('QSG_ID'),
61
-            $wpdb->prefix . 'esp_question_group_question' => array('QGQ_ID'),
62
-            $wpdb->prefix . 'esp_question_option'         => array('QSO_ID'),
63
-            $wpdb->prefix . 'esp_registration'            => array('REG_ID'),
64
-            $wpdb->prefix . 'esp_status'                  => array('STS_ID'),
65
-            $wpdb->prefix . 'esp_transaction'             => array('TXN_ID'),
66
-            $wpdb->prefix . 'esp_transaction'             => array('TXN_ID'),
67
-            $wpdb->prefix . 'events_detail'               => array('id'),
68
-            $wpdb->prefix . 'events_category_detail'      => array('id'),
69
-            $wpdb->prefix . 'events_category_rel'         => array('id'),
70
-            $wpdb->prefix . 'events_venue'                => array('id'),
71
-            $wpdb->prefix . 'events_venue_rel'            => array('emeta_id'),
72
-            $wpdb->prefix . 'events_locale'               => array('id'),
73
-            $wpdb->prefix . 'events_locale_rel'           => array('id'),
74
-            $wpdb->prefix . 'events_personnel'            => array('id'),
75
-            $wpdb->prefix . 'events_personnel_rel'        => array('id'),
76
-        );
77
-    }
78
-
79
-
80
-    /**
81
-     *        @ singleton method used to instantiate class object
82
-     *        @ access public
83
-     *
84
-     * @return EE_CSV
85
-     */
86
-    public static function instance()
87
-    {
88
-        // check if class object is instantiated
89
-        if (self::$_instance === null or ! is_object(self::$_instance) or ! (self::$_instance instanceof EE_CSV)) {
90
-            self::$_instance = new self();
91
-        }
92
-        return self::$_instance;
93
-    }
94
-
95
-    /**
96
-     * Opens a unicode or utf file (normal file_get_contents has difficulty readin ga unicode file. @see
97
-     * http://stackoverflow.com/questions/15092764/how-to-read-unicode-text-file-in-php
98
-     *
99
-     * @param string $file_path
100
-     * @return string
101
-     * @throws EE_Error
102
-     */
103
-    private function read_unicode_file($file_path)
104
-    {
105
-        $fc = "";
106
-        $fh = fopen($file_path, "rb");
107
-        if (! $fh) {
108
-            throw new EE_Error(sprintf(__("Cannot open file for read: %s<br>\n", 'event_espresso'), $file_path));
109
-        }
110
-        $flen = filesize($file_path);
111
-        $bc = fread($fh, $flen);
112
-        for ($i = 0; $i < $flen; $i++) {
113
-            $c = substr($bc, $i, 1);
114
-            if ((ord($c) != 0) && (ord($c) != 13)) {
115
-                $fc = $fc . $c;
116
-            }
117
-        }
118
-        if ((ord(substr($fc, 0, 1)) == 255) && (ord(substr($fc, 1, 1)) == 254)) {
119
-            $fc = substr($fc, 2);
120
-        }
121
-        return ($fc);
122
-    }
123
-
124
-
125
-    /**
126
-     * Generic CSV-functionality to turn an entire CSV file into a single array that's
127
-     * NOT in a specific format to EE. It's just a 2-level array, with top-level arrays
128
-     * representing each row in the CSV file, and the second-level arrays being each column in that row
129
-     *
130
-     * @param string $path_to_file
131
-     * @return array of arrays. Top-level array has rows, second-level array has each item
132
-     */
133
-    public function import_csv_to_multi_dimensional_array($path_to_file)
134
-    {
135
-        // needed to deal with Mac line endings
136
-        ini_set('auto_detect_line_endings', true);
137
-
138
-        // because fgetcsv does not correctly deal with backslashed quotes such as \"
139
-        // we'll read the file into a string
140
-        $file_contents = $this->read_unicode_file($path_to_file);
141
-        // replace backslashed quotes with CSV enclosures
142
-        $file_contents = str_replace('\\"', '"""', $file_contents);
143
-        // HEY YOU! PUT THAT FILE BACK!!!
144
-        file_put_contents($path_to_file, $file_contents);
145
-
146
-        if (($file_handle = fopen($path_to_file, "r")) !== false) {
147
-            # Set the parent multidimensional array key to 0.
148
-            $nn = 0;
149
-            $csvarray = array();
150
-
151
-            // in PHP 5.3 fgetcsv accepts a 5th parameter, but the pre 5.3 versions of fgetcsv choke if passed more than 4 - is that crazy or what?
152
-            if (version_compare(PHP_VERSION, '5.3.0') < 0) {
153
-                //  PHP 5.2- version
154
-                // loop through each row of the file
155
-                while (($data = fgetcsv($file_handle, 0, ',', '"')) !== false) {
156
-                    $csvarray[] = $data;
157
-                }
158
-            } else {
159
-                // loop through each row of the file
160
-                while (($data = fgetcsv($file_handle, 0, ',', '"', '\\')) !== false) {
161
-                    $csvarray[] = $data;
162
-                }
163
-            }
164
-            # Close the File.
165
-            fclose($file_handle);
166
-            return $csvarray;
167
-        } else {
168
-            EE_Error::add_error(
169
-                sprintf(__("An error occurred - the file: %s could not opened.", "event_espresso"), $path_to_file),
170
-                __FILE__,
171
-                __FUNCTION__,
172
-                __LINE__
173
-            );
174
-            return false;
175
-        }
176
-    }
177
-
178
-
179
-    /**
180
-     * @Import contents of csv file and store values in an array to be manipulated by other functions
181
-     * @access public
182
-     * @param string  $path_to_file         - the csv file to be imported including the path to it's location.
183
-     *                                      If $model_name is provided, assumes that each row in the CSV represents a
184
-     *                                      model object for that model If $model_name ISN'T provided, assumes that
185
-     *                                      before model object data, there is a row where the first entry is simply
186
-     *                                      'MODEL', and next entry is the model's name, (untranslated) like Event, and
187
-     *                                      then maybe a row of headers, and then the model data. Eg.
188
-     *                                      '<br>MODEL,Event,<br>EVT_ID,EVT_name,...<br>1,Monkey
189
-     *                                      Party,...<br>2,Llamarama,...<br>MODEL,Venue,<br>VNU_ID,VNU_name<br>1,The
190
-     *                                      Forest
191
-     * @param string  $model_name           model name if we know what model we're importing
192
-     * @param boolean $first_row_is_headers - whether the first row of data is headers or not - TRUE = headers, FALSE =
193
-     *                                      data
194
-     * @return mixed - array on success - multi dimensional with headers as keys (if headers exist) OR string on fail -
195
-     *               error message like the following array('Event'=>array( array('EVT_ID'=>1,'EVT_name'=>'bob
196
-     *               party',...), array('EVT_ID'=>2,'EVT_name'=>'llamarama',...),
197
-     *                                      ...
198
-     *                                      )
199
-     *                                      'Venue'=>array(
200
-     *                                      array('VNU_ID'=>1,'VNU_name'=>'the shack',...),
201
-     *                                      array('VNU_ID'=>2,'VNU_name'=>'tree house',...),
202
-     *                                      ...
203
-     *                                      )
204
-     *                                      ...
205
-     *                                      )
206
-     */
207
-    public function import_csv_to_model_data_array($path_to_file, $model_name = false, $first_row_is_headers = true)
208
-    {
209
-        $multi_dimensional_array = $this->import_csv_to_multi_dimensional_array($path_to_file);
210
-        if (! $multi_dimensional_array) {
211
-            return false;
212
-        }
213
-        // gotta start somewhere
214
-        $row = 1;
215
-        // array to store csv data in
216
-        $ee_formatted_data = array();
217
-        // array to store headers (column names)
218
-        $headers = array();
219
-        foreach ($multi_dimensional_array as $data) {
220
-            // if first cell is MODEL, then second cell is the MODEL name
221
-            if ($data[0] == 'MODEL') {
222
-                $model_name = $data[1];
223
-                // don't bother looking for model data in this row. The rest of this
224
-                // row should be blank
225
-                // AND pretend this is the first row again
226
-                $row = 1;
227
-                // reset headers
228
-                $headers = array();
229
-                continue;
230
-            }
231
-            if (strpos($data[0], EE_CSV::metadata_header) !== false) {
232
-                $model_name = EE_CSV::metadata_header;
233
-                // store like model data, we just won't try importing it etc.
234
-                $row = 1;
235
-                continue;
236
-            }
237
-
238
-
239
-            // how many columns are there?
240
-            $columns = count($data);
241
-
242
-            $model_entry = array();
243
-            // loop through each column
244
-            for ($i = 0; $i < $columns; $i++) {
245
-                // replace csv_enclosures with backslashed quotes
246
-                $data[ $i ] = str_replace('"""', '\\"', $data[ $i ]);
247
-                // do we need to grab the column names?
248
-                if ($row === 1) {
249
-                    if ($first_row_is_headers) {
250
-                        // store the column names to use for keys
251
-                        $column_name = $data[ $i ];
252
-                        // check it's not blank... sometimes CSV editign programs adda bunch of empty columns onto the end...
253
-                        if (! $column_name) {
254
-                            continue;
255
-                        }
256
-                        $matches = array();
257
-                        if ($model_name == EE_CSV::metadata_header) {
258
-                            $headers[ $i ] = $column_name;
259
-                        } else {
260
-                            // now get the db table name from it (the part between square brackets)
261
-                            $success = preg_match('~(.*)\[(.*)\]~', $column_name, $matches);
262
-                            if (! $success) {
263
-                                EE_Error::add_error(
264
-                                    sprintf(
265
-                                        __(
266
-                                            "The column titled %s is invalid for importing. It must be be in the format of 'Nice Name[model_field_name]' in row %s",
267
-                                            "event_espresso"
268
-                                        ),
269
-                                        $column_name,
270
-                                        implode(",", $data)
271
-                                    ),
272
-                                    __FILE__,
273
-                                    __FUNCTION__,
274
-                                    __LINE__
275
-                                );
276
-                                return false;
277
-                            }
278
-                            $headers[ $i ] = $matches[2];
279
-                        }
280
-                    } else {
281
-                        // no column names means our final array will just use counters for keys
282
-                        $model_entry[ $headers[ $i ] ] = $data[ $i ];
283
-                        $headers[ $i ] = $i;
284
-                    }
285
-                    // and we need to store csv data
286
-                } else {
287
-                    // this column isn' ta header, store it if there is a header for it
288
-                    if (isset($headers[ $i ])) {
289
-                        $model_entry[ $headers[ $i ] ] = $data[ $i ];
290
-                    }
291
-                }
292
-            }
293
-            // save the row's data IF it's a non-header-row
294
-            if (! $first_row_is_headers || ($first_row_is_headers && $row > 1)) {
295
-                $ee_formatted_data[ $model_name ][] = $model_entry;
296
-            }
297
-            // advance to next row
298
-            $row++;
299
-        }
300
-
301
-        // delete the uploaded file
302
-        unlink($path_to_file);
303
-        // echo '<pre style="height:auto;border:2px solid lightblue;">' . print_r( $ee_formatted_data, TRUE ) . '</pre><br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>';
304
-        // die();
305
-
306
-        // it's good to give back
307
-        return $ee_formatted_data;
308
-    }
309
-
310
-
311
-    public function save_csv_to_db($csv_data_array, $model_name = false)
312
-    {
313
-        EE_Error::doing_it_wrong(
314
-            'save_csv_to_db',
315
-            __(
316
-                'Function moved to EE_Import and renamed to save_csv_data_array_to_db',
317
-                'event_espresso'
318
-            ),
319
-            '4.6.7'
320
-        );
321
-        return EE_Import::instance()->save_csv_data_array_to_db($csv_data_array, $model_name);
322
-    }
323
-
324
-    /**
325
-     * Sends HTTP headers to indicate that the browser should download a file,
326
-     * and starts writing the file to PHP's output. Returns the file handle so other functions can
327
-     * also write to it
328
-     *
329
-     * @param string $new_filename the name of the file that the user will download
330
-     * @return resource, like the results of fopen(), which can be used for fwrite, fputcsv2, etc.
331
-     */
332
-    public function begin_sending_csv($filename)
333
-    {
334
-        // grab file extension
335
-        $ext = substr(strrchr($filename, '.'), 1);
336
-        if ($ext == '.csv' or $ext == '.xls') {
337
-            str_replace($ext, '', $filename);
338
-        }
339
-        $filename .= '.csv';
340
-
341
-        // if somebody's been naughty and already started outputting stuff, trash it
342
-        // and start writing our stuff.
343
-        if (ob_get_length()) {
344
-            @ob_flush();
345
-            @flush();
346
-            @ob_end_flush();
347
-        }
348
-        @ob_start();
349
-        header("Pragma: public");
350
-        header("Expires: 0");
351
-        header("Pragma: no-cache");
352
-        header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
353
-        // header("Content-Type: application/force-download");
354
-        // header("Content-Type: application/octet-stream");
355
-        // header("Content-Type: application/download");
356
-        header('Content-disposition: attachment; filename=' . $filename);
357
-        header("Content-Type: text/csv; charset=utf-8");
358
-        do_action('AHEE__EE_CSV__begin_sending_csv__headers');
359
-        echo apply_filters(
360
-            'FHEE__EE_CSV__begin_sending_csv__start_writing',
361
-            "\xEF\xBB\xBF"
362
-        ); // makes excel open it as UTF-8. UTF-8 BOM, see http://stackoverflow.com/a/4440143/2773835
363
-        $fh = fopen('php://output', 'w');
364
-        return $fh;
365
-    }
366
-
367
-    /**
368
-     * Writes some meta data to the CSV as a bunch of columns. Initially we're only
369
-     * mentioning the version and timezone
370
-     *
371
-     * @param resource $filehandle
372
-     */
373
-    public function write_metadata_to_csv($filehandle)
374
-    {
375
-        $data_row = array(EE_CSV::metadata_header);// do NOT translate because this exact string is used when importing
376
-        $this->fputcsv2($filehandle, $data_row);
377
-        $meta_data = array(
378
-            0 => array(
379
-                'version'        => espresso_version(),
380
-                'timezone'       => EEH_DTT_Helper::get_timezone(),
381
-                'time_of_export' => current_time('mysql'),
382
-                'site_url'       => site_url(),
383
-            ),
384
-        );
385
-        $this->write_data_array_to_csv($filehandle, $meta_data);
386
-    }
387
-
388
-
389
-    /**
390
-     * Writes $data to the csv file open in $filehandle. uses the array indices of $data for column headers
391
-     *
392
-     * @param array   $data                 2D array, first numerically-indexed, and next-level-down preferably indexed
393
-     *                                      by string
394
-     * @param boolean $add_csv_column_names whether or not we should add the keys in the bottom-most array as a row for
395
-     *                                      headers in the CSV. Eg, if $data looked like
396
-     *                                      array(0=>array('EVT_ID'=>1,'EVT_name'=>'monkey'...), 1=>array(...),...))
397
-     *                                      then the first row we'd write to the CSV would be "EVT_ID,EVT_name,..."
398
-     * @return boolean if we successfully wrote to the CSV or not. If there's no $data, we consider that a success
399
-     *                 (because we wrote everything there was...nothing)
400
-     */
401
-    public function write_data_array_to_csv($filehandle, $data)
402
-    {
403
-
404
-
405
-        // determine if $data is actually a 2d array
406
-        if ($data && is_array($data) && is_array(EEH_Array::get_one_item_from_array($data))) {
407
-            // make sure top level is numerically indexed,
408
-
409
-            if (EEH_Array::is_associative_array($data)) {
410
-                throw new EE_Error(
411
-                    sprintf(
412
-                        __(
413
-                            "top-level array must be numerically indexed. Does these look like numbers to you? %s",
414
-                            "event_espresso"
415
-                        ),
416
-                        implode(",", array_keys($data))
417
-                    )
418
-                );
419
-            }
420
-            $item_in_top_level_array = EEH_Array::get_one_item_from_array($data);
421
-            // now, is the last item in the top-level array of $data an associative or numeric array?
422
-            if (EEH_Array::is_associative_array($item_in_top_level_array)) {
423
-                // its associative, so we want to output its keys as column headers
424
-                $keys = array_keys($item_in_top_level_array);
425
-                echo $this->fputcsv2($filehandle, $keys);
426
-            }
427
-            // start writing data
428
-            foreach ($data as $data_row) {
429
-                echo $this->fputcsv2($filehandle, $data_row);
430
-            }
431
-            return true;
432
-        } else {
433
-            // no data TO write... so we can assume that's a success
434
-            return true;
435
-        }
436
-        // //if 2nd level is indexed by strings, use those as csv column headers (ie, the first row)
437
-        //
438
-        //
439
-        // $no_table = TRUE;
440
-        //
441
-        // // loop through data and add each row to the file/stream as csv
442
-        // foreach ( $data as $model_name => $model_data ) {
443
-        // // test first row to see if it is data or a model name
444
-        // $model = EE_Registry::instance();->load_model($model_name);
445
-        // //if the model really exists,
446
-        // if ( $model ) {
447
-        //
448
-        // // we have a table name
449
-        // $no_table = FALSE;
450
-        //
451
-        // // put the tablename into an array cuz that's how fputcsv rolls
452
-        // $model_name_row = array( 'MODEL', $model_name );
453
-        //
454
-        // // add table name to csv output
455
-        // echo self::fputcsv2($filehandle, $model_name_row);
456
-        //
457
-        // // now get the rest of the data
458
-        // foreach ( $model_data as $row ) {
459
-        // // output the row
460
-        // echo self::fputcsv2($filehandle, $row);
461
-        // }
462
-        //
463
-        // }
464
-        //
465
-        // if ( $no_table ) {
466
-        // // no table so just put the data
467
-        // echo self::fputcsv2($filehandle, $model_data);
468
-        // }
469
-        //
470
-        // } // END OF foreach ( $data )
471
-    }
472
-
473
-    /**
474
-     * Should be called after begin_sending_csv(), and one or more write_data_array_to_csv()s.
475
-     * Calls exit to prevent polluting the CSV file with other junk
476
-     *
477
-     * @param resource $fh filehandle where we're writing the CSV to
478
-     */
479
-    public function end_sending_csv($fh)
480
-    {
481
-        fclose($fh);
482
-        exit(0);
483
-    }
484
-
485
-    /**
486
-     * Given an open file, writes all the model data to it in the format the importer expects.
487
-     * Usually preceded by begin_sending_csv($filename), and followed by end_sending_csv($filehandle).
488
-     *
489
-     * @param resource $filehandle
490
-     * @param array    $model_data_array is assumed to be a 3d array: 1st layer has keys of model names (eg 'Event'),
491
-     *                                   next layer is numerically indexed to represent each model object (eg, each
492
-     *                                   individual event), and the last layer has all the attributes o fthat model
493
-     *                                   object (eg, the event's id, name, etc)
494
-     * @return boolean success
495
-     */
496
-    public function write_model_data_to_csv($filehandle, $model_data_array)
497
-    {
498
-        $this->write_metadata_to_csv($filehandle);
499
-        foreach ($model_data_array as $model_name => $model_instance_arrays) {
500
-            // first: output a special row stating the model
501
-            echo $this->fputcsv2($filehandle, array('MODEL', $model_name));
502
-            // if we have items to put in the CSV, do it normally
503
-
504
-            if (! empty($model_instance_arrays)) {
505
-                $this->write_data_array_to_csv($filehandle, $model_instance_arrays);
506
-            } else {
507
-                // echo "no data to write... so just write the headers";
508
-                // so there's actually NO model objects for that model.
509
-                // probably still want to show the columns
510
-                $model = EE_Registry::instance()->load_model($model_name);
511
-                $column_names = array();
512
-                foreach ($model->field_settings() as $field) {
513
-                    $column_names[ $field->get_nicename() . "[" . $field->get_name() . "]" ] = null;
514
-                }
515
-                $this->write_data_array_to_csv($filehandle, array($column_names));
516
-            }
517
-        }
518
-    }
519
-
520
-    /**
521
-     * Writes the CSV file to the output buffer, with rows corresponding to $model_data_array,
522
-     * and dies (in order to avoid other plugins from messing up the csv output)
523
-     *
524
-     * @param string $filename         the filename you want to give the file
525
-     * @param array  $model_data_array 3d array, as described in EE_CSV::write_model_data_to_csv()
526
-     * @return bool | void writes CSV file to output and dies
527
-     */
528
-    public function export_multiple_model_data_to_csv($filename, $model_data_array)
529
-    {
530
-        $filehandle = $this->begin_sending_csv($filename);
531
-        $this->write_model_data_to_csv($filehandle, $model_data_array);
532
-        $this->end_sending_csv($filehandle);
533
-    }
534
-
535
-    /**
536
-     * @Export contents of an array to csv file
537
-     * @access public
538
-     * @param array  $data     - the array of data to be converted to csv and exported
539
-     * @param string $filename - name for newly created csv file
540
-     * @return TRUE on success, FALSE on fail
541
-     */
542
-    public function export_array_to_csv($data = false, $filename = false)
543
-    {
544
-
545
-        // no data file?? get outta here
546
-        if (! $data or ! is_array($data) or empty($data)) {
547
-            return false;
548
-        }
549
-
550
-        // no filename?? get outta here
551
-        if (! $filename) {
552
-            return false;
553
-        }
554
-
555
-
556
-        // somebody told me i might need this ???
557
-        global $wpdb;
558
-        $prefix = $wpdb->prefix;
559
-
560
-
561
-        $fh = $this->begin_sending_csv($filename);
562
-
563
-
564
-        $this->end_sending_csv($fh);
565
-    }
566
-
567
-
568
-    /**
569
-     * @Determine the maximum upload file size based on php.ini settings
570
-     * @access    public
571
-     * @param int $percent_of_max - desired percentage of the max upload_mb
572
-     * @return int KB
573
-     */
574
-    public function get_max_upload_size($percent_of_max = false)
575
-    {
576
-
577
-        $max_upload = (int) (ini_get('upload_max_filesize'));
578
-        $max_post = (int) (ini_get('post_max_size'));
579
-        $memory_limit = (int) (ini_get('memory_limit'));
580
-
581
-        // determine the smallest of the three values from above
582
-        $upload_mb = min($max_upload, $max_post, $memory_limit);
583
-
584
-        // convert MB to KB
585
-        $upload_mb = $upload_mb * 1024;
586
-
587
-        // don't want the full monty? then reduce the max uplaod size
588
-        if ($percent_of_max) {
589
-            // is percent_of_max like this -> 50 or like this -> 0.50 ?
590
-            if ($percent_of_max > 1) {
591
-                // chnages 50 to 0.50
592
-                $percent_of_max = $percent_of_max / 100;
593
-            }
594
-            // make upload_mb a percentage of the max upload_mb
595
-            $upload_mb = $upload_mb * $percent_of_max;
596
-        }
597
-
598
-        return $upload_mb;
599
-    }
600
-
601
-
602
-    /**
603
-     * @Drop   in replacement for PHP's fputcsv function - but this one works!!!
604
-     * @access private
605
-     * @param resource $fh         - file handle - what we are writing to
606
-     * @param array    $row        - individual row of csv data
607
-     * @param string   $delimiter  - csv delimiter
608
-     * @param string   $enclosure  - csv enclosure
609
-     * @param string   $mysql_null - allows php NULL to be overridden with MySQl's insertable NULL value
610
-     * @return void
611
-     */
612
-    private function fputcsv2($fh, array $row, $delimiter = ',', $enclosure = '"', $mysql_null = false)
613
-    {
614
-        // Allow user to filter the csv delimiter and enclosure for other countries csv standards
615
-        $delimiter = apply_filters('FHEE__EE_CSV__fputcsv2__delimiter', $delimiter);
616
-        $enclosure = apply_filters('FHEE__EE_CSV__fputcsv2__enclosure', $enclosure);
617
-
618
-        $delimiter_esc = preg_quote($delimiter, '/');
619
-        $enclosure_esc = preg_quote($enclosure, '/');
620
-
621
-        $output = array();
622
-        foreach ($row as $field_value) {
623
-            if (is_object($field_value) || is_array($field_value)) {
624
-                $field_value = serialize($field_value);
625
-            }
626
-            if ($field_value === null && $mysql_null) {
627
-                $output[] = 'NULL';
628
-                continue;
629
-            }
630
-
631
-            $output[] = preg_match("/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field_value) ?
632
-                ($enclosure . str_replace($enclosure, $enclosure . $enclosure, $field_value) . $enclosure)
633
-                : $field_value;
634
-        }
635
-
636
-        fwrite($fh, join($delimiter, $output) . PHP_EOL);
637
-    }
638
-
639
-
640
-    // /**
641
-    //  * @CSV    Import / Export messages
642
-    //  * @access public
643
-    //  * @return void
644
-    //  */
645
-    // public function csv_admin_notices()
646
-    // {
647
-    //
648
-    //     // We play both kinds of music here! Country AND Western! - err... I mean, cycle through both types of notices
649
-    //     foreach (array('updates', 'errors') as $type) {
650
-    //
651
-    //         // if particular notice type is not empty, then "You've got Mail"
652
-    //         if (! empty($this->_notices[ $type ])) {
653
-    //
654
-    //             // is it an update or an error ?
655
-    //             $msg_class = $type == 'updates' ? 'updated' : 'error';
656
-    //             echo '<div id="message" class="' . $msg_class . '">';
657
-    //             // display each notice, however many that may be
658
-    //             foreach ($this->_notices[ $type ] as $message) {
659
-    //                 echo '<p>' . $message . '</p>';
660
-    //             }
661
-    //             // wrap it up
662
-    //             echo '</div>';
663
-    //         }
664
-    //     }
665
-    // }
666
-
667
-    /**
668
-     * Gets the date format to use in teh csv. filterable
669
-     *
670
-     * @param string $current_format
671
-     * @return string
672
-     */
673
-    public function get_date_format_for_csv($current_format = null)
674
-    {
675
-        return apply_filters('FHEE__EE_CSV__get_date_format_for_csv__format', 'Y-m-d', $current_format);
676
-    }
677
-
678
-    /**
679
-     * Gets the time format we want to use in CSV reports. Filterable
680
-     *
681
-     * @param string $current_format
682
-     * @return string
683
-     */
684
-    public function get_time_format_for_csv($current_format = null)
685
-    {
686
-        return apply_filters('FHEE__EE_CSV__get_time_format_for_csv__format', 'H:i:s', $current_format);
687
-    }
19
+	// instance of the EE_CSV object
20
+	private static $_instance = null;
21
+
22
+
23
+	// multidimensional array to store update & error messages
24
+	// var $_notices = array( 'updates' => array(), 'errors' => array() );
25
+
26
+
27
+	private $_primary_keys;
28
+
29
+	/**
30
+	 *
31
+	 * @var EE_Registry
32
+	 */
33
+	private $EE;
34
+	/**
35
+	 * string used for 1st cell in exports, which indicates that the following 2 rows will be metadata keys and values
36
+	 */
37
+	const metadata_header = 'Event Espresso Export Meta Data';
38
+
39
+	/**
40
+	 *        private constructor to prevent direct creation
41
+	 *
42
+	 * @Constructor
43
+	 * @access private
44
+	 * @return void
45
+	 */
46
+	private function __construct()
47
+	{
48
+		global $wpdb;
49
+
50
+		$this->_primary_keys = array(
51
+			$wpdb->prefix . 'esp_answer'                  => array('ANS_ID'),
52
+			$wpdb->prefix . 'esp_attendee'                => array('ATT_ID'),
53
+			$wpdb->prefix . 'esp_datetime'                => array('DTT_ID'),
54
+			$wpdb->prefix . 'esp_event_question_group'    => array('EQG_ID'),
55
+			$wpdb->prefix . 'esp_message_template'        => array('MTP_ID'),
56
+			$wpdb->prefix . 'esp_payment'                 => array('PAY_ID'),
57
+			$wpdb->prefix . 'esp_price'                   => array('PRC_ID'),
58
+			$wpdb->prefix . 'esp_price_type'              => array('PRT_ID'),
59
+			$wpdb->prefix . 'esp_question'                => array('QST_ID'),
60
+			$wpdb->prefix . 'esp_question_group'          => array('QSG_ID'),
61
+			$wpdb->prefix . 'esp_question_group_question' => array('QGQ_ID'),
62
+			$wpdb->prefix . 'esp_question_option'         => array('QSO_ID'),
63
+			$wpdb->prefix . 'esp_registration'            => array('REG_ID'),
64
+			$wpdb->prefix . 'esp_status'                  => array('STS_ID'),
65
+			$wpdb->prefix . 'esp_transaction'             => array('TXN_ID'),
66
+			$wpdb->prefix . 'esp_transaction'             => array('TXN_ID'),
67
+			$wpdb->prefix . 'events_detail'               => array('id'),
68
+			$wpdb->prefix . 'events_category_detail'      => array('id'),
69
+			$wpdb->prefix . 'events_category_rel'         => array('id'),
70
+			$wpdb->prefix . 'events_venue'                => array('id'),
71
+			$wpdb->prefix . 'events_venue_rel'            => array('emeta_id'),
72
+			$wpdb->prefix . 'events_locale'               => array('id'),
73
+			$wpdb->prefix . 'events_locale_rel'           => array('id'),
74
+			$wpdb->prefix . 'events_personnel'            => array('id'),
75
+			$wpdb->prefix . 'events_personnel_rel'        => array('id'),
76
+		);
77
+	}
78
+
79
+
80
+	/**
81
+	 *        @ singleton method used to instantiate class object
82
+	 *        @ access public
83
+	 *
84
+	 * @return EE_CSV
85
+	 */
86
+	public static function instance()
87
+	{
88
+		// check if class object is instantiated
89
+		if (self::$_instance === null or ! is_object(self::$_instance) or ! (self::$_instance instanceof EE_CSV)) {
90
+			self::$_instance = new self();
91
+		}
92
+		return self::$_instance;
93
+	}
94
+
95
+	/**
96
+	 * Opens a unicode or utf file (normal file_get_contents has difficulty readin ga unicode file. @see
97
+	 * http://stackoverflow.com/questions/15092764/how-to-read-unicode-text-file-in-php
98
+	 *
99
+	 * @param string $file_path
100
+	 * @return string
101
+	 * @throws EE_Error
102
+	 */
103
+	private function read_unicode_file($file_path)
104
+	{
105
+		$fc = "";
106
+		$fh = fopen($file_path, "rb");
107
+		if (! $fh) {
108
+			throw new EE_Error(sprintf(__("Cannot open file for read: %s<br>\n", 'event_espresso'), $file_path));
109
+		}
110
+		$flen = filesize($file_path);
111
+		$bc = fread($fh, $flen);
112
+		for ($i = 0; $i < $flen; $i++) {
113
+			$c = substr($bc, $i, 1);
114
+			if ((ord($c) != 0) && (ord($c) != 13)) {
115
+				$fc = $fc . $c;
116
+			}
117
+		}
118
+		if ((ord(substr($fc, 0, 1)) == 255) && (ord(substr($fc, 1, 1)) == 254)) {
119
+			$fc = substr($fc, 2);
120
+		}
121
+		return ($fc);
122
+	}
123
+
124
+
125
+	/**
126
+	 * Generic CSV-functionality to turn an entire CSV file into a single array that's
127
+	 * NOT in a specific format to EE. It's just a 2-level array, with top-level arrays
128
+	 * representing each row in the CSV file, and the second-level arrays being each column in that row
129
+	 *
130
+	 * @param string $path_to_file
131
+	 * @return array of arrays. Top-level array has rows, second-level array has each item
132
+	 */
133
+	public function import_csv_to_multi_dimensional_array($path_to_file)
134
+	{
135
+		// needed to deal with Mac line endings
136
+		ini_set('auto_detect_line_endings', true);
137
+
138
+		// because fgetcsv does not correctly deal with backslashed quotes such as \"
139
+		// we'll read the file into a string
140
+		$file_contents = $this->read_unicode_file($path_to_file);
141
+		// replace backslashed quotes with CSV enclosures
142
+		$file_contents = str_replace('\\"', '"""', $file_contents);
143
+		// HEY YOU! PUT THAT FILE BACK!!!
144
+		file_put_contents($path_to_file, $file_contents);
145
+
146
+		if (($file_handle = fopen($path_to_file, "r")) !== false) {
147
+			# Set the parent multidimensional array key to 0.
148
+			$nn = 0;
149
+			$csvarray = array();
150
+
151
+			// in PHP 5.3 fgetcsv accepts a 5th parameter, but the pre 5.3 versions of fgetcsv choke if passed more than 4 - is that crazy or what?
152
+			if (version_compare(PHP_VERSION, '5.3.0') < 0) {
153
+				//  PHP 5.2- version
154
+				// loop through each row of the file
155
+				while (($data = fgetcsv($file_handle, 0, ',', '"')) !== false) {
156
+					$csvarray[] = $data;
157
+				}
158
+			} else {
159
+				// loop through each row of the file
160
+				while (($data = fgetcsv($file_handle, 0, ',', '"', '\\')) !== false) {
161
+					$csvarray[] = $data;
162
+				}
163
+			}
164
+			# Close the File.
165
+			fclose($file_handle);
166
+			return $csvarray;
167
+		} else {
168
+			EE_Error::add_error(
169
+				sprintf(__("An error occurred - the file: %s could not opened.", "event_espresso"), $path_to_file),
170
+				__FILE__,
171
+				__FUNCTION__,
172
+				__LINE__
173
+			);
174
+			return false;
175
+		}
176
+	}
177
+
178
+
179
+	/**
180
+	 * @Import contents of csv file and store values in an array to be manipulated by other functions
181
+	 * @access public
182
+	 * @param string  $path_to_file         - the csv file to be imported including the path to it's location.
183
+	 *                                      If $model_name is provided, assumes that each row in the CSV represents a
184
+	 *                                      model object for that model If $model_name ISN'T provided, assumes that
185
+	 *                                      before model object data, there is a row where the first entry is simply
186
+	 *                                      'MODEL', and next entry is the model's name, (untranslated) like Event, and
187
+	 *                                      then maybe a row of headers, and then the model data. Eg.
188
+	 *                                      '<br>MODEL,Event,<br>EVT_ID,EVT_name,...<br>1,Monkey
189
+	 *                                      Party,...<br>2,Llamarama,...<br>MODEL,Venue,<br>VNU_ID,VNU_name<br>1,The
190
+	 *                                      Forest
191
+	 * @param string  $model_name           model name if we know what model we're importing
192
+	 * @param boolean $first_row_is_headers - whether the first row of data is headers or not - TRUE = headers, FALSE =
193
+	 *                                      data
194
+	 * @return mixed - array on success - multi dimensional with headers as keys (if headers exist) OR string on fail -
195
+	 *               error message like the following array('Event'=>array( array('EVT_ID'=>1,'EVT_name'=>'bob
196
+	 *               party',...), array('EVT_ID'=>2,'EVT_name'=>'llamarama',...),
197
+	 *                                      ...
198
+	 *                                      )
199
+	 *                                      'Venue'=>array(
200
+	 *                                      array('VNU_ID'=>1,'VNU_name'=>'the shack',...),
201
+	 *                                      array('VNU_ID'=>2,'VNU_name'=>'tree house',...),
202
+	 *                                      ...
203
+	 *                                      )
204
+	 *                                      ...
205
+	 *                                      )
206
+	 */
207
+	public function import_csv_to_model_data_array($path_to_file, $model_name = false, $first_row_is_headers = true)
208
+	{
209
+		$multi_dimensional_array = $this->import_csv_to_multi_dimensional_array($path_to_file);
210
+		if (! $multi_dimensional_array) {
211
+			return false;
212
+		}
213
+		// gotta start somewhere
214
+		$row = 1;
215
+		// array to store csv data in
216
+		$ee_formatted_data = array();
217
+		// array to store headers (column names)
218
+		$headers = array();
219
+		foreach ($multi_dimensional_array as $data) {
220
+			// if first cell is MODEL, then second cell is the MODEL name
221
+			if ($data[0] == 'MODEL') {
222
+				$model_name = $data[1];
223
+				// don't bother looking for model data in this row. The rest of this
224
+				// row should be blank
225
+				// AND pretend this is the first row again
226
+				$row = 1;
227
+				// reset headers
228
+				$headers = array();
229
+				continue;
230
+			}
231
+			if (strpos($data[0], EE_CSV::metadata_header) !== false) {
232
+				$model_name = EE_CSV::metadata_header;
233
+				// store like model data, we just won't try importing it etc.
234
+				$row = 1;
235
+				continue;
236
+			}
237
+
238
+
239
+			// how many columns are there?
240
+			$columns = count($data);
241
+
242
+			$model_entry = array();
243
+			// loop through each column
244
+			for ($i = 0; $i < $columns; $i++) {
245
+				// replace csv_enclosures with backslashed quotes
246
+				$data[ $i ] = str_replace('"""', '\\"', $data[ $i ]);
247
+				// do we need to grab the column names?
248
+				if ($row === 1) {
249
+					if ($first_row_is_headers) {
250
+						// store the column names to use for keys
251
+						$column_name = $data[ $i ];
252
+						// check it's not blank... sometimes CSV editign programs adda bunch of empty columns onto the end...
253
+						if (! $column_name) {
254
+							continue;
255
+						}
256
+						$matches = array();
257
+						if ($model_name == EE_CSV::metadata_header) {
258
+							$headers[ $i ] = $column_name;
259
+						} else {
260
+							// now get the db table name from it (the part between square brackets)
261
+							$success = preg_match('~(.*)\[(.*)\]~', $column_name, $matches);
262
+							if (! $success) {
263
+								EE_Error::add_error(
264
+									sprintf(
265
+										__(
266
+											"The column titled %s is invalid for importing. It must be be in the format of 'Nice Name[model_field_name]' in row %s",
267
+											"event_espresso"
268
+										),
269
+										$column_name,
270
+										implode(",", $data)
271
+									),
272
+									__FILE__,
273
+									__FUNCTION__,
274
+									__LINE__
275
+								);
276
+								return false;
277
+							}
278
+							$headers[ $i ] = $matches[2];
279
+						}
280
+					} else {
281
+						// no column names means our final array will just use counters for keys
282
+						$model_entry[ $headers[ $i ] ] = $data[ $i ];
283
+						$headers[ $i ] = $i;
284
+					}
285
+					// and we need to store csv data
286
+				} else {
287
+					// this column isn' ta header, store it if there is a header for it
288
+					if (isset($headers[ $i ])) {
289
+						$model_entry[ $headers[ $i ] ] = $data[ $i ];
290
+					}
291
+				}
292
+			}
293
+			// save the row's data IF it's a non-header-row
294
+			if (! $first_row_is_headers || ($first_row_is_headers && $row > 1)) {
295
+				$ee_formatted_data[ $model_name ][] = $model_entry;
296
+			}
297
+			// advance to next row
298
+			$row++;
299
+		}
300
+
301
+		// delete the uploaded file
302
+		unlink($path_to_file);
303
+		// echo '<pre style="height:auto;border:2px solid lightblue;">' . print_r( $ee_formatted_data, TRUE ) . '</pre><br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>';
304
+		// die();
305
+
306
+		// it's good to give back
307
+		return $ee_formatted_data;
308
+	}
309
+
310
+
311
+	public function save_csv_to_db($csv_data_array, $model_name = false)
312
+	{
313
+		EE_Error::doing_it_wrong(
314
+			'save_csv_to_db',
315
+			__(
316
+				'Function moved to EE_Import and renamed to save_csv_data_array_to_db',
317
+				'event_espresso'
318
+			),
319
+			'4.6.7'
320
+		);
321
+		return EE_Import::instance()->save_csv_data_array_to_db($csv_data_array, $model_name);
322
+	}
323
+
324
+	/**
325
+	 * Sends HTTP headers to indicate that the browser should download a file,
326
+	 * and starts writing the file to PHP's output. Returns the file handle so other functions can
327
+	 * also write to it
328
+	 *
329
+	 * @param string $new_filename the name of the file that the user will download
330
+	 * @return resource, like the results of fopen(), which can be used for fwrite, fputcsv2, etc.
331
+	 */
332
+	public function begin_sending_csv($filename)
333
+	{
334
+		// grab file extension
335
+		$ext = substr(strrchr($filename, '.'), 1);
336
+		if ($ext == '.csv' or $ext == '.xls') {
337
+			str_replace($ext, '', $filename);
338
+		}
339
+		$filename .= '.csv';
340
+
341
+		// if somebody's been naughty and already started outputting stuff, trash it
342
+		// and start writing our stuff.
343
+		if (ob_get_length()) {
344
+			@ob_flush();
345
+			@flush();
346
+			@ob_end_flush();
347
+		}
348
+		@ob_start();
349
+		header("Pragma: public");
350
+		header("Expires: 0");
351
+		header("Pragma: no-cache");
352
+		header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
353
+		// header("Content-Type: application/force-download");
354
+		// header("Content-Type: application/octet-stream");
355
+		// header("Content-Type: application/download");
356
+		header('Content-disposition: attachment; filename=' . $filename);
357
+		header("Content-Type: text/csv; charset=utf-8");
358
+		do_action('AHEE__EE_CSV__begin_sending_csv__headers');
359
+		echo apply_filters(
360
+			'FHEE__EE_CSV__begin_sending_csv__start_writing',
361
+			"\xEF\xBB\xBF"
362
+		); // makes excel open it as UTF-8. UTF-8 BOM, see http://stackoverflow.com/a/4440143/2773835
363
+		$fh = fopen('php://output', 'w');
364
+		return $fh;
365
+	}
366
+
367
+	/**
368
+	 * Writes some meta data to the CSV as a bunch of columns. Initially we're only
369
+	 * mentioning the version and timezone
370
+	 *
371
+	 * @param resource $filehandle
372
+	 */
373
+	public function write_metadata_to_csv($filehandle)
374
+	{
375
+		$data_row = array(EE_CSV::metadata_header);// do NOT translate because this exact string is used when importing
376
+		$this->fputcsv2($filehandle, $data_row);
377
+		$meta_data = array(
378
+			0 => array(
379
+				'version'        => espresso_version(),
380
+				'timezone'       => EEH_DTT_Helper::get_timezone(),
381
+				'time_of_export' => current_time('mysql'),
382
+				'site_url'       => site_url(),
383
+			),
384
+		);
385
+		$this->write_data_array_to_csv($filehandle, $meta_data);
386
+	}
387
+
388
+
389
+	/**
390
+	 * Writes $data to the csv file open in $filehandle. uses the array indices of $data for column headers
391
+	 *
392
+	 * @param array   $data                 2D array, first numerically-indexed, and next-level-down preferably indexed
393
+	 *                                      by string
394
+	 * @param boolean $add_csv_column_names whether or not we should add the keys in the bottom-most array as a row for
395
+	 *                                      headers in the CSV. Eg, if $data looked like
396
+	 *                                      array(0=>array('EVT_ID'=>1,'EVT_name'=>'monkey'...), 1=>array(...),...))
397
+	 *                                      then the first row we'd write to the CSV would be "EVT_ID,EVT_name,..."
398
+	 * @return boolean if we successfully wrote to the CSV or not. If there's no $data, we consider that a success
399
+	 *                 (because we wrote everything there was...nothing)
400
+	 */
401
+	public function write_data_array_to_csv($filehandle, $data)
402
+	{
403
+
404
+
405
+		// determine if $data is actually a 2d array
406
+		if ($data && is_array($data) && is_array(EEH_Array::get_one_item_from_array($data))) {
407
+			// make sure top level is numerically indexed,
408
+
409
+			if (EEH_Array::is_associative_array($data)) {
410
+				throw new EE_Error(
411
+					sprintf(
412
+						__(
413
+							"top-level array must be numerically indexed. Does these look like numbers to you? %s",
414
+							"event_espresso"
415
+						),
416
+						implode(",", array_keys($data))
417
+					)
418
+				);
419
+			}
420
+			$item_in_top_level_array = EEH_Array::get_one_item_from_array($data);
421
+			// now, is the last item in the top-level array of $data an associative or numeric array?
422
+			if (EEH_Array::is_associative_array($item_in_top_level_array)) {
423
+				// its associative, so we want to output its keys as column headers
424
+				$keys = array_keys($item_in_top_level_array);
425
+				echo $this->fputcsv2($filehandle, $keys);
426
+			}
427
+			// start writing data
428
+			foreach ($data as $data_row) {
429
+				echo $this->fputcsv2($filehandle, $data_row);
430
+			}
431
+			return true;
432
+		} else {
433
+			// no data TO write... so we can assume that's a success
434
+			return true;
435
+		}
436
+		// //if 2nd level is indexed by strings, use those as csv column headers (ie, the first row)
437
+		//
438
+		//
439
+		// $no_table = TRUE;
440
+		//
441
+		// // loop through data and add each row to the file/stream as csv
442
+		// foreach ( $data as $model_name => $model_data ) {
443
+		// // test first row to see if it is data or a model name
444
+		// $model = EE_Registry::instance();->load_model($model_name);
445
+		// //if the model really exists,
446
+		// if ( $model ) {
447
+		//
448
+		// // we have a table name
449
+		// $no_table = FALSE;
450
+		//
451
+		// // put the tablename into an array cuz that's how fputcsv rolls
452
+		// $model_name_row = array( 'MODEL', $model_name );
453
+		//
454
+		// // add table name to csv output
455
+		// echo self::fputcsv2($filehandle, $model_name_row);
456
+		//
457
+		// // now get the rest of the data
458
+		// foreach ( $model_data as $row ) {
459
+		// // output the row
460
+		// echo self::fputcsv2($filehandle, $row);
461
+		// }
462
+		//
463
+		// }
464
+		//
465
+		// if ( $no_table ) {
466
+		// // no table so just put the data
467
+		// echo self::fputcsv2($filehandle, $model_data);
468
+		// }
469
+		//
470
+		// } // END OF foreach ( $data )
471
+	}
472
+
473
+	/**
474
+	 * Should be called after begin_sending_csv(), and one or more write_data_array_to_csv()s.
475
+	 * Calls exit to prevent polluting the CSV file with other junk
476
+	 *
477
+	 * @param resource $fh filehandle where we're writing the CSV to
478
+	 */
479
+	public function end_sending_csv($fh)
480
+	{
481
+		fclose($fh);
482
+		exit(0);
483
+	}
484
+
485
+	/**
486
+	 * Given an open file, writes all the model data to it in the format the importer expects.
487
+	 * Usually preceded by begin_sending_csv($filename), and followed by end_sending_csv($filehandle).
488
+	 *
489
+	 * @param resource $filehandle
490
+	 * @param array    $model_data_array is assumed to be a 3d array: 1st layer has keys of model names (eg 'Event'),
491
+	 *                                   next layer is numerically indexed to represent each model object (eg, each
492
+	 *                                   individual event), and the last layer has all the attributes o fthat model
493
+	 *                                   object (eg, the event's id, name, etc)
494
+	 * @return boolean success
495
+	 */
496
+	public function write_model_data_to_csv($filehandle, $model_data_array)
497
+	{
498
+		$this->write_metadata_to_csv($filehandle);
499
+		foreach ($model_data_array as $model_name => $model_instance_arrays) {
500
+			// first: output a special row stating the model
501
+			echo $this->fputcsv2($filehandle, array('MODEL', $model_name));
502
+			// if we have items to put in the CSV, do it normally
503
+
504
+			if (! empty($model_instance_arrays)) {
505
+				$this->write_data_array_to_csv($filehandle, $model_instance_arrays);
506
+			} else {
507
+				// echo "no data to write... so just write the headers";
508
+				// so there's actually NO model objects for that model.
509
+				// probably still want to show the columns
510
+				$model = EE_Registry::instance()->load_model($model_name);
511
+				$column_names = array();
512
+				foreach ($model->field_settings() as $field) {
513
+					$column_names[ $field->get_nicename() . "[" . $field->get_name() . "]" ] = null;
514
+				}
515
+				$this->write_data_array_to_csv($filehandle, array($column_names));
516
+			}
517
+		}
518
+	}
519
+
520
+	/**
521
+	 * Writes the CSV file to the output buffer, with rows corresponding to $model_data_array,
522
+	 * and dies (in order to avoid other plugins from messing up the csv output)
523
+	 *
524
+	 * @param string $filename         the filename you want to give the file
525
+	 * @param array  $model_data_array 3d array, as described in EE_CSV::write_model_data_to_csv()
526
+	 * @return bool | void writes CSV file to output and dies
527
+	 */
528
+	public function export_multiple_model_data_to_csv($filename, $model_data_array)
529
+	{
530
+		$filehandle = $this->begin_sending_csv($filename);
531
+		$this->write_model_data_to_csv($filehandle, $model_data_array);
532
+		$this->end_sending_csv($filehandle);
533
+	}
534
+
535
+	/**
536
+	 * @Export contents of an array to csv file
537
+	 * @access public
538
+	 * @param array  $data     - the array of data to be converted to csv and exported
539
+	 * @param string $filename - name for newly created csv file
540
+	 * @return TRUE on success, FALSE on fail
541
+	 */
542
+	public function export_array_to_csv($data = false, $filename = false)
543
+	{
544
+
545
+		// no data file?? get outta here
546
+		if (! $data or ! is_array($data) or empty($data)) {
547
+			return false;
548
+		}
549
+
550
+		// no filename?? get outta here
551
+		if (! $filename) {
552
+			return false;
553
+		}
554
+
555
+
556
+		// somebody told me i might need this ???
557
+		global $wpdb;
558
+		$prefix = $wpdb->prefix;
559
+
560
+
561
+		$fh = $this->begin_sending_csv($filename);
562
+
563
+
564
+		$this->end_sending_csv($fh);
565
+	}
566
+
567
+
568
+	/**
569
+	 * @Determine the maximum upload file size based on php.ini settings
570
+	 * @access    public
571
+	 * @param int $percent_of_max - desired percentage of the max upload_mb
572
+	 * @return int KB
573
+	 */
574
+	public function get_max_upload_size($percent_of_max = false)
575
+	{
576
+
577
+		$max_upload = (int) (ini_get('upload_max_filesize'));
578
+		$max_post = (int) (ini_get('post_max_size'));
579
+		$memory_limit = (int) (ini_get('memory_limit'));
580
+
581
+		// determine the smallest of the three values from above
582
+		$upload_mb = min($max_upload, $max_post, $memory_limit);
583
+
584
+		// convert MB to KB
585
+		$upload_mb = $upload_mb * 1024;
586
+
587
+		// don't want the full monty? then reduce the max uplaod size
588
+		if ($percent_of_max) {
589
+			// is percent_of_max like this -> 50 or like this -> 0.50 ?
590
+			if ($percent_of_max > 1) {
591
+				// chnages 50 to 0.50
592
+				$percent_of_max = $percent_of_max / 100;
593
+			}
594
+			// make upload_mb a percentage of the max upload_mb
595
+			$upload_mb = $upload_mb * $percent_of_max;
596
+		}
597
+
598
+		return $upload_mb;
599
+	}
600
+
601
+
602
+	/**
603
+	 * @Drop   in replacement for PHP's fputcsv function - but this one works!!!
604
+	 * @access private
605
+	 * @param resource $fh         - file handle - what we are writing to
606
+	 * @param array    $row        - individual row of csv data
607
+	 * @param string   $delimiter  - csv delimiter
608
+	 * @param string   $enclosure  - csv enclosure
609
+	 * @param string   $mysql_null - allows php NULL to be overridden with MySQl's insertable NULL value
610
+	 * @return void
611
+	 */
612
+	private function fputcsv2($fh, array $row, $delimiter = ',', $enclosure = '"', $mysql_null = false)
613
+	{
614
+		// Allow user to filter the csv delimiter and enclosure for other countries csv standards
615
+		$delimiter = apply_filters('FHEE__EE_CSV__fputcsv2__delimiter', $delimiter);
616
+		$enclosure = apply_filters('FHEE__EE_CSV__fputcsv2__enclosure', $enclosure);
617
+
618
+		$delimiter_esc = preg_quote($delimiter, '/');
619
+		$enclosure_esc = preg_quote($enclosure, '/');
620
+
621
+		$output = array();
622
+		foreach ($row as $field_value) {
623
+			if (is_object($field_value) || is_array($field_value)) {
624
+				$field_value = serialize($field_value);
625
+			}
626
+			if ($field_value === null && $mysql_null) {
627
+				$output[] = 'NULL';
628
+				continue;
629
+			}
630
+
631
+			$output[] = preg_match("/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field_value) ?
632
+				($enclosure . str_replace($enclosure, $enclosure . $enclosure, $field_value) . $enclosure)
633
+				: $field_value;
634
+		}
635
+
636
+		fwrite($fh, join($delimiter, $output) . PHP_EOL);
637
+	}
638
+
639
+
640
+	// /**
641
+	//  * @CSV    Import / Export messages
642
+	//  * @access public
643
+	//  * @return void
644
+	//  */
645
+	// public function csv_admin_notices()
646
+	// {
647
+	//
648
+	//     // We play both kinds of music here! Country AND Western! - err... I mean, cycle through both types of notices
649
+	//     foreach (array('updates', 'errors') as $type) {
650
+	//
651
+	//         // if particular notice type is not empty, then "You've got Mail"
652
+	//         if (! empty($this->_notices[ $type ])) {
653
+	//
654
+	//             // is it an update or an error ?
655
+	//             $msg_class = $type == 'updates' ? 'updated' : 'error';
656
+	//             echo '<div id="message" class="' . $msg_class . '">';
657
+	//             // display each notice, however many that may be
658
+	//             foreach ($this->_notices[ $type ] as $message) {
659
+	//                 echo '<p>' . $message . '</p>';
660
+	//             }
661
+	//             // wrap it up
662
+	//             echo '</div>';
663
+	//         }
664
+	//     }
665
+	// }
666
+
667
+	/**
668
+	 * Gets the date format to use in teh csv. filterable
669
+	 *
670
+	 * @param string $current_format
671
+	 * @return string
672
+	 */
673
+	public function get_date_format_for_csv($current_format = null)
674
+	{
675
+		return apply_filters('FHEE__EE_CSV__get_date_format_for_csv__format', 'Y-m-d', $current_format);
676
+	}
677
+
678
+	/**
679
+	 * Gets the time format we want to use in CSV reports. Filterable
680
+	 *
681
+	 * @param string $current_format
682
+	 * @return string
683
+	 */
684
+	public function get_time_format_for_csv($current_format = null)
685
+	{
686
+		return apply_filters('FHEE__EE_CSV__get_time_format_for_csv__format', 'H:i:s', $current_format);
687
+	}
688 688
 }
Please login to merge, or discard this patch.
Spacing   +48 added lines, -48 removed lines patch added patch discarded remove patch
@@ -48,31 +48,31 @@  discard block
 block discarded – undo
48 48
         global $wpdb;
49 49
 
50 50
         $this->_primary_keys = array(
51
-            $wpdb->prefix . 'esp_answer'                  => array('ANS_ID'),
52
-            $wpdb->prefix . 'esp_attendee'                => array('ATT_ID'),
53
-            $wpdb->prefix . 'esp_datetime'                => array('DTT_ID'),
54
-            $wpdb->prefix . 'esp_event_question_group'    => array('EQG_ID'),
55
-            $wpdb->prefix . 'esp_message_template'        => array('MTP_ID'),
56
-            $wpdb->prefix . 'esp_payment'                 => array('PAY_ID'),
57
-            $wpdb->prefix . 'esp_price'                   => array('PRC_ID'),
58
-            $wpdb->prefix . 'esp_price_type'              => array('PRT_ID'),
59
-            $wpdb->prefix . 'esp_question'                => array('QST_ID'),
60
-            $wpdb->prefix . 'esp_question_group'          => array('QSG_ID'),
61
-            $wpdb->prefix . 'esp_question_group_question' => array('QGQ_ID'),
62
-            $wpdb->prefix . 'esp_question_option'         => array('QSO_ID'),
63
-            $wpdb->prefix . 'esp_registration'            => array('REG_ID'),
64
-            $wpdb->prefix . 'esp_status'                  => array('STS_ID'),
65
-            $wpdb->prefix . 'esp_transaction'             => array('TXN_ID'),
66
-            $wpdb->prefix . 'esp_transaction'             => array('TXN_ID'),
67
-            $wpdb->prefix . 'events_detail'               => array('id'),
68
-            $wpdb->prefix . 'events_category_detail'      => array('id'),
69
-            $wpdb->prefix . 'events_category_rel'         => array('id'),
70
-            $wpdb->prefix . 'events_venue'                => array('id'),
71
-            $wpdb->prefix . 'events_venue_rel'            => array('emeta_id'),
72
-            $wpdb->prefix . 'events_locale'               => array('id'),
73
-            $wpdb->prefix . 'events_locale_rel'           => array('id'),
74
-            $wpdb->prefix . 'events_personnel'            => array('id'),
75
-            $wpdb->prefix . 'events_personnel_rel'        => array('id'),
51
+            $wpdb->prefix.'esp_answer'                  => array('ANS_ID'),
52
+            $wpdb->prefix.'esp_attendee'                => array('ATT_ID'),
53
+            $wpdb->prefix.'esp_datetime'                => array('DTT_ID'),
54
+            $wpdb->prefix.'esp_event_question_group'    => array('EQG_ID'),
55
+            $wpdb->prefix.'esp_message_template'        => array('MTP_ID'),
56
+            $wpdb->prefix.'esp_payment'                 => array('PAY_ID'),
57
+            $wpdb->prefix.'esp_price'                   => array('PRC_ID'),
58
+            $wpdb->prefix.'esp_price_type'              => array('PRT_ID'),
59
+            $wpdb->prefix.'esp_question'                => array('QST_ID'),
60
+            $wpdb->prefix.'esp_question_group'          => array('QSG_ID'),
61
+            $wpdb->prefix.'esp_question_group_question' => array('QGQ_ID'),
62
+            $wpdb->prefix.'esp_question_option'         => array('QSO_ID'),
63
+            $wpdb->prefix.'esp_registration'            => array('REG_ID'),
64
+            $wpdb->prefix.'esp_status'                  => array('STS_ID'),
65
+            $wpdb->prefix.'esp_transaction'             => array('TXN_ID'),
66
+            $wpdb->prefix.'esp_transaction'             => array('TXN_ID'),
67
+            $wpdb->prefix.'events_detail'               => array('id'),
68
+            $wpdb->prefix.'events_category_detail'      => array('id'),
69
+            $wpdb->prefix.'events_category_rel'         => array('id'),
70
+            $wpdb->prefix.'events_venue'                => array('id'),
71
+            $wpdb->prefix.'events_venue_rel'            => array('emeta_id'),
72
+            $wpdb->prefix.'events_locale'               => array('id'),
73
+            $wpdb->prefix.'events_locale_rel'           => array('id'),
74
+            $wpdb->prefix.'events_personnel'            => array('id'),
75
+            $wpdb->prefix.'events_personnel_rel'        => array('id'),
76 76
         );
77 77
     }
78 78
 
@@ -104,7 +104,7 @@  discard block
 block discarded – undo
104 104
     {
105 105
         $fc = "";
106 106
         $fh = fopen($file_path, "rb");
107
-        if (! $fh) {
107
+        if ( ! $fh) {
108 108
             throw new EE_Error(sprintf(__("Cannot open file for read: %s<br>\n", 'event_espresso'), $file_path));
109 109
         }
110 110
         $flen = filesize($file_path);
@@ -112,7 +112,7 @@  discard block
 block discarded – undo
112 112
         for ($i = 0; $i < $flen; $i++) {
113 113
             $c = substr($bc, $i, 1);
114 114
             if ((ord($c) != 0) && (ord($c) != 13)) {
115
-                $fc = $fc . $c;
115
+                $fc = $fc.$c;
116 116
             }
117 117
         }
118 118
         if ((ord(substr($fc, 0, 1)) == 255) && (ord(substr($fc, 1, 1)) == 254)) {
@@ -207,7 +207,7 @@  discard block
 block discarded – undo
207 207
     public function import_csv_to_model_data_array($path_to_file, $model_name = false, $first_row_is_headers = true)
208 208
     {
209 209
         $multi_dimensional_array = $this->import_csv_to_multi_dimensional_array($path_to_file);
210
-        if (! $multi_dimensional_array) {
210
+        if ( ! $multi_dimensional_array) {
211 211
             return false;
212 212
         }
213 213
         // gotta start somewhere
@@ -243,23 +243,23 @@  discard block
 block discarded – undo
243 243
             // loop through each column
244 244
             for ($i = 0; $i < $columns; $i++) {
245 245
                 // replace csv_enclosures with backslashed quotes
246
-                $data[ $i ] = str_replace('"""', '\\"', $data[ $i ]);
246
+                $data[$i] = str_replace('"""', '\\"', $data[$i]);
247 247
                 // do we need to grab the column names?
248 248
                 if ($row === 1) {
249 249
                     if ($first_row_is_headers) {
250 250
                         // store the column names to use for keys
251
-                        $column_name = $data[ $i ];
251
+                        $column_name = $data[$i];
252 252
                         // check it's not blank... sometimes CSV editign programs adda bunch of empty columns onto the end...
253
-                        if (! $column_name) {
253
+                        if ( ! $column_name) {
254 254
                             continue;
255 255
                         }
256 256
                         $matches = array();
257 257
                         if ($model_name == EE_CSV::metadata_header) {
258
-                            $headers[ $i ] = $column_name;
258
+                            $headers[$i] = $column_name;
259 259
                         } else {
260 260
                             // now get the db table name from it (the part between square brackets)
261 261
                             $success = preg_match('~(.*)\[(.*)\]~', $column_name, $matches);
262
-                            if (! $success) {
262
+                            if ( ! $success) {
263 263
                                 EE_Error::add_error(
264 264
                                     sprintf(
265 265
                                         __(
@@ -275,24 +275,24 @@  discard block
 block discarded – undo
275 275
                                 );
276 276
                                 return false;
277 277
                             }
278
-                            $headers[ $i ] = $matches[2];
278
+                            $headers[$i] = $matches[2];
279 279
                         }
280 280
                     } else {
281 281
                         // no column names means our final array will just use counters for keys
282
-                        $model_entry[ $headers[ $i ] ] = $data[ $i ];
283
-                        $headers[ $i ] = $i;
282
+                        $model_entry[$headers[$i]] = $data[$i];
283
+                        $headers[$i] = $i;
284 284
                     }
285 285
                     // and we need to store csv data
286 286
                 } else {
287 287
                     // this column isn' ta header, store it if there is a header for it
288
-                    if (isset($headers[ $i ])) {
289
-                        $model_entry[ $headers[ $i ] ] = $data[ $i ];
288
+                    if (isset($headers[$i])) {
289
+                        $model_entry[$headers[$i]] = $data[$i];
290 290
                     }
291 291
                 }
292 292
             }
293 293
             // save the row's data IF it's a non-header-row
294
-            if (! $first_row_is_headers || ($first_row_is_headers && $row > 1)) {
295
-                $ee_formatted_data[ $model_name ][] = $model_entry;
294
+            if ( ! $first_row_is_headers || ($first_row_is_headers && $row > 1)) {
295
+                $ee_formatted_data[$model_name][] = $model_entry;
296 296
             }
297 297
             // advance to next row
298 298
             $row++;
@@ -353,7 +353,7 @@  discard block
 block discarded – undo
353 353
         // header("Content-Type: application/force-download");
354 354
         // header("Content-Type: application/octet-stream");
355 355
         // header("Content-Type: application/download");
356
-        header('Content-disposition: attachment; filename=' . $filename);
356
+        header('Content-disposition: attachment; filename='.$filename);
357 357
         header("Content-Type: text/csv; charset=utf-8");
358 358
         do_action('AHEE__EE_CSV__begin_sending_csv__headers');
359 359
         echo apply_filters(
@@ -372,7 +372,7 @@  discard block
 block discarded – undo
372 372
      */
373 373
     public function write_metadata_to_csv($filehandle)
374 374
     {
375
-        $data_row = array(EE_CSV::metadata_header);// do NOT translate because this exact string is used when importing
375
+        $data_row = array(EE_CSV::metadata_header); // do NOT translate because this exact string is used when importing
376 376
         $this->fputcsv2($filehandle, $data_row);
377 377
         $meta_data = array(
378 378
             0 => array(
@@ -501,7 +501,7 @@  discard block
 block discarded – undo
501 501
             echo $this->fputcsv2($filehandle, array('MODEL', $model_name));
502 502
             // if we have items to put in the CSV, do it normally
503 503
 
504
-            if (! empty($model_instance_arrays)) {
504
+            if ( ! empty($model_instance_arrays)) {
505 505
                 $this->write_data_array_to_csv($filehandle, $model_instance_arrays);
506 506
             } else {
507 507
                 // echo "no data to write... so just write the headers";
@@ -510,7 +510,7 @@  discard block
 block discarded – undo
510 510
                 $model = EE_Registry::instance()->load_model($model_name);
511 511
                 $column_names = array();
512 512
                 foreach ($model->field_settings() as $field) {
513
-                    $column_names[ $field->get_nicename() . "[" . $field->get_name() . "]" ] = null;
513
+                    $column_names[$field->get_nicename()."[".$field->get_name()."]"] = null;
514 514
                 }
515 515
                 $this->write_data_array_to_csv($filehandle, array($column_names));
516 516
             }
@@ -543,12 +543,12 @@  discard block
 block discarded – undo
543 543
     {
544 544
 
545 545
         // no data file?? get outta here
546
-        if (! $data or ! is_array($data) or empty($data)) {
546
+        if ( ! $data or ! is_array($data) or empty($data)) {
547 547
             return false;
548 548
         }
549 549
 
550 550
         // no filename?? get outta here
551
-        if (! $filename) {
551
+        if ( ! $filename) {
552 552
             return false;
553 553
         }
554 554
 
@@ -629,11 +629,11 @@  discard block
 block discarded – undo
629 629
             }
630 630
 
631 631
             $output[] = preg_match("/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field_value) ?
632
-                ($enclosure . str_replace($enclosure, $enclosure . $enclosure, $field_value) . $enclosure)
632
+                ($enclosure.str_replace($enclosure, $enclosure.$enclosure, $field_value).$enclosure)
633 633
                 : $field_value;
634 634
         }
635 635
 
636
-        fwrite($fh, join($delimiter, $output) . PHP_EOL);
636
+        fwrite($fh, join($delimiter, $output).PHP_EOL);
637 637
     }
638 638
 
639 639
 
Please login to merge, or discard this patch.
core/db_classes/EE_Currency.class.php 2 patches
Doc Comments   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -46,7 +46,7 @@  discard block
 block discarded – undo
46 46
      * @param array  $props_n_values  incoming values from the database
47 47
      * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
48 48
      *                                the website will be used.
49
-     * @return EE_Attendee
49
+     * @return EE_Currency
50 50
      */
51 51
     public static function new_instance_from_db($props_n_values = array(), $timezone = null)
52 52
     {
@@ -67,7 +67,7 @@  discard block
 block discarded – undo
67 67
      * Sets code
68 68
      *
69 69
      * @param string $code
70
-     * @return boolean
70
+     * @return boolean|null
71 71
      */
72 72
     public function set_code($code)
73 73
     {
@@ -88,7 +88,7 @@  discard block
 block discarded – undo
88 88
      * Sets active
89 89
      *
90 90
      * @param boolean $active
91
-     * @return boolean
91
+     * @return boolean|null
92 92
      */
93 93
     public function set_active($active)
94 94
     {
@@ -109,7 +109,7 @@  discard block
 block discarded – undo
109 109
      * Sets dec_plc
110 110
      *
111 111
      * @param int $dec_plc
112
-     * @return boolean
112
+     * @return boolean|null
113 113
      */
114 114
     public function set_dec_plc($dec_plc)
115 115
     {
@@ -130,7 +130,7 @@  discard block
 block discarded – undo
130 130
      * Sets plural
131 131
      *
132 132
      * @param string $plural
133
-     * @return boolean
133
+     * @return boolean|null
134 134
      */
135 135
     public function set_plural_name($plural)
136 136
     {
@@ -151,7 +151,7 @@  discard block
 block discarded – undo
151 151
      * Sets sign
152 152
      *
153 153
      * @param string $sign
154
-     * @return boolean
154
+     * @return boolean|null
155 155
      */
156 156
     public function set_sign($sign)
157 157
     {
@@ -172,7 +172,7 @@  discard block
 block discarded – undo
172 172
      * Sets single
173 173
      *
174 174
      * @param string $single
175
-     * @return boolean
175
+     * @return boolean|null
176 176
      */
177 177
     public function set_singular_name($single)
178 178
     {
Please login to merge, or discard this patch.
Indentation   +176 added lines, -176 removed lines patch added patch discarded remove patch
@@ -12,180 +12,180 @@
 block discarded – undo
12 12
 class EE_Currency extends EE_Base_Class
13 13
 {
14 14
 
15
-    /** Currency COde @var CUR_code */
16
-    protected $_CUR_code = null;
17
-    /** Currency Name Singular @var CUR_single */
18
-    protected $_CUR_single = null;
19
-    /** Currency Name Plural @var CUR_plural */
20
-    protected $_CUR_plural = null;
21
-    /** Currency Sign @var CUR_sign */
22
-    protected $_CUR_sign = null;
23
-    /** Currency Decimal Places @var CUR_dec_plc */
24
-    protected $_CUR_dec_plc = null;
25
-    /** Active? @var CUR_active */
26
-    protected $_CUR_active = null;
27
-    protected $_Payment_Method;
28
-
29
-    /**
30
-     *
31
-     * @param array  $props_n_values          incoming values
32
-     * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
33
-     *                                        used.)
34
-     * @param array  $date_formats            incoming date_formats in an array where the first value is the
35
-     *                                        date_format and the second value is the time format
36
-     * @return EE_Attendee
37
-     */
38
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
39
-    {
40
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
41
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
42
-    }
43
-
44
-
45
-    /**
46
-     * @param array  $props_n_values  incoming values from the database
47
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
48
-     *                                the website will be used.
49
-     * @return EE_Attendee
50
-     */
51
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
52
-    {
53
-        return new self($props_n_values, true, $timezone);
54
-    }
55
-
56
-    /**
57
-     * Gets code
58
-     *
59
-     * @return string
60
-     */
61
-    public function code()
62
-    {
63
-        return $this->get('CUR_code');
64
-    }
65
-
66
-    /**
67
-     * Sets code
68
-     *
69
-     * @param string $code
70
-     * @return boolean
71
-     */
72
-    public function set_code($code)
73
-    {
74
-        return $this->set('CUR_code', $code);
75
-    }
76
-
77
-    /**
78
-     * Gets active
79
-     *
80
-     * @return boolean
81
-     */
82
-    public function active()
83
-    {
84
-        return $this->get('CUR_active');
85
-    }
86
-
87
-    /**
88
-     * Sets active
89
-     *
90
-     * @param boolean $active
91
-     * @return boolean
92
-     */
93
-    public function set_active($active)
94
-    {
95
-        return $this->set('CUR_active', $active);
96
-    }
97
-
98
-    /**
99
-     * Gets dec_plc
100
-     *
101
-     * @return int
102
-     */
103
-    public function dec_plc()
104
-    {
105
-        return $this->get('CUR_dec_plc');
106
-    }
107
-
108
-    /**
109
-     * Sets dec_plc
110
-     *
111
-     * @param int $dec_plc
112
-     * @return boolean
113
-     */
114
-    public function set_dec_plc($dec_plc)
115
-    {
116
-        return $this->set('CUR_dec_plc', $dec_plc);
117
-    }
118
-
119
-    /**
120
-     * Gets plural
121
-     *
122
-     * @return string
123
-     */
124
-    public function plural_name()
125
-    {
126
-        return $this->get('CUR_plural');
127
-    }
128
-
129
-    /**
130
-     * Sets plural
131
-     *
132
-     * @param string $plural
133
-     * @return boolean
134
-     */
135
-    public function set_plural_name($plural)
136
-    {
137
-        return $this->set('CUR_plural', $plural);
138
-    }
139
-
140
-    /**
141
-     * Gets sign
142
-     *
143
-     * @return string
144
-     */
145
-    public function sign()
146
-    {
147
-        return $this->get('CUR_sign');
148
-    }
149
-
150
-    /**
151
-     * Sets sign
152
-     *
153
-     * @param string $sign
154
-     * @return boolean
155
-     */
156
-    public function set_sign($sign)
157
-    {
158
-        return $this->set('CUR_sign', $sign);
159
-    }
160
-
161
-    /**
162
-     * Gets single
163
-     *
164
-     * @return string
165
-     */
166
-    public function singular_name()
167
-    {
168
-        return $this->get('CUR_single');
169
-    }
170
-
171
-    /**
172
-     * Sets single
173
-     *
174
-     * @param string $single
175
-     * @return boolean
176
-     */
177
-    public function set_singular_name($single)
178
-    {
179
-        return $this->set('CUR_single', $single);
180
-    }
181
-
182
-    /**
183
-     * Gets a prettier name
184
-     *
185
-     * @return string
186
-     */
187
-    public function name()
188
-    {
189
-        return sprintf(__("%s (%s)", "event_espresso"), $this->code(), $this->plural_name());
190
-    }
15
+	/** Currency COde @var CUR_code */
16
+	protected $_CUR_code = null;
17
+	/** Currency Name Singular @var CUR_single */
18
+	protected $_CUR_single = null;
19
+	/** Currency Name Plural @var CUR_plural */
20
+	protected $_CUR_plural = null;
21
+	/** Currency Sign @var CUR_sign */
22
+	protected $_CUR_sign = null;
23
+	/** Currency Decimal Places @var CUR_dec_plc */
24
+	protected $_CUR_dec_plc = null;
25
+	/** Active? @var CUR_active */
26
+	protected $_CUR_active = null;
27
+	protected $_Payment_Method;
28
+
29
+	/**
30
+	 *
31
+	 * @param array  $props_n_values          incoming values
32
+	 * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
33
+	 *                                        used.)
34
+	 * @param array  $date_formats            incoming date_formats in an array where the first value is the
35
+	 *                                        date_format and the second value is the time format
36
+	 * @return EE_Attendee
37
+	 */
38
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
39
+	{
40
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
41
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
42
+	}
43
+
44
+
45
+	/**
46
+	 * @param array  $props_n_values  incoming values from the database
47
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
48
+	 *                                the website will be used.
49
+	 * @return EE_Attendee
50
+	 */
51
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
52
+	{
53
+		return new self($props_n_values, true, $timezone);
54
+	}
55
+
56
+	/**
57
+	 * Gets code
58
+	 *
59
+	 * @return string
60
+	 */
61
+	public function code()
62
+	{
63
+		return $this->get('CUR_code');
64
+	}
65
+
66
+	/**
67
+	 * Sets code
68
+	 *
69
+	 * @param string $code
70
+	 * @return boolean
71
+	 */
72
+	public function set_code($code)
73
+	{
74
+		return $this->set('CUR_code', $code);
75
+	}
76
+
77
+	/**
78
+	 * Gets active
79
+	 *
80
+	 * @return boolean
81
+	 */
82
+	public function active()
83
+	{
84
+		return $this->get('CUR_active');
85
+	}
86
+
87
+	/**
88
+	 * Sets active
89
+	 *
90
+	 * @param boolean $active
91
+	 * @return boolean
92
+	 */
93
+	public function set_active($active)
94
+	{
95
+		return $this->set('CUR_active', $active);
96
+	}
97
+
98
+	/**
99
+	 * Gets dec_plc
100
+	 *
101
+	 * @return int
102
+	 */
103
+	public function dec_plc()
104
+	{
105
+		return $this->get('CUR_dec_plc');
106
+	}
107
+
108
+	/**
109
+	 * Sets dec_plc
110
+	 *
111
+	 * @param int $dec_plc
112
+	 * @return boolean
113
+	 */
114
+	public function set_dec_plc($dec_plc)
115
+	{
116
+		return $this->set('CUR_dec_plc', $dec_plc);
117
+	}
118
+
119
+	/**
120
+	 * Gets plural
121
+	 *
122
+	 * @return string
123
+	 */
124
+	public function plural_name()
125
+	{
126
+		return $this->get('CUR_plural');
127
+	}
128
+
129
+	/**
130
+	 * Sets plural
131
+	 *
132
+	 * @param string $plural
133
+	 * @return boolean
134
+	 */
135
+	public function set_plural_name($plural)
136
+	{
137
+		return $this->set('CUR_plural', $plural);
138
+	}
139
+
140
+	/**
141
+	 * Gets sign
142
+	 *
143
+	 * @return string
144
+	 */
145
+	public function sign()
146
+	{
147
+		return $this->get('CUR_sign');
148
+	}
149
+
150
+	/**
151
+	 * Sets sign
152
+	 *
153
+	 * @param string $sign
154
+	 * @return boolean
155
+	 */
156
+	public function set_sign($sign)
157
+	{
158
+		return $this->set('CUR_sign', $sign);
159
+	}
160
+
161
+	/**
162
+	 * Gets single
163
+	 *
164
+	 * @return string
165
+	 */
166
+	public function singular_name()
167
+	{
168
+		return $this->get('CUR_single');
169
+	}
170
+
171
+	/**
172
+	 * Sets single
173
+	 *
174
+	 * @param string $single
175
+	 * @return boolean
176
+	 */
177
+	public function set_singular_name($single)
178
+	{
179
+		return $this->set('CUR_single', $single);
180
+	}
181
+
182
+	/**
183
+	 * Gets a prettier name
184
+	 *
185
+	 * @return string
186
+	 */
187
+	public function name()
188
+	{
189
+		return sprintf(__("%s (%s)", "event_espresso"), $this->code(), $this->plural_name());
190
+	}
191 191
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Currency_Payment_Method.class.php 2 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -44,7 +44,7 @@
 block discarded – undo
44 44
      * @param array  $props_n_values  incoming values from the database
45 45
      * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
46 46
      *                                the website will be used.
47
-     * @return EE_Attendee
47
+     * @return EE_Currency_Payment_Method
48 48
      */
49 49
     public static function new_instance_from_db($props_n_values = array(), $timezone = null)
50 50
     {
Please login to merge, or discard this patch.
Indentation   +32 added lines, -32 removed lines patch added patch discarded remove patch
@@ -14,40 +14,40 @@
 block discarded – undo
14 14
 class EE_Currency_Payment_Method extends EE_Base_Class
15 15
 {
16 16
 
17
-    /** Currency to Payment Method Link ID @var CPM_ID */
18
-    protected $_CPM_ID = null;
19
-    /** Currency Code @var CUR_code */
20
-    protected $_CUR_code = null;
21
-    /** Payment Method ID @var PMD_ID */
22
-    protected $_PMD_ID = null;
23
-    protected $_Payment_Method;
24
-    protected $_Currency;
17
+	/** Currency to Payment Method Link ID @var CPM_ID */
18
+	protected $_CPM_ID = null;
19
+	/** Currency Code @var CUR_code */
20
+	protected $_CUR_code = null;
21
+	/** Payment Method ID @var PMD_ID */
22
+	protected $_PMD_ID = null;
23
+	protected $_Payment_Method;
24
+	protected $_Currency;
25 25
 
26 26
 
27
-    /**
28
-     *
29
-     * @param array  $props_n_values          incoming values
30
-     * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
31
-     *                                        used.)
32
-     * @param array  $date_formats            incoming date_formats in an array where the first value is the
33
-     *                                        date_format and the second value is the time format
34
-     * @return EE_Attendee
35
-     */
36
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
37
-    {
38
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
39
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
40
-    }
27
+	/**
28
+	 *
29
+	 * @param array  $props_n_values          incoming values
30
+	 * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
31
+	 *                                        used.)
32
+	 * @param array  $date_formats            incoming date_formats in an array where the first value is the
33
+	 *                                        date_format and the second value is the time format
34
+	 * @return EE_Attendee
35
+	 */
36
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
37
+	{
38
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
39
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
40
+	}
41 41
 
42 42
 
43
-    /**
44
-     * @param array  $props_n_values  incoming values from the database
45
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
46
-     *                                the website will be used.
47
-     * @return EE_Attendee
48
-     */
49
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
50
-    {
51
-        return new self($props_n_values, true, $timezone);
52
-    }
43
+	/**
44
+	 * @param array  $props_n_values  incoming values from the database
45
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
46
+	 *                                the website will be used.
47
+	 * @return EE_Attendee
48
+	 */
49
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
50
+	{
51
+		return new self($props_n_values, true, $timezone);
52
+	}
53 53
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Datetime_Ticket.class.php 2 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -29,7 +29,7 @@
 block discarded – undo
29 29
      * @param array  $props_n_values  incoming values from the database
30 30
      * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
31 31
      *                                the website will be used.
32
-     * @return EE_Attendee
32
+     * @return EE_Datetime_Ticket
33 33
      */
34 34
     public static function new_instance_from_db($props_n_values = array(), $timezone = null)
35 35
     {
Please login to merge, or discard this patch.
Indentation   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -9,30 +9,30 @@
 block discarded – undo
9 9
 class EE_Datetime_Ticket extends EE_Base_Class
10 10
 {
11 11
 
12
-    /**
13
-     *
14
-     * @param array  $props_n_values          incoming values
15
-     * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
16
-     *                                        used.)
17
-     * @param array  $date_formats            incoming date_formats in an array where the first value is the
18
-     *                                        date_format and the second value is the time format
19
-     * @return EE_Attendee
20
-     */
21
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
22
-    {
23
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
24
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
25
-    }
12
+	/**
13
+	 *
14
+	 * @param array  $props_n_values          incoming values
15
+	 * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
16
+	 *                                        used.)
17
+	 * @param array  $date_formats            incoming date_formats in an array where the first value is the
18
+	 *                                        date_format and the second value is the time format
19
+	 * @return EE_Attendee
20
+	 */
21
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
22
+	{
23
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
24
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
25
+	}
26 26
 
27 27
 
28
-    /**
29
-     * @param array  $props_n_values  incoming values from the database
30
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
31
-     *                                the website will be used.
32
-     * @return EE_Attendee
33
-     */
34
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
35
-    {
36
-        return new self($props_n_values, true, $timezone);
37
-    }
28
+	/**
29
+	 * @param array  $props_n_values  incoming values from the database
30
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
31
+	 *                                the website will be used.
32
+	 * @return EE_Attendee
33
+	 */
34
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
35
+	{
36
+		return new self($props_n_values, true, $timezone);
37
+	}
38 38
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Event.class.php 3 patches
Doc Comments   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -838,7 +838,7 @@  discard block
 block discarded – undo
838 838
     /**
839 839
      * calculate spaces remaining based on "saleable" tickets
840 840
      *
841
-     * @param array $tickets
841
+     * @param EE_Base_Class[] $tickets
842 842
      * @param bool  $filtered
843 843
      * @return int|float
844 844
      * @throws EE_Error
@@ -1078,7 +1078,7 @@  discard block
 block discarded – undo
1078 1078
      *
1079 1079
      * @access public
1080 1080
      * @param boolean $echo whether to return (FALSE), or echo out the result (TRUE)
1081
-     * @return mixed void|string
1081
+     * @return string void|string
1082 1082
      * @throws EE_Error
1083 1083
      */
1084 1084
     public function pretty_active_status($echo = true)
Please login to merge, or discard this patch.
Spacing   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -71,7 +71,7 @@  discard block
 block discarded – undo
71 71
      */
72 72
     public function getAvailableSpacesCalculator()
73 73
     {
74
-        if (! $this->available_spaces_calculator instanceof EventSpacesCalculator) {
74
+        if ( ! $this->available_spaces_calculator instanceof EventSpacesCalculator) {
75 75
             $this->available_spaces_calculator = new EventSpacesCalculator($this);
76 76
         }
77 77
         return $this->available_spaces_calculator;
@@ -213,7 +213,7 @@  discard block
 block discarded – undo
213 213
      */
214 214
     public function primary_datetime($try_to_exclude_expired = true, $try_to_exclude_deleted = true)
215 215
     {
216
-        if (! empty($this->_Primary_Datetime)) {
216
+        if ( ! empty($this->_Primary_Datetime)) {
217 217
             return $this->_Primary_Datetime;
218 218
         }
219 219
         $this->_Primary_Datetime = EEM_Datetime::instance($this->_timezone)->get_primary_datetime_for_event(
@@ -236,7 +236,7 @@  discard block
 block discarded – undo
236 236
     {
237 237
         // first get all datetimes
238 238
         $datetimes = $this->datetimes_ordered();
239
-        if (! $datetimes) {
239
+        if ( ! $datetimes) {
240 240
             return array();
241 241
         }
242 242
         $datetime_ids = array();
@@ -429,7 +429,7 @@  discard block
 block discarded – undo
429 429
     public function short_description($num_words = 55, $more = null, $not_full_desc = false)
430 430
     {
431 431
         $short_desc = $this->get('EVT_short_desc');
432
-        if (! empty($short_desc) || $not_full_desc) {
432
+        if ( ! empty($short_desc) || $not_full_desc) {
433 433
             return $short_desc;
434 434
         }
435 435
         $full_desc = $this->get('EVT_desc');
@@ -883,7 +883,7 @@  discard block
 block discarded – undo
883 883
         );
884 884
         $all_expired = true;
885 885
         foreach ($tickets as $ticket) {
886
-            if (! $ticket->is_expired()) {
886
+            if ( ! $ticket->is_expired()) {
887 887
                 $all_expired = false;
888 888
                 break;
889 889
             }
@@ -972,7 +972,7 @@  discard block
 block discarded – undo
972 972
      */
973 973
     public function is_sold_out($actual = false)
974 974
     {
975
-        if (! $actual) {
975
+        if ( ! $actual) {
976 976
             return $this->status() === EEM_Event::sold_out;
977 977
         }
978 978
         return $this->perform_sold_out_status_check();
@@ -1017,11 +1017,11 @@  discard block
 block discarded – undo
1017 1017
     public function get_active_status($reset = false)
1018 1018
     {
1019 1019
         // if the active status has already been set, then just use that value (unless we are resetting it)
1020
-        if (! empty($this->_active_status) && ! $reset) {
1020
+        if ( ! empty($this->_active_status) && ! $reset) {
1021 1021
             return $this->_active_status;
1022 1022
         }
1023 1023
         // first check if event id is present on this object
1024
-        if (! $this->ID()) {
1024
+        if ( ! $this->ID()) {
1025 1025
             return false;
1026 1026
         }
1027 1027
         $where_params_for_event = array(array('EVT_ID' => $this->ID()));
@@ -1106,7 +1106,7 @@  discard block
 block discarded – undo
1106 1106
     public function get_number_of_tickets_sold()
1107 1107
     {
1108 1108
         $tkt_sold = 0;
1109
-        if (! $this->ID()) {
1109
+        if ( ! $this->ID()) {
1110 1110
             return 0;
1111 1111
         }
1112 1112
         $datetimes = $this->datetimes();
@@ -1290,7 +1290,7 @@  discard block
 block discarded – undo
1290 1290
             ]
1291 1291
         );
1292 1292
         $field_to_update = EEM_Event_Question_Group::instance()->fieldNameForContext($for_primary);
1293
-        $other_field = EEM_Event_Question_Group::instance()->fieldNameForContext(! $for_primary);
1293
+        $other_field = EEM_Event_Question_Group::instance()->fieldNameForContext( ! $for_primary);
1294 1294
         if ($existing_relation->get($other_field) === false) {
1295 1295
             // Delete it. It's now no longer for primary or additional question groups.
1296 1296
             return $this->_remove_relation_to($question_group_id_or_obj, 'Question_Group');
Please login to merge, or discard this patch.
Indentation   +1384 added lines, -1384 removed lines patch added patch discarded remove patch
@@ -15,1388 +15,1388 @@
 block discarded – undo
15 15
 class EE_Event extends EE_CPT_Base implements EEI_Line_Item_Object, EEI_Admin_Links, EEI_Has_Icon, EEI_Event
16 16
 {
17 17
 
18
-    /**
19
-     * cached value for the the logical active status for the event
20
-     *
21
-     * @see get_active_status()
22
-     * @var string
23
-     */
24
-    protected $_active_status = '';
25
-
26
-    /**
27
-     * This is just used for caching the Primary Datetime for the Event on initial retrieval
28
-     *
29
-     * @var EE_Datetime
30
-     */
31
-    protected $_Primary_Datetime;
32
-
33
-    /**
34
-     * @var EventSpacesCalculator $available_spaces_calculator
35
-     */
36
-    protected $available_spaces_calculator;
37
-
38
-
39
-    /**
40
-     * @param array  $props_n_values          incoming values
41
-     * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
42
-     *                                        used.)
43
-     * @param array  $date_formats            incoming date_formats in an array where the first value is the
44
-     *                                        date_format and the second value is the time format
45
-     * @return EE_Event
46
-     * @throws EE_Error
47
-     */
48
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
49
-    {
50
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
51
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
52
-    }
53
-
54
-
55
-    /**
56
-     * @param array  $props_n_values  incoming values from the database
57
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
58
-     *                                the website will be used.
59
-     * @return EE_Event
60
-     * @throws EE_Error
61
-     */
62
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
63
-    {
64
-        return new self($props_n_values, true, $timezone);
65
-    }
66
-
67
-
68
-    /**
69
-     * @return EventSpacesCalculator
70
-     * @throws \EE_Error
71
-     */
72
-    public function getAvailableSpacesCalculator()
73
-    {
74
-        if (! $this->available_spaces_calculator instanceof EventSpacesCalculator) {
75
-            $this->available_spaces_calculator = new EventSpacesCalculator($this);
76
-        }
77
-        return $this->available_spaces_calculator;
78
-    }
79
-
80
-
81
-    /**
82
-     * Overrides parent set() method so that all calls to set( 'status', $status ) can be routed to internal methods
83
-     *
84
-     * @param string $field_name
85
-     * @param mixed  $field_value
86
-     * @param bool   $use_default
87
-     * @throws EE_Error
88
-     */
89
-    public function set($field_name, $field_value, $use_default = false)
90
-    {
91
-        switch ($field_name) {
92
-            case 'status':
93
-                $this->set_status($field_value, $use_default);
94
-                break;
95
-            default:
96
-                parent::set($field_name, $field_value, $use_default);
97
-        }
98
-    }
99
-
100
-
101
-    /**
102
-     *    set_status
103
-     * Checks if event status is being changed to SOLD OUT
104
-     * and updates event meta data with previous event status
105
-     * so that we can revert things if/when the event is no longer sold out
106
-     *
107
-     * @access public
108
-     * @param string $new_status
109
-     * @param bool   $use_default
110
-     * @return void
111
-     * @throws EE_Error
112
-     */
113
-    public function set_status($new_status = null, $use_default = false)
114
-    {
115
-        // if nothing is set, and we aren't explicitly wanting to reset the status, then just leave
116
-        if (empty($new_status) && ! $use_default) {
117
-            return;
118
-        }
119
-        // get current Event status
120
-        $old_status = $this->status();
121
-        // if status has changed
122
-        if ($old_status !== $new_status) {
123
-            // TO sold_out
124
-            if ($new_status === EEM_Event::sold_out) {
125
-                // save the previous event status so that we can revert if the event is no longer sold out
126
-                $this->add_post_meta('_previous_event_status', $old_status);
127
-                do_action('AHEE__EE_Event__set_status__to_sold_out', $this, $old_status, $new_status);
128
-                // OR FROM  sold_out
129
-            } elseif ($old_status === EEM_Event::sold_out) {
130
-                $this->delete_post_meta('_previous_event_status');
131
-                do_action('AHEE__EE_Event__set_status__from_sold_out', $this, $old_status, $new_status);
132
-            }
133
-            // clear out the active status so that it gets reset the next time it is requested
134
-            $this->_active_status = null;
135
-            // update status
136
-            parent::set('status', $new_status, $use_default);
137
-            do_action('AHEE__EE_Event__set_status__after_update', $this);
138
-            return;
139
-        }
140
-        // even though the old value matches the new value, it's still good to
141
-        // allow the parent set method to have a say
142
-        parent::set('status', $new_status, $use_default);
143
-    }
144
-
145
-
146
-    /**
147
-     * Gets all the datetimes for this event
148
-     *
149
-     * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
150
-     * @return EE_Base_Class[]|EE_Datetime[]
151
-     * @throws EE_Error
152
-     */
153
-    public function datetimes($query_params = array())
154
-    {
155
-        return $this->get_many_related('Datetime', $query_params);
156
-    }
157
-
158
-
159
-    /**
160
-     * Gets all the datetimes for this event, ordered by DTT_EVT_start in ascending order
161
-     *
162
-     * @return EE_Base_Class[]|EE_Datetime[]
163
-     * @throws EE_Error
164
-     */
165
-    public function datetimes_in_chronological_order()
166
-    {
167
-        return $this->get_many_related('Datetime', array('order_by' => array('DTT_EVT_start' => 'ASC')));
168
-    }
169
-
170
-
171
-    /**
172
-     * Gets all the datetimes for this event, ordered by the DTT_order on the datetime.
173
-     * @darren, we should probably UNSET timezone on the EEM_Datetime model
174
-     * after running our query, so that this timezone isn't set for EVERY query
175
-     * on EEM_Datetime for the rest of the request, no?
176
-     *
177
-     * @param boolean $show_expired whether or not to include expired events
178
-     * @param boolean $show_deleted whether or not to include deleted events
179
-     * @param null    $limit
180
-     * @return EE_Datetime[]
181
-     * @throws EE_Error
182
-     */
183
-    public function datetimes_ordered($show_expired = true, $show_deleted = false, $limit = null)
184
-    {
185
-        return EEM_Datetime::instance($this->_timezone)->get_datetimes_for_event_ordered_by_DTT_order(
186
-            $this->ID(),
187
-            $show_expired,
188
-            $show_deleted,
189
-            $limit
190
-        );
191
-    }
192
-
193
-
194
-    /**
195
-     * Returns one related datetime. Mostly only used by some legacy code.
196
-     *
197
-     * @return EE_Base_Class|EE_Datetime
198
-     * @throws EE_Error
199
-     */
200
-    public function first_datetime()
201
-    {
202
-        return $this->get_first_related('Datetime');
203
-    }
204
-
205
-
206
-    /**
207
-     * Returns the 'primary' datetime for the event
208
-     *
209
-     * @param bool $try_to_exclude_expired
210
-     * @param bool $try_to_exclude_deleted
211
-     * @return EE_Datetime
212
-     * @throws EE_Error
213
-     */
214
-    public function primary_datetime($try_to_exclude_expired = true, $try_to_exclude_deleted = true)
215
-    {
216
-        if (! empty($this->_Primary_Datetime)) {
217
-            return $this->_Primary_Datetime;
218
-        }
219
-        $this->_Primary_Datetime = EEM_Datetime::instance($this->_timezone)->get_primary_datetime_for_event(
220
-            $this->ID(),
221
-            $try_to_exclude_expired,
222
-            $try_to_exclude_deleted
223
-        );
224
-        return $this->_Primary_Datetime;
225
-    }
226
-
227
-
228
-    /**
229
-     * Gets all the tickets available for purchase of this event
230
-     *
231
-     * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
232
-     * @return EE_Base_Class[]|EE_Ticket[]
233
-     * @throws EE_Error
234
-     */
235
-    public function tickets($query_params = array())
236
-    {
237
-        // first get all datetimes
238
-        $datetimes = $this->datetimes_ordered();
239
-        if (! $datetimes) {
240
-            return array();
241
-        }
242
-        $datetime_ids = array();
243
-        foreach ($datetimes as $datetime) {
244
-            $datetime_ids[] = $datetime->ID();
245
-        }
246
-        $where_params = array('Datetime.DTT_ID' => array('IN', $datetime_ids));
247
-        // if incoming $query_params has where conditions let's merge but not override existing.
248
-        if (is_array($query_params) && isset($query_params[0])) {
249
-            $where_params = array_merge($query_params[0], $where_params);
250
-            unset($query_params[0]);
251
-        }
252
-        // now add $where_params to $query_params
253
-        $query_params[0] = $where_params;
254
-        return EEM_Ticket::instance()->get_all($query_params);
255
-    }
256
-
257
-
258
-    /**
259
-     * get all unexpired untrashed tickets
260
-     *
261
-     * @return EE_Ticket[]
262
-     * @throws EE_Error
263
-     */
264
-    public function active_tickets()
265
-    {
266
-        return $this->tickets(
267
-            array(
268
-                array(
269
-                    'TKT_end_date' => array('>=', EEM_Ticket::instance()->current_time_for_query('TKT_end_date')),
270
-                    'TKT_deleted'  => false,
271
-                ),
272
-            )
273
-        );
274
-    }
275
-
276
-
277
-    /**
278
-     * @return bool
279
-     * @throws EE_Error
280
-     */
281
-    public function additional_limit()
282
-    {
283
-        return $this->get('EVT_additional_limit');
284
-    }
285
-
286
-
287
-    /**
288
-     * @return bool
289
-     * @throws EE_Error
290
-     */
291
-    public function allow_overflow()
292
-    {
293
-        return $this->get('EVT_allow_overflow');
294
-    }
295
-
296
-
297
-    /**
298
-     * @return bool
299
-     * @throws EE_Error
300
-     */
301
-    public function created()
302
-    {
303
-        return $this->get('EVT_created');
304
-    }
305
-
306
-
307
-    /**
308
-     * @return bool
309
-     * @throws EE_Error
310
-     */
311
-    public function description()
312
-    {
313
-        return $this->get('EVT_desc');
314
-    }
315
-
316
-
317
-    /**
318
-     * Runs do_shortcode and wpautop on the description
319
-     *
320
-     * @return string of html
321
-     * @throws EE_Error
322
-     */
323
-    public function description_filtered()
324
-    {
325
-        return $this->get_pretty('EVT_desc');
326
-    }
327
-
328
-
329
-    /**
330
-     * @return bool
331
-     * @throws EE_Error
332
-     */
333
-    public function display_description()
334
-    {
335
-        return $this->get('EVT_display_desc');
336
-    }
337
-
338
-
339
-    /**
340
-     * @return bool
341
-     * @throws EE_Error
342
-     */
343
-    public function display_ticket_selector()
344
-    {
345
-        return (bool) $this->get('EVT_display_ticket_selector');
346
-    }
347
-
348
-
349
-    /**
350
-     * @return bool
351
-     * @throws EE_Error
352
-     */
353
-    public function external_url()
354
-    {
355
-        return $this->get('EVT_external_URL');
356
-    }
357
-
358
-
359
-    /**
360
-     * @return bool
361
-     * @throws EE_Error
362
-     */
363
-    public function member_only()
364
-    {
365
-        return $this->get('EVT_member_only');
366
-    }
367
-
368
-
369
-    /**
370
-     * @return bool
371
-     * @throws EE_Error
372
-     */
373
-    public function phone()
374
-    {
375
-        return $this->get('EVT_phone');
376
-    }
377
-
378
-
379
-    /**
380
-     * @return bool
381
-     * @throws EE_Error
382
-     */
383
-    public function modified()
384
-    {
385
-        return $this->get('EVT_modified');
386
-    }
387
-
388
-
389
-    /**
390
-     * @return bool
391
-     * @throws EE_Error
392
-     */
393
-    public function name()
394
-    {
395
-        return $this->get('EVT_name');
396
-    }
397
-
398
-
399
-    /**
400
-     * @return bool
401
-     * @throws EE_Error
402
-     */
403
-    public function order()
404
-    {
405
-        return $this->get('EVT_order');
406
-    }
407
-
408
-
409
-    /**
410
-     * @return bool|string
411
-     * @throws EE_Error
412
-     */
413
-    public function default_registration_status()
414
-    {
415
-        $event_default_registration_status = $this->get('EVT_default_registration_status');
416
-        return ! empty($event_default_registration_status)
417
-            ? $event_default_registration_status
418
-            : EE_Registry::instance()->CFG->registration->default_STS_ID;
419
-    }
420
-
421
-
422
-    /**
423
-     * @param int  $num_words
424
-     * @param null $more
425
-     * @param bool $not_full_desc
426
-     * @return bool|string
427
-     * @throws EE_Error
428
-     */
429
-    public function short_description($num_words = 55, $more = null, $not_full_desc = false)
430
-    {
431
-        $short_desc = $this->get('EVT_short_desc');
432
-        if (! empty($short_desc) || $not_full_desc) {
433
-            return $short_desc;
434
-        }
435
-        $full_desc = $this->get('EVT_desc');
436
-        return wp_trim_words($full_desc, $num_words, $more);
437
-    }
438
-
439
-
440
-    /**
441
-     * @return bool
442
-     * @throws EE_Error
443
-     */
444
-    public function slug()
445
-    {
446
-        return $this->get('EVT_slug');
447
-    }
448
-
449
-
450
-    /**
451
-     * @return bool
452
-     * @throws EE_Error
453
-     */
454
-    public function timezone_string()
455
-    {
456
-        return $this->get('EVT_timezone_string');
457
-    }
458
-
459
-
460
-    /**
461
-     * @return bool
462
-     * @throws EE_Error
463
-     */
464
-    public function visible_on()
465
-    {
466
-        return $this->get('EVT_visible_on');
467
-    }
468
-
469
-
470
-    /**
471
-     * @return int
472
-     * @throws EE_Error
473
-     */
474
-    public function wp_user()
475
-    {
476
-        return $this->get('EVT_wp_user');
477
-    }
478
-
479
-
480
-    /**
481
-     * @return bool
482
-     * @throws EE_Error
483
-     */
484
-    public function donations()
485
-    {
486
-        return $this->get('EVT_donations');
487
-    }
488
-
489
-
490
-    /**
491
-     * @param $limit
492
-     * @throws EE_Error
493
-     */
494
-    public function set_additional_limit($limit)
495
-    {
496
-        $this->set('EVT_additional_limit', $limit);
497
-    }
498
-
499
-
500
-    /**
501
-     * @param $created
502
-     * @throws EE_Error
503
-     */
504
-    public function set_created($created)
505
-    {
506
-        $this->set('EVT_created', $created);
507
-    }
508
-
509
-
510
-    /**
511
-     * @param $desc
512
-     * @throws EE_Error
513
-     */
514
-    public function set_description($desc)
515
-    {
516
-        $this->set('EVT_desc', $desc);
517
-    }
518
-
519
-
520
-    /**
521
-     * @param $display_desc
522
-     * @throws EE_Error
523
-     */
524
-    public function set_display_description($display_desc)
525
-    {
526
-        $this->set('EVT_display_desc', $display_desc);
527
-    }
528
-
529
-
530
-    /**
531
-     * @param $display_ticket_selector
532
-     * @throws EE_Error
533
-     */
534
-    public function set_display_ticket_selector($display_ticket_selector)
535
-    {
536
-        $this->set('EVT_display_ticket_selector', $display_ticket_selector);
537
-    }
538
-
539
-
540
-    /**
541
-     * @param $external_url
542
-     * @throws EE_Error
543
-     */
544
-    public function set_external_url($external_url)
545
-    {
546
-        $this->set('EVT_external_URL', $external_url);
547
-    }
548
-
549
-
550
-    /**
551
-     * @param $member_only
552
-     * @throws EE_Error
553
-     */
554
-    public function set_member_only($member_only)
555
-    {
556
-        $this->set('EVT_member_only', $member_only);
557
-    }
558
-
559
-
560
-    /**
561
-     * @param $event_phone
562
-     * @throws EE_Error
563
-     */
564
-    public function set_event_phone($event_phone)
565
-    {
566
-        $this->set('EVT_phone', $event_phone);
567
-    }
568
-
569
-
570
-    /**
571
-     * @param $modified
572
-     * @throws EE_Error
573
-     */
574
-    public function set_modified($modified)
575
-    {
576
-        $this->set('EVT_modified', $modified);
577
-    }
578
-
579
-
580
-    /**
581
-     * @param $name
582
-     * @throws EE_Error
583
-     */
584
-    public function set_name($name)
585
-    {
586
-        $this->set('EVT_name', $name);
587
-    }
588
-
589
-
590
-    /**
591
-     * @param $order
592
-     * @throws EE_Error
593
-     */
594
-    public function set_order($order)
595
-    {
596
-        $this->set('EVT_order', $order);
597
-    }
598
-
599
-
600
-    /**
601
-     * @param $short_desc
602
-     * @throws EE_Error
603
-     */
604
-    public function set_short_description($short_desc)
605
-    {
606
-        $this->set('EVT_short_desc', $short_desc);
607
-    }
608
-
609
-
610
-    /**
611
-     * @param $slug
612
-     * @throws EE_Error
613
-     */
614
-    public function set_slug($slug)
615
-    {
616
-        $this->set('EVT_slug', $slug);
617
-    }
618
-
619
-
620
-    /**
621
-     * @param $timezone_string
622
-     * @throws EE_Error
623
-     */
624
-    public function set_timezone_string($timezone_string)
625
-    {
626
-        $this->set('EVT_timezone_string', $timezone_string);
627
-    }
628
-
629
-
630
-    /**
631
-     * @param $visible_on
632
-     * @throws EE_Error
633
-     */
634
-    public function set_visible_on($visible_on)
635
-    {
636
-        $this->set('EVT_visible_on', $visible_on);
637
-    }
638
-
639
-
640
-    /**
641
-     * @param $wp_user
642
-     * @throws EE_Error
643
-     */
644
-    public function set_wp_user($wp_user)
645
-    {
646
-        $this->set('EVT_wp_user', $wp_user);
647
-    }
648
-
649
-
650
-    /**
651
-     * @param $default_registration_status
652
-     * @throws EE_Error
653
-     */
654
-    public function set_default_registration_status($default_registration_status)
655
-    {
656
-        $this->set('EVT_default_registration_status', $default_registration_status);
657
-    }
658
-
659
-
660
-    /**
661
-     * @param $donations
662
-     * @throws EE_Error
663
-     */
664
-    public function set_donations($donations)
665
-    {
666
-        $this->set('EVT_donations', $donations);
667
-    }
668
-
669
-
670
-    /**
671
-     * Adds a venue to this event
672
-     *
673
-     * @param EE_Venue /int $venue_id_or_obj
674
-     * @return EE_Base_Class|EE_Venue
675
-     * @throws EE_Error
676
-     */
677
-    public function add_venue($venue_id_or_obj)
678
-    {
679
-        return $this->_add_relation_to($venue_id_or_obj, 'Venue');
680
-    }
681
-
682
-
683
-    /**
684
-     * Removes a venue from the event
685
-     *
686
-     * @param EE_Venue /int $venue_id_or_obj
687
-     * @return EE_Base_Class|EE_Venue
688
-     * @throws EE_Error
689
-     */
690
-    public function remove_venue($venue_id_or_obj)
691
-    {
692
-        return $this->_remove_relation_to($venue_id_or_obj, 'Venue');
693
-    }
694
-
695
-
696
-    /**
697
-     * Gets all the venues related ot the event. May provide additional $query_params if desired
698
-     *
699
-     * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
700
-     * @return EE_Base_Class[]|EE_Venue[]
701
-     * @throws EE_Error
702
-     */
703
-    public function venues($query_params = array())
704
-    {
705
-        return $this->get_many_related('Venue', $query_params);
706
-    }
707
-
708
-
709
-    /**
710
-     * check if event id is present and if event is published
711
-     *
712
-     * @access public
713
-     * @return boolean true yes, false no
714
-     * @throws EE_Error
715
-     */
716
-    private function _has_ID_and_is_published()
717
-    {
718
-        // first check if event id is present and not NULL,
719
-        // then check if this event is published (or any of the equivalent "published" statuses)
720
-        return
721
-            $this->ID() && $this->ID() !== null
722
-            && (
723
-                $this->status() === 'publish'
724
-                || $this->status() === EEM_Event::sold_out
725
-                || $this->status() === EEM_Event::postponed
726
-                || $this->status() === EEM_Event::cancelled
727
-            );
728
-    }
729
-
730
-
731
-    /**
732
-     * This simply compares the internal dates with NOW and determines if the event is upcoming or not.
733
-     *
734
-     * @access public
735
-     * @return boolean true yes, false no
736
-     * @throws EE_Error
737
-     */
738
-    public function is_upcoming()
739
-    {
740
-        // check if event id is present and if this event is published
741
-        if ($this->is_inactive()) {
742
-            return false;
743
-        }
744
-        // set initial value
745
-        $upcoming = false;
746
-        // next let's get all datetimes and loop through them
747
-        $datetimes = $this->datetimes_in_chronological_order();
748
-        foreach ($datetimes as $datetime) {
749
-            if ($datetime instanceof EE_Datetime) {
750
-                // if this dtt is expired then we continue cause one of the other datetimes might be upcoming.
751
-                if ($datetime->is_expired()) {
752
-                    continue;
753
-                }
754
-                // if this dtt is active then we return false.
755
-                if ($datetime->is_active()) {
756
-                    return false;
757
-                }
758
-                // otherwise let's check upcoming status
759
-                $upcoming = $datetime->is_upcoming();
760
-            }
761
-        }
762
-        return $upcoming;
763
-    }
764
-
765
-
766
-    /**
767
-     * @return bool
768
-     * @throws EE_Error
769
-     */
770
-    public function is_active()
771
-    {
772
-        // check if event id is present and if this event is published
773
-        if ($this->is_inactive()) {
774
-            return false;
775
-        }
776
-        // set initial value
777
-        $active = false;
778
-        // next let's get all datetimes and loop through them
779
-        $datetimes = $this->datetimes_in_chronological_order();
780
-        foreach ($datetimes as $datetime) {
781
-            if ($datetime instanceof EE_Datetime) {
782
-                // if this dtt is expired then we continue cause one of the other datetimes might be active.
783
-                if ($datetime->is_expired()) {
784
-                    continue;
785
-                }
786
-                // if this dtt is upcoming then we return false.
787
-                if ($datetime->is_upcoming()) {
788
-                    return false;
789
-                }
790
-                // otherwise let's check active status
791
-                $active = $datetime->is_active();
792
-            }
793
-        }
794
-        return $active;
795
-    }
796
-
797
-
798
-    /**
799
-     * @return bool
800
-     * @throws EE_Error
801
-     */
802
-    public function is_expired()
803
-    {
804
-        // check if event id is present and if this event is published
805
-        if ($this->is_inactive()) {
806
-            return false;
807
-        }
808
-        // set initial value
809
-        $expired = false;
810
-        // first let's get all datetimes and loop through them
811
-        $datetimes = $this->datetimes_in_chronological_order();
812
-        foreach ($datetimes as $datetime) {
813
-            if ($datetime instanceof EE_Datetime) {
814
-                // if this dtt is upcoming or active then we return false.
815
-                if ($datetime->is_upcoming() || $datetime->is_active()) {
816
-                    return false;
817
-                }
818
-                // otherwise let's check active status
819
-                $expired = $datetime->is_expired();
820
-            }
821
-        }
822
-        return $expired;
823
-    }
824
-
825
-
826
-    /**
827
-     * @return bool
828
-     * @throws EE_Error
829
-     */
830
-    public function is_inactive()
831
-    {
832
-        // check if event id is present and if this event is published
833
-        if ($this->_has_ID_and_is_published()) {
834
-            return false;
835
-        }
836
-        return true;
837
-    }
838
-
839
-
840
-    /**
841
-     * calculate spaces remaining based on "saleable" tickets
842
-     *
843
-     * @param array $tickets
844
-     * @param bool  $filtered
845
-     * @return int|float
846
-     * @throws EE_Error
847
-     * @throws DomainException
848
-     * @throws UnexpectedEntityException
849
-     */
850
-    public function spaces_remaining($tickets = array(), $filtered = true)
851
-    {
852
-        $this->getAvailableSpacesCalculator()->setActiveTickets($tickets);
853
-        $spaces_remaining = $this->getAvailableSpacesCalculator()->spacesRemaining();
854
-        return $filtered
855
-            ? apply_filters(
856
-                'FHEE_EE_Event__spaces_remaining',
857
-                $spaces_remaining,
858
-                $this,
859
-                $tickets
860
-            )
861
-            : $spaces_remaining;
862
-    }
863
-
864
-
865
-    /**
866
-     *    perform_sold_out_status_check
867
-     *    checks all of this events's datetime  reg_limit - sold values to determine if ANY datetimes have spaces
868
-     *    available... if NOT, then the event status will get toggled to 'sold_out'
869
-     *
870
-     * @return bool    return the ACTUAL sold out state.
871
-     * @throws EE_Error
872
-     * @throws DomainException
873
-     * @throws UnexpectedEntityException
874
-     */
875
-    public function perform_sold_out_status_check()
876
-    {
877
-        // get all tickets
878
-        $tickets = $this->tickets(
879
-            array(
880
-                'default_where_conditions' => 'none',
881
-                'order_by' => array('TKT_qty' => 'ASC'),
882
-            )
883
-        );
884
-        $all_expired = true;
885
-        foreach ($tickets as $ticket) {
886
-            if (! $ticket->is_expired()) {
887
-                $all_expired = false;
888
-                break;
889
-            }
890
-        }
891
-        // if all the tickets are just expired, then don't update the event status to sold out
892
-        if ($all_expired) {
893
-            return true;
894
-        }
895
-        $spaces_remaining = $this->spaces_remaining($tickets);
896
-        if ($spaces_remaining < 1) {
897
-            if ($this->status() !== EEM_Event::post_status_private) {
898
-                $this->set_status(EEM_Event::sold_out);
899
-                $this->save();
900
-            }
901
-            $sold_out = true;
902
-        } else {
903
-            $sold_out = false;
904
-            // was event previously marked as sold out ?
905
-            if ($this->status() === EEM_Event::sold_out) {
906
-                // revert status to previous value, if it was set
907
-                $previous_event_status = $this->get_post_meta('_previous_event_status', true);
908
-                if ($previous_event_status) {
909
-                    $this->set_status($previous_event_status);
910
-                    $this->save();
911
-                }
912
-            }
913
-        }
914
-        do_action('AHEE__EE_Event__perform_sold_out_status_check__end', $this, $sold_out, $spaces_remaining, $tickets);
915
-        return $sold_out;
916
-    }
917
-
918
-
919
-    /**
920
-     * This returns the total remaining spaces for sale on this event.
921
-     *
922
-     * @uses EE_Event::total_available_spaces()
923
-     * @return float|int
924
-     * @throws EE_Error
925
-     * @throws DomainException
926
-     * @throws UnexpectedEntityException
927
-     */
928
-    public function spaces_remaining_for_sale()
929
-    {
930
-        return $this->total_available_spaces(true);
931
-    }
932
-
933
-
934
-    /**
935
-     * This returns the total spaces available for an event
936
-     * while considering all the qtys on the tickets and the reg limits
937
-     * on the datetimes attached to this event.
938
-     *
939
-     * @param   bool $consider_sold Whether to consider any tickets that have already sold in our calculation.
940
-     *                              If this is false, then we return the most tickets that could ever be sold
941
-     *                              for this event with the datetime and tickets setup on the event under optimal
942
-     *                              selling conditions.  Otherwise we return a live calculation of spaces available
943
-     *                              based on tickets sold.  Depending on setup and stage of sales, this
944
-     *                              may appear to equal remaining tickets.  However, the more tickets are
945
-     *                              sold out, the more accurate the "live" total is.
946
-     * @return float|int
947
-     * @throws EE_Error
948
-     * @throws DomainException
949
-     * @throws UnexpectedEntityException
950
-     */
951
-    public function total_available_spaces($consider_sold = false)
952
-    {
953
-        $spaces_available = $consider_sold
954
-            ? $this->getAvailableSpacesCalculator()->spacesRemaining()
955
-            : $this->getAvailableSpacesCalculator()->totalSpacesAvailable();
956
-        return apply_filters(
957
-            'FHEE_EE_Event__total_available_spaces__spaces_available',
958
-            $spaces_available,
959
-            $this,
960
-            $this->getAvailableSpacesCalculator()->getDatetimes(),
961
-            $this->getAvailableSpacesCalculator()->getActiveTickets()
962
-        );
963
-    }
964
-
965
-
966
-    /**
967
-     * Checks if the event is set to sold out
968
-     *
969
-     * @param  bool $actual whether or not to perform calculations to not only figure the
970
-     *                      actual status but also to flip the status if necessary to sold
971
-     *                      out If false, we just check the existing status of the event
972
-     * @return boolean
973
-     * @throws EE_Error
974
-     */
975
-    public function is_sold_out($actual = false)
976
-    {
977
-        if (! $actual) {
978
-            return $this->status() === EEM_Event::sold_out;
979
-        }
980
-        return $this->perform_sold_out_status_check();
981
-    }
982
-
983
-
984
-    /**
985
-     * Checks if the event is marked as postponed
986
-     *
987
-     * @return boolean
988
-     */
989
-    public function is_postponed()
990
-    {
991
-        return $this->status() === EEM_Event::postponed;
992
-    }
993
-
994
-
995
-    /**
996
-     * Checks if the event is marked as cancelled
997
-     *
998
-     * @return boolean
999
-     */
1000
-    public function is_cancelled()
1001
-    {
1002
-        return $this->status() === EEM_Event::cancelled;
1003
-    }
1004
-
1005
-
1006
-    /**
1007
-     * Get the logical active status in a hierarchical order for all the datetimes.  Note
1008
-     * Basically, we order the datetimes by EVT_start_date.  Then first test on whether the event is published.  If its
1009
-     * NOT published then we test for whether its expired or not.  IF it IS published then we test first on whether an
1010
-     * event has any active dates.  If no active dates then we check for any upcoming dates.  If no upcoming dates then
1011
-     * the event is considered expired.
1012
-     * NOTE: this method does NOT calculate whether the datetimes are sold out when event is published.  Sold Out is a
1013
-     * status set on the EVENT when it is not published and thus is done
1014
-     *
1015
-     * @param bool $reset
1016
-     * @return bool | string - based on EE_Datetime active constants or FALSE if error.
1017
-     * @throws EE_Error
1018
-     */
1019
-    public function get_active_status($reset = false)
1020
-    {
1021
-        // if the active status has already been set, then just use that value (unless we are resetting it)
1022
-        if (! empty($this->_active_status) && ! $reset) {
1023
-            return $this->_active_status;
1024
-        }
1025
-        // first check if event id is present on this object
1026
-        if (! $this->ID()) {
1027
-            return false;
1028
-        }
1029
-        $where_params_for_event = array(array('EVT_ID' => $this->ID()));
1030
-        // if event is published:
1031
-        if ($this->status() === EEM_Event::post_status_publish || $this->status() === EEM_Event::post_status_private) {
1032
-            // active?
1033
-            if (EEM_Datetime::instance()->get_datetime_count_for_status(
1034
-                EE_Datetime::active,
1035
-                $where_params_for_event
1036
-            ) > 0) {
1037
-                $this->_active_status = EE_Datetime::active;
1038
-            } else {
1039
-                // upcoming?
1040
-                if (EEM_Datetime::instance()->get_datetime_count_for_status(
1041
-                    EE_Datetime::upcoming,
1042
-                    $where_params_for_event
1043
-                ) > 0) {
1044
-                    $this->_active_status = EE_Datetime::upcoming;
1045
-                } else {
1046
-                    // expired?
1047
-                    if (EEM_Datetime::instance()->get_datetime_count_for_status(
1048
-                        EE_Datetime::expired,
1049
-                        $where_params_for_event
1050
-                    ) > 0
1051
-                    ) {
1052
-                        $this->_active_status = EE_Datetime::expired;
1053
-                    } else {
1054
-                        // it would be odd if things make it this far because it basically means there are no datetime's
1055
-                        // attached to the event.  So in this case it will just be considered inactive.
1056
-                        $this->_active_status = EE_Datetime::inactive;
1057
-                    }
1058
-                }
1059
-            }
1060
-        } else {
1061
-            // the event is not published, so let's just set it's active status according to its' post status
1062
-            switch ($this->status()) {
1063
-                case EEM_Event::sold_out:
1064
-                    $this->_active_status = EE_Datetime::sold_out;
1065
-                    break;
1066
-                case EEM_Event::cancelled:
1067
-                    $this->_active_status = EE_Datetime::cancelled;
1068
-                    break;
1069
-                case EEM_Event::postponed:
1070
-                    $this->_active_status = EE_Datetime::postponed;
1071
-                    break;
1072
-                default:
1073
-                    $this->_active_status = EE_Datetime::inactive;
1074
-            }
1075
-        }
1076
-        return $this->_active_status;
1077
-    }
1078
-
1079
-
1080
-    /**
1081
-     *    pretty_active_status
1082
-     *
1083
-     * @access public
1084
-     * @param boolean $echo whether to return (FALSE), or echo out the result (TRUE)
1085
-     * @return mixed void|string
1086
-     * @throws EE_Error
1087
-     */
1088
-    public function pretty_active_status($echo = true)
1089
-    {
1090
-        $active_status = $this->get_active_status();
1091
-        $status = '<span class="ee-status event-active-status-'
1092
-                  . $active_status
1093
-                  . '">'
1094
-                  . EEH_Template::pretty_status($active_status, false, 'sentence')
1095
-                  . '</span>';
1096
-        if ($echo) {
1097
-            echo $status;
1098
-            return '';
1099
-        }
1100
-        return $status;
1101
-    }
1102
-
1103
-
1104
-    /**
1105
-     * @return bool|int
1106
-     * @throws EE_Error
1107
-     */
1108
-    public function get_number_of_tickets_sold()
1109
-    {
1110
-        $tkt_sold = 0;
1111
-        if (! $this->ID()) {
1112
-            return 0;
1113
-        }
1114
-        $datetimes = $this->datetimes();
1115
-        foreach ($datetimes as $datetime) {
1116
-            if ($datetime instanceof EE_Datetime) {
1117
-                $tkt_sold += $datetime->sold();
1118
-            }
1119
-        }
1120
-        return $tkt_sold;
1121
-    }
1122
-
1123
-
1124
-    /**
1125
-     * This just returns a count of all the registrations for this event
1126
-     *
1127
-     * @access  public
1128
-     * @return int
1129
-     * @throws EE_Error
1130
-     */
1131
-    public function get_count_of_all_registrations()
1132
-    {
1133
-        return EEM_Event::instance()->count_related($this, 'Registration');
1134
-    }
1135
-
1136
-
1137
-    /**
1138
-     * This returns the ticket with the earliest start time that is
1139
-     * available for this event (across all datetimes attached to the event)
1140
-     *
1141
-     * @return EE_Base_Class|EE_Ticket|null
1142
-     * @throws EE_Error
1143
-     */
1144
-    public function get_ticket_with_earliest_start_time()
1145
-    {
1146
-        $where['Datetime.EVT_ID'] = $this->ID();
1147
-        $query_params = array($where, 'order_by' => array('TKT_start_date' => 'ASC'));
1148
-        return EE_Registry::instance()->load_model('Ticket')->get_one($query_params);
1149
-    }
1150
-
1151
-
1152
-    /**
1153
-     * This returns the ticket with the latest end time that is available
1154
-     * for this event (across all datetimes attached to the event)
1155
-     *
1156
-     * @return EE_Base_Class|EE_Ticket|null
1157
-     * @throws EE_Error
1158
-     */
1159
-    public function get_ticket_with_latest_end_time()
1160
-    {
1161
-        $where['Datetime.EVT_ID'] = $this->ID();
1162
-        $query_params = array($where, 'order_by' => array('TKT_end_date' => 'DESC'));
1163
-        return EE_Registry::instance()->load_model('Ticket')->get_one($query_params);
1164
-    }
1165
-
1166
-
1167
-    /**
1168
-     * This returns the number of different ticket types currently on sale for this event.
1169
-     *
1170
-     * @return int
1171
-     * @throws EE_Error
1172
-     */
1173
-    public function countTicketsOnSale()
1174
-    {
1175
-        $where = array(
1176
-            'Datetime.EVT_ID' => $this->ID(),
1177
-            'TKT_start_date'  => array('<', time()),
1178
-            'TKT_end_date'    => array('>', time()),
1179
-        );
1180
-        return EEM_Ticket::instance()->count(array($where));
1181
-    }
1182
-
1183
-
1184
-    /**
1185
-     * This returns whether there are any tickets on sale for this event.
1186
-     *
1187
-     * @return bool true = YES tickets on sale.
1188
-     * @throws EE_Error
1189
-     */
1190
-    public function tickets_on_sale()
1191
-    {
1192
-        return $this->countTicketsOnSale() > 0;
1193
-    }
1194
-
1195
-
1196
-    /**
1197
-     * Gets the URL for viewing this event on the front-end. Overrides parent
1198
-     * to check for an external URL first
1199
-     *
1200
-     * @return string
1201
-     * @throws EE_Error
1202
-     */
1203
-    public function get_permalink()
1204
-    {
1205
-        if ($this->external_url()) {
1206
-            return $this->external_url();
1207
-        }
1208
-        return parent::get_permalink();
1209
-    }
1210
-
1211
-
1212
-    /**
1213
-     * Gets the first term for 'espresso_event_categories' we can find
1214
-     *
1215
-     * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1216
-     * @return EE_Base_Class|EE_Term|null
1217
-     * @throws EE_Error
1218
-     */
1219
-    public function first_event_category($query_params = array())
1220
-    {
1221
-        $query_params[0]['Term_Taxonomy.taxonomy'] = 'espresso_event_categories';
1222
-        $query_params[0]['Term_Taxonomy.Event.EVT_ID'] = $this->ID();
1223
-        return EEM_Term::instance()->get_one($query_params);
1224
-    }
1225
-
1226
-
1227
-    /**
1228
-     * Gets all terms for 'espresso_event_categories' we can find
1229
-     *
1230
-     * @param array $query_params
1231
-     * @return EE_Base_Class[]|EE_Term[]
1232
-     * @throws EE_Error
1233
-     */
1234
-    public function get_all_event_categories($query_params = array())
1235
-    {
1236
-        $query_params[0]['Term_Taxonomy.taxonomy'] = 'espresso_event_categories';
1237
-        $query_params[0]['Term_Taxonomy.Event.EVT_ID'] = $this->ID();
1238
-        return EEM_Term::instance()->get_all($query_params);
1239
-    }
1240
-
1241
-
1242
-    /**
1243
-     * Adds a question group to this event
1244
-     *
1245
-     * @param EE_Question_Group|int $question_group_id_or_obj
1246
-     * @param bool $for_primary if true, the question group will be added for the primary
1247
-     *                                           registrant, if false will be added for others. default: false
1248
-     * @return EE_Base_Class|EE_Question_Group
1249
-     * @throws EE_Error
1250
-     * @throws InvalidArgumentException
1251
-     * @throws InvalidDataTypeException
1252
-     * @throws InvalidInterfaceException
1253
-     * @throws ReflectionException
1254
-     */
1255
-    public function add_question_group($question_group_id_or_obj, $for_primary = false)
1256
-    {
1257
-        // If the row already exists, it will be updated. If it doesn't, it will be inserted.
1258
-        // That's in EE_HABTM_Relation::add_relation_to().
1259
-        return $this->_add_relation_to(
1260
-            $question_group_id_or_obj,
1261
-            'Question_Group',
1262
-            [
1263
-                EEM_Event_Question_Group::instance()->fieldNameForContext($for_primary) => true
1264
-            ]
1265
-        );
1266
-    }
1267
-
1268
-
1269
-    /**
1270
-     * Removes a question group from the event
1271
-     *
1272
-     * @param EE_Question_Group|int $question_group_id_or_obj
1273
-     * @param bool $for_primary if true, the question group will be removed from the primary
1274
-     *                                           registrant, if false will be removed from others. default: false
1275
-     * @return EE_Base_Class|EE_Question_Group
1276
-     * @throws EE_Error
1277
-     * @throws InvalidArgumentException
1278
-     * @throws ReflectionException
1279
-     * @throws InvalidDataTypeException
1280
-     * @throws InvalidInterfaceException
1281
-     */
1282
-    public function remove_question_group($question_group_id_or_obj, $for_primary = false)
1283
-    {
1284
-        // If the question group is used for the other type (primary or additional)
1285
-        // then just update it. If not, delete it outright.
1286
-        $existing_relation = $this->get_first_related(
1287
-            'Event_Question_Group',
1288
-            [
1289
-                [
1290
-                    'QSG_ID' => EEM_Question_Group::instance()->ensure_is_ID($question_group_id_or_obj)
1291
-                ]
1292
-            ]
1293
-        );
1294
-        $field_to_update = EEM_Event_Question_Group::instance()->fieldNameForContext($for_primary);
1295
-        $other_field = EEM_Event_Question_Group::instance()->fieldNameForContext(! $for_primary);
1296
-        if ($existing_relation->get($other_field) === false) {
1297
-            // Delete it. It's now no longer for primary or additional question groups.
1298
-            return $this->_remove_relation_to($question_group_id_or_obj, 'Question_Group');
1299
-        }
1300
-        // Just update it. They'll still use this question group for the other category
1301
-        $existing_relation->save(
1302
-            [
1303
-                $field_to_update => false
1304
-            ]
1305
-        );
1306
-    }
1307
-
1308
-
1309
-    /**
1310
-     * Gets all the question groups, ordering them by QSG_order ascending
1311
-     *
1312
-     * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1313
-     * @return EE_Base_Class[]|EE_Question_Group[]
1314
-     * @throws EE_Error
1315
-     */
1316
-    public function question_groups($query_params = array())
1317
-    {
1318
-        $query_params = ! empty($query_params) ? $query_params : array('order_by' => array('QSG_order' => 'ASC'));
1319
-        return $this->get_many_related('Question_Group', $query_params);
1320
-    }
1321
-
1322
-
1323
-    /**
1324
-     * Implementation for EEI_Has_Icon interface method.
1325
-     *
1326
-     * @see EEI_Visual_Representation for comments
1327
-     * @return string
1328
-     */
1329
-    public function get_icon()
1330
-    {
1331
-        return '<span class="dashicons dashicons-flag"></span>';
1332
-    }
1333
-
1334
-
1335
-    /**
1336
-     * Implementation for EEI_Admin_Links interface method.
1337
-     *
1338
-     * @see EEI_Admin_Links for comments
1339
-     * @return string
1340
-     * @throws EE_Error
1341
-     */
1342
-    public function get_admin_details_link()
1343
-    {
1344
-        return $this->get_admin_edit_link();
1345
-    }
1346
-
1347
-
1348
-    /**
1349
-     * Implementation for EEI_Admin_Links interface method.
1350
-     *
1351
-     * @see EEI_Admin_Links for comments
1352
-     * @return string
1353
-     * @throws EE_Error
1354
-     */
1355
-    public function get_admin_edit_link()
1356
-    {
1357
-        return EEH_URL::add_query_args_and_nonce(
1358
-            array(
1359
-                'page'   => 'espresso_events',
1360
-                'action' => 'edit',
1361
-                'post'   => $this->ID(),
1362
-            ),
1363
-            admin_url('admin.php')
1364
-        );
1365
-    }
1366
-
1367
-
1368
-    /**
1369
-     * Implementation for EEI_Admin_Links interface method.
1370
-     *
1371
-     * @see EEI_Admin_Links for comments
1372
-     * @return string
1373
-     */
1374
-    public function get_admin_settings_link()
1375
-    {
1376
-        return EEH_URL::add_query_args_and_nonce(
1377
-            array(
1378
-                'page'   => 'espresso_events',
1379
-                'action' => 'default_event_settings',
1380
-            ),
1381
-            admin_url('admin.php')
1382
-        );
1383
-    }
1384
-
1385
-
1386
-    /**
1387
-     * Implementation for EEI_Admin_Links interface method.
1388
-     *
1389
-     * @see EEI_Admin_Links for comments
1390
-     * @return string
1391
-     */
1392
-    public function get_admin_overview_link()
1393
-    {
1394
-        return EEH_URL::add_query_args_and_nonce(
1395
-            array(
1396
-                'page'   => 'espresso_events',
1397
-                'action' => 'default',
1398
-            ),
1399
-            admin_url('admin.php')
1400
-        );
1401
-    }
18
+	/**
19
+	 * cached value for the the logical active status for the event
20
+	 *
21
+	 * @see get_active_status()
22
+	 * @var string
23
+	 */
24
+	protected $_active_status = '';
25
+
26
+	/**
27
+	 * This is just used for caching the Primary Datetime for the Event on initial retrieval
28
+	 *
29
+	 * @var EE_Datetime
30
+	 */
31
+	protected $_Primary_Datetime;
32
+
33
+	/**
34
+	 * @var EventSpacesCalculator $available_spaces_calculator
35
+	 */
36
+	protected $available_spaces_calculator;
37
+
38
+
39
+	/**
40
+	 * @param array  $props_n_values          incoming values
41
+	 * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
42
+	 *                                        used.)
43
+	 * @param array  $date_formats            incoming date_formats in an array where the first value is the
44
+	 *                                        date_format and the second value is the time format
45
+	 * @return EE_Event
46
+	 * @throws EE_Error
47
+	 */
48
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
49
+	{
50
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
51
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
52
+	}
53
+
54
+
55
+	/**
56
+	 * @param array  $props_n_values  incoming values from the database
57
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
58
+	 *                                the website will be used.
59
+	 * @return EE_Event
60
+	 * @throws EE_Error
61
+	 */
62
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
63
+	{
64
+		return new self($props_n_values, true, $timezone);
65
+	}
66
+
67
+
68
+	/**
69
+	 * @return EventSpacesCalculator
70
+	 * @throws \EE_Error
71
+	 */
72
+	public function getAvailableSpacesCalculator()
73
+	{
74
+		if (! $this->available_spaces_calculator instanceof EventSpacesCalculator) {
75
+			$this->available_spaces_calculator = new EventSpacesCalculator($this);
76
+		}
77
+		return $this->available_spaces_calculator;
78
+	}
79
+
80
+
81
+	/**
82
+	 * Overrides parent set() method so that all calls to set( 'status', $status ) can be routed to internal methods
83
+	 *
84
+	 * @param string $field_name
85
+	 * @param mixed  $field_value
86
+	 * @param bool   $use_default
87
+	 * @throws EE_Error
88
+	 */
89
+	public function set($field_name, $field_value, $use_default = false)
90
+	{
91
+		switch ($field_name) {
92
+			case 'status':
93
+				$this->set_status($field_value, $use_default);
94
+				break;
95
+			default:
96
+				parent::set($field_name, $field_value, $use_default);
97
+		}
98
+	}
99
+
100
+
101
+	/**
102
+	 *    set_status
103
+	 * Checks if event status is being changed to SOLD OUT
104
+	 * and updates event meta data with previous event status
105
+	 * so that we can revert things if/when the event is no longer sold out
106
+	 *
107
+	 * @access public
108
+	 * @param string $new_status
109
+	 * @param bool   $use_default
110
+	 * @return void
111
+	 * @throws EE_Error
112
+	 */
113
+	public function set_status($new_status = null, $use_default = false)
114
+	{
115
+		// if nothing is set, and we aren't explicitly wanting to reset the status, then just leave
116
+		if (empty($new_status) && ! $use_default) {
117
+			return;
118
+		}
119
+		// get current Event status
120
+		$old_status = $this->status();
121
+		// if status has changed
122
+		if ($old_status !== $new_status) {
123
+			// TO sold_out
124
+			if ($new_status === EEM_Event::sold_out) {
125
+				// save the previous event status so that we can revert if the event is no longer sold out
126
+				$this->add_post_meta('_previous_event_status', $old_status);
127
+				do_action('AHEE__EE_Event__set_status__to_sold_out', $this, $old_status, $new_status);
128
+				// OR FROM  sold_out
129
+			} elseif ($old_status === EEM_Event::sold_out) {
130
+				$this->delete_post_meta('_previous_event_status');
131
+				do_action('AHEE__EE_Event__set_status__from_sold_out', $this, $old_status, $new_status);
132
+			}
133
+			// clear out the active status so that it gets reset the next time it is requested
134
+			$this->_active_status = null;
135
+			// update status
136
+			parent::set('status', $new_status, $use_default);
137
+			do_action('AHEE__EE_Event__set_status__after_update', $this);
138
+			return;
139
+		}
140
+		// even though the old value matches the new value, it's still good to
141
+		// allow the parent set method to have a say
142
+		parent::set('status', $new_status, $use_default);
143
+	}
144
+
145
+
146
+	/**
147
+	 * Gets all the datetimes for this event
148
+	 *
149
+	 * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
150
+	 * @return EE_Base_Class[]|EE_Datetime[]
151
+	 * @throws EE_Error
152
+	 */
153
+	public function datetimes($query_params = array())
154
+	{
155
+		return $this->get_many_related('Datetime', $query_params);
156
+	}
157
+
158
+
159
+	/**
160
+	 * Gets all the datetimes for this event, ordered by DTT_EVT_start in ascending order
161
+	 *
162
+	 * @return EE_Base_Class[]|EE_Datetime[]
163
+	 * @throws EE_Error
164
+	 */
165
+	public function datetimes_in_chronological_order()
166
+	{
167
+		return $this->get_many_related('Datetime', array('order_by' => array('DTT_EVT_start' => 'ASC')));
168
+	}
169
+
170
+
171
+	/**
172
+	 * Gets all the datetimes for this event, ordered by the DTT_order on the datetime.
173
+	 * @darren, we should probably UNSET timezone on the EEM_Datetime model
174
+	 * after running our query, so that this timezone isn't set for EVERY query
175
+	 * on EEM_Datetime for the rest of the request, no?
176
+	 *
177
+	 * @param boolean $show_expired whether or not to include expired events
178
+	 * @param boolean $show_deleted whether or not to include deleted events
179
+	 * @param null    $limit
180
+	 * @return EE_Datetime[]
181
+	 * @throws EE_Error
182
+	 */
183
+	public function datetimes_ordered($show_expired = true, $show_deleted = false, $limit = null)
184
+	{
185
+		return EEM_Datetime::instance($this->_timezone)->get_datetimes_for_event_ordered_by_DTT_order(
186
+			$this->ID(),
187
+			$show_expired,
188
+			$show_deleted,
189
+			$limit
190
+		);
191
+	}
192
+
193
+
194
+	/**
195
+	 * Returns one related datetime. Mostly only used by some legacy code.
196
+	 *
197
+	 * @return EE_Base_Class|EE_Datetime
198
+	 * @throws EE_Error
199
+	 */
200
+	public function first_datetime()
201
+	{
202
+		return $this->get_first_related('Datetime');
203
+	}
204
+
205
+
206
+	/**
207
+	 * Returns the 'primary' datetime for the event
208
+	 *
209
+	 * @param bool $try_to_exclude_expired
210
+	 * @param bool $try_to_exclude_deleted
211
+	 * @return EE_Datetime
212
+	 * @throws EE_Error
213
+	 */
214
+	public function primary_datetime($try_to_exclude_expired = true, $try_to_exclude_deleted = true)
215
+	{
216
+		if (! empty($this->_Primary_Datetime)) {
217
+			return $this->_Primary_Datetime;
218
+		}
219
+		$this->_Primary_Datetime = EEM_Datetime::instance($this->_timezone)->get_primary_datetime_for_event(
220
+			$this->ID(),
221
+			$try_to_exclude_expired,
222
+			$try_to_exclude_deleted
223
+		);
224
+		return $this->_Primary_Datetime;
225
+	}
226
+
227
+
228
+	/**
229
+	 * Gets all the tickets available for purchase of this event
230
+	 *
231
+	 * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
232
+	 * @return EE_Base_Class[]|EE_Ticket[]
233
+	 * @throws EE_Error
234
+	 */
235
+	public function tickets($query_params = array())
236
+	{
237
+		// first get all datetimes
238
+		$datetimes = $this->datetimes_ordered();
239
+		if (! $datetimes) {
240
+			return array();
241
+		}
242
+		$datetime_ids = array();
243
+		foreach ($datetimes as $datetime) {
244
+			$datetime_ids[] = $datetime->ID();
245
+		}
246
+		$where_params = array('Datetime.DTT_ID' => array('IN', $datetime_ids));
247
+		// if incoming $query_params has where conditions let's merge but not override existing.
248
+		if (is_array($query_params) && isset($query_params[0])) {
249
+			$where_params = array_merge($query_params[0], $where_params);
250
+			unset($query_params[0]);
251
+		}
252
+		// now add $where_params to $query_params
253
+		$query_params[0] = $where_params;
254
+		return EEM_Ticket::instance()->get_all($query_params);
255
+	}
256
+
257
+
258
+	/**
259
+	 * get all unexpired untrashed tickets
260
+	 *
261
+	 * @return EE_Ticket[]
262
+	 * @throws EE_Error
263
+	 */
264
+	public function active_tickets()
265
+	{
266
+		return $this->tickets(
267
+			array(
268
+				array(
269
+					'TKT_end_date' => array('>=', EEM_Ticket::instance()->current_time_for_query('TKT_end_date')),
270
+					'TKT_deleted'  => false,
271
+				),
272
+			)
273
+		);
274
+	}
275
+
276
+
277
+	/**
278
+	 * @return bool
279
+	 * @throws EE_Error
280
+	 */
281
+	public function additional_limit()
282
+	{
283
+		return $this->get('EVT_additional_limit');
284
+	}
285
+
286
+
287
+	/**
288
+	 * @return bool
289
+	 * @throws EE_Error
290
+	 */
291
+	public function allow_overflow()
292
+	{
293
+		return $this->get('EVT_allow_overflow');
294
+	}
295
+
296
+
297
+	/**
298
+	 * @return bool
299
+	 * @throws EE_Error
300
+	 */
301
+	public function created()
302
+	{
303
+		return $this->get('EVT_created');
304
+	}
305
+
306
+
307
+	/**
308
+	 * @return bool
309
+	 * @throws EE_Error
310
+	 */
311
+	public function description()
312
+	{
313
+		return $this->get('EVT_desc');
314
+	}
315
+
316
+
317
+	/**
318
+	 * Runs do_shortcode and wpautop on the description
319
+	 *
320
+	 * @return string of html
321
+	 * @throws EE_Error
322
+	 */
323
+	public function description_filtered()
324
+	{
325
+		return $this->get_pretty('EVT_desc');
326
+	}
327
+
328
+
329
+	/**
330
+	 * @return bool
331
+	 * @throws EE_Error
332
+	 */
333
+	public function display_description()
334
+	{
335
+		return $this->get('EVT_display_desc');
336
+	}
337
+
338
+
339
+	/**
340
+	 * @return bool
341
+	 * @throws EE_Error
342
+	 */
343
+	public function display_ticket_selector()
344
+	{
345
+		return (bool) $this->get('EVT_display_ticket_selector');
346
+	}
347
+
348
+
349
+	/**
350
+	 * @return bool
351
+	 * @throws EE_Error
352
+	 */
353
+	public function external_url()
354
+	{
355
+		return $this->get('EVT_external_URL');
356
+	}
357
+
358
+
359
+	/**
360
+	 * @return bool
361
+	 * @throws EE_Error
362
+	 */
363
+	public function member_only()
364
+	{
365
+		return $this->get('EVT_member_only');
366
+	}
367
+
368
+
369
+	/**
370
+	 * @return bool
371
+	 * @throws EE_Error
372
+	 */
373
+	public function phone()
374
+	{
375
+		return $this->get('EVT_phone');
376
+	}
377
+
378
+
379
+	/**
380
+	 * @return bool
381
+	 * @throws EE_Error
382
+	 */
383
+	public function modified()
384
+	{
385
+		return $this->get('EVT_modified');
386
+	}
387
+
388
+
389
+	/**
390
+	 * @return bool
391
+	 * @throws EE_Error
392
+	 */
393
+	public function name()
394
+	{
395
+		return $this->get('EVT_name');
396
+	}
397
+
398
+
399
+	/**
400
+	 * @return bool
401
+	 * @throws EE_Error
402
+	 */
403
+	public function order()
404
+	{
405
+		return $this->get('EVT_order');
406
+	}
407
+
408
+
409
+	/**
410
+	 * @return bool|string
411
+	 * @throws EE_Error
412
+	 */
413
+	public function default_registration_status()
414
+	{
415
+		$event_default_registration_status = $this->get('EVT_default_registration_status');
416
+		return ! empty($event_default_registration_status)
417
+			? $event_default_registration_status
418
+			: EE_Registry::instance()->CFG->registration->default_STS_ID;
419
+	}
420
+
421
+
422
+	/**
423
+	 * @param int  $num_words
424
+	 * @param null $more
425
+	 * @param bool $not_full_desc
426
+	 * @return bool|string
427
+	 * @throws EE_Error
428
+	 */
429
+	public function short_description($num_words = 55, $more = null, $not_full_desc = false)
430
+	{
431
+		$short_desc = $this->get('EVT_short_desc');
432
+		if (! empty($short_desc) || $not_full_desc) {
433
+			return $short_desc;
434
+		}
435
+		$full_desc = $this->get('EVT_desc');
436
+		return wp_trim_words($full_desc, $num_words, $more);
437
+	}
438
+
439
+
440
+	/**
441
+	 * @return bool
442
+	 * @throws EE_Error
443
+	 */
444
+	public function slug()
445
+	{
446
+		return $this->get('EVT_slug');
447
+	}
448
+
449
+
450
+	/**
451
+	 * @return bool
452
+	 * @throws EE_Error
453
+	 */
454
+	public function timezone_string()
455
+	{
456
+		return $this->get('EVT_timezone_string');
457
+	}
458
+
459
+
460
+	/**
461
+	 * @return bool
462
+	 * @throws EE_Error
463
+	 */
464
+	public function visible_on()
465
+	{
466
+		return $this->get('EVT_visible_on');
467
+	}
468
+
469
+
470
+	/**
471
+	 * @return int
472
+	 * @throws EE_Error
473
+	 */
474
+	public function wp_user()
475
+	{
476
+		return $this->get('EVT_wp_user');
477
+	}
478
+
479
+
480
+	/**
481
+	 * @return bool
482
+	 * @throws EE_Error
483
+	 */
484
+	public function donations()
485
+	{
486
+		return $this->get('EVT_donations');
487
+	}
488
+
489
+
490
+	/**
491
+	 * @param $limit
492
+	 * @throws EE_Error
493
+	 */
494
+	public function set_additional_limit($limit)
495
+	{
496
+		$this->set('EVT_additional_limit', $limit);
497
+	}
498
+
499
+
500
+	/**
501
+	 * @param $created
502
+	 * @throws EE_Error
503
+	 */
504
+	public function set_created($created)
505
+	{
506
+		$this->set('EVT_created', $created);
507
+	}
508
+
509
+
510
+	/**
511
+	 * @param $desc
512
+	 * @throws EE_Error
513
+	 */
514
+	public function set_description($desc)
515
+	{
516
+		$this->set('EVT_desc', $desc);
517
+	}
518
+
519
+
520
+	/**
521
+	 * @param $display_desc
522
+	 * @throws EE_Error
523
+	 */
524
+	public function set_display_description($display_desc)
525
+	{
526
+		$this->set('EVT_display_desc', $display_desc);
527
+	}
528
+
529
+
530
+	/**
531
+	 * @param $display_ticket_selector
532
+	 * @throws EE_Error
533
+	 */
534
+	public function set_display_ticket_selector($display_ticket_selector)
535
+	{
536
+		$this->set('EVT_display_ticket_selector', $display_ticket_selector);
537
+	}
538
+
539
+
540
+	/**
541
+	 * @param $external_url
542
+	 * @throws EE_Error
543
+	 */
544
+	public function set_external_url($external_url)
545
+	{
546
+		$this->set('EVT_external_URL', $external_url);
547
+	}
548
+
549
+
550
+	/**
551
+	 * @param $member_only
552
+	 * @throws EE_Error
553
+	 */
554
+	public function set_member_only($member_only)
555
+	{
556
+		$this->set('EVT_member_only', $member_only);
557
+	}
558
+
559
+
560
+	/**
561
+	 * @param $event_phone
562
+	 * @throws EE_Error
563
+	 */
564
+	public function set_event_phone($event_phone)
565
+	{
566
+		$this->set('EVT_phone', $event_phone);
567
+	}
568
+
569
+
570
+	/**
571
+	 * @param $modified
572
+	 * @throws EE_Error
573
+	 */
574
+	public function set_modified($modified)
575
+	{
576
+		$this->set('EVT_modified', $modified);
577
+	}
578
+
579
+
580
+	/**
581
+	 * @param $name
582
+	 * @throws EE_Error
583
+	 */
584
+	public function set_name($name)
585
+	{
586
+		$this->set('EVT_name', $name);
587
+	}
588
+
589
+
590
+	/**
591
+	 * @param $order
592
+	 * @throws EE_Error
593
+	 */
594
+	public function set_order($order)
595
+	{
596
+		$this->set('EVT_order', $order);
597
+	}
598
+
599
+
600
+	/**
601
+	 * @param $short_desc
602
+	 * @throws EE_Error
603
+	 */
604
+	public function set_short_description($short_desc)
605
+	{
606
+		$this->set('EVT_short_desc', $short_desc);
607
+	}
608
+
609
+
610
+	/**
611
+	 * @param $slug
612
+	 * @throws EE_Error
613
+	 */
614
+	public function set_slug($slug)
615
+	{
616
+		$this->set('EVT_slug', $slug);
617
+	}
618
+
619
+
620
+	/**
621
+	 * @param $timezone_string
622
+	 * @throws EE_Error
623
+	 */
624
+	public function set_timezone_string($timezone_string)
625
+	{
626
+		$this->set('EVT_timezone_string', $timezone_string);
627
+	}
628
+
629
+
630
+	/**
631
+	 * @param $visible_on
632
+	 * @throws EE_Error
633
+	 */
634
+	public function set_visible_on($visible_on)
635
+	{
636
+		$this->set('EVT_visible_on', $visible_on);
637
+	}
638
+
639
+
640
+	/**
641
+	 * @param $wp_user
642
+	 * @throws EE_Error
643
+	 */
644
+	public function set_wp_user($wp_user)
645
+	{
646
+		$this->set('EVT_wp_user', $wp_user);
647
+	}
648
+
649
+
650
+	/**
651
+	 * @param $default_registration_status
652
+	 * @throws EE_Error
653
+	 */
654
+	public function set_default_registration_status($default_registration_status)
655
+	{
656
+		$this->set('EVT_default_registration_status', $default_registration_status);
657
+	}
658
+
659
+
660
+	/**
661
+	 * @param $donations
662
+	 * @throws EE_Error
663
+	 */
664
+	public function set_donations($donations)
665
+	{
666
+		$this->set('EVT_donations', $donations);
667
+	}
668
+
669
+
670
+	/**
671
+	 * Adds a venue to this event
672
+	 *
673
+	 * @param EE_Venue /int $venue_id_or_obj
674
+	 * @return EE_Base_Class|EE_Venue
675
+	 * @throws EE_Error
676
+	 */
677
+	public function add_venue($venue_id_or_obj)
678
+	{
679
+		return $this->_add_relation_to($venue_id_or_obj, 'Venue');
680
+	}
681
+
682
+
683
+	/**
684
+	 * Removes a venue from the event
685
+	 *
686
+	 * @param EE_Venue /int $venue_id_or_obj
687
+	 * @return EE_Base_Class|EE_Venue
688
+	 * @throws EE_Error
689
+	 */
690
+	public function remove_venue($venue_id_or_obj)
691
+	{
692
+		return $this->_remove_relation_to($venue_id_or_obj, 'Venue');
693
+	}
694
+
695
+
696
+	/**
697
+	 * Gets all the venues related ot the event. May provide additional $query_params if desired
698
+	 *
699
+	 * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
700
+	 * @return EE_Base_Class[]|EE_Venue[]
701
+	 * @throws EE_Error
702
+	 */
703
+	public function venues($query_params = array())
704
+	{
705
+		return $this->get_many_related('Venue', $query_params);
706
+	}
707
+
708
+
709
+	/**
710
+	 * check if event id is present and if event is published
711
+	 *
712
+	 * @access public
713
+	 * @return boolean true yes, false no
714
+	 * @throws EE_Error
715
+	 */
716
+	private function _has_ID_and_is_published()
717
+	{
718
+		// first check if event id is present and not NULL,
719
+		// then check if this event is published (or any of the equivalent "published" statuses)
720
+		return
721
+			$this->ID() && $this->ID() !== null
722
+			&& (
723
+				$this->status() === 'publish'
724
+				|| $this->status() === EEM_Event::sold_out
725
+				|| $this->status() === EEM_Event::postponed
726
+				|| $this->status() === EEM_Event::cancelled
727
+			);
728
+	}
729
+
730
+
731
+	/**
732
+	 * This simply compares the internal dates with NOW and determines if the event is upcoming or not.
733
+	 *
734
+	 * @access public
735
+	 * @return boolean true yes, false no
736
+	 * @throws EE_Error
737
+	 */
738
+	public function is_upcoming()
739
+	{
740
+		// check if event id is present and if this event is published
741
+		if ($this->is_inactive()) {
742
+			return false;
743
+		}
744
+		// set initial value
745
+		$upcoming = false;
746
+		// next let's get all datetimes and loop through them
747
+		$datetimes = $this->datetimes_in_chronological_order();
748
+		foreach ($datetimes as $datetime) {
749
+			if ($datetime instanceof EE_Datetime) {
750
+				// if this dtt is expired then we continue cause one of the other datetimes might be upcoming.
751
+				if ($datetime->is_expired()) {
752
+					continue;
753
+				}
754
+				// if this dtt is active then we return false.
755
+				if ($datetime->is_active()) {
756
+					return false;
757
+				}
758
+				// otherwise let's check upcoming status
759
+				$upcoming = $datetime->is_upcoming();
760
+			}
761
+		}
762
+		return $upcoming;
763
+	}
764
+
765
+
766
+	/**
767
+	 * @return bool
768
+	 * @throws EE_Error
769
+	 */
770
+	public function is_active()
771
+	{
772
+		// check if event id is present and if this event is published
773
+		if ($this->is_inactive()) {
774
+			return false;
775
+		}
776
+		// set initial value
777
+		$active = false;
778
+		// next let's get all datetimes and loop through them
779
+		$datetimes = $this->datetimes_in_chronological_order();
780
+		foreach ($datetimes as $datetime) {
781
+			if ($datetime instanceof EE_Datetime) {
782
+				// if this dtt is expired then we continue cause one of the other datetimes might be active.
783
+				if ($datetime->is_expired()) {
784
+					continue;
785
+				}
786
+				// if this dtt is upcoming then we return false.
787
+				if ($datetime->is_upcoming()) {
788
+					return false;
789
+				}
790
+				// otherwise let's check active status
791
+				$active = $datetime->is_active();
792
+			}
793
+		}
794
+		return $active;
795
+	}
796
+
797
+
798
+	/**
799
+	 * @return bool
800
+	 * @throws EE_Error
801
+	 */
802
+	public function is_expired()
803
+	{
804
+		// check if event id is present and if this event is published
805
+		if ($this->is_inactive()) {
806
+			return false;
807
+		}
808
+		// set initial value
809
+		$expired = false;
810
+		// first let's get all datetimes and loop through them
811
+		$datetimes = $this->datetimes_in_chronological_order();
812
+		foreach ($datetimes as $datetime) {
813
+			if ($datetime instanceof EE_Datetime) {
814
+				// if this dtt is upcoming or active then we return false.
815
+				if ($datetime->is_upcoming() || $datetime->is_active()) {
816
+					return false;
817
+				}
818
+				// otherwise let's check active status
819
+				$expired = $datetime->is_expired();
820
+			}
821
+		}
822
+		return $expired;
823
+	}
824
+
825
+
826
+	/**
827
+	 * @return bool
828
+	 * @throws EE_Error
829
+	 */
830
+	public function is_inactive()
831
+	{
832
+		// check if event id is present and if this event is published
833
+		if ($this->_has_ID_and_is_published()) {
834
+			return false;
835
+		}
836
+		return true;
837
+	}
838
+
839
+
840
+	/**
841
+	 * calculate spaces remaining based on "saleable" tickets
842
+	 *
843
+	 * @param array $tickets
844
+	 * @param bool  $filtered
845
+	 * @return int|float
846
+	 * @throws EE_Error
847
+	 * @throws DomainException
848
+	 * @throws UnexpectedEntityException
849
+	 */
850
+	public function spaces_remaining($tickets = array(), $filtered = true)
851
+	{
852
+		$this->getAvailableSpacesCalculator()->setActiveTickets($tickets);
853
+		$spaces_remaining = $this->getAvailableSpacesCalculator()->spacesRemaining();
854
+		return $filtered
855
+			? apply_filters(
856
+				'FHEE_EE_Event__spaces_remaining',
857
+				$spaces_remaining,
858
+				$this,
859
+				$tickets
860
+			)
861
+			: $spaces_remaining;
862
+	}
863
+
864
+
865
+	/**
866
+	 *    perform_sold_out_status_check
867
+	 *    checks all of this events's datetime  reg_limit - sold values to determine if ANY datetimes have spaces
868
+	 *    available... if NOT, then the event status will get toggled to 'sold_out'
869
+	 *
870
+	 * @return bool    return the ACTUAL sold out state.
871
+	 * @throws EE_Error
872
+	 * @throws DomainException
873
+	 * @throws UnexpectedEntityException
874
+	 */
875
+	public function perform_sold_out_status_check()
876
+	{
877
+		// get all tickets
878
+		$tickets = $this->tickets(
879
+			array(
880
+				'default_where_conditions' => 'none',
881
+				'order_by' => array('TKT_qty' => 'ASC'),
882
+			)
883
+		);
884
+		$all_expired = true;
885
+		foreach ($tickets as $ticket) {
886
+			if (! $ticket->is_expired()) {
887
+				$all_expired = false;
888
+				break;
889
+			}
890
+		}
891
+		// if all the tickets are just expired, then don't update the event status to sold out
892
+		if ($all_expired) {
893
+			return true;
894
+		}
895
+		$spaces_remaining = $this->spaces_remaining($tickets);
896
+		if ($spaces_remaining < 1) {
897
+			if ($this->status() !== EEM_Event::post_status_private) {
898
+				$this->set_status(EEM_Event::sold_out);
899
+				$this->save();
900
+			}
901
+			$sold_out = true;
902
+		} else {
903
+			$sold_out = false;
904
+			// was event previously marked as sold out ?
905
+			if ($this->status() === EEM_Event::sold_out) {
906
+				// revert status to previous value, if it was set
907
+				$previous_event_status = $this->get_post_meta('_previous_event_status', true);
908
+				if ($previous_event_status) {
909
+					$this->set_status($previous_event_status);
910
+					$this->save();
911
+				}
912
+			}
913
+		}
914
+		do_action('AHEE__EE_Event__perform_sold_out_status_check__end', $this, $sold_out, $spaces_remaining, $tickets);
915
+		return $sold_out;
916
+	}
917
+
918
+
919
+	/**
920
+	 * This returns the total remaining spaces for sale on this event.
921
+	 *
922
+	 * @uses EE_Event::total_available_spaces()
923
+	 * @return float|int
924
+	 * @throws EE_Error
925
+	 * @throws DomainException
926
+	 * @throws UnexpectedEntityException
927
+	 */
928
+	public function spaces_remaining_for_sale()
929
+	{
930
+		return $this->total_available_spaces(true);
931
+	}
932
+
933
+
934
+	/**
935
+	 * This returns the total spaces available for an event
936
+	 * while considering all the qtys on the tickets and the reg limits
937
+	 * on the datetimes attached to this event.
938
+	 *
939
+	 * @param   bool $consider_sold Whether to consider any tickets that have already sold in our calculation.
940
+	 *                              If this is false, then we return the most tickets that could ever be sold
941
+	 *                              for this event with the datetime and tickets setup on the event under optimal
942
+	 *                              selling conditions.  Otherwise we return a live calculation of spaces available
943
+	 *                              based on tickets sold.  Depending on setup and stage of sales, this
944
+	 *                              may appear to equal remaining tickets.  However, the more tickets are
945
+	 *                              sold out, the more accurate the "live" total is.
946
+	 * @return float|int
947
+	 * @throws EE_Error
948
+	 * @throws DomainException
949
+	 * @throws UnexpectedEntityException
950
+	 */
951
+	public function total_available_spaces($consider_sold = false)
952
+	{
953
+		$spaces_available = $consider_sold
954
+			? $this->getAvailableSpacesCalculator()->spacesRemaining()
955
+			: $this->getAvailableSpacesCalculator()->totalSpacesAvailable();
956
+		return apply_filters(
957
+			'FHEE_EE_Event__total_available_spaces__spaces_available',
958
+			$spaces_available,
959
+			$this,
960
+			$this->getAvailableSpacesCalculator()->getDatetimes(),
961
+			$this->getAvailableSpacesCalculator()->getActiveTickets()
962
+		);
963
+	}
964
+
965
+
966
+	/**
967
+	 * Checks if the event is set to sold out
968
+	 *
969
+	 * @param  bool $actual whether or not to perform calculations to not only figure the
970
+	 *                      actual status but also to flip the status if necessary to sold
971
+	 *                      out If false, we just check the existing status of the event
972
+	 * @return boolean
973
+	 * @throws EE_Error
974
+	 */
975
+	public function is_sold_out($actual = false)
976
+	{
977
+		if (! $actual) {
978
+			return $this->status() === EEM_Event::sold_out;
979
+		}
980
+		return $this->perform_sold_out_status_check();
981
+	}
982
+
983
+
984
+	/**
985
+	 * Checks if the event is marked as postponed
986
+	 *
987
+	 * @return boolean
988
+	 */
989
+	public function is_postponed()
990
+	{
991
+		return $this->status() === EEM_Event::postponed;
992
+	}
993
+
994
+
995
+	/**
996
+	 * Checks if the event is marked as cancelled
997
+	 *
998
+	 * @return boolean
999
+	 */
1000
+	public function is_cancelled()
1001
+	{
1002
+		return $this->status() === EEM_Event::cancelled;
1003
+	}
1004
+
1005
+
1006
+	/**
1007
+	 * Get the logical active status in a hierarchical order for all the datetimes.  Note
1008
+	 * Basically, we order the datetimes by EVT_start_date.  Then first test on whether the event is published.  If its
1009
+	 * NOT published then we test for whether its expired or not.  IF it IS published then we test first on whether an
1010
+	 * event has any active dates.  If no active dates then we check for any upcoming dates.  If no upcoming dates then
1011
+	 * the event is considered expired.
1012
+	 * NOTE: this method does NOT calculate whether the datetimes are sold out when event is published.  Sold Out is a
1013
+	 * status set on the EVENT when it is not published and thus is done
1014
+	 *
1015
+	 * @param bool $reset
1016
+	 * @return bool | string - based on EE_Datetime active constants or FALSE if error.
1017
+	 * @throws EE_Error
1018
+	 */
1019
+	public function get_active_status($reset = false)
1020
+	{
1021
+		// if the active status has already been set, then just use that value (unless we are resetting it)
1022
+		if (! empty($this->_active_status) && ! $reset) {
1023
+			return $this->_active_status;
1024
+		}
1025
+		// first check if event id is present on this object
1026
+		if (! $this->ID()) {
1027
+			return false;
1028
+		}
1029
+		$where_params_for_event = array(array('EVT_ID' => $this->ID()));
1030
+		// if event is published:
1031
+		if ($this->status() === EEM_Event::post_status_publish || $this->status() === EEM_Event::post_status_private) {
1032
+			// active?
1033
+			if (EEM_Datetime::instance()->get_datetime_count_for_status(
1034
+				EE_Datetime::active,
1035
+				$where_params_for_event
1036
+			) > 0) {
1037
+				$this->_active_status = EE_Datetime::active;
1038
+			} else {
1039
+				// upcoming?
1040
+				if (EEM_Datetime::instance()->get_datetime_count_for_status(
1041
+					EE_Datetime::upcoming,
1042
+					$where_params_for_event
1043
+				) > 0) {
1044
+					$this->_active_status = EE_Datetime::upcoming;
1045
+				} else {
1046
+					// expired?
1047
+					if (EEM_Datetime::instance()->get_datetime_count_for_status(
1048
+						EE_Datetime::expired,
1049
+						$where_params_for_event
1050
+					) > 0
1051
+					) {
1052
+						$this->_active_status = EE_Datetime::expired;
1053
+					} else {
1054
+						// it would be odd if things make it this far because it basically means there are no datetime's
1055
+						// attached to the event.  So in this case it will just be considered inactive.
1056
+						$this->_active_status = EE_Datetime::inactive;
1057
+					}
1058
+				}
1059
+			}
1060
+		} else {
1061
+			// the event is not published, so let's just set it's active status according to its' post status
1062
+			switch ($this->status()) {
1063
+				case EEM_Event::sold_out:
1064
+					$this->_active_status = EE_Datetime::sold_out;
1065
+					break;
1066
+				case EEM_Event::cancelled:
1067
+					$this->_active_status = EE_Datetime::cancelled;
1068
+					break;
1069
+				case EEM_Event::postponed:
1070
+					$this->_active_status = EE_Datetime::postponed;
1071
+					break;
1072
+				default:
1073
+					$this->_active_status = EE_Datetime::inactive;
1074
+			}
1075
+		}
1076
+		return $this->_active_status;
1077
+	}
1078
+
1079
+
1080
+	/**
1081
+	 *    pretty_active_status
1082
+	 *
1083
+	 * @access public
1084
+	 * @param boolean $echo whether to return (FALSE), or echo out the result (TRUE)
1085
+	 * @return mixed void|string
1086
+	 * @throws EE_Error
1087
+	 */
1088
+	public function pretty_active_status($echo = true)
1089
+	{
1090
+		$active_status = $this->get_active_status();
1091
+		$status = '<span class="ee-status event-active-status-'
1092
+				  . $active_status
1093
+				  . '">'
1094
+				  . EEH_Template::pretty_status($active_status, false, 'sentence')
1095
+				  . '</span>';
1096
+		if ($echo) {
1097
+			echo $status;
1098
+			return '';
1099
+		}
1100
+		return $status;
1101
+	}
1102
+
1103
+
1104
+	/**
1105
+	 * @return bool|int
1106
+	 * @throws EE_Error
1107
+	 */
1108
+	public function get_number_of_tickets_sold()
1109
+	{
1110
+		$tkt_sold = 0;
1111
+		if (! $this->ID()) {
1112
+			return 0;
1113
+		}
1114
+		$datetimes = $this->datetimes();
1115
+		foreach ($datetimes as $datetime) {
1116
+			if ($datetime instanceof EE_Datetime) {
1117
+				$tkt_sold += $datetime->sold();
1118
+			}
1119
+		}
1120
+		return $tkt_sold;
1121
+	}
1122
+
1123
+
1124
+	/**
1125
+	 * This just returns a count of all the registrations for this event
1126
+	 *
1127
+	 * @access  public
1128
+	 * @return int
1129
+	 * @throws EE_Error
1130
+	 */
1131
+	public function get_count_of_all_registrations()
1132
+	{
1133
+		return EEM_Event::instance()->count_related($this, 'Registration');
1134
+	}
1135
+
1136
+
1137
+	/**
1138
+	 * This returns the ticket with the earliest start time that is
1139
+	 * available for this event (across all datetimes attached to the event)
1140
+	 *
1141
+	 * @return EE_Base_Class|EE_Ticket|null
1142
+	 * @throws EE_Error
1143
+	 */
1144
+	public function get_ticket_with_earliest_start_time()
1145
+	{
1146
+		$where['Datetime.EVT_ID'] = $this->ID();
1147
+		$query_params = array($where, 'order_by' => array('TKT_start_date' => 'ASC'));
1148
+		return EE_Registry::instance()->load_model('Ticket')->get_one($query_params);
1149
+	}
1150
+
1151
+
1152
+	/**
1153
+	 * This returns the ticket with the latest end time that is available
1154
+	 * for this event (across all datetimes attached to the event)
1155
+	 *
1156
+	 * @return EE_Base_Class|EE_Ticket|null
1157
+	 * @throws EE_Error
1158
+	 */
1159
+	public function get_ticket_with_latest_end_time()
1160
+	{
1161
+		$where['Datetime.EVT_ID'] = $this->ID();
1162
+		$query_params = array($where, 'order_by' => array('TKT_end_date' => 'DESC'));
1163
+		return EE_Registry::instance()->load_model('Ticket')->get_one($query_params);
1164
+	}
1165
+
1166
+
1167
+	/**
1168
+	 * This returns the number of different ticket types currently on sale for this event.
1169
+	 *
1170
+	 * @return int
1171
+	 * @throws EE_Error
1172
+	 */
1173
+	public function countTicketsOnSale()
1174
+	{
1175
+		$where = array(
1176
+			'Datetime.EVT_ID' => $this->ID(),
1177
+			'TKT_start_date'  => array('<', time()),
1178
+			'TKT_end_date'    => array('>', time()),
1179
+		);
1180
+		return EEM_Ticket::instance()->count(array($where));
1181
+	}
1182
+
1183
+
1184
+	/**
1185
+	 * This returns whether there are any tickets on sale for this event.
1186
+	 *
1187
+	 * @return bool true = YES tickets on sale.
1188
+	 * @throws EE_Error
1189
+	 */
1190
+	public function tickets_on_sale()
1191
+	{
1192
+		return $this->countTicketsOnSale() > 0;
1193
+	}
1194
+
1195
+
1196
+	/**
1197
+	 * Gets the URL for viewing this event on the front-end. Overrides parent
1198
+	 * to check for an external URL first
1199
+	 *
1200
+	 * @return string
1201
+	 * @throws EE_Error
1202
+	 */
1203
+	public function get_permalink()
1204
+	{
1205
+		if ($this->external_url()) {
1206
+			return $this->external_url();
1207
+		}
1208
+		return parent::get_permalink();
1209
+	}
1210
+
1211
+
1212
+	/**
1213
+	 * Gets the first term for 'espresso_event_categories' we can find
1214
+	 *
1215
+	 * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1216
+	 * @return EE_Base_Class|EE_Term|null
1217
+	 * @throws EE_Error
1218
+	 */
1219
+	public function first_event_category($query_params = array())
1220
+	{
1221
+		$query_params[0]['Term_Taxonomy.taxonomy'] = 'espresso_event_categories';
1222
+		$query_params[0]['Term_Taxonomy.Event.EVT_ID'] = $this->ID();
1223
+		return EEM_Term::instance()->get_one($query_params);
1224
+	}
1225
+
1226
+
1227
+	/**
1228
+	 * Gets all terms for 'espresso_event_categories' we can find
1229
+	 *
1230
+	 * @param array $query_params
1231
+	 * @return EE_Base_Class[]|EE_Term[]
1232
+	 * @throws EE_Error
1233
+	 */
1234
+	public function get_all_event_categories($query_params = array())
1235
+	{
1236
+		$query_params[0]['Term_Taxonomy.taxonomy'] = 'espresso_event_categories';
1237
+		$query_params[0]['Term_Taxonomy.Event.EVT_ID'] = $this->ID();
1238
+		return EEM_Term::instance()->get_all($query_params);
1239
+	}
1240
+
1241
+
1242
+	/**
1243
+	 * Adds a question group to this event
1244
+	 *
1245
+	 * @param EE_Question_Group|int $question_group_id_or_obj
1246
+	 * @param bool $for_primary if true, the question group will be added for the primary
1247
+	 *                                           registrant, if false will be added for others. default: false
1248
+	 * @return EE_Base_Class|EE_Question_Group
1249
+	 * @throws EE_Error
1250
+	 * @throws InvalidArgumentException
1251
+	 * @throws InvalidDataTypeException
1252
+	 * @throws InvalidInterfaceException
1253
+	 * @throws ReflectionException
1254
+	 */
1255
+	public function add_question_group($question_group_id_or_obj, $for_primary = false)
1256
+	{
1257
+		// If the row already exists, it will be updated. If it doesn't, it will be inserted.
1258
+		// That's in EE_HABTM_Relation::add_relation_to().
1259
+		return $this->_add_relation_to(
1260
+			$question_group_id_or_obj,
1261
+			'Question_Group',
1262
+			[
1263
+				EEM_Event_Question_Group::instance()->fieldNameForContext($for_primary) => true
1264
+			]
1265
+		);
1266
+	}
1267
+
1268
+
1269
+	/**
1270
+	 * Removes a question group from the event
1271
+	 *
1272
+	 * @param EE_Question_Group|int $question_group_id_or_obj
1273
+	 * @param bool $for_primary if true, the question group will be removed from the primary
1274
+	 *                                           registrant, if false will be removed from others. default: false
1275
+	 * @return EE_Base_Class|EE_Question_Group
1276
+	 * @throws EE_Error
1277
+	 * @throws InvalidArgumentException
1278
+	 * @throws ReflectionException
1279
+	 * @throws InvalidDataTypeException
1280
+	 * @throws InvalidInterfaceException
1281
+	 */
1282
+	public function remove_question_group($question_group_id_or_obj, $for_primary = false)
1283
+	{
1284
+		// If the question group is used for the other type (primary or additional)
1285
+		// then just update it. If not, delete it outright.
1286
+		$existing_relation = $this->get_first_related(
1287
+			'Event_Question_Group',
1288
+			[
1289
+				[
1290
+					'QSG_ID' => EEM_Question_Group::instance()->ensure_is_ID($question_group_id_or_obj)
1291
+				]
1292
+			]
1293
+		);
1294
+		$field_to_update = EEM_Event_Question_Group::instance()->fieldNameForContext($for_primary);
1295
+		$other_field = EEM_Event_Question_Group::instance()->fieldNameForContext(! $for_primary);
1296
+		if ($existing_relation->get($other_field) === false) {
1297
+			// Delete it. It's now no longer for primary or additional question groups.
1298
+			return $this->_remove_relation_to($question_group_id_or_obj, 'Question_Group');
1299
+		}
1300
+		// Just update it. They'll still use this question group for the other category
1301
+		$existing_relation->save(
1302
+			[
1303
+				$field_to_update => false
1304
+			]
1305
+		);
1306
+	}
1307
+
1308
+
1309
+	/**
1310
+	 * Gets all the question groups, ordering them by QSG_order ascending
1311
+	 *
1312
+	 * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1313
+	 * @return EE_Base_Class[]|EE_Question_Group[]
1314
+	 * @throws EE_Error
1315
+	 */
1316
+	public function question_groups($query_params = array())
1317
+	{
1318
+		$query_params = ! empty($query_params) ? $query_params : array('order_by' => array('QSG_order' => 'ASC'));
1319
+		return $this->get_many_related('Question_Group', $query_params);
1320
+	}
1321
+
1322
+
1323
+	/**
1324
+	 * Implementation for EEI_Has_Icon interface method.
1325
+	 *
1326
+	 * @see EEI_Visual_Representation for comments
1327
+	 * @return string
1328
+	 */
1329
+	public function get_icon()
1330
+	{
1331
+		return '<span class="dashicons dashicons-flag"></span>';
1332
+	}
1333
+
1334
+
1335
+	/**
1336
+	 * Implementation for EEI_Admin_Links interface method.
1337
+	 *
1338
+	 * @see EEI_Admin_Links for comments
1339
+	 * @return string
1340
+	 * @throws EE_Error
1341
+	 */
1342
+	public function get_admin_details_link()
1343
+	{
1344
+		return $this->get_admin_edit_link();
1345
+	}
1346
+
1347
+
1348
+	/**
1349
+	 * Implementation for EEI_Admin_Links interface method.
1350
+	 *
1351
+	 * @see EEI_Admin_Links for comments
1352
+	 * @return string
1353
+	 * @throws EE_Error
1354
+	 */
1355
+	public function get_admin_edit_link()
1356
+	{
1357
+		return EEH_URL::add_query_args_and_nonce(
1358
+			array(
1359
+				'page'   => 'espresso_events',
1360
+				'action' => 'edit',
1361
+				'post'   => $this->ID(),
1362
+			),
1363
+			admin_url('admin.php')
1364
+		);
1365
+	}
1366
+
1367
+
1368
+	/**
1369
+	 * Implementation for EEI_Admin_Links interface method.
1370
+	 *
1371
+	 * @see EEI_Admin_Links for comments
1372
+	 * @return string
1373
+	 */
1374
+	public function get_admin_settings_link()
1375
+	{
1376
+		return EEH_URL::add_query_args_and_nonce(
1377
+			array(
1378
+				'page'   => 'espresso_events',
1379
+				'action' => 'default_event_settings',
1380
+			),
1381
+			admin_url('admin.php')
1382
+		);
1383
+	}
1384
+
1385
+
1386
+	/**
1387
+	 * Implementation for EEI_Admin_Links interface method.
1388
+	 *
1389
+	 * @see EEI_Admin_Links for comments
1390
+	 * @return string
1391
+	 */
1392
+	public function get_admin_overview_link()
1393
+	{
1394
+		return EEH_URL::add_query_args_and_nonce(
1395
+			array(
1396
+				'page'   => 'espresso_events',
1397
+				'action' => 'default',
1398
+			),
1399
+			admin_url('admin.php')
1400
+		);
1401
+	}
1402 1402
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Extra_Meta.class.php 2 patches
Doc Comments   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -46,7 +46,7 @@  discard block
 block discarded – undo
46 46
      * Sets FK_ID
47 47
      *
48 48
      * @param int $FK_ID
49
-     * @return boolean
49
+     * @return boolean|null
50 50
      */
51 51
     public function set_FK_ID($FK_ID)
52 52
     {
@@ -69,7 +69,7 @@  discard block
 block discarded – undo
69 69
      * Sets model
70 70
      *
71 71
      * @param string $model
72
-     * @return boolean
72
+     * @return boolean|null
73 73
      */
74 74
     public function set_model($model)
75 75
     {
@@ -92,7 +92,7 @@  discard block
 block discarded – undo
92 92
      * Sets key
93 93
      *
94 94
      * @param string $key
95
-     * @return boolean
95
+     * @return boolean|null
96 96
      */
97 97
     public function set_key($key)
98 98
     {
@@ -115,7 +115,7 @@  discard block
 block discarded – undo
115 115
      * Sets value
116 116
      *
117 117
      * @param string $value
118
-     * @return boolean
118
+     * @return boolean|null
119 119
      */
120 120
     public function set_value($value)
121 121
     {
Please login to merge, or discard this patch.
Indentation   +111 added lines, -111 removed lines patch added patch discarded remove patch
@@ -10,115 +10,115 @@
 block discarded – undo
10 10
 class EE_Extra_Meta extends EE_Base_Class
11 11
 {
12 12
 
13
-    /**
14
-     * @param array $props_n_values
15
-     * @return EE_Extra_Meta|mixed
16
-     */
17
-    public static function new_instance($props_n_values = array())
18
-    {
19
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__);
20
-        return $has_object ? $has_object : new self($props_n_values);
21
-    }
22
-
23
-
24
-    /**
25
-     * @param array $props_n_values
26
-     * @return EE_Extra_Meta
27
-     */
28
-    public static function new_instance_from_db($props_n_values = array())
29
-    {
30
-        return new self($props_n_values, true);
31
-    }
32
-
33
-
34
-    /**
35
-     * Gets FK_ID
36
-     *
37
-     * @return int
38
-     */
39
-    public function FK_ID()
40
-    {
41
-        return $this->get('FK_ID');
42
-    }
43
-
44
-
45
-    /**
46
-     * Sets FK_ID
47
-     *
48
-     * @param int $FK_ID
49
-     * @return boolean
50
-     */
51
-    public function set_FK_ID($FK_ID)
52
-    {
53
-        $this->set('FK_ID', $FK_ID);
54
-    }
55
-
56
-
57
-    /**
58
-     * Gets model
59
-     *
60
-     * @return string
61
-     */
62
-    public function model()
63
-    {
64
-        return $this->get('EXM_model');
65
-    }
66
-
67
-
68
-    /**
69
-     * Sets model
70
-     *
71
-     * @param string $model
72
-     * @return boolean
73
-     */
74
-    public function set_model($model)
75
-    {
76
-        $this->set('EXM_model', $model);
77
-    }
78
-
79
-
80
-    /**
81
-     * Gets key
82
-     *
83
-     * @return string
84
-     */
85
-    public function key()
86
-    {
87
-        return $this->get('EXM_key');
88
-    }
89
-
90
-
91
-    /**
92
-     * Sets key
93
-     *
94
-     * @param string $key
95
-     * @return boolean
96
-     */
97
-    public function set_key($key)
98
-    {
99
-        $this->set('EXM_key', $key);
100
-    }
101
-
102
-
103
-    /**
104
-     * Gets value
105
-     *
106
-     * @return string
107
-     */
108
-    public function value()
109
-    {
110
-        return $this->get('EXM_value');
111
-    }
112
-
113
-
114
-    /**
115
-     * Sets value
116
-     *
117
-     * @param string $value
118
-     * @return boolean
119
-     */
120
-    public function set_value($value)
121
-    {
122
-        $this->set('EXM_value', $value);
123
-    }
13
+	/**
14
+	 * @param array $props_n_values
15
+	 * @return EE_Extra_Meta|mixed
16
+	 */
17
+	public static function new_instance($props_n_values = array())
18
+	{
19
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__);
20
+		return $has_object ? $has_object : new self($props_n_values);
21
+	}
22
+
23
+
24
+	/**
25
+	 * @param array $props_n_values
26
+	 * @return EE_Extra_Meta
27
+	 */
28
+	public static function new_instance_from_db($props_n_values = array())
29
+	{
30
+		return new self($props_n_values, true);
31
+	}
32
+
33
+
34
+	/**
35
+	 * Gets FK_ID
36
+	 *
37
+	 * @return int
38
+	 */
39
+	public function FK_ID()
40
+	{
41
+		return $this->get('FK_ID');
42
+	}
43
+
44
+
45
+	/**
46
+	 * Sets FK_ID
47
+	 *
48
+	 * @param int $FK_ID
49
+	 * @return boolean
50
+	 */
51
+	public function set_FK_ID($FK_ID)
52
+	{
53
+		$this->set('FK_ID', $FK_ID);
54
+	}
55
+
56
+
57
+	/**
58
+	 * Gets model
59
+	 *
60
+	 * @return string
61
+	 */
62
+	public function model()
63
+	{
64
+		return $this->get('EXM_model');
65
+	}
66
+
67
+
68
+	/**
69
+	 * Sets model
70
+	 *
71
+	 * @param string $model
72
+	 * @return boolean
73
+	 */
74
+	public function set_model($model)
75
+	{
76
+		$this->set('EXM_model', $model);
77
+	}
78
+
79
+
80
+	/**
81
+	 * Gets key
82
+	 *
83
+	 * @return string
84
+	 */
85
+	public function key()
86
+	{
87
+		return $this->get('EXM_key');
88
+	}
89
+
90
+
91
+	/**
92
+	 * Sets key
93
+	 *
94
+	 * @param string $key
95
+	 * @return boolean
96
+	 */
97
+	public function set_key($key)
98
+	{
99
+		$this->set('EXM_key', $key);
100
+	}
101
+
102
+
103
+	/**
104
+	 * Gets value
105
+	 *
106
+	 * @return string
107
+	 */
108
+	public function value()
109
+	{
110
+		return $this->get('EXM_value');
111
+	}
112
+
113
+
114
+	/**
115
+	 * Sets value
116
+	 *
117
+	 * @param string $value
118
+	 * @return boolean
119
+	 */
120
+	public function set_value($value)
121
+	{
122
+		$this->set('EXM_value', $value);
123
+	}
124 124
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Post_Meta.class.php 2 patches
Doc Comments   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -46,7 +46,7 @@  discard block
 block discarded – undo
46 46
      * Sets meta_id
47 47
      *
48 48
      * @param int $meta_id
49
-     * @return boolean
49
+     * @return boolean|null
50 50
      */
51 51
     public function set_meta_id($meta_id)
52 52
     {
@@ -68,7 +68,7 @@  discard block
 block discarded – undo
68 68
      * Sets post_id
69 69
      *
70 70
      * @param int $post_id
71
-     * @return boolean
71
+     * @return boolean|null
72 72
      */
73 73
     public function set_post_id($post_id)
74 74
     {
@@ -90,7 +90,7 @@  discard block
 block discarded – undo
90 90
      * Sets meta_key
91 91
      *
92 92
      * @param string $meta_key
93
-     * @return boolean
93
+     * @return boolean|null
94 94
      */
95 95
     public function set_meta_key($meta_key)
96 96
     {
@@ -112,7 +112,7 @@  discard block
 block discarded – undo
112 112
      * Sets meta_value
113 113
      *
114 114
      * @param mixed $meta_value
115
-     * @return boolean
115
+     * @return boolean|null
116 116
      */
117 117
     public function set_meta_value($meta_value)
118 118
     {
Please login to merge, or discard this patch.
Indentation   +108 added lines, -108 removed lines patch added patch discarded remove patch
@@ -10,112 +10,112 @@
 block discarded – undo
10 10
 class EE_Post_Meta extends EE_Base_Class
11 11
 {
12 12
 
13
-    /**
14
-     * @param array $props_n_values
15
-     * @return EE_Post_Meta|mixed
16
-     */
17
-    public static function new_instance($props_n_values = array())
18
-    {
19
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__);
20
-        return $has_object ? $has_object : new self($props_n_values);
21
-    }
22
-
23
-
24
-    /**
25
-     * @param array $props_n_values
26
-     * @return EE_Post_Meta
27
-     */
28
-    public static function new_instance_from_db($props_n_values = array())
29
-    {
30
-        return new self($props_n_values, true);
31
-    }
32
-
33
-
34
-    /**
35
-     * Gets meta_id
36
-     *
37
-     * @return int
38
-     */
39
-    public function meta_id()
40
-    {
41
-        return $this->get('meta_id');
42
-    }
43
-
44
-
45
-    /**
46
-     * Sets meta_id
47
-     *
48
-     * @param int $meta_id
49
-     * @return boolean
50
-     */
51
-    public function set_meta_id($meta_id)
52
-    {
53
-        return $this->set('meta_id', $meta_id);
54
-    }
55
-
56
-    /**
57
-     * Gets post_id
58
-     *
59
-     * @return int
60
-     */
61
-    public function post_id()
62
-    {
63
-        return $this->get('post_id');
64
-    }
65
-
66
-
67
-    /**
68
-     * Sets post_id
69
-     *
70
-     * @param int $post_id
71
-     * @return boolean
72
-     */
73
-    public function set_post_id($post_id)
74
-    {
75
-        return $this->set('post_id', $post_id);
76
-    }
77
-
78
-    /**
79
-     * Gets meta_key
80
-     *
81
-     * @return string
82
-     */
83
-    public function meta_key()
84
-    {
85
-        return $this->get('meta_key');
86
-    }
87
-
88
-
89
-    /**
90
-     * Sets meta_key
91
-     *
92
-     * @param string $meta_key
93
-     * @return boolean
94
-     */
95
-    public function set_meta_key($meta_key)
96
-    {
97
-        return $this->set('meta_key', $meta_key);
98
-    }
99
-
100
-    /**
101
-     * Gets meta_value
102
-     *
103
-     * @return mixed
104
-     */
105
-    public function meta_value()
106
-    {
107
-        return $this->get('meta_value');
108
-    }
109
-
110
-
111
-    /**
112
-     * Sets meta_value
113
-     *
114
-     * @param mixed $meta_value
115
-     * @return boolean
116
-     */
117
-    public function set_meta_value($meta_value)
118
-    {
119
-        return $this->set('meta_value', $meta_value);
120
-    }
13
+	/**
14
+	 * @param array $props_n_values
15
+	 * @return EE_Post_Meta|mixed
16
+	 */
17
+	public static function new_instance($props_n_values = array())
18
+	{
19
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__);
20
+		return $has_object ? $has_object : new self($props_n_values);
21
+	}
22
+
23
+
24
+	/**
25
+	 * @param array $props_n_values
26
+	 * @return EE_Post_Meta
27
+	 */
28
+	public static function new_instance_from_db($props_n_values = array())
29
+	{
30
+		return new self($props_n_values, true);
31
+	}
32
+
33
+
34
+	/**
35
+	 * Gets meta_id
36
+	 *
37
+	 * @return int
38
+	 */
39
+	public function meta_id()
40
+	{
41
+		return $this->get('meta_id');
42
+	}
43
+
44
+
45
+	/**
46
+	 * Sets meta_id
47
+	 *
48
+	 * @param int $meta_id
49
+	 * @return boolean
50
+	 */
51
+	public function set_meta_id($meta_id)
52
+	{
53
+		return $this->set('meta_id', $meta_id);
54
+	}
55
+
56
+	/**
57
+	 * Gets post_id
58
+	 *
59
+	 * @return int
60
+	 */
61
+	public function post_id()
62
+	{
63
+		return $this->get('post_id');
64
+	}
65
+
66
+
67
+	/**
68
+	 * Sets post_id
69
+	 *
70
+	 * @param int $post_id
71
+	 * @return boolean
72
+	 */
73
+	public function set_post_id($post_id)
74
+	{
75
+		return $this->set('post_id', $post_id);
76
+	}
77
+
78
+	/**
79
+	 * Gets meta_key
80
+	 *
81
+	 * @return string
82
+	 */
83
+	public function meta_key()
84
+	{
85
+		return $this->get('meta_key');
86
+	}
87
+
88
+
89
+	/**
90
+	 * Sets meta_key
91
+	 *
92
+	 * @param string $meta_key
93
+	 * @return boolean
94
+	 */
95
+	public function set_meta_key($meta_key)
96
+	{
97
+		return $this->set('meta_key', $meta_key);
98
+	}
99
+
100
+	/**
101
+	 * Gets meta_value
102
+	 *
103
+	 * @return mixed
104
+	 */
105
+	public function meta_value()
106
+	{
107
+		return $this->get('meta_value');
108
+	}
109
+
110
+
111
+	/**
112
+	 * Sets meta_value
113
+	 *
114
+	 * @param mixed $meta_value
115
+	 * @return boolean
116
+	 */
117
+	public function set_meta_value($meta_value)
118
+	{
119
+		return $this->set('meta_value', $meta_value);
120
+	}
121 121
 }
Please login to merge, or discard this patch.