@@ -603,7 +603,7 @@ |
||
603 | 603 | * @param EE_Message $message |
604 | 604 | * @param EE_messenger $messenger |
605 | 605 | * @param EE_message_type $message_type |
606 | - * @param $test_send |
|
606 | + * @param boolean $test_send |
|
607 | 607 | * @return bool true means all went well, false means, not so much. |
608 | 608 | */ |
609 | 609 | protected function _do_preview( |
@@ -2,7 +2,7 @@ discard block |
||
2 | 2 | use \EventEspresso\core\exceptions\SendMessageException; |
3 | 3 | |
4 | 4 | if (! defined('EVENT_ESPRESSO_VERSION')) { |
5 | - exit('No direct script access allowed'); |
|
5 | + exit('No direct script access allowed'); |
|
6 | 6 | } |
7 | 7 | |
8 | 8 | /** |
@@ -18,681 +18,681 @@ discard block |
||
18 | 18 | { |
19 | 19 | |
20 | 20 | |
21 | - /** |
|
22 | - * @type string reference for sending action |
|
23 | - */ |
|
24 | - const action_sending = 'sending'; |
|
25 | - |
|
26 | - /** |
|
27 | - * @type string reference for generation action |
|
28 | - */ |
|
29 | - const action_generating = 'generation'; |
|
30 | - |
|
31 | - |
|
32 | - /** |
|
33 | - * @type EE_Message_Repository $_message_repository |
|
34 | - */ |
|
35 | - protected $_message_repository; |
|
36 | - |
|
37 | - /** |
|
38 | - * Sets the limit of how many messages are generated per process. |
|
39 | - * |
|
40 | - * @type int |
|
41 | - */ |
|
42 | - protected $_batch_count; |
|
43 | - |
|
44 | - /** |
|
45 | - * Sets the limit of how many messages can be sent per hour. |
|
46 | - * |
|
47 | - * @type int |
|
48 | - */ |
|
49 | - protected $_rate_limit; |
|
50 | - |
|
51 | - /** |
|
52 | - * This is an array of cached queue items being stored in this object. |
|
53 | - * The array keys will be the ID of the EE_Message in the db if saved. If the EE_Message |
|
54 | - * is not saved to the db then its key will be an increment of "UNS" (i.e. UNS1, UNS2 etc.) |
|
55 | - * |
|
56 | - * @type EE_Message[] |
|
57 | - */ |
|
58 | - protected $_cached_queue_items; |
|
59 | - |
|
60 | - /** |
|
61 | - * Tracks the number of unsaved queue items. |
|
62 | - * |
|
63 | - * @type int |
|
64 | - */ |
|
65 | - protected $_unsaved_count = 0; |
|
66 | - |
|
67 | - /** |
|
68 | - * used to record if a do_messenger_hooks has already been called for a message type. This prevents multiple |
|
69 | - * hooks getting fired if users have setup their action/filter hooks to prevent duplicate calls. |
|
70 | - * |
|
71 | - * @type array |
|
72 | - */ |
|
73 | - protected $_did_hook = array(); |
|
74 | - |
|
75 | - |
|
76 | - /** |
|
77 | - * Constructor. |
|
78 | - * Setup all the initial properties and load a EE_Message_Repository. |
|
79 | - * |
|
80 | - * @param \EE_Message_Repository $message_repository |
|
81 | - */ |
|
82 | - public function __construct(EE_Message_Repository $message_repository) |
|
83 | - { |
|
84 | - $this->_batch_count = apply_filters('FHEE__EE_Messages_Queue___batch_count', 50); |
|
85 | - $this->_rate_limit = $this->get_rate_limit(); |
|
86 | - $this->_message_repository = $message_repository; |
|
87 | - } |
|
88 | - |
|
89 | - |
|
90 | - /** |
|
91 | - * Add a EE_Message object to the queue |
|
92 | - * |
|
93 | - * @param EE_Message $message |
|
94 | - * @param array $data This will be an array of data to attach to the object in the repository. If the |
|
95 | - * object is persisted, this data will be saved on an extra_meta object related to |
|
96 | - * EE_Message. |
|
97 | - * @param bool $preview Whether this EE_Message represents a preview or not. |
|
98 | - * @param bool $test_send This indicates whether to do a test send instead of actual send. A test send will |
|
99 | - * use the messenger send method but typically is based on preview data. |
|
100 | - * @return bool Whether the message was successfully added to the repository or not. |
|
101 | - */ |
|
102 | - public function add(EE_Message $message, $data = array(), $preview = false, $test_send = false) |
|
103 | - { |
|
104 | - $data['preview'] = $preview; |
|
105 | - $data['test_send'] = $test_send; |
|
106 | - return $this->_message_repository->add($message, $data); |
|
107 | - } |
|
108 | - |
|
109 | - |
|
110 | - /** |
|
111 | - * Removes EE_Message from _queue that matches the given EE_Message if the pointer is on a matching EE_Message |
|
112 | - * |
|
113 | - * @param EE_Message $message The message to detach from the queue |
|
114 | - * @param bool $persist This flag indicates whether to attempt to delete the object from the db as well. |
|
115 | - * @return bool |
|
116 | - */ |
|
117 | - public function remove(EE_Message $message, $persist = false) |
|
118 | - { |
|
119 | - if ($persist && $this->_message_repository->current() !== $message) { |
|
120 | - //get pointer on right message |
|
121 | - if ($this->_message_repository->has($message)) { |
|
122 | - $this->_message_repository->rewind(); |
|
123 | - while ($this->_message_repository->valid()) { |
|
124 | - if ($this->_message_repository->current() === $message) { |
|
125 | - break; |
|
126 | - } |
|
127 | - $this->_message_repository->next(); |
|
128 | - } |
|
129 | - } else { |
|
130 | - return false; |
|
131 | - } |
|
132 | - } |
|
133 | - return $persist ? $this->_message_repository->delete() : $this->_message_repository->remove($message); |
|
134 | - } |
|
135 | - |
|
136 | - |
|
137 | - /** |
|
138 | - * Persists all queued EE_Message objects to the db. |
|
139 | - * |
|
140 | - * @param bool $do_hooks_only @see EE_Message_Repository::saveAll |
|
141 | - * @return array @see EE_Messages_Repository::saveAll() for return values. |
|
142 | - */ |
|
143 | - public function save($do_hooks_only = false) |
|
144 | - { |
|
145 | - return $this->_message_repository->saveAll($do_hooks_only); |
|
146 | - } |
|
147 | - |
|
148 | - |
|
149 | - /** |
|
150 | - * @return EE_Message_Repository |
|
151 | - */ |
|
152 | - public function get_message_repository() |
|
153 | - { |
|
154 | - return $this->_message_repository; |
|
155 | - } |
|
156 | - |
|
157 | - |
|
158 | - /** |
|
159 | - * This does the following things: |
|
160 | - * 1. Checks if there is a lock on generation (prevents race conditions). If there is a lock then exits (return |
|
161 | - * false). |
|
162 | - * 2. If no lock, sets lock, then retrieves a batch of non-generated EE_Message objects and adds to queue |
|
163 | - * 3. Returns bool. True = batch ready. False = no batch ready (or nothing available for generation). |
|
164 | - * Note: Callers should make sure they release the lock otherwise batch generation will be prevented from |
|
165 | - * continuing. The lock is on a transient that is set to expire after one hour as a fallback in case locks are not |
|
166 | - * removed. |
|
167 | - * |
|
168 | - * @return bool true if successfully retrieved batch, false no batch ready. |
|
169 | - */ |
|
170 | - public function get_batch_to_generate() |
|
171 | - { |
|
172 | - if ($this->is_locked(EE_Messages_Queue::action_generating)) { |
|
173 | - return false; |
|
174 | - } |
|
175 | - |
|
176 | - //lock batch generation to prevent race conditions. |
|
177 | - $this->lock_queue(EE_Messages_Queue::action_generating); |
|
178 | - |
|
179 | - $query_args = array( |
|
180 | - // key 0 = where conditions |
|
181 | - 0 => array('STS_ID' => EEM_Message::status_incomplete), |
|
182 | - 'order_by' => $this->_get_priority_orderby(), |
|
183 | - 'limit' => $this->_batch_count, |
|
184 | - ); |
|
185 | - $messages = EEM_Message::instance()->get_all($query_args); |
|
186 | - |
|
187 | - if ( ! $messages) { |
|
188 | - return false; //nothing to generate |
|
189 | - } |
|
190 | - |
|
191 | - foreach ($messages as $message) { |
|
192 | - if ($message instanceof EE_Message) { |
|
193 | - $data = $message->all_extra_meta_array(); |
|
194 | - $this->add($message, $data); |
|
195 | - } |
|
196 | - } |
|
197 | - return true; |
|
198 | - } |
|
199 | - |
|
200 | - |
|
201 | - /** |
|
202 | - * This does the following things: |
|
203 | - * 1. Checks if there is a lock on sending (prevents race conditions). If there is a lock then exits (return |
|
204 | - * false). |
|
205 | - * 2. Grabs the allowed number of messages to send for the rate_limit. If cannot send any more messages, then |
|
206 | - * return false. |
|
207 | - * 2. If no lock, sets lock, then retrieves a batch of EE_Message objects, adds to queue and triggers execution. |
|
208 | - * 3. On success or unsuccessful send, sets status appropriately. |
|
209 | - * 4. Saves messages via the queue |
|
210 | - * 5. Releases lock. |
|
211 | - * |
|
212 | - * @return bool true on success, false if something preventing sending (i.e. lock set). Note: true does not |
|
213 | - * necessarily mean that all messages were successfully sent. It just means that this method |
|
214 | - * successfully completed. On true, client may want to call $this->count_STS_in_queue( |
|
215 | - * EEM_Message::status_failed ) to see if any failed EE_Message objects. Each failed message object |
|
216 | - * will also have a saved error message on it to assist with notifying user. |
|
217 | - */ |
|
218 | - public function get_to_send_batch_and_send() |
|
219 | - { |
|
220 | - if ($this->is_locked(EE_Messages_Queue::action_sending) || $this->_rate_limit < 1) { |
|
221 | - return false; |
|
222 | - } |
|
223 | - |
|
224 | - $this->lock_queue(EE_Messages_Queue::action_sending); |
|
225 | - |
|
226 | - $batch = $this->_batch_count < $this->_rate_limit ? $this->_batch_count : $this->_rate_limit; |
|
227 | - |
|
228 | - $query_args = array( |
|
229 | - // key 0 = where conditions |
|
230 | - 0 => array('STS_ID' => array('IN', EEM_Message::instance()->stati_indicating_to_send())), |
|
231 | - 'order_by' => $this->_get_priority_orderby(), |
|
232 | - 'limit' => $batch, |
|
233 | - ); |
|
234 | - |
|
235 | - $messages_to_send = EEM_Message::instance()->get_all($query_args); |
|
236 | - |
|
237 | - |
|
238 | - //any to send? |
|
239 | - if ( ! $messages_to_send) { |
|
240 | - $this->unlock_queue(EE_Messages_Queue::action_sending); |
|
241 | - return false; |
|
242 | - } |
|
243 | - |
|
244 | - //add to queue. |
|
245 | - foreach ($messages_to_send as $message) { |
|
246 | - if ($message instanceof EE_Message) { |
|
247 | - $this->add($message); |
|
248 | - } |
|
249 | - } |
|
250 | - |
|
251 | - //send messages (this also updates the rate limit) |
|
252 | - $this->execute(); |
|
253 | - |
|
254 | - //release lock |
|
255 | - $this->unlock_queue(EE_Messages_Queue::action_sending); |
|
256 | - return true; |
|
257 | - } |
|
258 | - |
|
259 | - |
|
260 | - /** |
|
261 | - * Locks the queue so that no other queues can call the "batch" methods. |
|
262 | - * |
|
263 | - * @param string $type The type of queue being locked. |
|
264 | - */ |
|
265 | - public function lock_queue($type = EE_Messages_Queue::action_generating) |
|
266 | - { |
|
267 | - set_transient($this->_get_lock_key($type), 1, $this->_get_lock_expiry($type)); |
|
268 | - } |
|
269 | - |
|
270 | - |
|
271 | - /** |
|
272 | - * Unlocks the queue so that batch methods can be used. |
|
273 | - * |
|
274 | - * @param string $type The type of queue being unlocked. |
|
275 | - */ |
|
276 | - public function unlock_queue($type = EE_Messages_Queue::action_generating) |
|
277 | - { |
|
278 | - delete_transient($this->_get_lock_key($type)); |
|
279 | - } |
|
280 | - |
|
281 | - |
|
282 | - /** |
|
283 | - * Retrieve the key used for the lock transient. |
|
284 | - * |
|
285 | - * @param string $type The type of lock. |
|
286 | - * @return string |
|
287 | - */ |
|
288 | - protected function _get_lock_key($type = EE_Messages_Queue::action_generating) |
|
289 | - { |
|
290 | - return '_ee_lock_' . $type; |
|
291 | - } |
|
292 | - |
|
293 | - |
|
294 | - /** |
|
295 | - * Retrieve the expiry time for the lock transient. |
|
296 | - * |
|
297 | - * @param string $type The type of lock |
|
298 | - * @return int time to expiry in seconds. |
|
299 | - */ |
|
300 | - protected function _get_lock_expiry($type = EE_Messages_Queue::action_generating) |
|
301 | - { |
|
302 | - return (int)apply_filters('FHEE__EE_Messages_Queue__lock_expiry', HOUR_IN_SECONDS, $type); |
|
303 | - } |
|
304 | - |
|
305 | - |
|
306 | - /** |
|
307 | - * Returns the key used for rate limit transient. |
|
308 | - * |
|
309 | - * @return string |
|
310 | - */ |
|
311 | - protected function _get_rate_limit_key() |
|
312 | - { |
|
313 | - return '_ee_rate_limit'; |
|
314 | - } |
|
315 | - |
|
316 | - |
|
317 | - /** |
|
318 | - * Returns the rate limit expiry time. |
|
319 | - * |
|
320 | - * @return int |
|
321 | - */ |
|
322 | - protected function _get_rate_limit_expiry() |
|
323 | - { |
|
324 | - return (int)apply_filters('FHEE__EE_Messages_Queue__rate_limit_expiry', HOUR_IN_SECONDS); |
|
325 | - } |
|
326 | - |
|
327 | - |
|
328 | - /** |
|
329 | - * Returns the default rate limit for sending messages. |
|
330 | - * |
|
331 | - * @return int |
|
332 | - */ |
|
333 | - protected function _default_rate_limit() |
|
334 | - { |
|
335 | - return (int)apply_filters('FHEE__EE_Messages_Queue___rate_limit', 200); |
|
336 | - } |
|
337 | - |
|
338 | - |
|
339 | - /** |
|
340 | - * Return the orderby array for priority. |
|
341 | - * |
|
342 | - * @return array |
|
343 | - */ |
|
344 | - protected function _get_priority_orderby() |
|
345 | - { |
|
346 | - return array( |
|
347 | - 'MSG_priority' => 'ASC', |
|
348 | - 'MSG_modified' => 'DESC', |
|
349 | - ); |
|
350 | - } |
|
351 | - |
|
352 | - |
|
353 | - /** |
|
354 | - * Returns whether batch methods are "locked" or not. |
|
355 | - * |
|
356 | - * @param string $type The type of lock being checked for. |
|
357 | - * @return bool |
|
358 | - */ |
|
359 | - public function is_locked($type = EE_Messages_Queue::action_generating) |
|
360 | - { |
|
361 | - /** |
|
362 | - * This filters the default is_locked behaviour. |
|
363 | - */ |
|
364 | - $is_locked = filter_var( |
|
365 | - apply_filters( |
|
366 | - 'FHEE__EE_Messages_Queue__is_locked', |
|
367 | - get_transient($this->_get_lock_key($type)), |
|
368 | - $this |
|
369 | - ), |
|
370 | - FILTER_VALIDATE_BOOLEAN |
|
371 | - ); |
|
372 | - |
|
373 | - /** |
|
374 | - * @see usage of this filter in EE_Messages_Queue::initiate_request_by_priority() method. |
|
375 | - * Also implemented here because messages processed on the same request should not have any locks applied. |
|
376 | - */ |
|
377 | - if ( |
|
378 | - apply_filters('FHEE__EE_Messages_Processor__initiate_request_by_priority__do_immediate_processing', false) |
|
379 | - || EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request |
|
380 | - ) { |
|
381 | - $is_locked = false; |
|
382 | - } |
|
383 | - |
|
384 | - |
|
385 | - return $is_locked; |
|
386 | - } |
|
387 | - |
|
388 | - |
|
389 | - /** |
|
390 | - * Retrieves the rate limit that may be cached as a transient. |
|
391 | - * If the rate limit is not set, then this sets the default rate limit and expiry and returns it. |
|
392 | - * |
|
393 | - * @return int |
|
394 | - */ |
|
395 | - public function get_rate_limit() |
|
396 | - { |
|
397 | - if ( ! $rate_limit = get_transient($this->_get_rate_limit_key())) { |
|
398 | - $rate_limit = $this->_default_rate_limit(); |
|
399 | - set_transient($this->_get_rate_limit_key(), $rate_limit, $this->_get_rate_limit_key()); |
|
400 | - } |
|
401 | - return $rate_limit; |
|
402 | - } |
|
403 | - |
|
404 | - |
|
405 | - /** |
|
406 | - * This updates existing rate limit with the new limit which is the old minus the batch. |
|
407 | - * |
|
408 | - * @param int $batch_completed This sets the new rate limit based on the given batch that was completed. |
|
409 | - */ |
|
410 | - public function set_rate_limit($batch_completed) |
|
411 | - { |
|
412 | - //first get the most up to date rate limit (in case its expired and reset) |
|
413 | - $rate_limit = $this->get_rate_limit(); |
|
414 | - $new_limit = $rate_limit - $batch_completed; |
|
415 | - //updating the transient option directly to avoid resetting the expiry. |
|
416 | - update_option('_transient_' . $this->_get_rate_limit_key(), $new_limit); |
|
417 | - } |
|
418 | - |
|
419 | - |
|
420 | - /** |
|
421 | - * This method checks the queue for ANY EE_Message objects with a priority matching the given priority passed in. |
|
422 | - * If that exists, then we immediately initiate a non-blocking request to do the requested action type. |
|
423 | - * Note: Keep in mind that there is the possibility that the request will not execute if there is already another |
|
424 | - * request running on a queue for the given task. |
|
425 | - * |
|
426 | - * @param string $task This indicates what type of request is going to be initiated. |
|
427 | - * @param int $priority This indicates the priority that triggers initiating the request. |
|
428 | - */ |
|
429 | - public function initiate_request_by_priority($task = 'generate', $priority = EEM_Message::priority_high) |
|
430 | - { |
|
431 | - //determine what status is matched with the priority as part of the trigger conditions. |
|
432 | - $status = $task == 'generate' |
|
433 | - ? EEM_Message::status_incomplete |
|
434 | - : EEM_Message::instance()->stati_indicating_to_send(); |
|
435 | - // always make sure we save because either this will get executed immediately on a separate request |
|
436 | - // or remains in the queue for the regularly scheduled queue batch. |
|
437 | - $this->save(); |
|
438 | - /** |
|
439 | - * This filter/option allows users to override processing of messages on separate requests and instead have everything |
|
440 | - * happen on the same request. If this is utilized remember: |
|
441 | - * - message priorities don't matter |
|
442 | - * - existing unprocessed messages in the queue will not get processed unless manually triggered. |
|
443 | - * - things will be perceived to take longer to happen for end users (i.e. registrations) because of the additional |
|
444 | - * processing happening on the same request. |
|
445 | - * - any race condition protection (locks) are removed because they don't apply when things are processed on |
|
446 | - * the same request. |
|
447 | - */ |
|
448 | - if ( |
|
449 | - apply_filters('FHEE__EE_Messages_Processor__initiate_request_by_priority__do_immediate_processing', false) |
|
450 | - || EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request |
|
451 | - ) { |
|
452 | - $messages_processor = EE_Registry::instance()->load_lib('Messages_Processor'); |
|
453 | - if ($messages_processor instanceof EE_Messages_Processor) { |
|
454 | - return $messages_processor->process_immediately_from_queue($this); |
|
455 | - } |
|
456 | - //if we get here then that means the messages processor couldn't be loaded so messages will just remain |
|
457 | - //queued for manual triggering by end user. |
|
458 | - } |
|
459 | - |
|
460 | - if ($this->_message_repository->count_by_priority_and_status($priority, $status)) { |
|
461 | - EE_Messages_Scheduler::initiate_scheduled_non_blocking_request($task); |
|
462 | - } |
|
463 | - } |
|
464 | - |
|
465 | - |
|
466 | - /** |
|
467 | - * Loops through the EE_Message objects in the _queue and calls the messenger send methods for each message. |
|
468 | - * |
|
469 | - * @param bool $save Used to indicate whether to save the message queue after sending |
|
470 | - * (default will save). |
|
471 | - * @param mixed $sending_messenger (optional) When the sending messenger is different than |
|
472 | - * what is on the EE_Message object in the queue. |
|
473 | - * For instance, showing the browser view of an email message, |
|
474 | - * or giving a pdf generated view of an html document. |
|
475 | - * This should be an instance of EE_messenger but if you call this |
|
476 | - * method |
|
477 | - * intending it to be a sending messenger but a valid one could not be |
|
478 | - * retrieved then send in an instance of EE_Error that contains the |
|
479 | - * related error message. |
|
480 | - * @param bool|int $by_priority When set, this indicates that only messages |
|
481 | - * matching the given priority should be executed. |
|
482 | - * @return int Number of messages sent. Note, 0 does not mean that no messages were processed. |
|
483 | - * Also, if the messenger is an request type messenger (or a preview), |
|
484 | - * its entirely possible that the messenger will exit before |
|
485 | - */ |
|
486 | - public function execute($save = true, $sending_messenger = null, $by_priority = false) |
|
487 | - { |
|
488 | - $messages_sent = 0; |
|
489 | - $this->_did_hook = array(); |
|
490 | - $this->_message_repository->rewind(); |
|
491 | - |
|
492 | - while ($this->_message_repository->valid()) { |
|
493 | - $error_messages = array(); |
|
494 | - /** @type EE_Message $message */ |
|
495 | - $message = $this->_message_repository->current(); |
|
496 | - //only process things that are queued for sending |
|
497 | - if (! in_array($message->STS_ID(), EEM_Message::instance()->stati_indicating_to_send())) { |
|
498 | - $this->_message_repository->next(); |
|
499 | - continue; |
|
500 | - } |
|
501 | - //if $by_priority is set and does not match then continue; |
|
502 | - if ($by_priority && $by_priority != $message->priority()) { |
|
503 | - $this->_message_repository->next(); |
|
504 | - continue; |
|
505 | - } |
|
506 | - //error checking |
|
507 | - if (! $message->valid_messenger()) { |
|
508 | - $error_messages[] = sprintf( |
|
509 | - __('The %s messenger is not active at time of sending.', 'event_espresso'), |
|
510 | - $message->messenger() |
|
511 | - ); |
|
512 | - } |
|
513 | - if (! $message->valid_message_type()) { |
|
514 | - $error_messages[] = sprintf( |
|
515 | - __('The %s message type is not active at the time of sending.', 'event_espresso'), |
|
516 | - $message->message_type() |
|
517 | - ); |
|
518 | - } |
|
519 | - // if there was supposed to be a sending messenger for this message, but it was invalid/inactive, |
|
520 | - // then it will instead be an EE_Error object, so let's check for that |
|
521 | - if ($sending_messenger instanceof EE_Error) { |
|
522 | - $error_messages[] = $sending_messenger->getMessage(); |
|
523 | - } |
|
524 | - // if there are no errors, then let's process the message |
|
525 | - if (empty($error_messages)) { |
|
526 | - if ($save) { |
|
527 | - $message->set_messenger_is_executing(); |
|
528 | - } |
|
529 | - if ($this->_process_message($message, $sending_messenger)) { |
|
530 | - $messages_sent++; |
|
531 | - } |
|
532 | - } |
|
533 | - $this->_set_error_message($message, $error_messages); |
|
534 | - //add modified time |
|
535 | - $message->set_modified(time()); |
|
536 | - //we save each message after its processed to make sure its status persists in case PHP times-out or runs |
|
537 | - //out of memory. @see https://events.codebasehq.com/projects/event-espresso/tickets/10281 |
|
538 | - if ($save) { |
|
539 | - $message->save(); |
|
540 | - } |
|
541 | - |
|
542 | - $this->_message_repository->next(); |
|
543 | - } |
|
544 | - if ($save) { |
|
545 | - $this->save(true); |
|
546 | - } |
|
547 | - return $messages_sent; |
|
548 | - } |
|
549 | - |
|
550 | - |
|
551 | - /** |
|
552 | - * _process_message |
|
553 | - * |
|
554 | - * @param EE_Message $message |
|
555 | - * @param mixed $sending_messenger (optional) |
|
556 | - * @return bool |
|
557 | - */ |
|
558 | - protected function _process_message(EE_Message $message, $sending_messenger = null) |
|
559 | - { |
|
560 | - // these *should* have been validated in the execute() method above |
|
561 | - $messenger = $message->messenger_object(); |
|
562 | - $message_type = $message->message_type_object(); |
|
563 | - //do actions for sending messenger if it differs from generating messenger and swap values. |
|
564 | - if ( |
|
565 | - $sending_messenger instanceof EE_messenger |
|
566 | - && $messenger instanceof EE_messenger |
|
567 | - && $sending_messenger->name != $messenger->name |
|
568 | - ) { |
|
569 | - $messenger->do_secondary_messenger_hooks($sending_messenger->name); |
|
570 | - $messenger = $sending_messenger; |
|
571 | - } |
|
572 | - // send using messenger, but double check objects |
|
573 | - if ($messenger instanceof EE_messenger && $message_type instanceof EE_message_type) { |
|
574 | - //set hook for message type (but only if not using another messenger to send). |
|
575 | - if ( ! isset($this->_did_hook[$message_type->name])) { |
|
576 | - $message_type->do_messenger_hooks($messenger); |
|
577 | - $this->_did_hook[$message_type->name] = 1; |
|
578 | - } |
|
579 | - //if preview then use preview method |
|
580 | - return $this->_message_repository->is_preview() |
|
581 | - ? $this->_do_preview($message, $messenger, $message_type, $this->_message_repository->is_test_send()) |
|
582 | - : $this->_do_send($message, $messenger, $message_type); |
|
583 | - } |
|
584 | - return false; |
|
585 | - } |
|
586 | - |
|
587 | - |
|
588 | - /** |
|
589 | - * The intention of this method is to count how many EE_Message objects |
|
590 | - * are in the queue with a given status. |
|
591 | - * Example usage: |
|
592 | - * After a caller calls the "EE_Message_Queue::execute()" method, the caller can check if there were any failed |
|
593 | - * sends by calling $queue->count_STS_in_queue( EEM_Message_Queue::status_failed ). |
|
594 | - * |
|
595 | - * @param array $status Stati to check for in queue |
|
596 | - * @return int Count of EE_Message's matching the given status. |
|
597 | - */ |
|
598 | - public function count_STS_in_queue($status) |
|
599 | - { |
|
600 | - $count = 0; |
|
601 | - $status = is_array($status) ? $status : array($status); |
|
602 | - $this->_message_repository->rewind(); |
|
603 | - foreach ($this->_message_repository as $message) { |
|
604 | - if (in_array($message->STS_ID(), $status)) { |
|
605 | - $count++; |
|
606 | - } |
|
607 | - } |
|
608 | - return $count; |
|
609 | - } |
|
610 | - |
|
611 | - |
|
612 | - /** |
|
613 | - * Executes the get_preview method on the provided messenger. |
|
614 | - * |
|
615 | - * @param EE_Message $message |
|
616 | - * @param EE_messenger $messenger |
|
617 | - * @param EE_message_type $message_type |
|
618 | - * @param $test_send |
|
619 | - * @return bool true means all went well, false means, not so much. |
|
620 | - */ |
|
621 | - protected function _do_preview( |
|
622 | - EE_Message $message, |
|
623 | - EE_messenger $messenger, |
|
624 | - EE_message_type $message_type, |
|
625 | - $test_send |
|
626 | - ) { |
|
627 | - if ($preview = $messenger->get_preview($message, $message_type, $test_send)) { |
|
628 | - if ( ! $test_send) { |
|
629 | - $message->set_content($preview); |
|
630 | - } |
|
631 | - $message->set_STS_ID(EEM_Message::status_sent); |
|
632 | - return true; |
|
633 | - } else { |
|
634 | - $message->set_STS_ID(EEM_Message::status_failed); |
|
635 | - return false; |
|
636 | - } |
|
637 | - } |
|
638 | - |
|
639 | - |
|
640 | - /** |
|
641 | - * Executes the send method on the provided messenger |
|
642 | - * EE_Messengers are expected to: |
|
643 | - * - return true if the send was successful. |
|
644 | - * - return false if the send was unsuccessful but can be tried again. |
|
645 | - * - throw an Exception if the send was unsuccessful and cannot be tried again. |
|
646 | - * |
|
647 | - * @param EE_Message $message |
|
648 | - * @param EE_messenger $messenger |
|
649 | - * @param EE_message_type $message_type |
|
650 | - * @return bool true means all went well, false means, not so much. |
|
651 | - */ |
|
652 | - protected function _do_send(EE_Message $message, EE_messenger $messenger, EE_message_type $message_type) |
|
653 | - { |
|
654 | - try { |
|
655 | - if ($messenger->send_message($message, $message_type)) { |
|
656 | - $message->set_STS_ID(EEM_Message::status_sent); |
|
657 | - return true; |
|
658 | - } else { |
|
659 | - $message->set_STS_ID(EEM_Message::status_retry); |
|
660 | - return false; |
|
661 | - } |
|
662 | - } catch (SendMessageException $e) { |
|
663 | - $message->set_STS_ID(EEM_Message::status_failed); |
|
664 | - $message->set_error_message($e->getMessage()); |
|
665 | - return false; |
|
666 | - } |
|
667 | - } |
|
668 | - |
|
669 | - |
|
670 | - /** |
|
671 | - * This sets any necessary error messages on the message object and its status to failed. |
|
672 | - * |
|
673 | - * @param EE_Message $message |
|
674 | - * @param array $error_messages the response from the messenger. |
|
675 | - */ |
|
676 | - protected function _set_error_message(EE_Message $message, $error_messages) |
|
677 | - { |
|
678 | - $error_messages = (array)$error_messages; |
|
679 | - if (in_array($message->STS_ID(), EEM_Message::instance()->stati_indicating_failed_sending())) { |
|
680 | - $notices = EE_Error::has_notices(); |
|
681 | - $error_messages[] = __( |
|
682 | - 'Messenger and Message Type were valid and active, but the messenger send method failed.', |
|
683 | - 'event_espresso' |
|
684 | - ); |
|
685 | - if ($notices === 1) { |
|
686 | - $notices = EE_Error::get_vanilla_notices(); |
|
687 | - $notices['errors'] = isset($notices['errors']) ? $notices['errors'] : array(); |
|
688 | - $error_messages[] = implode("\n", $notices['errors']); |
|
689 | - } |
|
690 | - } |
|
691 | - if (count($error_messages) > 0) { |
|
692 | - $msg = __('Message was not executed successfully.', 'event_espresso'); |
|
693 | - $msg = $msg . "\n" . implode("\n", $error_messages); |
|
694 | - $message->set_error_message($msg); |
|
695 | - } |
|
696 | - } |
|
21 | + /** |
|
22 | + * @type string reference for sending action |
|
23 | + */ |
|
24 | + const action_sending = 'sending'; |
|
25 | + |
|
26 | + /** |
|
27 | + * @type string reference for generation action |
|
28 | + */ |
|
29 | + const action_generating = 'generation'; |
|
30 | + |
|
31 | + |
|
32 | + /** |
|
33 | + * @type EE_Message_Repository $_message_repository |
|
34 | + */ |
|
35 | + protected $_message_repository; |
|
36 | + |
|
37 | + /** |
|
38 | + * Sets the limit of how many messages are generated per process. |
|
39 | + * |
|
40 | + * @type int |
|
41 | + */ |
|
42 | + protected $_batch_count; |
|
43 | + |
|
44 | + /** |
|
45 | + * Sets the limit of how many messages can be sent per hour. |
|
46 | + * |
|
47 | + * @type int |
|
48 | + */ |
|
49 | + protected $_rate_limit; |
|
50 | + |
|
51 | + /** |
|
52 | + * This is an array of cached queue items being stored in this object. |
|
53 | + * The array keys will be the ID of the EE_Message in the db if saved. If the EE_Message |
|
54 | + * is not saved to the db then its key will be an increment of "UNS" (i.e. UNS1, UNS2 etc.) |
|
55 | + * |
|
56 | + * @type EE_Message[] |
|
57 | + */ |
|
58 | + protected $_cached_queue_items; |
|
59 | + |
|
60 | + /** |
|
61 | + * Tracks the number of unsaved queue items. |
|
62 | + * |
|
63 | + * @type int |
|
64 | + */ |
|
65 | + protected $_unsaved_count = 0; |
|
66 | + |
|
67 | + /** |
|
68 | + * used to record if a do_messenger_hooks has already been called for a message type. This prevents multiple |
|
69 | + * hooks getting fired if users have setup their action/filter hooks to prevent duplicate calls. |
|
70 | + * |
|
71 | + * @type array |
|
72 | + */ |
|
73 | + protected $_did_hook = array(); |
|
74 | + |
|
75 | + |
|
76 | + /** |
|
77 | + * Constructor. |
|
78 | + * Setup all the initial properties and load a EE_Message_Repository. |
|
79 | + * |
|
80 | + * @param \EE_Message_Repository $message_repository |
|
81 | + */ |
|
82 | + public function __construct(EE_Message_Repository $message_repository) |
|
83 | + { |
|
84 | + $this->_batch_count = apply_filters('FHEE__EE_Messages_Queue___batch_count', 50); |
|
85 | + $this->_rate_limit = $this->get_rate_limit(); |
|
86 | + $this->_message_repository = $message_repository; |
|
87 | + } |
|
88 | + |
|
89 | + |
|
90 | + /** |
|
91 | + * Add a EE_Message object to the queue |
|
92 | + * |
|
93 | + * @param EE_Message $message |
|
94 | + * @param array $data This will be an array of data to attach to the object in the repository. If the |
|
95 | + * object is persisted, this data will be saved on an extra_meta object related to |
|
96 | + * EE_Message. |
|
97 | + * @param bool $preview Whether this EE_Message represents a preview or not. |
|
98 | + * @param bool $test_send This indicates whether to do a test send instead of actual send. A test send will |
|
99 | + * use the messenger send method but typically is based on preview data. |
|
100 | + * @return bool Whether the message was successfully added to the repository or not. |
|
101 | + */ |
|
102 | + public function add(EE_Message $message, $data = array(), $preview = false, $test_send = false) |
|
103 | + { |
|
104 | + $data['preview'] = $preview; |
|
105 | + $data['test_send'] = $test_send; |
|
106 | + return $this->_message_repository->add($message, $data); |
|
107 | + } |
|
108 | + |
|
109 | + |
|
110 | + /** |
|
111 | + * Removes EE_Message from _queue that matches the given EE_Message if the pointer is on a matching EE_Message |
|
112 | + * |
|
113 | + * @param EE_Message $message The message to detach from the queue |
|
114 | + * @param bool $persist This flag indicates whether to attempt to delete the object from the db as well. |
|
115 | + * @return bool |
|
116 | + */ |
|
117 | + public function remove(EE_Message $message, $persist = false) |
|
118 | + { |
|
119 | + if ($persist && $this->_message_repository->current() !== $message) { |
|
120 | + //get pointer on right message |
|
121 | + if ($this->_message_repository->has($message)) { |
|
122 | + $this->_message_repository->rewind(); |
|
123 | + while ($this->_message_repository->valid()) { |
|
124 | + if ($this->_message_repository->current() === $message) { |
|
125 | + break; |
|
126 | + } |
|
127 | + $this->_message_repository->next(); |
|
128 | + } |
|
129 | + } else { |
|
130 | + return false; |
|
131 | + } |
|
132 | + } |
|
133 | + return $persist ? $this->_message_repository->delete() : $this->_message_repository->remove($message); |
|
134 | + } |
|
135 | + |
|
136 | + |
|
137 | + /** |
|
138 | + * Persists all queued EE_Message objects to the db. |
|
139 | + * |
|
140 | + * @param bool $do_hooks_only @see EE_Message_Repository::saveAll |
|
141 | + * @return array @see EE_Messages_Repository::saveAll() for return values. |
|
142 | + */ |
|
143 | + public function save($do_hooks_only = false) |
|
144 | + { |
|
145 | + return $this->_message_repository->saveAll($do_hooks_only); |
|
146 | + } |
|
147 | + |
|
148 | + |
|
149 | + /** |
|
150 | + * @return EE_Message_Repository |
|
151 | + */ |
|
152 | + public function get_message_repository() |
|
153 | + { |
|
154 | + return $this->_message_repository; |
|
155 | + } |
|
156 | + |
|
157 | + |
|
158 | + /** |
|
159 | + * This does the following things: |
|
160 | + * 1. Checks if there is a lock on generation (prevents race conditions). If there is a lock then exits (return |
|
161 | + * false). |
|
162 | + * 2. If no lock, sets lock, then retrieves a batch of non-generated EE_Message objects and adds to queue |
|
163 | + * 3. Returns bool. True = batch ready. False = no batch ready (or nothing available for generation). |
|
164 | + * Note: Callers should make sure they release the lock otherwise batch generation will be prevented from |
|
165 | + * continuing. The lock is on a transient that is set to expire after one hour as a fallback in case locks are not |
|
166 | + * removed. |
|
167 | + * |
|
168 | + * @return bool true if successfully retrieved batch, false no batch ready. |
|
169 | + */ |
|
170 | + public function get_batch_to_generate() |
|
171 | + { |
|
172 | + if ($this->is_locked(EE_Messages_Queue::action_generating)) { |
|
173 | + return false; |
|
174 | + } |
|
175 | + |
|
176 | + //lock batch generation to prevent race conditions. |
|
177 | + $this->lock_queue(EE_Messages_Queue::action_generating); |
|
178 | + |
|
179 | + $query_args = array( |
|
180 | + // key 0 = where conditions |
|
181 | + 0 => array('STS_ID' => EEM_Message::status_incomplete), |
|
182 | + 'order_by' => $this->_get_priority_orderby(), |
|
183 | + 'limit' => $this->_batch_count, |
|
184 | + ); |
|
185 | + $messages = EEM_Message::instance()->get_all($query_args); |
|
186 | + |
|
187 | + if ( ! $messages) { |
|
188 | + return false; //nothing to generate |
|
189 | + } |
|
190 | + |
|
191 | + foreach ($messages as $message) { |
|
192 | + if ($message instanceof EE_Message) { |
|
193 | + $data = $message->all_extra_meta_array(); |
|
194 | + $this->add($message, $data); |
|
195 | + } |
|
196 | + } |
|
197 | + return true; |
|
198 | + } |
|
199 | + |
|
200 | + |
|
201 | + /** |
|
202 | + * This does the following things: |
|
203 | + * 1. Checks if there is a lock on sending (prevents race conditions). If there is a lock then exits (return |
|
204 | + * false). |
|
205 | + * 2. Grabs the allowed number of messages to send for the rate_limit. If cannot send any more messages, then |
|
206 | + * return false. |
|
207 | + * 2. If no lock, sets lock, then retrieves a batch of EE_Message objects, adds to queue and triggers execution. |
|
208 | + * 3. On success or unsuccessful send, sets status appropriately. |
|
209 | + * 4. Saves messages via the queue |
|
210 | + * 5. Releases lock. |
|
211 | + * |
|
212 | + * @return bool true on success, false if something preventing sending (i.e. lock set). Note: true does not |
|
213 | + * necessarily mean that all messages were successfully sent. It just means that this method |
|
214 | + * successfully completed. On true, client may want to call $this->count_STS_in_queue( |
|
215 | + * EEM_Message::status_failed ) to see if any failed EE_Message objects. Each failed message object |
|
216 | + * will also have a saved error message on it to assist with notifying user. |
|
217 | + */ |
|
218 | + public function get_to_send_batch_and_send() |
|
219 | + { |
|
220 | + if ($this->is_locked(EE_Messages_Queue::action_sending) || $this->_rate_limit < 1) { |
|
221 | + return false; |
|
222 | + } |
|
223 | + |
|
224 | + $this->lock_queue(EE_Messages_Queue::action_sending); |
|
225 | + |
|
226 | + $batch = $this->_batch_count < $this->_rate_limit ? $this->_batch_count : $this->_rate_limit; |
|
227 | + |
|
228 | + $query_args = array( |
|
229 | + // key 0 = where conditions |
|
230 | + 0 => array('STS_ID' => array('IN', EEM_Message::instance()->stati_indicating_to_send())), |
|
231 | + 'order_by' => $this->_get_priority_orderby(), |
|
232 | + 'limit' => $batch, |
|
233 | + ); |
|
234 | + |
|
235 | + $messages_to_send = EEM_Message::instance()->get_all($query_args); |
|
236 | + |
|
237 | + |
|
238 | + //any to send? |
|
239 | + if ( ! $messages_to_send) { |
|
240 | + $this->unlock_queue(EE_Messages_Queue::action_sending); |
|
241 | + return false; |
|
242 | + } |
|
243 | + |
|
244 | + //add to queue. |
|
245 | + foreach ($messages_to_send as $message) { |
|
246 | + if ($message instanceof EE_Message) { |
|
247 | + $this->add($message); |
|
248 | + } |
|
249 | + } |
|
250 | + |
|
251 | + //send messages (this also updates the rate limit) |
|
252 | + $this->execute(); |
|
253 | + |
|
254 | + //release lock |
|
255 | + $this->unlock_queue(EE_Messages_Queue::action_sending); |
|
256 | + return true; |
|
257 | + } |
|
258 | + |
|
259 | + |
|
260 | + /** |
|
261 | + * Locks the queue so that no other queues can call the "batch" methods. |
|
262 | + * |
|
263 | + * @param string $type The type of queue being locked. |
|
264 | + */ |
|
265 | + public function lock_queue($type = EE_Messages_Queue::action_generating) |
|
266 | + { |
|
267 | + set_transient($this->_get_lock_key($type), 1, $this->_get_lock_expiry($type)); |
|
268 | + } |
|
269 | + |
|
270 | + |
|
271 | + /** |
|
272 | + * Unlocks the queue so that batch methods can be used. |
|
273 | + * |
|
274 | + * @param string $type The type of queue being unlocked. |
|
275 | + */ |
|
276 | + public function unlock_queue($type = EE_Messages_Queue::action_generating) |
|
277 | + { |
|
278 | + delete_transient($this->_get_lock_key($type)); |
|
279 | + } |
|
280 | + |
|
281 | + |
|
282 | + /** |
|
283 | + * Retrieve the key used for the lock transient. |
|
284 | + * |
|
285 | + * @param string $type The type of lock. |
|
286 | + * @return string |
|
287 | + */ |
|
288 | + protected function _get_lock_key($type = EE_Messages_Queue::action_generating) |
|
289 | + { |
|
290 | + return '_ee_lock_' . $type; |
|
291 | + } |
|
292 | + |
|
293 | + |
|
294 | + /** |
|
295 | + * Retrieve the expiry time for the lock transient. |
|
296 | + * |
|
297 | + * @param string $type The type of lock |
|
298 | + * @return int time to expiry in seconds. |
|
299 | + */ |
|
300 | + protected function _get_lock_expiry($type = EE_Messages_Queue::action_generating) |
|
301 | + { |
|
302 | + return (int)apply_filters('FHEE__EE_Messages_Queue__lock_expiry', HOUR_IN_SECONDS, $type); |
|
303 | + } |
|
304 | + |
|
305 | + |
|
306 | + /** |
|
307 | + * Returns the key used for rate limit transient. |
|
308 | + * |
|
309 | + * @return string |
|
310 | + */ |
|
311 | + protected function _get_rate_limit_key() |
|
312 | + { |
|
313 | + return '_ee_rate_limit'; |
|
314 | + } |
|
315 | + |
|
316 | + |
|
317 | + /** |
|
318 | + * Returns the rate limit expiry time. |
|
319 | + * |
|
320 | + * @return int |
|
321 | + */ |
|
322 | + protected function _get_rate_limit_expiry() |
|
323 | + { |
|
324 | + return (int)apply_filters('FHEE__EE_Messages_Queue__rate_limit_expiry', HOUR_IN_SECONDS); |
|
325 | + } |
|
326 | + |
|
327 | + |
|
328 | + /** |
|
329 | + * Returns the default rate limit for sending messages. |
|
330 | + * |
|
331 | + * @return int |
|
332 | + */ |
|
333 | + protected function _default_rate_limit() |
|
334 | + { |
|
335 | + return (int)apply_filters('FHEE__EE_Messages_Queue___rate_limit', 200); |
|
336 | + } |
|
337 | + |
|
338 | + |
|
339 | + /** |
|
340 | + * Return the orderby array for priority. |
|
341 | + * |
|
342 | + * @return array |
|
343 | + */ |
|
344 | + protected function _get_priority_orderby() |
|
345 | + { |
|
346 | + return array( |
|
347 | + 'MSG_priority' => 'ASC', |
|
348 | + 'MSG_modified' => 'DESC', |
|
349 | + ); |
|
350 | + } |
|
351 | + |
|
352 | + |
|
353 | + /** |
|
354 | + * Returns whether batch methods are "locked" or not. |
|
355 | + * |
|
356 | + * @param string $type The type of lock being checked for. |
|
357 | + * @return bool |
|
358 | + */ |
|
359 | + public function is_locked($type = EE_Messages_Queue::action_generating) |
|
360 | + { |
|
361 | + /** |
|
362 | + * This filters the default is_locked behaviour. |
|
363 | + */ |
|
364 | + $is_locked = filter_var( |
|
365 | + apply_filters( |
|
366 | + 'FHEE__EE_Messages_Queue__is_locked', |
|
367 | + get_transient($this->_get_lock_key($type)), |
|
368 | + $this |
|
369 | + ), |
|
370 | + FILTER_VALIDATE_BOOLEAN |
|
371 | + ); |
|
372 | + |
|
373 | + /** |
|
374 | + * @see usage of this filter in EE_Messages_Queue::initiate_request_by_priority() method. |
|
375 | + * Also implemented here because messages processed on the same request should not have any locks applied. |
|
376 | + */ |
|
377 | + if ( |
|
378 | + apply_filters('FHEE__EE_Messages_Processor__initiate_request_by_priority__do_immediate_processing', false) |
|
379 | + || EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request |
|
380 | + ) { |
|
381 | + $is_locked = false; |
|
382 | + } |
|
383 | + |
|
384 | + |
|
385 | + return $is_locked; |
|
386 | + } |
|
387 | + |
|
388 | + |
|
389 | + /** |
|
390 | + * Retrieves the rate limit that may be cached as a transient. |
|
391 | + * If the rate limit is not set, then this sets the default rate limit and expiry and returns it. |
|
392 | + * |
|
393 | + * @return int |
|
394 | + */ |
|
395 | + public function get_rate_limit() |
|
396 | + { |
|
397 | + if ( ! $rate_limit = get_transient($this->_get_rate_limit_key())) { |
|
398 | + $rate_limit = $this->_default_rate_limit(); |
|
399 | + set_transient($this->_get_rate_limit_key(), $rate_limit, $this->_get_rate_limit_key()); |
|
400 | + } |
|
401 | + return $rate_limit; |
|
402 | + } |
|
403 | + |
|
404 | + |
|
405 | + /** |
|
406 | + * This updates existing rate limit with the new limit which is the old minus the batch. |
|
407 | + * |
|
408 | + * @param int $batch_completed This sets the new rate limit based on the given batch that was completed. |
|
409 | + */ |
|
410 | + public function set_rate_limit($batch_completed) |
|
411 | + { |
|
412 | + //first get the most up to date rate limit (in case its expired and reset) |
|
413 | + $rate_limit = $this->get_rate_limit(); |
|
414 | + $new_limit = $rate_limit - $batch_completed; |
|
415 | + //updating the transient option directly to avoid resetting the expiry. |
|
416 | + update_option('_transient_' . $this->_get_rate_limit_key(), $new_limit); |
|
417 | + } |
|
418 | + |
|
419 | + |
|
420 | + /** |
|
421 | + * This method checks the queue for ANY EE_Message objects with a priority matching the given priority passed in. |
|
422 | + * If that exists, then we immediately initiate a non-blocking request to do the requested action type. |
|
423 | + * Note: Keep in mind that there is the possibility that the request will not execute if there is already another |
|
424 | + * request running on a queue for the given task. |
|
425 | + * |
|
426 | + * @param string $task This indicates what type of request is going to be initiated. |
|
427 | + * @param int $priority This indicates the priority that triggers initiating the request. |
|
428 | + */ |
|
429 | + public function initiate_request_by_priority($task = 'generate', $priority = EEM_Message::priority_high) |
|
430 | + { |
|
431 | + //determine what status is matched with the priority as part of the trigger conditions. |
|
432 | + $status = $task == 'generate' |
|
433 | + ? EEM_Message::status_incomplete |
|
434 | + : EEM_Message::instance()->stati_indicating_to_send(); |
|
435 | + // always make sure we save because either this will get executed immediately on a separate request |
|
436 | + // or remains in the queue for the regularly scheduled queue batch. |
|
437 | + $this->save(); |
|
438 | + /** |
|
439 | + * This filter/option allows users to override processing of messages on separate requests and instead have everything |
|
440 | + * happen on the same request. If this is utilized remember: |
|
441 | + * - message priorities don't matter |
|
442 | + * - existing unprocessed messages in the queue will not get processed unless manually triggered. |
|
443 | + * - things will be perceived to take longer to happen for end users (i.e. registrations) because of the additional |
|
444 | + * processing happening on the same request. |
|
445 | + * - any race condition protection (locks) are removed because they don't apply when things are processed on |
|
446 | + * the same request. |
|
447 | + */ |
|
448 | + if ( |
|
449 | + apply_filters('FHEE__EE_Messages_Processor__initiate_request_by_priority__do_immediate_processing', false) |
|
450 | + || EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request |
|
451 | + ) { |
|
452 | + $messages_processor = EE_Registry::instance()->load_lib('Messages_Processor'); |
|
453 | + if ($messages_processor instanceof EE_Messages_Processor) { |
|
454 | + return $messages_processor->process_immediately_from_queue($this); |
|
455 | + } |
|
456 | + //if we get here then that means the messages processor couldn't be loaded so messages will just remain |
|
457 | + //queued for manual triggering by end user. |
|
458 | + } |
|
459 | + |
|
460 | + if ($this->_message_repository->count_by_priority_and_status($priority, $status)) { |
|
461 | + EE_Messages_Scheduler::initiate_scheduled_non_blocking_request($task); |
|
462 | + } |
|
463 | + } |
|
464 | + |
|
465 | + |
|
466 | + /** |
|
467 | + * Loops through the EE_Message objects in the _queue and calls the messenger send methods for each message. |
|
468 | + * |
|
469 | + * @param bool $save Used to indicate whether to save the message queue after sending |
|
470 | + * (default will save). |
|
471 | + * @param mixed $sending_messenger (optional) When the sending messenger is different than |
|
472 | + * what is on the EE_Message object in the queue. |
|
473 | + * For instance, showing the browser view of an email message, |
|
474 | + * or giving a pdf generated view of an html document. |
|
475 | + * This should be an instance of EE_messenger but if you call this |
|
476 | + * method |
|
477 | + * intending it to be a sending messenger but a valid one could not be |
|
478 | + * retrieved then send in an instance of EE_Error that contains the |
|
479 | + * related error message. |
|
480 | + * @param bool|int $by_priority When set, this indicates that only messages |
|
481 | + * matching the given priority should be executed. |
|
482 | + * @return int Number of messages sent. Note, 0 does not mean that no messages were processed. |
|
483 | + * Also, if the messenger is an request type messenger (or a preview), |
|
484 | + * its entirely possible that the messenger will exit before |
|
485 | + */ |
|
486 | + public function execute($save = true, $sending_messenger = null, $by_priority = false) |
|
487 | + { |
|
488 | + $messages_sent = 0; |
|
489 | + $this->_did_hook = array(); |
|
490 | + $this->_message_repository->rewind(); |
|
491 | + |
|
492 | + while ($this->_message_repository->valid()) { |
|
493 | + $error_messages = array(); |
|
494 | + /** @type EE_Message $message */ |
|
495 | + $message = $this->_message_repository->current(); |
|
496 | + //only process things that are queued for sending |
|
497 | + if (! in_array($message->STS_ID(), EEM_Message::instance()->stati_indicating_to_send())) { |
|
498 | + $this->_message_repository->next(); |
|
499 | + continue; |
|
500 | + } |
|
501 | + //if $by_priority is set and does not match then continue; |
|
502 | + if ($by_priority && $by_priority != $message->priority()) { |
|
503 | + $this->_message_repository->next(); |
|
504 | + continue; |
|
505 | + } |
|
506 | + //error checking |
|
507 | + if (! $message->valid_messenger()) { |
|
508 | + $error_messages[] = sprintf( |
|
509 | + __('The %s messenger is not active at time of sending.', 'event_espresso'), |
|
510 | + $message->messenger() |
|
511 | + ); |
|
512 | + } |
|
513 | + if (! $message->valid_message_type()) { |
|
514 | + $error_messages[] = sprintf( |
|
515 | + __('The %s message type is not active at the time of sending.', 'event_espresso'), |
|
516 | + $message->message_type() |
|
517 | + ); |
|
518 | + } |
|
519 | + // if there was supposed to be a sending messenger for this message, but it was invalid/inactive, |
|
520 | + // then it will instead be an EE_Error object, so let's check for that |
|
521 | + if ($sending_messenger instanceof EE_Error) { |
|
522 | + $error_messages[] = $sending_messenger->getMessage(); |
|
523 | + } |
|
524 | + // if there are no errors, then let's process the message |
|
525 | + if (empty($error_messages)) { |
|
526 | + if ($save) { |
|
527 | + $message->set_messenger_is_executing(); |
|
528 | + } |
|
529 | + if ($this->_process_message($message, $sending_messenger)) { |
|
530 | + $messages_sent++; |
|
531 | + } |
|
532 | + } |
|
533 | + $this->_set_error_message($message, $error_messages); |
|
534 | + //add modified time |
|
535 | + $message->set_modified(time()); |
|
536 | + //we save each message after its processed to make sure its status persists in case PHP times-out or runs |
|
537 | + //out of memory. @see https://events.codebasehq.com/projects/event-espresso/tickets/10281 |
|
538 | + if ($save) { |
|
539 | + $message->save(); |
|
540 | + } |
|
541 | + |
|
542 | + $this->_message_repository->next(); |
|
543 | + } |
|
544 | + if ($save) { |
|
545 | + $this->save(true); |
|
546 | + } |
|
547 | + return $messages_sent; |
|
548 | + } |
|
549 | + |
|
550 | + |
|
551 | + /** |
|
552 | + * _process_message |
|
553 | + * |
|
554 | + * @param EE_Message $message |
|
555 | + * @param mixed $sending_messenger (optional) |
|
556 | + * @return bool |
|
557 | + */ |
|
558 | + protected function _process_message(EE_Message $message, $sending_messenger = null) |
|
559 | + { |
|
560 | + // these *should* have been validated in the execute() method above |
|
561 | + $messenger = $message->messenger_object(); |
|
562 | + $message_type = $message->message_type_object(); |
|
563 | + //do actions for sending messenger if it differs from generating messenger and swap values. |
|
564 | + if ( |
|
565 | + $sending_messenger instanceof EE_messenger |
|
566 | + && $messenger instanceof EE_messenger |
|
567 | + && $sending_messenger->name != $messenger->name |
|
568 | + ) { |
|
569 | + $messenger->do_secondary_messenger_hooks($sending_messenger->name); |
|
570 | + $messenger = $sending_messenger; |
|
571 | + } |
|
572 | + // send using messenger, but double check objects |
|
573 | + if ($messenger instanceof EE_messenger && $message_type instanceof EE_message_type) { |
|
574 | + //set hook for message type (but only if not using another messenger to send). |
|
575 | + if ( ! isset($this->_did_hook[$message_type->name])) { |
|
576 | + $message_type->do_messenger_hooks($messenger); |
|
577 | + $this->_did_hook[$message_type->name] = 1; |
|
578 | + } |
|
579 | + //if preview then use preview method |
|
580 | + return $this->_message_repository->is_preview() |
|
581 | + ? $this->_do_preview($message, $messenger, $message_type, $this->_message_repository->is_test_send()) |
|
582 | + : $this->_do_send($message, $messenger, $message_type); |
|
583 | + } |
|
584 | + return false; |
|
585 | + } |
|
586 | + |
|
587 | + |
|
588 | + /** |
|
589 | + * The intention of this method is to count how many EE_Message objects |
|
590 | + * are in the queue with a given status. |
|
591 | + * Example usage: |
|
592 | + * After a caller calls the "EE_Message_Queue::execute()" method, the caller can check if there were any failed |
|
593 | + * sends by calling $queue->count_STS_in_queue( EEM_Message_Queue::status_failed ). |
|
594 | + * |
|
595 | + * @param array $status Stati to check for in queue |
|
596 | + * @return int Count of EE_Message's matching the given status. |
|
597 | + */ |
|
598 | + public function count_STS_in_queue($status) |
|
599 | + { |
|
600 | + $count = 0; |
|
601 | + $status = is_array($status) ? $status : array($status); |
|
602 | + $this->_message_repository->rewind(); |
|
603 | + foreach ($this->_message_repository as $message) { |
|
604 | + if (in_array($message->STS_ID(), $status)) { |
|
605 | + $count++; |
|
606 | + } |
|
607 | + } |
|
608 | + return $count; |
|
609 | + } |
|
610 | + |
|
611 | + |
|
612 | + /** |
|
613 | + * Executes the get_preview method on the provided messenger. |
|
614 | + * |
|
615 | + * @param EE_Message $message |
|
616 | + * @param EE_messenger $messenger |
|
617 | + * @param EE_message_type $message_type |
|
618 | + * @param $test_send |
|
619 | + * @return bool true means all went well, false means, not so much. |
|
620 | + */ |
|
621 | + protected function _do_preview( |
|
622 | + EE_Message $message, |
|
623 | + EE_messenger $messenger, |
|
624 | + EE_message_type $message_type, |
|
625 | + $test_send |
|
626 | + ) { |
|
627 | + if ($preview = $messenger->get_preview($message, $message_type, $test_send)) { |
|
628 | + if ( ! $test_send) { |
|
629 | + $message->set_content($preview); |
|
630 | + } |
|
631 | + $message->set_STS_ID(EEM_Message::status_sent); |
|
632 | + return true; |
|
633 | + } else { |
|
634 | + $message->set_STS_ID(EEM_Message::status_failed); |
|
635 | + return false; |
|
636 | + } |
|
637 | + } |
|
638 | + |
|
639 | + |
|
640 | + /** |
|
641 | + * Executes the send method on the provided messenger |
|
642 | + * EE_Messengers are expected to: |
|
643 | + * - return true if the send was successful. |
|
644 | + * - return false if the send was unsuccessful but can be tried again. |
|
645 | + * - throw an Exception if the send was unsuccessful and cannot be tried again. |
|
646 | + * |
|
647 | + * @param EE_Message $message |
|
648 | + * @param EE_messenger $messenger |
|
649 | + * @param EE_message_type $message_type |
|
650 | + * @return bool true means all went well, false means, not so much. |
|
651 | + */ |
|
652 | + protected function _do_send(EE_Message $message, EE_messenger $messenger, EE_message_type $message_type) |
|
653 | + { |
|
654 | + try { |
|
655 | + if ($messenger->send_message($message, $message_type)) { |
|
656 | + $message->set_STS_ID(EEM_Message::status_sent); |
|
657 | + return true; |
|
658 | + } else { |
|
659 | + $message->set_STS_ID(EEM_Message::status_retry); |
|
660 | + return false; |
|
661 | + } |
|
662 | + } catch (SendMessageException $e) { |
|
663 | + $message->set_STS_ID(EEM_Message::status_failed); |
|
664 | + $message->set_error_message($e->getMessage()); |
|
665 | + return false; |
|
666 | + } |
|
667 | + } |
|
668 | + |
|
669 | + |
|
670 | + /** |
|
671 | + * This sets any necessary error messages on the message object and its status to failed. |
|
672 | + * |
|
673 | + * @param EE_Message $message |
|
674 | + * @param array $error_messages the response from the messenger. |
|
675 | + */ |
|
676 | + protected function _set_error_message(EE_Message $message, $error_messages) |
|
677 | + { |
|
678 | + $error_messages = (array)$error_messages; |
|
679 | + if (in_array($message->STS_ID(), EEM_Message::instance()->stati_indicating_failed_sending())) { |
|
680 | + $notices = EE_Error::has_notices(); |
|
681 | + $error_messages[] = __( |
|
682 | + 'Messenger and Message Type were valid and active, but the messenger send method failed.', |
|
683 | + 'event_espresso' |
|
684 | + ); |
|
685 | + if ($notices === 1) { |
|
686 | + $notices = EE_Error::get_vanilla_notices(); |
|
687 | + $notices['errors'] = isset($notices['errors']) ? $notices['errors'] : array(); |
|
688 | + $error_messages[] = implode("\n", $notices['errors']); |
|
689 | + } |
|
690 | + } |
|
691 | + if (count($error_messages) > 0) { |
|
692 | + $msg = __('Message was not executed successfully.', 'event_espresso'); |
|
693 | + $msg = $msg . "\n" . implode("\n", $error_messages); |
|
694 | + $message->set_error_message($msg); |
|
695 | + } |
|
696 | + } |
|
697 | 697 | |
698 | 698 | } //end EE_Messages_Queue class |
699 | 699 | \ No newline at end of file |
@@ -1,7 +1,7 @@ discard block |
||
1 | 1 | <?php |
2 | 2 | use \EventEspresso\core\exceptions\SendMessageException; |
3 | 3 | |
4 | -if (! defined('EVENT_ESPRESSO_VERSION')) { |
|
4 | +if ( ! defined('EVENT_ESPRESSO_VERSION')) { |
|
5 | 5 | exit('No direct script access allowed'); |
6 | 6 | } |
7 | 7 | |
@@ -182,7 +182,7 @@ discard block |
||
182 | 182 | 'order_by' => $this->_get_priority_orderby(), |
183 | 183 | 'limit' => $this->_batch_count, |
184 | 184 | ); |
185 | - $messages = EEM_Message::instance()->get_all($query_args); |
|
185 | + $messages = EEM_Message::instance()->get_all($query_args); |
|
186 | 186 | |
187 | 187 | if ( ! $messages) { |
188 | 188 | return false; //nothing to generate |
@@ -287,7 +287,7 @@ discard block |
||
287 | 287 | */ |
288 | 288 | protected function _get_lock_key($type = EE_Messages_Queue::action_generating) |
289 | 289 | { |
290 | - return '_ee_lock_' . $type; |
|
290 | + return '_ee_lock_'.$type; |
|
291 | 291 | } |
292 | 292 | |
293 | 293 | |
@@ -299,7 +299,7 @@ discard block |
||
299 | 299 | */ |
300 | 300 | protected function _get_lock_expiry($type = EE_Messages_Queue::action_generating) |
301 | 301 | { |
302 | - return (int)apply_filters('FHEE__EE_Messages_Queue__lock_expiry', HOUR_IN_SECONDS, $type); |
|
302 | + return (int) apply_filters('FHEE__EE_Messages_Queue__lock_expiry', HOUR_IN_SECONDS, $type); |
|
303 | 303 | } |
304 | 304 | |
305 | 305 | |
@@ -321,7 +321,7 @@ discard block |
||
321 | 321 | */ |
322 | 322 | protected function _get_rate_limit_expiry() |
323 | 323 | { |
324 | - return (int)apply_filters('FHEE__EE_Messages_Queue__rate_limit_expiry', HOUR_IN_SECONDS); |
|
324 | + return (int) apply_filters('FHEE__EE_Messages_Queue__rate_limit_expiry', HOUR_IN_SECONDS); |
|
325 | 325 | } |
326 | 326 | |
327 | 327 | |
@@ -332,7 +332,7 @@ discard block |
||
332 | 332 | */ |
333 | 333 | protected function _default_rate_limit() |
334 | 334 | { |
335 | - return (int)apply_filters('FHEE__EE_Messages_Queue___rate_limit', 200); |
|
335 | + return (int) apply_filters('FHEE__EE_Messages_Queue___rate_limit', 200); |
|
336 | 336 | } |
337 | 337 | |
338 | 338 | |
@@ -413,7 +413,7 @@ discard block |
||
413 | 413 | $rate_limit = $this->get_rate_limit(); |
414 | 414 | $new_limit = $rate_limit - $batch_completed; |
415 | 415 | //updating the transient option directly to avoid resetting the expiry. |
416 | - update_option('_transient_' . $this->_get_rate_limit_key(), $new_limit); |
|
416 | + update_option('_transient_'.$this->_get_rate_limit_key(), $new_limit); |
|
417 | 417 | } |
418 | 418 | |
419 | 419 | |
@@ -494,7 +494,7 @@ discard block |
||
494 | 494 | /** @type EE_Message $message */ |
495 | 495 | $message = $this->_message_repository->current(); |
496 | 496 | //only process things that are queued for sending |
497 | - if (! in_array($message->STS_ID(), EEM_Message::instance()->stati_indicating_to_send())) { |
|
497 | + if ( ! in_array($message->STS_ID(), EEM_Message::instance()->stati_indicating_to_send())) { |
|
498 | 498 | $this->_message_repository->next(); |
499 | 499 | continue; |
500 | 500 | } |
@@ -504,13 +504,13 @@ discard block |
||
504 | 504 | continue; |
505 | 505 | } |
506 | 506 | //error checking |
507 | - if (! $message->valid_messenger()) { |
|
507 | + if ( ! $message->valid_messenger()) { |
|
508 | 508 | $error_messages[] = sprintf( |
509 | 509 | __('The %s messenger is not active at time of sending.', 'event_espresso'), |
510 | 510 | $message->messenger() |
511 | 511 | ); |
512 | 512 | } |
513 | - if (! $message->valid_message_type()) { |
|
513 | + if ( ! $message->valid_message_type()) { |
|
514 | 514 | $error_messages[] = sprintf( |
515 | 515 | __('The %s message type is not active at the time of sending.', 'event_espresso'), |
516 | 516 | $message->message_type() |
@@ -675,7 +675,7 @@ discard block |
||
675 | 675 | */ |
676 | 676 | protected function _set_error_message(EE_Message $message, $error_messages) |
677 | 677 | { |
678 | - $error_messages = (array)$error_messages; |
|
678 | + $error_messages = (array) $error_messages; |
|
679 | 679 | if (in_array($message->STS_ID(), EEM_Message::instance()->stati_indicating_failed_sending())) { |
680 | 680 | $notices = EE_Error::has_notices(); |
681 | 681 | $error_messages[] = __( |
@@ -690,7 +690,7 @@ discard block |
||
690 | 690 | } |
691 | 691 | if (count($error_messages) > 0) { |
692 | 692 | $msg = __('Message was not executed successfully.', 'event_espresso'); |
693 | - $msg = $msg . "\n" . implode("\n", $error_messages); |
|
693 | + $msg = $msg."\n".implode("\n", $error_messages); |
|
694 | 694 | $message->set_error_message($msg); |
695 | 695 | } |
696 | 696 | } |
@@ -1,4 +1,4 @@ discard block |
||
1 | -<?php if (! defined('EVENT_ESPRESSO_VERSION')) { |
|
1 | +<?php if ( ! defined('EVENT_ESPRESSO_VERSION')) { |
|
2 | 2 | exit('No direct script access allowed'); |
3 | 3 | } |
4 | 4 | /** |
@@ -12,7 +12,7 @@ discard block |
||
12 | 12 | * @ version 4.0 |
13 | 13 | * ------------------------------------------------------------------------ |
14 | 14 | */ |
15 | -require_once(EE_MODELS . 'EEM_Base.model.php'); |
|
15 | +require_once(EE_MODELS.'EEM_Base.model.php'); |
|
16 | 16 | |
17 | 17 | /** |
18 | 18 | * Class EEM_Status |
@@ -49,7 +49,7 @@ discard block |
||
49 | 49 | false, |
50 | 50 | 'event', |
51 | 51 | array( |
52 | - 'event' => __("Event", "event_espresso"),//deprecated |
|
52 | + 'event' => __("Event", "event_espresso"), //deprecated |
|
53 | 53 | 'registration' => __("Registration", "event_espresso"), |
54 | 54 | 'transaction' => __("Transaction", "event_espresso"), |
55 | 55 | 'payment' => __("Payment", "event_espresso"), |
@@ -1,5 +1,5 @@ discard block |
||
1 | 1 | <?php if (! defined('EVENT_ESPRESSO_VERSION')) { |
2 | - exit('No direct script access allowed'); |
|
2 | + exit('No direct script access allowed'); |
|
3 | 3 | } |
4 | 4 | /** |
5 | 5 | * Event Espresso |
@@ -25,291 +25,291 @@ discard block |
||
25 | 25 | class EEM_Status extends EEM_Base |
26 | 26 | { |
27 | 27 | |
28 | - // private instance of the Attendee object |
|
29 | - protected static $_instance = null; |
|
28 | + // private instance of the Attendee object |
|
29 | + protected static $_instance = null; |
|
30 | 30 | |
31 | 31 | |
32 | - /** |
|
33 | - * @return EEM_Status |
|
34 | - */ |
|
35 | - protected function __construct($timezone = null) |
|
36 | - { |
|
37 | - $this->singular_item = __('Status', 'event_espresso'); |
|
38 | - $this->plural_item = __('Stati', 'event_espresso'); |
|
39 | - $this->_tables = array( |
|
40 | - 'StatusTable' => new EE_Primary_Table('esp_status', 'STS_ID'), |
|
41 | - ); |
|
42 | - $this->_fields = array( |
|
43 | - 'StatusTable' => array( |
|
44 | - 'STS_ID' => new EE_Primary_Key_String_Field('STS_ID', __('Status ID', 'event_espresso')), |
|
45 | - 'STS_code' => new EE_Plain_Text_Field('STS_code', __('Status Code', 'event_espresso'), false, ''), |
|
46 | - 'STS_type' => new EE_Enum_Text_Field( |
|
47 | - 'STS_type', |
|
48 | - __("Type", "event_espresso"), |
|
49 | - false, |
|
50 | - 'event', |
|
51 | - array( |
|
52 | - 'event' => __("Event", "event_espresso"),//deprecated |
|
53 | - 'registration' => __("Registration", "event_espresso"), |
|
54 | - 'transaction' => __("Transaction", "event_espresso"), |
|
55 | - 'payment' => __("Payment", "event_espresso"), |
|
56 | - 'email' => __("Email", "event_espresso"), |
|
57 | - 'message' => __("Message", "event_espresso"), |
|
58 | - )), |
|
59 | - 'STS_can_edit' => new EE_Boolean_Field('STS_can_edit', __('Editable?', 'event_espresso'), false), |
|
60 | - 'STS_desc' => new EE_Simple_HTML_Field('STS_desc', __("Description", "event_espresso"), false, ''), |
|
61 | - 'STS_open' => new EE_Boolean_Field('STS_open', __("Open?", "event_espresso"), false, false), |
|
62 | - ), |
|
63 | - ); |
|
64 | - $this->_model_relations = array( |
|
65 | - 'Registration' => new EE_Has_Many_Relation(), |
|
66 | - 'Transaction' => new EE_Has_Many_Relation(), |
|
67 | - 'Payment' => new EE_Has_Many_Relation(), |
|
68 | - ); |
|
69 | - //this model is generally available for reading |
|
70 | - $this->_cap_restriction_generators[EEM_Base::caps_read] = new EE_Restriction_Generator_Public(); |
|
32 | + /** |
|
33 | + * @return EEM_Status |
|
34 | + */ |
|
35 | + protected function __construct($timezone = null) |
|
36 | + { |
|
37 | + $this->singular_item = __('Status', 'event_espresso'); |
|
38 | + $this->plural_item = __('Stati', 'event_espresso'); |
|
39 | + $this->_tables = array( |
|
40 | + 'StatusTable' => new EE_Primary_Table('esp_status', 'STS_ID'), |
|
41 | + ); |
|
42 | + $this->_fields = array( |
|
43 | + 'StatusTable' => array( |
|
44 | + 'STS_ID' => new EE_Primary_Key_String_Field('STS_ID', __('Status ID', 'event_espresso')), |
|
45 | + 'STS_code' => new EE_Plain_Text_Field('STS_code', __('Status Code', 'event_espresso'), false, ''), |
|
46 | + 'STS_type' => new EE_Enum_Text_Field( |
|
47 | + 'STS_type', |
|
48 | + __("Type", "event_espresso"), |
|
49 | + false, |
|
50 | + 'event', |
|
51 | + array( |
|
52 | + 'event' => __("Event", "event_espresso"),//deprecated |
|
53 | + 'registration' => __("Registration", "event_espresso"), |
|
54 | + 'transaction' => __("Transaction", "event_espresso"), |
|
55 | + 'payment' => __("Payment", "event_espresso"), |
|
56 | + 'email' => __("Email", "event_espresso"), |
|
57 | + 'message' => __("Message", "event_espresso"), |
|
58 | + )), |
|
59 | + 'STS_can_edit' => new EE_Boolean_Field('STS_can_edit', __('Editable?', 'event_espresso'), false), |
|
60 | + 'STS_desc' => new EE_Simple_HTML_Field('STS_desc', __("Description", "event_espresso"), false, ''), |
|
61 | + 'STS_open' => new EE_Boolean_Field('STS_open', __("Open?", "event_espresso"), false, false), |
|
62 | + ), |
|
63 | + ); |
|
64 | + $this->_model_relations = array( |
|
65 | + 'Registration' => new EE_Has_Many_Relation(), |
|
66 | + 'Transaction' => new EE_Has_Many_Relation(), |
|
67 | + 'Payment' => new EE_Has_Many_Relation(), |
|
68 | + ); |
|
69 | + //this model is generally available for reading |
|
70 | + $this->_cap_restriction_generators[EEM_Base::caps_read] = new EE_Restriction_Generator_Public(); |
|
71 | 71 | |
72 | - parent::__construct($timezone); |
|
73 | - } |
|
72 | + parent::__construct($timezone); |
|
73 | + } |
|
74 | 74 | |
75 | 75 | |
76 | - /** |
|
77 | - * This method provides the localized singular or plural string for a given status id |
|
78 | - * |
|
79 | - * @param array $statuses This should be an array of statuses in the format array( $status_id, $status_code ). |
|
80 | - * That way if there isn't a translation in the index we'll return the default code. |
|
81 | - * @param boolean $plural Whether to return plural string or not. Note, nearly all of the plural strings are the |
|
82 | - * same as the singular (in English), however, this may NOT be the case with other |
|
83 | - * languages |
|
84 | - * @param string $schema This can be either 'upper', 'lower', or 'sentence'. Basically indicates how we want |
|
85 | - * the status string returned ( UPPER, lower, Sentence) |
|
86 | - * @throws EE_Error |
|
87 | - * @return array an array of translated strings for the incoming status id. |
|
88 | - */ |
|
89 | - public function localized_status($statuses, $plural = false, $schema = 'upper') |
|
90 | - { |
|
91 | - //note these are all in lower case because ucwords() on upper case will NOT convert. |
|
92 | - $translation_array = array( |
|
93 | - EEM_Registration::status_id_pending_payment => array( |
|
94 | - __('pending payment', 'event_espresso'), //singular |
|
95 | - __('pending payments', 'event_espresso') //plural |
|
96 | - ), |
|
97 | - EEM_Registration::status_id_approved => array( |
|
98 | - __('approved', 'event_espresso'), //singular |
|
99 | - __('approved', 'event_espresso') //plural |
|
100 | - ), |
|
101 | - EEM_Registration::status_id_not_approved => array( |
|
102 | - __('not approved', 'event_espresso'), |
|
103 | - __('not approved', 'event_espresso'), |
|
104 | - ), |
|
105 | - EEM_Registration::status_id_cancelled => array( |
|
106 | - __('cancelled', 'event_espresso'), |
|
107 | - __('cancelled', 'event_espresso'), |
|
108 | - ), |
|
109 | - EEM_Registration::status_id_incomplete => array( |
|
110 | - __('incomplete', 'event_espresso'), |
|
111 | - __('incomplete', 'event_espresso'), |
|
112 | - ), |
|
113 | - EEM_Registration::status_id_declined => array( |
|
114 | - __('declined', 'event_espresso'), |
|
115 | - __('declined', 'event_espresso'), |
|
116 | - ), |
|
117 | - EEM_Registration::status_id_wait_list => array( |
|
118 | - __('wait list', 'event_espresso'), |
|
119 | - __('wait list', 'event_espresso'), |
|
120 | - ), |
|
121 | - EEM_Transaction::overpaid_status_code => array( |
|
122 | - __('overpaid', 'event_espresso'), |
|
123 | - __('overpaid', 'event_espresso'), |
|
124 | - ), |
|
125 | - EEM_Transaction::complete_status_code => array( |
|
126 | - __('complete', 'event_espresso'), |
|
127 | - __('complete', 'event_espresso'), |
|
128 | - ), |
|
129 | - EEM_Transaction::incomplete_status_code => array( |
|
130 | - __('incomplete', 'event_espresso'), |
|
131 | - __('incomplete', 'event_espresso'), |
|
132 | - ), |
|
133 | - EEM_Transaction::failed_status_code => array( |
|
134 | - __('failed', 'event_espresso'), |
|
135 | - __('failed', 'event_espresso'), |
|
136 | - ), |
|
137 | - EEM_Transaction::abandoned_status_code => array( |
|
138 | - __('abandoned', 'event_espresso'), |
|
139 | - __('abandoned', 'event_espresso'), |
|
140 | - ), |
|
141 | - EEM_Payment::status_id_approved => array( |
|
142 | - __('accepted', 'event_espresso'), |
|
143 | - __('accepted', 'event_espresso'), |
|
144 | - ), |
|
145 | - EEM_Payment::status_id_pending => array( |
|
146 | - __('pending', 'event_espresso'), |
|
147 | - __('pending', 'event_espresso'), |
|
148 | - ), |
|
149 | - EEM_Payment::status_id_cancelled => array( |
|
150 | - __('cancelled', 'event_espresso'), |
|
151 | - __('cancelled', 'event_espresso'), |
|
152 | - ), |
|
153 | - EEM_Payment::status_id_declined => array( |
|
154 | - __('declined', 'event_espresso'), |
|
155 | - __('declined', 'event_espresso'), |
|
156 | - ), |
|
157 | - EEM_Payment::status_id_failed => array( |
|
158 | - __('failed', 'event_espresso'), |
|
159 | - __('failed', 'event_espresso'), |
|
160 | - ), |
|
161 | - //following statuses are NOT part of the EEM_Status but to keep things centralized we include in here. |
|
162 | - EEM_Event::sold_out => array( |
|
163 | - __('sold out', 'event_espresso'), |
|
164 | - __('sold out', 'event_espresso'), |
|
165 | - ), |
|
166 | - EEM_Event::postponed => array( |
|
167 | - __('postponed', 'event_espresso'), |
|
168 | - __('Postponed', 'event_espresso'), |
|
169 | - ), |
|
170 | - EEM_Event::cancelled => array( |
|
171 | - __('cancelled', 'event_espresso'), |
|
172 | - __('cancelled', 'event_espresso'), |
|
173 | - ), |
|
174 | - EE_Ticket::archived => array( |
|
175 | - __('archived', 'event_espresso'), |
|
176 | - __('archived', 'event_espresso'), |
|
177 | - ), |
|
178 | - EE_Ticket::expired => array( |
|
179 | - __('expired', 'event_espresso'), |
|
180 | - __('expired', 'event_espresso'), |
|
181 | - ), |
|
182 | - EE_Ticket::sold_out => array( |
|
183 | - __('sold out', 'event_espresso'), |
|
184 | - __('sold out', 'event_espresso'), |
|
185 | - ), |
|
186 | - EE_Ticket::pending => array( |
|
187 | - __('upcoming', 'event_espresso'), |
|
188 | - __('upcoming', 'event_espresso'), |
|
189 | - ), |
|
190 | - EE_Ticket::onsale => array( |
|
191 | - __('on sale', 'event_espresso'), |
|
192 | - __('on sale', 'event_espresso'), |
|
193 | - ), |
|
194 | - EE_Datetime::cancelled => array( |
|
195 | - __('cancelled', 'event_espresso'), |
|
196 | - __('cancelled', 'event_espresso'), |
|
197 | - ), |
|
198 | - EE_Datetime::sold_out => array( |
|
199 | - __('sold out', 'event_espresso'), |
|
200 | - __('sold out', 'event_espresso'), |
|
201 | - ), |
|
202 | - EE_Datetime::expired => array( |
|
203 | - __('expired', 'event_espresso'), |
|
204 | - __('expired', 'event_espresso'), |
|
205 | - ), |
|
206 | - EE_Datetime::inactive => array( |
|
207 | - __('inactive', 'event_espresso'), |
|
208 | - __('inactive', 'event_espresso'), |
|
209 | - ), |
|
210 | - EE_Datetime::upcoming => array( |
|
211 | - __('upcoming', 'event_espresso'), |
|
212 | - __('upcoming', 'event_espresso'), |
|
213 | - ), |
|
214 | - EE_Datetime::active => array( |
|
215 | - __('active', 'event_espresso'), |
|
216 | - __('active', 'event_espresso'), |
|
217 | - ), |
|
218 | - EE_Datetime::postponed => array( |
|
219 | - __('postponed', 'event_espresso'), |
|
220 | - __('postponed', 'event_espresso'), |
|
221 | - ), |
|
222 | - //messages related |
|
223 | - EEM_Message::status_sent => array( |
|
224 | - __('sent', 'event_espresso'), |
|
225 | - __('sent', 'event_espresso'), |
|
226 | - ), |
|
227 | - EEM_Message::status_idle => array( |
|
228 | - __('queued for sending', 'event_espresso'), |
|
229 | - __('queued for sending', 'event_espresso'), |
|
230 | - ), |
|
231 | - EEM_Message::status_failed => array( |
|
232 | - __('failed', 'event_espresso'), |
|
233 | - __('failed', 'event_espresso'), |
|
234 | - ), |
|
235 | - EEM_Message::status_debug_only => array( |
|
236 | - __('debug only', 'event_espresso'), |
|
237 | - __('debug only', 'event_espresso'), |
|
238 | - ), |
|
239 | - EEM_Message::status_messenger_executing => array( |
|
240 | - __('messenger is executing', 'event_espresso'), |
|
241 | - __('messenger is executing', 'event_espresso'), |
|
242 | - ), |
|
243 | - EEM_Message::status_resend => array( |
|
244 | - __('queued for resending', 'event_espresso'), |
|
245 | - __('queued for resending', 'event_espresso'), |
|
246 | - ), |
|
247 | - EEM_Message::status_incomplete => array( |
|
248 | - __('queued for generating', 'event_espresso'), |
|
249 | - __('queued for generating', 'event_espresso'), |
|
250 | - ), |
|
251 | - EEM_Message::status_retry => array( |
|
252 | - __('failed sending, can be retried', 'event_espresso'), |
|
253 | - __('failed sending, can be retried', 'event_espresso'), |
|
254 | - ), |
|
255 | - EEM_CPT_Base::post_status_publish => array( |
|
256 | - __('published', 'event_espresso'), |
|
257 | - __('published', 'event_espresso'), |
|
258 | - ), |
|
259 | - EEM_CPT_Base::post_status_future => array( |
|
260 | - __('scheduled', 'event_espresso'), |
|
261 | - __('scheduled', 'event_espresso'), |
|
262 | - ), |
|
263 | - EEM_CPT_Base::post_status_draft => array( |
|
264 | - __('draft', 'event_espresso'), |
|
265 | - __('draft', 'event_espresso'), |
|
266 | - ), |
|
267 | - EEM_CPT_Base::post_status_pending => array( |
|
268 | - __('pending', 'event_espresso'), |
|
269 | - __('pending', 'event_espresso'), |
|
270 | - ), |
|
271 | - EEM_CPT_Base::post_status_private => array( |
|
272 | - __('private', 'event_espresso'), |
|
273 | - __('private', 'event_espresso'), |
|
274 | - ), |
|
275 | - EEM_CPT_Base::post_status_trashed => array( |
|
276 | - __('trashed', 'event_espresso'), |
|
277 | - __('trashed', 'event_espresso'), |
|
278 | - ), |
|
279 | - ); |
|
76 | + /** |
|
77 | + * This method provides the localized singular or plural string for a given status id |
|
78 | + * |
|
79 | + * @param array $statuses This should be an array of statuses in the format array( $status_id, $status_code ). |
|
80 | + * That way if there isn't a translation in the index we'll return the default code. |
|
81 | + * @param boolean $plural Whether to return plural string or not. Note, nearly all of the plural strings are the |
|
82 | + * same as the singular (in English), however, this may NOT be the case with other |
|
83 | + * languages |
|
84 | + * @param string $schema This can be either 'upper', 'lower', or 'sentence'. Basically indicates how we want |
|
85 | + * the status string returned ( UPPER, lower, Sentence) |
|
86 | + * @throws EE_Error |
|
87 | + * @return array an array of translated strings for the incoming status id. |
|
88 | + */ |
|
89 | + public function localized_status($statuses, $plural = false, $schema = 'upper') |
|
90 | + { |
|
91 | + //note these are all in lower case because ucwords() on upper case will NOT convert. |
|
92 | + $translation_array = array( |
|
93 | + EEM_Registration::status_id_pending_payment => array( |
|
94 | + __('pending payment', 'event_espresso'), //singular |
|
95 | + __('pending payments', 'event_espresso') //plural |
|
96 | + ), |
|
97 | + EEM_Registration::status_id_approved => array( |
|
98 | + __('approved', 'event_espresso'), //singular |
|
99 | + __('approved', 'event_espresso') //plural |
|
100 | + ), |
|
101 | + EEM_Registration::status_id_not_approved => array( |
|
102 | + __('not approved', 'event_espresso'), |
|
103 | + __('not approved', 'event_espresso'), |
|
104 | + ), |
|
105 | + EEM_Registration::status_id_cancelled => array( |
|
106 | + __('cancelled', 'event_espresso'), |
|
107 | + __('cancelled', 'event_espresso'), |
|
108 | + ), |
|
109 | + EEM_Registration::status_id_incomplete => array( |
|
110 | + __('incomplete', 'event_espresso'), |
|
111 | + __('incomplete', 'event_espresso'), |
|
112 | + ), |
|
113 | + EEM_Registration::status_id_declined => array( |
|
114 | + __('declined', 'event_espresso'), |
|
115 | + __('declined', 'event_espresso'), |
|
116 | + ), |
|
117 | + EEM_Registration::status_id_wait_list => array( |
|
118 | + __('wait list', 'event_espresso'), |
|
119 | + __('wait list', 'event_espresso'), |
|
120 | + ), |
|
121 | + EEM_Transaction::overpaid_status_code => array( |
|
122 | + __('overpaid', 'event_espresso'), |
|
123 | + __('overpaid', 'event_espresso'), |
|
124 | + ), |
|
125 | + EEM_Transaction::complete_status_code => array( |
|
126 | + __('complete', 'event_espresso'), |
|
127 | + __('complete', 'event_espresso'), |
|
128 | + ), |
|
129 | + EEM_Transaction::incomplete_status_code => array( |
|
130 | + __('incomplete', 'event_espresso'), |
|
131 | + __('incomplete', 'event_espresso'), |
|
132 | + ), |
|
133 | + EEM_Transaction::failed_status_code => array( |
|
134 | + __('failed', 'event_espresso'), |
|
135 | + __('failed', 'event_espresso'), |
|
136 | + ), |
|
137 | + EEM_Transaction::abandoned_status_code => array( |
|
138 | + __('abandoned', 'event_espresso'), |
|
139 | + __('abandoned', 'event_espresso'), |
|
140 | + ), |
|
141 | + EEM_Payment::status_id_approved => array( |
|
142 | + __('accepted', 'event_espresso'), |
|
143 | + __('accepted', 'event_espresso'), |
|
144 | + ), |
|
145 | + EEM_Payment::status_id_pending => array( |
|
146 | + __('pending', 'event_espresso'), |
|
147 | + __('pending', 'event_espresso'), |
|
148 | + ), |
|
149 | + EEM_Payment::status_id_cancelled => array( |
|
150 | + __('cancelled', 'event_espresso'), |
|
151 | + __('cancelled', 'event_espresso'), |
|
152 | + ), |
|
153 | + EEM_Payment::status_id_declined => array( |
|
154 | + __('declined', 'event_espresso'), |
|
155 | + __('declined', 'event_espresso'), |
|
156 | + ), |
|
157 | + EEM_Payment::status_id_failed => array( |
|
158 | + __('failed', 'event_espresso'), |
|
159 | + __('failed', 'event_espresso'), |
|
160 | + ), |
|
161 | + //following statuses are NOT part of the EEM_Status but to keep things centralized we include in here. |
|
162 | + EEM_Event::sold_out => array( |
|
163 | + __('sold out', 'event_espresso'), |
|
164 | + __('sold out', 'event_espresso'), |
|
165 | + ), |
|
166 | + EEM_Event::postponed => array( |
|
167 | + __('postponed', 'event_espresso'), |
|
168 | + __('Postponed', 'event_espresso'), |
|
169 | + ), |
|
170 | + EEM_Event::cancelled => array( |
|
171 | + __('cancelled', 'event_espresso'), |
|
172 | + __('cancelled', 'event_espresso'), |
|
173 | + ), |
|
174 | + EE_Ticket::archived => array( |
|
175 | + __('archived', 'event_espresso'), |
|
176 | + __('archived', 'event_espresso'), |
|
177 | + ), |
|
178 | + EE_Ticket::expired => array( |
|
179 | + __('expired', 'event_espresso'), |
|
180 | + __('expired', 'event_espresso'), |
|
181 | + ), |
|
182 | + EE_Ticket::sold_out => array( |
|
183 | + __('sold out', 'event_espresso'), |
|
184 | + __('sold out', 'event_espresso'), |
|
185 | + ), |
|
186 | + EE_Ticket::pending => array( |
|
187 | + __('upcoming', 'event_espresso'), |
|
188 | + __('upcoming', 'event_espresso'), |
|
189 | + ), |
|
190 | + EE_Ticket::onsale => array( |
|
191 | + __('on sale', 'event_espresso'), |
|
192 | + __('on sale', 'event_espresso'), |
|
193 | + ), |
|
194 | + EE_Datetime::cancelled => array( |
|
195 | + __('cancelled', 'event_espresso'), |
|
196 | + __('cancelled', 'event_espresso'), |
|
197 | + ), |
|
198 | + EE_Datetime::sold_out => array( |
|
199 | + __('sold out', 'event_espresso'), |
|
200 | + __('sold out', 'event_espresso'), |
|
201 | + ), |
|
202 | + EE_Datetime::expired => array( |
|
203 | + __('expired', 'event_espresso'), |
|
204 | + __('expired', 'event_espresso'), |
|
205 | + ), |
|
206 | + EE_Datetime::inactive => array( |
|
207 | + __('inactive', 'event_espresso'), |
|
208 | + __('inactive', 'event_espresso'), |
|
209 | + ), |
|
210 | + EE_Datetime::upcoming => array( |
|
211 | + __('upcoming', 'event_espresso'), |
|
212 | + __('upcoming', 'event_espresso'), |
|
213 | + ), |
|
214 | + EE_Datetime::active => array( |
|
215 | + __('active', 'event_espresso'), |
|
216 | + __('active', 'event_espresso'), |
|
217 | + ), |
|
218 | + EE_Datetime::postponed => array( |
|
219 | + __('postponed', 'event_espresso'), |
|
220 | + __('postponed', 'event_espresso'), |
|
221 | + ), |
|
222 | + //messages related |
|
223 | + EEM_Message::status_sent => array( |
|
224 | + __('sent', 'event_espresso'), |
|
225 | + __('sent', 'event_espresso'), |
|
226 | + ), |
|
227 | + EEM_Message::status_idle => array( |
|
228 | + __('queued for sending', 'event_espresso'), |
|
229 | + __('queued for sending', 'event_espresso'), |
|
230 | + ), |
|
231 | + EEM_Message::status_failed => array( |
|
232 | + __('failed', 'event_espresso'), |
|
233 | + __('failed', 'event_espresso'), |
|
234 | + ), |
|
235 | + EEM_Message::status_debug_only => array( |
|
236 | + __('debug only', 'event_espresso'), |
|
237 | + __('debug only', 'event_espresso'), |
|
238 | + ), |
|
239 | + EEM_Message::status_messenger_executing => array( |
|
240 | + __('messenger is executing', 'event_espresso'), |
|
241 | + __('messenger is executing', 'event_espresso'), |
|
242 | + ), |
|
243 | + EEM_Message::status_resend => array( |
|
244 | + __('queued for resending', 'event_espresso'), |
|
245 | + __('queued for resending', 'event_espresso'), |
|
246 | + ), |
|
247 | + EEM_Message::status_incomplete => array( |
|
248 | + __('queued for generating', 'event_espresso'), |
|
249 | + __('queued for generating', 'event_espresso'), |
|
250 | + ), |
|
251 | + EEM_Message::status_retry => array( |
|
252 | + __('failed sending, can be retried', 'event_espresso'), |
|
253 | + __('failed sending, can be retried', 'event_espresso'), |
|
254 | + ), |
|
255 | + EEM_CPT_Base::post_status_publish => array( |
|
256 | + __('published', 'event_espresso'), |
|
257 | + __('published', 'event_espresso'), |
|
258 | + ), |
|
259 | + EEM_CPT_Base::post_status_future => array( |
|
260 | + __('scheduled', 'event_espresso'), |
|
261 | + __('scheduled', 'event_espresso'), |
|
262 | + ), |
|
263 | + EEM_CPT_Base::post_status_draft => array( |
|
264 | + __('draft', 'event_espresso'), |
|
265 | + __('draft', 'event_espresso'), |
|
266 | + ), |
|
267 | + EEM_CPT_Base::post_status_pending => array( |
|
268 | + __('pending', 'event_espresso'), |
|
269 | + __('pending', 'event_espresso'), |
|
270 | + ), |
|
271 | + EEM_CPT_Base::post_status_private => array( |
|
272 | + __('private', 'event_espresso'), |
|
273 | + __('private', 'event_espresso'), |
|
274 | + ), |
|
275 | + EEM_CPT_Base::post_status_trashed => array( |
|
276 | + __('trashed', 'event_espresso'), |
|
277 | + __('trashed', 'event_espresso'), |
|
278 | + ), |
|
279 | + ); |
|
280 | 280 | |
281 | - $translation_array = apply_filters('FHEE__EEM_Status__localized_status__translation_array', $translation_array); |
|
281 | + $translation_array = apply_filters('FHEE__EEM_Status__localized_status__translation_array', $translation_array); |
|
282 | 282 | |
283 | - if ( ! is_array($statuses)) { |
|
284 | - throw new EE_Error(__('The incoming statuses argument must be an array with keys as the $status_id and values as the $status_code', |
|
285 | - 'event_espresso')); |
|
286 | - } |
|
283 | + if ( ! is_array($statuses)) { |
|
284 | + throw new EE_Error(__('The incoming statuses argument must be an array with keys as the $status_id and values as the $status_code', |
|
285 | + 'event_espresso')); |
|
286 | + } |
|
287 | 287 | |
288 | - $translation = array(); |
|
288 | + $translation = array(); |
|
289 | 289 | |
290 | - foreach ($statuses as $id => $code) { |
|
291 | - if (isset($translation_array[$id])) { |
|
292 | - $translation[$id] = $plural ? $translation_array[$id][1] : $translation_array[$id][0]; |
|
293 | - } else { |
|
294 | - $translation[$id] = $code; |
|
295 | - } |
|
290 | + foreach ($statuses as $id => $code) { |
|
291 | + if (isset($translation_array[$id])) { |
|
292 | + $translation[$id] = $plural ? $translation_array[$id][1] : $translation_array[$id][0]; |
|
293 | + } else { |
|
294 | + $translation[$id] = $code; |
|
295 | + } |
|
296 | 296 | |
297 | - //schema |
|
298 | - switch ($schema) { |
|
299 | - case 'lower' : |
|
300 | - $translation[$id] = strtolower($translation[$id]); //even though these start in lower case, this will catch any statuses added via filter. |
|
301 | - break; |
|
302 | - case 'sentence' : |
|
303 | - $translation[$id] = ucwords($translation[$id]); |
|
304 | - break; |
|
305 | - case 'upper' : |
|
306 | - $translation[$id] = strtoupper($translation[$id]); |
|
307 | - break; |
|
308 | - } |
|
309 | - } |
|
297 | + //schema |
|
298 | + switch ($schema) { |
|
299 | + case 'lower' : |
|
300 | + $translation[$id] = strtolower($translation[$id]); //even though these start in lower case, this will catch any statuses added via filter. |
|
301 | + break; |
|
302 | + case 'sentence' : |
|
303 | + $translation[$id] = ucwords($translation[$id]); |
|
304 | + break; |
|
305 | + case 'upper' : |
|
306 | + $translation[$id] = strtoupper($translation[$id]); |
|
307 | + break; |
|
308 | + } |
|
309 | + } |
|
310 | 310 | |
311 | - return $translation; |
|
312 | - } |
|
311 | + return $translation; |
|
312 | + } |
|
313 | 313 | |
314 | 314 | |
315 | 315 | } |
@@ -119,7 +119,7 @@ discard block |
||
119 | 119 | self::priority_low => __('low', 'event_espresso'), |
120 | 120 | ); |
121 | 121 | |
122 | - $this->_fields = array( |
|
122 | + $this->_fields = array( |
|
123 | 123 | 'Message' => array( |
124 | 124 | 'MSG_ID' => new EE_Primary_Key_Int_Field('MSG_ID', __('Message ID', 'event_espresso')), |
125 | 125 | 'MSG_token' => new EE_Plain_Text_Field('MSG_token', |
@@ -347,7 +347,7 @@ discard block |
||
347 | 347 | ); |
348 | 348 | break; |
349 | 349 | default : |
350 | - $query_params[0]['AND**filter_by']['OR**filter_by_' . $request_key][$model_name . '.' . $request_key] = $request_value; |
|
350 | + $query_params[0]['AND**filter_by']['OR**filter_by_'.$request_key][$model_name.'.'.$request_key] = $request_value; |
|
351 | 351 | break; |
352 | 352 | } |
353 | 353 | } |
@@ -410,7 +410,7 @@ discard block |
||
410 | 410 | //prepend to the last element of $label_parts an "and". |
411 | 411 | if (count($label_parts) > 1) { |
412 | 412 | $label_parts_index_to_prepend = count($label_parts) - 1; |
413 | - $label_parts[$label_parts_index_to_prepend] = 'and' . $label_parts[$label_parts_index_to_prepend]; |
|
413 | + $label_parts[$label_parts_index_to_prepend] = 'and'.$label_parts[$label_parts_index_to_prepend]; |
|
414 | 414 | } |
415 | 415 | |
416 | 416 | $pretty_label .= sprintf( |
@@ -1,5 +1,5 @@ discard block |
||
1 | 1 | <?php if ( ! defined('EVENT_ESPRESSO_VERSION')) { |
2 | - exit('No direct script access allowed'); |
|
2 | + exit('No direct script access allowed'); |
|
3 | 3 | } |
4 | 4 | |
5 | 5 | /** |
@@ -12,481 +12,481 @@ discard block |
||
12 | 12 | class EEM_Message extends EEM_Base implements EEI_Query_Filter |
13 | 13 | { |
14 | 14 | |
15 | - // private instance of the Message object |
|
16 | - protected static $_instance = null; |
|
15 | + // private instance of the Message object |
|
16 | + protected static $_instance = null; |
|
17 | 17 | |
18 | 18 | |
19 | - /** |
|
20 | - * This priority indicates a message should be generated and sent ASAP |
|
21 | - * |
|
22 | - * @type int |
|
23 | - */ |
|
24 | - const priority_high = 10; |
|
19 | + /** |
|
20 | + * This priority indicates a message should be generated and sent ASAP |
|
21 | + * |
|
22 | + * @type int |
|
23 | + */ |
|
24 | + const priority_high = 10; |
|
25 | 25 | |
26 | 26 | |
27 | - /** |
|
28 | - * This priority indicates a message should be generated ASAP and queued for sending. |
|
29 | - * |
|
30 | - * @type |
|
31 | - */ |
|
32 | - const priority_medium = 20; |
|
33 | - |
|
34 | - |
|
35 | - /** |
|
36 | - * This priority indicates a message should be queued for generating. |
|
37 | - * |
|
38 | - * @type int |
|
39 | - */ |
|
40 | - const priority_low = 30; |
|
41 | - |
|
42 | - |
|
43 | - /** |
|
44 | - * indicates this message was sent at the time modified |
|
45 | - */ |
|
46 | - const status_sent = 'MSN'; |
|
47 | - |
|
48 | - |
|
49 | - /** |
|
50 | - * indicates this message is waiting to be sent |
|
51 | - */ |
|
52 | - const status_idle = 'MID'; |
|
53 | - |
|
54 | - |
|
55 | - /** |
|
56 | - * indicates an attempt was a made to send this message |
|
57 | - * at the scheduled time, but it failed at the time modified. This differs from MDO status in that it will ALWAYS |
|
58 | - * appear to the end user. |
|
59 | - */ |
|
60 | - const status_failed = 'MFL'; |
|
61 | - |
|
62 | - |
|
63 | - /** |
|
64 | - * indicates the message has been flagged for resending (at the time modified). |
|
65 | - */ |
|
66 | - const status_resend = 'MRS'; |
|
67 | - |
|
68 | - |
|
69 | - /** |
|
70 | - * indicates the message has been flagged for generation but has not been generated yet. Messages always start as |
|
71 | - * this status when added to the queue. |
|
72 | - */ |
|
73 | - const status_incomplete = 'MIC'; |
|
74 | - |
|
75 | - |
|
76 | - /** |
|
77 | - * Indicates everything was generated fine for the message, however, the messenger was unable to send. |
|
78 | - * This status means that its possible to retry sending the message. |
|
79 | - */ |
|
80 | - const status_retry = 'MRT'; |
|
81 | - |
|
82 | - |
|
83 | - /** |
|
84 | - * This is used for more informational messages that may not indicate anything is broken but still cannot be |
|
85 | - * generated or sent correctly. An example of a message that would get flagged this way would be when a not |
|
86 | - * approved message was queued for generation, but at time of generation, the attached registration(s) are |
|
87 | - * approved. So the message queued for generation is no longer valid. Messages for this status will only persist |
|
88 | - * in the db and be viewable in the message activity list table when the messages system is in debug mode. |
|
89 | - * |
|
90 | - * @see EEM_Message::debug() |
|
91 | - */ |
|
92 | - const status_debug_only = 'MDO'; |
|
93 | - |
|
94 | - |
|
95 | - /** |
|
96 | - * This status is given to messages it is processed by the messenger send method. |
|
97 | - * Messages with this status should rarely be seen in the Message List table, but if they are, that's usually |
|
98 | - * indicative of a PHP timeout or memory limit issue. |
|
99 | - */ |
|
100 | - const status_messenger_executing = 'MEX'; |
|
101 | - |
|
102 | - |
|
103 | - /** |
|
104 | - * Private constructor to prevent direct creation. |
|
105 | - * |
|
106 | - * @param string $timezone string representing the timezone we want to set for returned Date Time Strings (and |
|
107 | - * any incoming timezone data that gets saved). Note this just sends the timezone info to |
|
108 | - * the date time model field objects. Default is null (and will be assumed using the set |
|
109 | - * timezone in the 'timezone_string' wp option) |
|
110 | - * @return EEM_Message |
|
111 | - */ |
|
112 | - protected function __construct($timezone = null) |
|
113 | - { |
|
114 | - $this->singular_item = __('Message', 'event_espresso'); |
|
115 | - $this->plural_item = __('Messages', 'event_espresso'); |
|
116 | - |
|
117 | - //used for token generator |
|
118 | - EE_Registry::instance()->load_helper('URL'); |
|
119 | - |
|
120 | - $this->_tables = array( |
|
121 | - 'Message' => new EE_Primary_Table('esp_message', 'MSG_ID'), |
|
122 | - ); |
|
123 | - |
|
124 | - $allowed_priority = array( |
|
125 | - self::priority_high => __('high', 'event_espresso'), |
|
126 | - self::priority_medium => __('medium', 'event_espresso'), |
|
127 | - self::priority_low => __('low', 'event_espresso'), |
|
128 | - ); |
|
129 | - |
|
130 | - $this->_fields = array( |
|
131 | - 'Message' => array( |
|
132 | - 'MSG_ID' => new EE_Primary_Key_Int_Field('MSG_ID', __('Message ID', 'event_espresso')), |
|
133 | - 'MSG_token' => new EE_Plain_Text_Field('MSG_token', |
|
134 | - __('Unique Token used to represent this row in publicly viewable contexts (eg. a url).', |
|
135 | - 'event_espresso'), false, EEH_URL::generate_unique_token()), |
|
136 | - 'GRP_ID' => new EE_Foreign_Key_Int_Field('GRP_ID', |
|
137 | - __('Foreign key to the EEM_Message_Template_Group table.', 'event_espresso'), true, 0, |
|
138 | - 'Message_Template_Group'), |
|
139 | - 'TXN_ID' => new EE_Foreign_Key_Int_Field('TXN_ID', |
|
140 | - __('Foreign key to the related EE_Transaction. This is required to give context for regenerating the specific message', |
|
141 | - 'event_espresso'), true, 0, 'Transaction'), |
|
142 | - 'MSG_messenger' => new EE_Plain_Text_Field('MSG_messenger', |
|
143 | - __('Corresponds to the EE_messenger::name used to send this message. This will also be used to attempt any resending of the message.', |
|
144 | - 'event_espresso'), false, 'email'), |
|
145 | - 'MSG_message_type' => new EE_Plain_Text_Field('MSG_message_type', |
|
146 | - __('Corresponds to the EE_message_type::name used to generate this message.', 'event_espresso'), |
|
147 | - false, 'receipt'), |
|
148 | - 'MSG_context' => new EE_Plain_Text_Field('MSG_context', __('Context', 'event_espresso'), false), |
|
149 | - 'MSG_recipient_ID' => new EE_Foreign_Key_Int_Field('MSG_recipient_ID', |
|
150 | - __('Recipient ID', 'event_espresso'), true, null, array('Registration', 'Attendee', 'WP_User')), |
|
151 | - 'MSG_recipient_type' => new EE_Any_Foreign_Model_Name_Field('MSG_recipient_type', |
|
152 | - __('Recipient Type', 'event_espresso'), true, null, array('Registration', 'Attendee', 'WP_User')), |
|
153 | - 'MSG_content' => new EE_Maybe_Serialized_Text_Field('MSG_content', |
|
154 | - __('Content', 'event_espresso'), true, ''), |
|
155 | - 'MSG_to' => new EE_Maybe_Serialized_Text_Field('MSG_to', __('Address To', 'event_espresso'), |
|
156 | - true), |
|
157 | - 'MSG_from' => new EE_Maybe_Serialized_Text_Field('MSG_from', |
|
158 | - __('Address From', 'event_espresso'), true), |
|
159 | - 'MSG_subject' => new EE_Maybe_Serialized_Text_Field('MSG_subject', |
|
160 | - __('Subject', 'event_espresso'), true, ''), |
|
161 | - 'MSG_priority' => new EE_Enum_Integer_Field('MSG_priority', __('Priority', 'event_espresso'), |
|
162 | - false, self::priority_low, $allowed_priority), |
|
163 | - 'STS_ID' => new EE_Foreign_Key_String_Field('STS_ID', __('Status', 'event_espresso'), false, |
|
164 | - self::status_incomplete, 'Status'), |
|
165 | - 'MSG_created' => new EE_Datetime_Field('MSG_created', __('Created', 'event_espresso'), false, |
|
166 | - EE_Datetime_Field::now), |
|
167 | - 'MSG_modified' => new EE_Datetime_Field('MSG_modified', __('Modified', 'event_espresso'), true, |
|
168 | - EE_Datetime_Field::now), |
|
169 | - ), |
|
170 | - ); |
|
171 | - $this->_model_relations = array( |
|
172 | - 'Attendee' => new EE_Belongs_To_Any_Relation(), |
|
173 | - 'Registration' => new EE_Belongs_To_Any_Relation(), |
|
174 | - 'WP_User' => new EE_Belongs_To_Any_Relation(), |
|
175 | - 'Message_Template_Group' => new EE_Belongs_To_Relation(), |
|
176 | - 'Transaction' => new EE_Belongs_To_Relation(), |
|
177 | - ); |
|
178 | - parent::__construct($timezone); |
|
179 | - } |
|
180 | - |
|
181 | - |
|
182 | - /** |
|
183 | - * @return \EE_Message |
|
184 | - */ |
|
185 | - public function create_default_object() |
|
186 | - { |
|
187 | - /** @type EE_Message $message */ |
|
188 | - $message = parent::create_default_object(); |
|
189 | - if ($message instanceof EE_Message) { |
|
190 | - return EE_Message_Factory::set_messenger_and_message_type($message); |
|
191 | - } |
|
192 | - return null; |
|
193 | - } |
|
194 | - |
|
195 | - |
|
196 | - /** |
|
197 | - * @param mixed $cols_n_values |
|
198 | - * @return \EE_Message |
|
199 | - */ |
|
200 | - public function instantiate_class_from_array_or_object($cols_n_values) |
|
201 | - { |
|
202 | - /** @type EE_Message $message */ |
|
203 | - $message = parent::instantiate_class_from_array_or_object($cols_n_values); |
|
204 | - if ($message instanceof EE_Message) { |
|
205 | - return EE_Message_Factory::set_messenger_and_message_type($message); |
|
206 | - } |
|
207 | - return null; |
|
208 | - } |
|
209 | - |
|
210 | - |
|
211 | - /** |
|
212 | - * Returns whether or not a message of that type was sent for a given attendee. |
|
213 | - * |
|
214 | - * @param EE_Attendee|int $attendee |
|
215 | - * @param string $message_type the message type slug |
|
216 | - * @return boolean |
|
217 | - */ |
|
218 | - public function message_sent_for_attendee($attendee, $message_type) |
|
219 | - { |
|
220 | - $attendee_ID = EEM_Attendee::instance()->ensure_is_ID($attendee); |
|
221 | - return $this->exists(array( |
|
222 | - array( |
|
223 | - 'Attendee.ATT_ID' => $attendee_ID, |
|
224 | - 'MSG_message_type' => $message_type, |
|
225 | - 'STS_ID' => array('IN', $this->stati_indicating_sent()), |
|
226 | - ), |
|
227 | - )); |
|
228 | - } |
|
229 | - |
|
230 | - |
|
231 | - /** |
|
232 | - * Returns whether or not a message of that type was sent for a given registration |
|
233 | - * |
|
234 | - * @param EE_Registration|int $registration |
|
235 | - * @param string $message_type the message type slug |
|
236 | - * @return boolean |
|
237 | - */ |
|
238 | - public function message_sent_for_registration($registration, $message_type) |
|
239 | - { |
|
240 | - $registrationID = EEM_Registration::instance()->ensure_is_ID($registration); |
|
241 | - return $this->exists(array( |
|
242 | - array( |
|
243 | - 'Registration.REG_ID' => $registrationID, |
|
244 | - 'MSG_message_type' => $message_type, |
|
245 | - 'STS_ID' => array('IN', $this->stati_indicating_sent()), |
|
246 | - ), |
|
247 | - )); |
|
248 | - } |
|
249 | - |
|
250 | - |
|
251 | - /** |
|
252 | - * This retrieves an EE_Message object from the db matching the given token string. |
|
253 | - * |
|
254 | - * @param string $token |
|
255 | - * @return EE_Message |
|
256 | - */ |
|
257 | - public function get_one_by_token($token) |
|
258 | - { |
|
259 | - return $this->get_one(array( |
|
260 | - array( |
|
261 | - 'MSG_token' => $token, |
|
262 | - ), |
|
263 | - )); |
|
264 | - } |
|
265 | - |
|
266 | - |
|
267 | - /** |
|
268 | - * Returns stati that indicate the message HAS been sent |
|
269 | - * |
|
270 | - * @return array of strings for possible stati |
|
271 | - */ |
|
272 | - public function stati_indicating_sent() |
|
273 | - { |
|
274 | - return apply_filters('FHEE__EEM_Message__stati_indicating_sent', array(self::status_sent)); |
|
275 | - } |
|
276 | - |
|
277 | - |
|
278 | - /** |
|
279 | - * Returns stati that indicate the message is waiting to be sent. |
|
280 | - * |
|
281 | - * @return array of strings for possible stati. |
|
282 | - */ |
|
283 | - public function stati_indicating_to_send() |
|
284 | - { |
|
285 | - return apply_filters('FHEE__EEM_Message__stati_indicating_to_send', |
|
286 | - array(self::status_idle, self::status_resend)); |
|
287 | - } |
|
288 | - |
|
289 | - |
|
290 | - /** |
|
291 | - * Returns stati that indicate the message has failed sending |
|
292 | - * |
|
293 | - * @return array array of strings for possible stati. |
|
294 | - */ |
|
295 | - public function stati_indicating_failed_sending() |
|
296 | - { |
|
297 | - $failed_stati = array( |
|
298 | - self::status_failed, |
|
299 | - self::status_retry, |
|
300 | - self::status_messenger_executing, |
|
301 | - ); |
|
302 | - //if WP_DEBUG is set, then let's include debug_only fails |
|
303 | - if (WP_DEBUG) { |
|
304 | - $failed_stati[] = self::status_debug_only; |
|
305 | - } |
|
306 | - return apply_filters('FHEE__EEM_Message__stati_indicating_failed_sending', $failed_stati); |
|
307 | - } |
|
308 | - |
|
309 | - |
|
310 | - /** |
|
311 | - * Returns filterable array of all EEM_Message statuses. |
|
312 | - * |
|
313 | - * @return array |
|
314 | - */ |
|
315 | - public function all_statuses() |
|
316 | - { |
|
317 | - return apply_filters( |
|
318 | - 'FHEE__EEM_Message__all_statuses', |
|
319 | - array( |
|
320 | - EEM_Message::status_sent, |
|
321 | - EEM_Message::status_incomplete, |
|
322 | - EEM_Message::status_idle, |
|
323 | - EEM_Message::status_resend, |
|
324 | - EEM_Message::status_retry, |
|
325 | - EEM_Message::status_failed, |
|
326 | - EEM_Message::status_messenger_executing, |
|
327 | - EEM_Message::status_debug_only, |
|
328 | - ) |
|
329 | - ); |
|
330 | - } |
|
331 | - |
|
332 | - /** |
|
333 | - * Detects any specific query variables in the request and uses those to setup appropriate |
|
334 | - * filter for any queries. |
|
335 | - * |
|
336 | - * @return array |
|
337 | - */ |
|
338 | - public function filter_by_query_params() |
|
339 | - { |
|
340 | - // expected possible query_vars, the key in this array matches an expected key in the request, |
|
341 | - // the value, matches the corresponding EEM_Base child reference. |
|
342 | - $expected_vars = $this->_expected_vars_for_query_inject(); |
|
343 | - $query_params[0] = array(); |
|
344 | - foreach ($expected_vars as $request_key => $model_name) { |
|
345 | - $request_value = EE_Registry::instance()->REQ->get($request_key); |
|
346 | - if ($request_value) { |
|
347 | - //special case |
|
348 | - switch ($request_key) { |
|
349 | - case '_REG_ID' : |
|
350 | - $query_params[0]['AND**filter_by']['OR**filter_by_REG_ID'] = array( |
|
351 | - 'Transaction.Registration.REG_ID' => $request_value, |
|
352 | - ); |
|
353 | - break; |
|
354 | - case 'EVT_ID' : |
|
355 | - $query_params[0]['AND**filter_by']['OR**filter_by_EVT_ID'] = array( |
|
356 | - 'Transaction.Registration.EVT_ID' => $request_value, |
|
357 | - ); |
|
358 | - break; |
|
359 | - default : |
|
360 | - $query_params[0]['AND**filter_by']['OR**filter_by_' . $request_key][$model_name . '.' . $request_key] = $request_value; |
|
361 | - break; |
|
362 | - } |
|
363 | - } |
|
364 | - } |
|
365 | - return $query_params; |
|
366 | - } |
|
367 | - |
|
368 | - |
|
369 | - /** |
|
370 | - * @return string |
|
371 | - */ |
|
372 | - public function get_pretty_label_for_results() |
|
373 | - { |
|
374 | - $expected_vars = $this->_expected_vars_for_query_inject(); |
|
375 | - $pretty_label = ''; |
|
376 | - $label_parts = array(); |
|
377 | - foreach ($expected_vars as $request_key => $model_name) { |
|
378 | - $model = EE_Registry::instance()->load_model($model_name); |
|
379 | - if ($model_field_value = EE_Registry::instance()->REQ->get($request_key)) { |
|
380 | - switch ($request_key) { |
|
381 | - case '_REG_ID' : |
|
382 | - $label_parts[] = sprintf( |
|
383 | - esc_html__('Registration with the ID: %s', 'event_espresso'), |
|
384 | - $model_field_value |
|
385 | - ); |
|
386 | - break; |
|
387 | - case 'ATT_ID' : |
|
388 | - /** @var EE_Attendee $attendee */ |
|
389 | - $attendee = $model->get_one_by_ID($model_field_value); |
|
390 | - $label_parts[] = $attendee instanceof EE_Attendee |
|
391 | - ? sprintf(esc_html__('Attendee %s', 'event_espresso'), $attendee->full_name()) |
|
392 | - : sprintf(esc_html__('Attendee ID: %s', 'event_espresso'), $model_field_value); |
|
393 | - break; |
|
394 | - case 'ID' : |
|
395 | - /** @var EE_WP_User $wpUser */ |
|
396 | - $wpUser = $model->get_one_by_ID($model_field_value); |
|
397 | - $label_parts[] = $wpUser instanceof EE_WP_User |
|
398 | - ? sprintf(esc_html__('WP User: %s', 'event_espresso'), $wpUser->name()) |
|
399 | - : sprintf(esc_html__('WP User ID: %s', 'event_espresso'), $model_field_value); |
|
400 | - break; |
|
401 | - case 'TXN_ID' : |
|
402 | - $label_parts[] = sprintf( |
|
403 | - esc_html__('Transaction with the ID: %s', 'event_espresso'), |
|
404 | - $model_field_value |
|
405 | - ); |
|
406 | - break; |
|
407 | - case 'EVT_ID' : |
|
408 | - /** @var EE_Event $Event */ |
|
409 | - $Event = $model->get_one_by_ID($model_field_value); |
|
410 | - $label_parts[] = $Event instanceof EE_Event |
|
411 | - ? sprintf(esc_html__('for the Event: %s', 'event_espresso'), $Event->name()) |
|
412 | - : sprintf(esc_html__('for the Event with ID: %s', 'event_espresso'), $model_field_value); |
|
413 | - break; |
|
414 | - } |
|
415 | - } |
|
416 | - } |
|
417 | - |
|
418 | - if ($label_parts) { |
|
419 | - |
|
420 | - //prepend to the last element of $label_parts an "and". |
|
421 | - if (count($label_parts) > 1) { |
|
422 | - $label_parts_index_to_prepend = count($label_parts) - 1; |
|
423 | - $label_parts[$label_parts_index_to_prepend] = 'and' . $label_parts[$label_parts_index_to_prepend]; |
|
424 | - } |
|
425 | - |
|
426 | - $pretty_label .= sprintf( |
|
427 | - esc_html_x( |
|
428 | - 'Showing messages for %s', |
|
429 | - 'A label for the messages returned in a query that are filtered by items in the query. This could be Transaction, Event, Attendee, Registration, or WP_User.', |
|
430 | - 'event_espresso' |
|
431 | - ), |
|
432 | - implode(', ', $label_parts) |
|
433 | - ); |
|
434 | - } |
|
435 | - return $pretty_label; |
|
436 | - } |
|
437 | - |
|
438 | - |
|
439 | - /** |
|
440 | - * This returns the array of expected variables for the EEI_Query_Filter methods being implemented |
|
441 | - * The array is in the format: |
|
442 | - * array( |
|
443 | - * {$field_name} => {$model_name} |
|
444 | - * ); |
|
445 | - * |
|
446 | - * @since 4.9.0 |
|
447 | - * @return array |
|
448 | - */ |
|
449 | - protected function _expected_vars_for_query_inject() |
|
450 | - { |
|
451 | - return array( |
|
452 | - '_REG_ID' => 'Registration', |
|
453 | - 'ATT_ID' => 'Attendee', |
|
454 | - 'ID' => 'WP_User', |
|
455 | - 'TXN_ID' => 'Transaction', |
|
456 | - 'EVT_ID' => 'Event', |
|
457 | - ); |
|
458 | - } |
|
459 | - |
|
460 | - |
|
461 | - /** |
|
462 | - * This returns whether EEM_Message is in debug mode or not. |
|
463 | - * Currently "debug mode" is used to control the handling of the EEM_Message::debug_only status when |
|
464 | - * generating/sending messages. Debug mode can be set by either: |
|
465 | - * 1. Sending in a value for the $set_debug argument |
|
466 | - * 2. Defining `EE_DEBUG_MESSAGES` constant in wp-config.php |
|
467 | - * 3. Overriding the above via the provided filter. |
|
468 | - * |
|
469 | - * @param bool|null $set_debug If provided, then the debug mode will be set internally until reset via the |
|
470 | - * provided boolean. When no argument is provided (default null) then the debug |
|
471 | - * mode will be returned. |
|
472 | - * @return bool true means Messages is in debug mode. false means messages system is not in debug mode. |
|
473 | - */ |
|
474 | - public static function debug($set_debug = null) |
|
475 | - { |
|
476 | - static $is_debugging = null; |
|
477 | - |
|
478 | - //initialize (use constant if set). |
|
479 | - if (is_null($set_debug) && is_null($is_debugging)) { |
|
480 | - $is_debugging = defined('EE_DEBUG_MESSAGES') && EE_DEBUG_MESSAGES; |
|
481 | - } |
|
482 | - |
|
483 | - if ( ! is_null($set_debug)) { |
|
484 | - $is_debugging = filter_var($set_debug, FILTER_VALIDATE_BOOLEAN); |
|
485 | - } |
|
486 | - |
|
487 | - //return filtered value |
|
488 | - return apply_filters('FHEE__EEM_Message__debug', $is_debugging); |
|
489 | - } |
|
27 | + /** |
|
28 | + * This priority indicates a message should be generated ASAP and queued for sending. |
|
29 | + * |
|
30 | + * @type |
|
31 | + */ |
|
32 | + const priority_medium = 20; |
|
33 | + |
|
34 | + |
|
35 | + /** |
|
36 | + * This priority indicates a message should be queued for generating. |
|
37 | + * |
|
38 | + * @type int |
|
39 | + */ |
|
40 | + const priority_low = 30; |
|
41 | + |
|
42 | + |
|
43 | + /** |
|
44 | + * indicates this message was sent at the time modified |
|
45 | + */ |
|
46 | + const status_sent = 'MSN'; |
|
47 | + |
|
48 | + |
|
49 | + /** |
|
50 | + * indicates this message is waiting to be sent |
|
51 | + */ |
|
52 | + const status_idle = 'MID'; |
|
53 | + |
|
54 | + |
|
55 | + /** |
|
56 | + * indicates an attempt was a made to send this message |
|
57 | + * at the scheduled time, but it failed at the time modified. This differs from MDO status in that it will ALWAYS |
|
58 | + * appear to the end user. |
|
59 | + */ |
|
60 | + const status_failed = 'MFL'; |
|
61 | + |
|
62 | + |
|
63 | + /** |
|
64 | + * indicates the message has been flagged for resending (at the time modified). |
|
65 | + */ |
|
66 | + const status_resend = 'MRS'; |
|
67 | + |
|
68 | + |
|
69 | + /** |
|
70 | + * indicates the message has been flagged for generation but has not been generated yet. Messages always start as |
|
71 | + * this status when added to the queue. |
|
72 | + */ |
|
73 | + const status_incomplete = 'MIC'; |
|
74 | + |
|
75 | + |
|
76 | + /** |
|
77 | + * Indicates everything was generated fine for the message, however, the messenger was unable to send. |
|
78 | + * This status means that its possible to retry sending the message. |
|
79 | + */ |
|
80 | + const status_retry = 'MRT'; |
|
81 | + |
|
82 | + |
|
83 | + /** |
|
84 | + * This is used for more informational messages that may not indicate anything is broken but still cannot be |
|
85 | + * generated or sent correctly. An example of a message that would get flagged this way would be when a not |
|
86 | + * approved message was queued for generation, but at time of generation, the attached registration(s) are |
|
87 | + * approved. So the message queued for generation is no longer valid. Messages for this status will only persist |
|
88 | + * in the db and be viewable in the message activity list table when the messages system is in debug mode. |
|
89 | + * |
|
90 | + * @see EEM_Message::debug() |
|
91 | + */ |
|
92 | + const status_debug_only = 'MDO'; |
|
93 | + |
|
94 | + |
|
95 | + /** |
|
96 | + * This status is given to messages it is processed by the messenger send method. |
|
97 | + * Messages with this status should rarely be seen in the Message List table, but if they are, that's usually |
|
98 | + * indicative of a PHP timeout or memory limit issue. |
|
99 | + */ |
|
100 | + const status_messenger_executing = 'MEX'; |
|
101 | + |
|
102 | + |
|
103 | + /** |
|
104 | + * Private constructor to prevent direct creation. |
|
105 | + * |
|
106 | + * @param string $timezone string representing the timezone we want to set for returned Date Time Strings (and |
|
107 | + * any incoming timezone data that gets saved). Note this just sends the timezone info to |
|
108 | + * the date time model field objects. Default is null (and will be assumed using the set |
|
109 | + * timezone in the 'timezone_string' wp option) |
|
110 | + * @return EEM_Message |
|
111 | + */ |
|
112 | + protected function __construct($timezone = null) |
|
113 | + { |
|
114 | + $this->singular_item = __('Message', 'event_espresso'); |
|
115 | + $this->plural_item = __('Messages', 'event_espresso'); |
|
116 | + |
|
117 | + //used for token generator |
|
118 | + EE_Registry::instance()->load_helper('URL'); |
|
119 | + |
|
120 | + $this->_tables = array( |
|
121 | + 'Message' => new EE_Primary_Table('esp_message', 'MSG_ID'), |
|
122 | + ); |
|
123 | + |
|
124 | + $allowed_priority = array( |
|
125 | + self::priority_high => __('high', 'event_espresso'), |
|
126 | + self::priority_medium => __('medium', 'event_espresso'), |
|
127 | + self::priority_low => __('low', 'event_espresso'), |
|
128 | + ); |
|
129 | + |
|
130 | + $this->_fields = array( |
|
131 | + 'Message' => array( |
|
132 | + 'MSG_ID' => new EE_Primary_Key_Int_Field('MSG_ID', __('Message ID', 'event_espresso')), |
|
133 | + 'MSG_token' => new EE_Plain_Text_Field('MSG_token', |
|
134 | + __('Unique Token used to represent this row in publicly viewable contexts (eg. a url).', |
|
135 | + 'event_espresso'), false, EEH_URL::generate_unique_token()), |
|
136 | + 'GRP_ID' => new EE_Foreign_Key_Int_Field('GRP_ID', |
|
137 | + __('Foreign key to the EEM_Message_Template_Group table.', 'event_espresso'), true, 0, |
|
138 | + 'Message_Template_Group'), |
|
139 | + 'TXN_ID' => new EE_Foreign_Key_Int_Field('TXN_ID', |
|
140 | + __('Foreign key to the related EE_Transaction. This is required to give context for regenerating the specific message', |
|
141 | + 'event_espresso'), true, 0, 'Transaction'), |
|
142 | + 'MSG_messenger' => new EE_Plain_Text_Field('MSG_messenger', |
|
143 | + __('Corresponds to the EE_messenger::name used to send this message. This will also be used to attempt any resending of the message.', |
|
144 | + 'event_espresso'), false, 'email'), |
|
145 | + 'MSG_message_type' => new EE_Plain_Text_Field('MSG_message_type', |
|
146 | + __('Corresponds to the EE_message_type::name used to generate this message.', 'event_espresso'), |
|
147 | + false, 'receipt'), |
|
148 | + 'MSG_context' => new EE_Plain_Text_Field('MSG_context', __('Context', 'event_espresso'), false), |
|
149 | + 'MSG_recipient_ID' => new EE_Foreign_Key_Int_Field('MSG_recipient_ID', |
|
150 | + __('Recipient ID', 'event_espresso'), true, null, array('Registration', 'Attendee', 'WP_User')), |
|
151 | + 'MSG_recipient_type' => new EE_Any_Foreign_Model_Name_Field('MSG_recipient_type', |
|
152 | + __('Recipient Type', 'event_espresso'), true, null, array('Registration', 'Attendee', 'WP_User')), |
|
153 | + 'MSG_content' => new EE_Maybe_Serialized_Text_Field('MSG_content', |
|
154 | + __('Content', 'event_espresso'), true, ''), |
|
155 | + 'MSG_to' => new EE_Maybe_Serialized_Text_Field('MSG_to', __('Address To', 'event_espresso'), |
|
156 | + true), |
|
157 | + 'MSG_from' => new EE_Maybe_Serialized_Text_Field('MSG_from', |
|
158 | + __('Address From', 'event_espresso'), true), |
|
159 | + 'MSG_subject' => new EE_Maybe_Serialized_Text_Field('MSG_subject', |
|
160 | + __('Subject', 'event_espresso'), true, ''), |
|
161 | + 'MSG_priority' => new EE_Enum_Integer_Field('MSG_priority', __('Priority', 'event_espresso'), |
|
162 | + false, self::priority_low, $allowed_priority), |
|
163 | + 'STS_ID' => new EE_Foreign_Key_String_Field('STS_ID', __('Status', 'event_espresso'), false, |
|
164 | + self::status_incomplete, 'Status'), |
|
165 | + 'MSG_created' => new EE_Datetime_Field('MSG_created', __('Created', 'event_espresso'), false, |
|
166 | + EE_Datetime_Field::now), |
|
167 | + 'MSG_modified' => new EE_Datetime_Field('MSG_modified', __('Modified', 'event_espresso'), true, |
|
168 | + EE_Datetime_Field::now), |
|
169 | + ), |
|
170 | + ); |
|
171 | + $this->_model_relations = array( |
|
172 | + 'Attendee' => new EE_Belongs_To_Any_Relation(), |
|
173 | + 'Registration' => new EE_Belongs_To_Any_Relation(), |
|
174 | + 'WP_User' => new EE_Belongs_To_Any_Relation(), |
|
175 | + 'Message_Template_Group' => new EE_Belongs_To_Relation(), |
|
176 | + 'Transaction' => new EE_Belongs_To_Relation(), |
|
177 | + ); |
|
178 | + parent::__construct($timezone); |
|
179 | + } |
|
180 | + |
|
181 | + |
|
182 | + /** |
|
183 | + * @return \EE_Message |
|
184 | + */ |
|
185 | + public function create_default_object() |
|
186 | + { |
|
187 | + /** @type EE_Message $message */ |
|
188 | + $message = parent::create_default_object(); |
|
189 | + if ($message instanceof EE_Message) { |
|
190 | + return EE_Message_Factory::set_messenger_and_message_type($message); |
|
191 | + } |
|
192 | + return null; |
|
193 | + } |
|
194 | + |
|
195 | + |
|
196 | + /** |
|
197 | + * @param mixed $cols_n_values |
|
198 | + * @return \EE_Message |
|
199 | + */ |
|
200 | + public function instantiate_class_from_array_or_object($cols_n_values) |
|
201 | + { |
|
202 | + /** @type EE_Message $message */ |
|
203 | + $message = parent::instantiate_class_from_array_or_object($cols_n_values); |
|
204 | + if ($message instanceof EE_Message) { |
|
205 | + return EE_Message_Factory::set_messenger_and_message_type($message); |
|
206 | + } |
|
207 | + return null; |
|
208 | + } |
|
209 | + |
|
210 | + |
|
211 | + /** |
|
212 | + * Returns whether or not a message of that type was sent for a given attendee. |
|
213 | + * |
|
214 | + * @param EE_Attendee|int $attendee |
|
215 | + * @param string $message_type the message type slug |
|
216 | + * @return boolean |
|
217 | + */ |
|
218 | + public function message_sent_for_attendee($attendee, $message_type) |
|
219 | + { |
|
220 | + $attendee_ID = EEM_Attendee::instance()->ensure_is_ID($attendee); |
|
221 | + return $this->exists(array( |
|
222 | + array( |
|
223 | + 'Attendee.ATT_ID' => $attendee_ID, |
|
224 | + 'MSG_message_type' => $message_type, |
|
225 | + 'STS_ID' => array('IN', $this->stati_indicating_sent()), |
|
226 | + ), |
|
227 | + )); |
|
228 | + } |
|
229 | + |
|
230 | + |
|
231 | + /** |
|
232 | + * Returns whether or not a message of that type was sent for a given registration |
|
233 | + * |
|
234 | + * @param EE_Registration|int $registration |
|
235 | + * @param string $message_type the message type slug |
|
236 | + * @return boolean |
|
237 | + */ |
|
238 | + public function message_sent_for_registration($registration, $message_type) |
|
239 | + { |
|
240 | + $registrationID = EEM_Registration::instance()->ensure_is_ID($registration); |
|
241 | + return $this->exists(array( |
|
242 | + array( |
|
243 | + 'Registration.REG_ID' => $registrationID, |
|
244 | + 'MSG_message_type' => $message_type, |
|
245 | + 'STS_ID' => array('IN', $this->stati_indicating_sent()), |
|
246 | + ), |
|
247 | + )); |
|
248 | + } |
|
249 | + |
|
250 | + |
|
251 | + /** |
|
252 | + * This retrieves an EE_Message object from the db matching the given token string. |
|
253 | + * |
|
254 | + * @param string $token |
|
255 | + * @return EE_Message |
|
256 | + */ |
|
257 | + public function get_one_by_token($token) |
|
258 | + { |
|
259 | + return $this->get_one(array( |
|
260 | + array( |
|
261 | + 'MSG_token' => $token, |
|
262 | + ), |
|
263 | + )); |
|
264 | + } |
|
265 | + |
|
266 | + |
|
267 | + /** |
|
268 | + * Returns stati that indicate the message HAS been sent |
|
269 | + * |
|
270 | + * @return array of strings for possible stati |
|
271 | + */ |
|
272 | + public function stati_indicating_sent() |
|
273 | + { |
|
274 | + return apply_filters('FHEE__EEM_Message__stati_indicating_sent', array(self::status_sent)); |
|
275 | + } |
|
276 | + |
|
277 | + |
|
278 | + /** |
|
279 | + * Returns stati that indicate the message is waiting to be sent. |
|
280 | + * |
|
281 | + * @return array of strings for possible stati. |
|
282 | + */ |
|
283 | + public function stati_indicating_to_send() |
|
284 | + { |
|
285 | + return apply_filters('FHEE__EEM_Message__stati_indicating_to_send', |
|
286 | + array(self::status_idle, self::status_resend)); |
|
287 | + } |
|
288 | + |
|
289 | + |
|
290 | + /** |
|
291 | + * Returns stati that indicate the message has failed sending |
|
292 | + * |
|
293 | + * @return array array of strings for possible stati. |
|
294 | + */ |
|
295 | + public function stati_indicating_failed_sending() |
|
296 | + { |
|
297 | + $failed_stati = array( |
|
298 | + self::status_failed, |
|
299 | + self::status_retry, |
|
300 | + self::status_messenger_executing, |
|
301 | + ); |
|
302 | + //if WP_DEBUG is set, then let's include debug_only fails |
|
303 | + if (WP_DEBUG) { |
|
304 | + $failed_stati[] = self::status_debug_only; |
|
305 | + } |
|
306 | + return apply_filters('FHEE__EEM_Message__stati_indicating_failed_sending', $failed_stati); |
|
307 | + } |
|
308 | + |
|
309 | + |
|
310 | + /** |
|
311 | + * Returns filterable array of all EEM_Message statuses. |
|
312 | + * |
|
313 | + * @return array |
|
314 | + */ |
|
315 | + public function all_statuses() |
|
316 | + { |
|
317 | + return apply_filters( |
|
318 | + 'FHEE__EEM_Message__all_statuses', |
|
319 | + array( |
|
320 | + EEM_Message::status_sent, |
|
321 | + EEM_Message::status_incomplete, |
|
322 | + EEM_Message::status_idle, |
|
323 | + EEM_Message::status_resend, |
|
324 | + EEM_Message::status_retry, |
|
325 | + EEM_Message::status_failed, |
|
326 | + EEM_Message::status_messenger_executing, |
|
327 | + EEM_Message::status_debug_only, |
|
328 | + ) |
|
329 | + ); |
|
330 | + } |
|
331 | + |
|
332 | + /** |
|
333 | + * Detects any specific query variables in the request and uses those to setup appropriate |
|
334 | + * filter for any queries. |
|
335 | + * |
|
336 | + * @return array |
|
337 | + */ |
|
338 | + public function filter_by_query_params() |
|
339 | + { |
|
340 | + // expected possible query_vars, the key in this array matches an expected key in the request, |
|
341 | + // the value, matches the corresponding EEM_Base child reference. |
|
342 | + $expected_vars = $this->_expected_vars_for_query_inject(); |
|
343 | + $query_params[0] = array(); |
|
344 | + foreach ($expected_vars as $request_key => $model_name) { |
|
345 | + $request_value = EE_Registry::instance()->REQ->get($request_key); |
|
346 | + if ($request_value) { |
|
347 | + //special case |
|
348 | + switch ($request_key) { |
|
349 | + case '_REG_ID' : |
|
350 | + $query_params[0]['AND**filter_by']['OR**filter_by_REG_ID'] = array( |
|
351 | + 'Transaction.Registration.REG_ID' => $request_value, |
|
352 | + ); |
|
353 | + break; |
|
354 | + case 'EVT_ID' : |
|
355 | + $query_params[0]['AND**filter_by']['OR**filter_by_EVT_ID'] = array( |
|
356 | + 'Transaction.Registration.EVT_ID' => $request_value, |
|
357 | + ); |
|
358 | + break; |
|
359 | + default : |
|
360 | + $query_params[0]['AND**filter_by']['OR**filter_by_' . $request_key][$model_name . '.' . $request_key] = $request_value; |
|
361 | + break; |
|
362 | + } |
|
363 | + } |
|
364 | + } |
|
365 | + return $query_params; |
|
366 | + } |
|
367 | + |
|
368 | + |
|
369 | + /** |
|
370 | + * @return string |
|
371 | + */ |
|
372 | + public function get_pretty_label_for_results() |
|
373 | + { |
|
374 | + $expected_vars = $this->_expected_vars_for_query_inject(); |
|
375 | + $pretty_label = ''; |
|
376 | + $label_parts = array(); |
|
377 | + foreach ($expected_vars as $request_key => $model_name) { |
|
378 | + $model = EE_Registry::instance()->load_model($model_name); |
|
379 | + if ($model_field_value = EE_Registry::instance()->REQ->get($request_key)) { |
|
380 | + switch ($request_key) { |
|
381 | + case '_REG_ID' : |
|
382 | + $label_parts[] = sprintf( |
|
383 | + esc_html__('Registration with the ID: %s', 'event_espresso'), |
|
384 | + $model_field_value |
|
385 | + ); |
|
386 | + break; |
|
387 | + case 'ATT_ID' : |
|
388 | + /** @var EE_Attendee $attendee */ |
|
389 | + $attendee = $model->get_one_by_ID($model_field_value); |
|
390 | + $label_parts[] = $attendee instanceof EE_Attendee |
|
391 | + ? sprintf(esc_html__('Attendee %s', 'event_espresso'), $attendee->full_name()) |
|
392 | + : sprintf(esc_html__('Attendee ID: %s', 'event_espresso'), $model_field_value); |
|
393 | + break; |
|
394 | + case 'ID' : |
|
395 | + /** @var EE_WP_User $wpUser */ |
|
396 | + $wpUser = $model->get_one_by_ID($model_field_value); |
|
397 | + $label_parts[] = $wpUser instanceof EE_WP_User |
|
398 | + ? sprintf(esc_html__('WP User: %s', 'event_espresso'), $wpUser->name()) |
|
399 | + : sprintf(esc_html__('WP User ID: %s', 'event_espresso'), $model_field_value); |
|
400 | + break; |
|
401 | + case 'TXN_ID' : |
|
402 | + $label_parts[] = sprintf( |
|
403 | + esc_html__('Transaction with the ID: %s', 'event_espresso'), |
|
404 | + $model_field_value |
|
405 | + ); |
|
406 | + break; |
|
407 | + case 'EVT_ID' : |
|
408 | + /** @var EE_Event $Event */ |
|
409 | + $Event = $model->get_one_by_ID($model_field_value); |
|
410 | + $label_parts[] = $Event instanceof EE_Event |
|
411 | + ? sprintf(esc_html__('for the Event: %s', 'event_espresso'), $Event->name()) |
|
412 | + : sprintf(esc_html__('for the Event with ID: %s', 'event_espresso'), $model_field_value); |
|
413 | + break; |
|
414 | + } |
|
415 | + } |
|
416 | + } |
|
417 | + |
|
418 | + if ($label_parts) { |
|
419 | + |
|
420 | + //prepend to the last element of $label_parts an "and". |
|
421 | + if (count($label_parts) > 1) { |
|
422 | + $label_parts_index_to_prepend = count($label_parts) - 1; |
|
423 | + $label_parts[$label_parts_index_to_prepend] = 'and' . $label_parts[$label_parts_index_to_prepend]; |
|
424 | + } |
|
425 | + |
|
426 | + $pretty_label .= sprintf( |
|
427 | + esc_html_x( |
|
428 | + 'Showing messages for %s', |
|
429 | + 'A label for the messages returned in a query that are filtered by items in the query. This could be Transaction, Event, Attendee, Registration, or WP_User.', |
|
430 | + 'event_espresso' |
|
431 | + ), |
|
432 | + implode(', ', $label_parts) |
|
433 | + ); |
|
434 | + } |
|
435 | + return $pretty_label; |
|
436 | + } |
|
437 | + |
|
438 | + |
|
439 | + /** |
|
440 | + * This returns the array of expected variables for the EEI_Query_Filter methods being implemented |
|
441 | + * The array is in the format: |
|
442 | + * array( |
|
443 | + * {$field_name} => {$model_name} |
|
444 | + * ); |
|
445 | + * |
|
446 | + * @since 4.9.0 |
|
447 | + * @return array |
|
448 | + */ |
|
449 | + protected function _expected_vars_for_query_inject() |
|
450 | + { |
|
451 | + return array( |
|
452 | + '_REG_ID' => 'Registration', |
|
453 | + 'ATT_ID' => 'Attendee', |
|
454 | + 'ID' => 'WP_User', |
|
455 | + 'TXN_ID' => 'Transaction', |
|
456 | + 'EVT_ID' => 'Event', |
|
457 | + ); |
|
458 | + } |
|
459 | + |
|
460 | + |
|
461 | + /** |
|
462 | + * This returns whether EEM_Message is in debug mode or not. |
|
463 | + * Currently "debug mode" is used to control the handling of the EEM_Message::debug_only status when |
|
464 | + * generating/sending messages. Debug mode can be set by either: |
|
465 | + * 1. Sending in a value for the $set_debug argument |
|
466 | + * 2. Defining `EE_DEBUG_MESSAGES` constant in wp-config.php |
|
467 | + * 3. Overriding the above via the provided filter. |
|
468 | + * |
|
469 | + * @param bool|null $set_debug If provided, then the debug mode will be set internally until reset via the |
|
470 | + * provided boolean. When no argument is provided (default null) then the debug |
|
471 | + * mode will be returned. |
|
472 | + * @return bool true means Messages is in debug mode. false means messages system is not in debug mode. |
|
473 | + */ |
|
474 | + public static function debug($set_debug = null) |
|
475 | + { |
|
476 | + static $is_debugging = null; |
|
477 | + |
|
478 | + //initialize (use constant if set). |
|
479 | + if (is_null($set_debug) && is_null($is_debugging)) { |
|
480 | + $is_debugging = defined('EE_DEBUG_MESSAGES') && EE_DEBUG_MESSAGES; |
|
481 | + } |
|
482 | + |
|
483 | + if ( ! is_null($set_debug)) { |
|
484 | + $is_debugging = filter_var($set_debug, FILTER_VALIDATE_BOOLEAN); |
|
485 | + } |
|
486 | + |
|
487 | + //return filtered value |
|
488 | + return apply_filters('FHEE__EEM_Message__debug', $is_debugging); |
|
489 | + } |
|
490 | 490 | |
491 | 491 | |
492 | 492 | } |
@@ -1,6 +1,6 @@ discard block |
||
1 | 1 | <?php |
2 | 2 | if (! defined('EVENT_ESPRESSO_VERSION')) { |
3 | - exit('NO direct script access allowed'); |
|
3 | + exit('NO direct script access allowed'); |
|
4 | 4 | } |
5 | 5 | |
6 | 6 | /** |
@@ -15,430 +15,430 @@ discard block |
||
15 | 15 | { |
16 | 16 | |
17 | 17 | |
18 | - /** |
|
19 | - * @return Messages_Admin_Page |
|
20 | - */ |
|
21 | - public function get_admin_page() |
|
22 | - { |
|
23 | - return $this->_admin_page; |
|
24 | - } |
|
25 | - |
|
26 | - |
|
27 | - protected function _setup_data() |
|
28 | - { |
|
29 | - $this->_data = $this->_get_messages($this->_per_page, $this->_view); |
|
30 | - $this->_all_data_count = $this->_get_messages($this->_per_page, $this->_view, true); |
|
31 | - } |
|
32 | - |
|
33 | - |
|
34 | - protected function _set_properties() |
|
35 | - { |
|
36 | - $this->_wp_list_args = array( |
|
37 | - 'singular' => __('Message', 'event_espresso'), |
|
38 | - 'plural' => __('Messages', 'event_espresso'), |
|
39 | - 'ajax' => true, |
|
40 | - 'screen' => $this->get_admin_page()->get_current_screen()->id, |
|
41 | - ); |
|
42 | - |
|
43 | - $this->_columns = array( |
|
44 | - 'cb' => '<input type="checkbox" />', |
|
45 | - 'to' => __('To', 'event_espresso'), |
|
46 | - 'from' => __('From', 'event_espresso'), |
|
47 | - 'messenger' => __('Messenger', 'event_espresso'), |
|
48 | - 'message_type' => __('Message Type', 'event_espresso'), |
|
49 | - 'context' => __('Context', 'event_espresso'), |
|
50 | - 'modified' => __('Modified', 'event_espresso'), |
|
51 | - 'action' => __('Actions', 'event_espresso'), |
|
52 | - 'msg_id' => __('ID', 'event_espresso'), |
|
53 | - ); |
|
54 | - |
|
55 | - $this->_sortable_columns = array( |
|
56 | - 'modified' => array('MSG_modified' => true), |
|
57 | - 'message_type' => array('MSG_message_type' => false), |
|
58 | - 'messenger' => array('MSG_messenger' => false), |
|
59 | - 'to' => array('MSG_to' => false), |
|
60 | - 'from' => array('MSG_from' => false), |
|
61 | - 'context' => array('MSG_context' => false), |
|
62 | - 'msg_id' => array('MSG_ID', false), |
|
63 | - ); |
|
64 | - |
|
65 | - $this->_primary_column = 'to'; |
|
66 | - |
|
67 | - $this->_hidden_columns = array( |
|
68 | - 'msg_id', |
|
69 | - ); |
|
70 | - } |
|
71 | - |
|
72 | - |
|
73 | - /** |
|
74 | - * This simply sets up the row class for the table rows. |
|
75 | - * Allows for easier overriding of child methods for setting up sorting. |
|
76 | - * |
|
77 | - * @param object $item the current item |
|
78 | - * @return string |
|
79 | - */ |
|
80 | - protected function _get_row_class($item) |
|
81 | - { |
|
82 | - $class = parent::_get_row_class($item); |
|
83 | - //add status class |
|
84 | - $class .= ' ee-status-strip msg-status-' . $item->STS_ID(); |
|
85 | - if ($this->_has_checkbox_column) { |
|
86 | - $class .= ' has-checkbox-column'; |
|
87 | - } |
|
88 | - return $class; |
|
89 | - } |
|
90 | - |
|
91 | - |
|
92 | - /** |
|
93 | - * _get_table_filters |
|
94 | - * We use this to assemble and return any filters that are associated with this table that help further refine what |
|
95 | - * get's shown in the table. |
|
96 | - * |
|
97 | - * @abstract |
|
98 | - * @access protected |
|
99 | - * @return string |
|
100 | - * @throws \EE_Error |
|
101 | - */ |
|
102 | - protected function _get_table_filters() |
|
103 | - { |
|
104 | - $filters = array(); |
|
105 | - |
|
106 | - //get select_inputs |
|
107 | - $select_inputs = array( |
|
108 | - $this->_get_messengers_dropdown_filter(), |
|
109 | - $this->_get_message_types_dropdown_filter(), |
|
110 | - $this->_get_contexts_for_message_types_dropdown_filter(), |
|
111 | - ); |
|
112 | - |
|
113 | - //set filters to select inputs if they aren't empty |
|
114 | - foreach ($select_inputs as $select_input) { |
|
115 | - if ($select_input) { |
|
116 | - $filters[] = $select_input; |
|
117 | - } |
|
118 | - } |
|
119 | - return $filters; |
|
120 | - } |
|
121 | - |
|
122 | - |
|
123 | - protected function _add_view_counts() |
|
124 | - { |
|
125 | - foreach ($this->_views as $view => $args) { |
|
126 | - $this->_views[$view]['count'] = $this->_get_messages($this->_per_page, $view, true, true); |
|
127 | - } |
|
128 | - } |
|
129 | - |
|
130 | - |
|
131 | - /** |
|
132 | - * @param EE_Message $message |
|
133 | - * @return string checkbox |
|
134 | - * @throws \EE_Error |
|
135 | - */ |
|
136 | - public function column_cb($message) |
|
137 | - { |
|
138 | - return sprintf('<input type="checkbox" name="MSG_ID[%s]" value="1" />', $message->ID()); |
|
139 | - } |
|
140 | - |
|
141 | - |
|
142 | - /** |
|
143 | - * @param EE_Message $message |
|
144 | - * @return string |
|
145 | - * @throws \EE_Error |
|
146 | - */ |
|
147 | - public function column_msg_id(EE_Message $message) |
|
148 | - { |
|
149 | - return $message->ID(); |
|
150 | - } |
|
151 | - |
|
152 | - |
|
153 | - /** |
|
154 | - * @param EE_Message $message |
|
155 | - * @return string The recipient of the message |
|
156 | - * @throws \EE_Error |
|
157 | - */ |
|
158 | - public function column_to(EE_Message $message) |
|
159 | - { |
|
160 | - EE_Registry::instance()->load_helper('URL'); |
|
161 | - $actions = array(); |
|
162 | - $actions['delete'] = '<a href="' |
|
163 | - . EEH_URL::add_query_args_and_nonce( |
|
164 | - array( |
|
165 | - 'page' => 'espresso_messages', |
|
166 | - 'action' => 'delete_ee_message', |
|
167 | - 'MSG_ID' => $message->ID(), |
|
168 | - ), |
|
169 | - admin_url('admin.php') |
|
170 | - ) |
|
171 | - . '">' . __('Delete', 'event_espresso') . '</a>'; |
|
172 | - return esc_html($message->to()) . $this->row_actions($actions); |
|
173 | - } |
|
174 | - |
|
175 | - |
|
176 | - /** |
|
177 | - * @param EE_Message $message |
|
178 | - * @return string The sender of the message |
|
179 | - */ |
|
180 | - public function column_from(EE_Message $message) |
|
181 | - { |
|
182 | - return esc_html($message->from()); |
|
183 | - } |
|
184 | - |
|
185 | - |
|
186 | - /** |
|
187 | - * @param EE_Message $message |
|
188 | - * @return string The messenger used to send the message. |
|
189 | - */ |
|
190 | - public function column_messenger(EE_Message $message) |
|
191 | - { |
|
192 | - return ucwords($message->messenger_label()); |
|
193 | - } |
|
194 | - |
|
195 | - |
|
196 | - /** |
|
197 | - * @param EE_Message $message |
|
198 | - * @return string The message type used to generate the message. |
|
199 | - */ |
|
200 | - public function column_message_type(EE_Message $message) |
|
201 | - { |
|
202 | - return ucwords($message->message_type_label()); |
|
203 | - } |
|
204 | - |
|
205 | - |
|
206 | - /** |
|
207 | - * @param EE_Message $message |
|
208 | - * @return string The context the message was generated for. |
|
209 | - */ |
|
210 | - public function column_context(EE_Message $message) |
|
211 | - { |
|
212 | - return $message->context_label(); |
|
213 | - } |
|
214 | - |
|
215 | - |
|
216 | - /** |
|
217 | - * @param EE_Message $message |
|
218 | - * @return string The timestamp when this message was last modified. |
|
219 | - */ |
|
220 | - public function column_modified(EE_Message $message) |
|
221 | - { |
|
222 | - return $message->modified(); |
|
223 | - } |
|
224 | - |
|
225 | - |
|
226 | - /** |
|
227 | - * @param EE_Message $message |
|
228 | - * @return string Actions that can be done on the current message. |
|
229 | - */ |
|
230 | - public function column_action(EE_Message $message) |
|
231 | - { |
|
232 | - EE_Registry::instance()->load_helper('MSG_Template'); |
|
233 | - $action_links = array( |
|
234 | - 'view' => EEH_MSG_Template::get_message_action_link('view', $message), |
|
235 | - 'error' => EEH_MSG_Template::get_message_action_link('error', $message), |
|
236 | - 'generate_now' => EEH_MSG_Template::get_message_action_link('generate_now', $message), |
|
237 | - 'send_now' => EEH_MSG_Template::get_message_action_link('send_now', $message), |
|
238 | - 'queue_for_resending' => EEH_MSG_Template::get_message_action_link('queue_for_resending', $message), |
|
239 | - 'view_transaction' => EEH_MSG_Template::get_message_action_link('view_transaction', $message), |
|
240 | - ); |
|
241 | - $content = ''; |
|
242 | - switch ($message->STS_ID()) { |
|
243 | - case EEM_Message::status_sent : |
|
244 | - $content = $action_links['view'] . $action_links['queue_for_resending'] . $action_links['view_transaction']; |
|
245 | - break; |
|
246 | - case EEM_Message::status_resend : |
|
247 | - $content = $action_links['view'] . $action_links['send_now'] . $action_links['view_transaction']; |
|
248 | - break; |
|
249 | - case EEM_Message::status_retry : |
|
250 | - $content = $action_links['view'] . $action_links['send_now'] . $action_links['error'] . $action_links['view_transaction']; |
|
251 | - break; |
|
252 | - case EEM_Message::status_failed : |
|
253 | - case EEM_Message::status_debug_only : |
|
254 | - $content = $action_links['error'] . $action_links['view_transaction']; |
|
255 | - break; |
|
256 | - case EEM_Message::status_idle : |
|
257 | - $content = $action_links['view'] . $action_links['send_now'] . $action_links['view_transaction']; |
|
258 | - break; |
|
259 | - case EEM_Message::status_incomplete; |
|
260 | - $content = $action_links['generate_now'] . $action_links['view_transaction']; |
|
261 | - break; |
|
262 | - } |
|
263 | - return $content; |
|
264 | - } |
|
265 | - |
|
266 | - |
|
267 | - /** |
|
268 | - * Retrieve the EE_Message objects for the list table. |
|
269 | - * |
|
270 | - * @param int $perpage The number of items per page |
|
271 | - * @param string $view The view items are being retrieved for |
|
272 | - * @param bool $count Whether to just return a count or not. |
|
273 | - * @param bool $all Disregard any paging info (no limit on data returned). |
|
274 | - * @return int|EE_Message[] |
|
275 | - * @throws \EE_Error |
|
276 | - */ |
|
277 | - protected function _get_messages($perpage = 10, $view = 'all', $count = false, $all = false) |
|
278 | - { |
|
279 | - |
|
280 | - $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged']) |
|
281 | - ? $this->_req_data['paged'] |
|
282 | - : 1; |
|
283 | - |
|
284 | - $per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage']) |
|
285 | - ? $this->_req_data['perpage'] |
|
286 | - : $perpage; |
|
287 | - |
|
288 | - $offset = ($current_page - 1) * $per_page; |
|
289 | - $limit = $all || $count ? null : array($offset, $per_page); |
|
290 | - $query_params = array( |
|
291 | - 'order_by' => empty($this->_req_data['orderby']) ? 'MSG_modified' : $this->_req_data['orderby'], |
|
292 | - 'order' => empty($this->_req_data['order']) ? 'DESC' : $this->_req_data['order'], |
|
293 | - 'limit' => $limit, |
|
294 | - ); |
|
295 | - |
|
296 | - /** |
|
297 | - * Any filters coming in from other routes? |
|
298 | - */ |
|
299 | - if (isset($this->_req_data['filterby'])) { |
|
300 | - $query_params = array_merge($query_params, EEM_Message::instance()->filter_by_query_params()); |
|
301 | - if ( ! $count) { |
|
302 | - $query_params['group_by'] = 'MSG_ID'; |
|
303 | - } |
|
304 | - } |
|
305 | - |
|
306 | - //view conditionals |
|
307 | - if ($view !== 'all' && $count && $all) { |
|
308 | - $query_params[0]['AND*view_conditional'] = array( |
|
309 | - 'STS_ID' => strtoupper($view), |
|
310 | - ); |
|
311 | - } |
|
312 | - |
|
313 | - if (! $all && ! empty($this->_req_data['status']) && $this->_req_data['status'] !== 'all') { |
|
314 | - $query_params[0]['AND*view_conditional'] = $this->_req_data === EEM_Message::status_failed |
|
315 | - ? array( |
|
316 | - 'STS_ID' => array( |
|
317 | - 'IN', |
|
318 | - array(EEM_Message::status_failed, EEM_Message::status_messenger_executing) |
|
319 | - ) |
|
320 | - ) |
|
321 | - : array( 'STS_ID' => strtoupper($this->_req_data['status']) ); |
|
322 | - } |
|
323 | - |
|
324 | - if (! $all && ! empty($this->_req_data['s'])) { |
|
325 | - $search_string = '%' . $this->_req_data['s'] . '%'; |
|
326 | - $query_params[0]['OR'] = array( |
|
327 | - 'MSG_to' => array('LIKE', $search_string), |
|
328 | - 'MSG_from' => array('LIKE', $search_string), |
|
329 | - 'MSG_subject' => array('LIKE', $search_string), |
|
330 | - 'MSG_content' => array('LIKE', $search_string), |
|
331 | - ); |
|
332 | - } |
|
333 | - |
|
334 | - //account for debug only status. We don't show Messages with the EEM_Message::status_debug_only to clients when |
|
335 | - //the messages system is in debug mode. |
|
336 | - //Note: for backward compat with previous iterations, this is necessary because there may be EEM_Message::status_debug_only |
|
337 | - //messages in the database. |
|
338 | - if (! EEM_Message::debug()) { |
|
339 | - $query_params[0]['AND*debug_only_conditional'] = array( |
|
340 | - 'STS_ID' => array('!=', EEM_Message::status_debug_only), |
|
341 | - ); |
|
342 | - } |
|
343 | - |
|
344 | - //account for filters |
|
345 | - if (! $all |
|
346 | - && isset($this->_req_data['ee_messenger_filter_by']) |
|
347 | - && $this->_req_data['ee_messenger_filter_by'] !== 'none_selected' |
|
348 | - ) { |
|
349 | - $query_params[0]['AND*messenger_filter'] = array( |
|
350 | - 'MSG_messenger' => $this->_req_data['ee_messenger_filter_by'], |
|
351 | - ); |
|
352 | - } |
|
353 | - if (! $all |
|
354 | - && ! empty($this->_req_data['ee_message_type_filter_by']) |
|
355 | - && $this->_req_data['ee_message_type_filter_by'] !== 'none_selected' |
|
356 | - ) { |
|
357 | - $query_params[0]['AND*message_type_filter'] = array( |
|
358 | - 'MSG_message_type' => $this->_req_data['ee_message_type_filter_by'], |
|
359 | - ); |
|
360 | - } |
|
361 | - |
|
362 | - if (! $all |
|
363 | - && ! empty($this->_req_data['ee_context_filter_by']) |
|
364 | - && $this->_req_data['ee_context_filter_by'] !== 'none_selected' |
|
365 | - ) { |
|
366 | - $query_params[0]['AND*context_filter'] = array( |
|
367 | - 'MSG_context' => array('IN', explode(',', $this->_req_data['ee_context_filter_by'])), |
|
368 | - ); |
|
369 | - } |
|
370 | - |
|
371 | - return $count |
|
372 | - /** @type int */ |
|
373 | - ? EEM_Message::instance()->count($query_params, null, true) |
|
374 | - /** @type EE_Message[] */ |
|
375 | - : EEM_Message::instance()->get_all($query_params); |
|
376 | - } |
|
377 | - |
|
378 | - |
|
379 | - /** |
|
380 | - * Generate dropdown filter select input for messengers. |
|
381 | - * |
|
382 | - * @return string |
|
383 | - */ |
|
384 | - protected function _get_messengers_dropdown_filter() |
|
385 | - { |
|
386 | - $messenger_options = array(); |
|
387 | - $active_messages_grouped_by_messenger = EEM_Message::instance()->get_all(array('group_by' => 'MSG_messenger')); |
|
388 | - |
|
389 | - //setup array of messenger options |
|
390 | - foreach ($active_messages_grouped_by_messenger as $active_message) { |
|
391 | - if ($active_message instanceof EE_Message) { |
|
392 | - $messenger_options[$active_message->messenger()] = ucwords($active_message->messenger_label()); |
|
393 | - } |
|
394 | - } |
|
395 | - return $this->get_admin_page()->get_messengers_select_input($messenger_options); |
|
396 | - } |
|
397 | - |
|
398 | - |
|
399 | - /** |
|
400 | - * Generate dropdown filter select input for message types |
|
401 | - * |
|
402 | - * @return string |
|
403 | - */ |
|
404 | - protected function _get_message_types_dropdown_filter() |
|
405 | - { |
|
406 | - $message_type_options = array(); |
|
407 | - $active_messages_grouped_by_message_type = EEM_Message::instance()->get_all(array('group_by' => 'MSG_message_type')); |
|
408 | - |
|
409 | - //setup array of message type options |
|
410 | - foreach ($active_messages_grouped_by_message_type as $active_message) { |
|
411 | - if ($active_message instanceof EE_Message) { |
|
412 | - $message_type_options[$active_message->message_type()] = ucwords($active_message->message_type_label()); |
|
413 | - } |
|
414 | - } |
|
415 | - return $this->get_admin_page()->get_message_types_select_input($message_type_options); |
|
416 | - } |
|
417 | - |
|
418 | - |
|
419 | - /** |
|
420 | - * Generate dropdown filter select input for message type contexts |
|
421 | - * |
|
422 | - * @return string |
|
423 | - */ |
|
424 | - protected function _get_contexts_for_message_types_dropdown_filter() |
|
425 | - { |
|
426 | - $context_options = array(); |
|
427 | - $active_messages_grouped_by_context = EEM_Message::instance()->get_all(array('group_by' => 'MSG_context')); |
|
428 | - |
|
429 | - //setup array of context options |
|
430 | - foreach ($active_messages_grouped_by_context as $active_message) { |
|
431 | - if ($active_message instanceof EE_Message) { |
|
432 | - $message_type = $active_message->message_type_object(); |
|
433 | - if ($message_type instanceof EE_message_type) { |
|
434 | - foreach ($message_type->get_contexts() as $context => $context_details) { |
|
435 | - if (isset($context_details['label'])) { |
|
436 | - $context_options[$context] = $context_details['label']; |
|
437 | - } |
|
438 | - } |
|
439 | - } |
|
440 | - } |
|
441 | - } |
|
442 | - return $this->get_admin_page()->get_contexts_for_message_types_select_input($context_options); |
|
443 | - } |
|
18 | + /** |
|
19 | + * @return Messages_Admin_Page |
|
20 | + */ |
|
21 | + public function get_admin_page() |
|
22 | + { |
|
23 | + return $this->_admin_page; |
|
24 | + } |
|
25 | + |
|
26 | + |
|
27 | + protected function _setup_data() |
|
28 | + { |
|
29 | + $this->_data = $this->_get_messages($this->_per_page, $this->_view); |
|
30 | + $this->_all_data_count = $this->_get_messages($this->_per_page, $this->_view, true); |
|
31 | + } |
|
32 | + |
|
33 | + |
|
34 | + protected function _set_properties() |
|
35 | + { |
|
36 | + $this->_wp_list_args = array( |
|
37 | + 'singular' => __('Message', 'event_espresso'), |
|
38 | + 'plural' => __('Messages', 'event_espresso'), |
|
39 | + 'ajax' => true, |
|
40 | + 'screen' => $this->get_admin_page()->get_current_screen()->id, |
|
41 | + ); |
|
42 | + |
|
43 | + $this->_columns = array( |
|
44 | + 'cb' => '<input type="checkbox" />', |
|
45 | + 'to' => __('To', 'event_espresso'), |
|
46 | + 'from' => __('From', 'event_espresso'), |
|
47 | + 'messenger' => __('Messenger', 'event_espresso'), |
|
48 | + 'message_type' => __('Message Type', 'event_espresso'), |
|
49 | + 'context' => __('Context', 'event_espresso'), |
|
50 | + 'modified' => __('Modified', 'event_espresso'), |
|
51 | + 'action' => __('Actions', 'event_espresso'), |
|
52 | + 'msg_id' => __('ID', 'event_espresso'), |
|
53 | + ); |
|
54 | + |
|
55 | + $this->_sortable_columns = array( |
|
56 | + 'modified' => array('MSG_modified' => true), |
|
57 | + 'message_type' => array('MSG_message_type' => false), |
|
58 | + 'messenger' => array('MSG_messenger' => false), |
|
59 | + 'to' => array('MSG_to' => false), |
|
60 | + 'from' => array('MSG_from' => false), |
|
61 | + 'context' => array('MSG_context' => false), |
|
62 | + 'msg_id' => array('MSG_ID', false), |
|
63 | + ); |
|
64 | + |
|
65 | + $this->_primary_column = 'to'; |
|
66 | + |
|
67 | + $this->_hidden_columns = array( |
|
68 | + 'msg_id', |
|
69 | + ); |
|
70 | + } |
|
71 | + |
|
72 | + |
|
73 | + /** |
|
74 | + * This simply sets up the row class for the table rows. |
|
75 | + * Allows for easier overriding of child methods for setting up sorting. |
|
76 | + * |
|
77 | + * @param object $item the current item |
|
78 | + * @return string |
|
79 | + */ |
|
80 | + protected function _get_row_class($item) |
|
81 | + { |
|
82 | + $class = parent::_get_row_class($item); |
|
83 | + //add status class |
|
84 | + $class .= ' ee-status-strip msg-status-' . $item->STS_ID(); |
|
85 | + if ($this->_has_checkbox_column) { |
|
86 | + $class .= ' has-checkbox-column'; |
|
87 | + } |
|
88 | + return $class; |
|
89 | + } |
|
90 | + |
|
91 | + |
|
92 | + /** |
|
93 | + * _get_table_filters |
|
94 | + * We use this to assemble and return any filters that are associated with this table that help further refine what |
|
95 | + * get's shown in the table. |
|
96 | + * |
|
97 | + * @abstract |
|
98 | + * @access protected |
|
99 | + * @return string |
|
100 | + * @throws \EE_Error |
|
101 | + */ |
|
102 | + protected function _get_table_filters() |
|
103 | + { |
|
104 | + $filters = array(); |
|
105 | + |
|
106 | + //get select_inputs |
|
107 | + $select_inputs = array( |
|
108 | + $this->_get_messengers_dropdown_filter(), |
|
109 | + $this->_get_message_types_dropdown_filter(), |
|
110 | + $this->_get_contexts_for_message_types_dropdown_filter(), |
|
111 | + ); |
|
112 | + |
|
113 | + //set filters to select inputs if they aren't empty |
|
114 | + foreach ($select_inputs as $select_input) { |
|
115 | + if ($select_input) { |
|
116 | + $filters[] = $select_input; |
|
117 | + } |
|
118 | + } |
|
119 | + return $filters; |
|
120 | + } |
|
121 | + |
|
122 | + |
|
123 | + protected function _add_view_counts() |
|
124 | + { |
|
125 | + foreach ($this->_views as $view => $args) { |
|
126 | + $this->_views[$view]['count'] = $this->_get_messages($this->_per_page, $view, true, true); |
|
127 | + } |
|
128 | + } |
|
129 | + |
|
130 | + |
|
131 | + /** |
|
132 | + * @param EE_Message $message |
|
133 | + * @return string checkbox |
|
134 | + * @throws \EE_Error |
|
135 | + */ |
|
136 | + public function column_cb($message) |
|
137 | + { |
|
138 | + return sprintf('<input type="checkbox" name="MSG_ID[%s]" value="1" />', $message->ID()); |
|
139 | + } |
|
140 | + |
|
141 | + |
|
142 | + /** |
|
143 | + * @param EE_Message $message |
|
144 | + * @return string |
|
145 | + * @throws \EE_Error |
|
146 | + */ |
|
147 | + public function column_msg_id(EE_Message $message) |
|
148 | + { |
|
149 | + return $message->ID(); |
|
150 | + } |
|
151 | + |
|
152 | + |
|
153 | + /** |
|
154 | + * @param EE_Message $message |
|
155 | + * @return string The recipient of the message |
|
156 | + * @throws \EE_Error |
|
157 | + */ |
|
158 | + public function column_to(EE_Message $message) |
|
159 | + { |
|
160 | + EE_Registry::instance()->load_helper('URL'); |
|
161 | + $actions = array(); |
|
162 | + $actions['delete'] = '<a href="' |
|
163 | + . EEH_URL::add_query_args_and_nonce( |
|
164 | + array( |
|
165 | + 'page' => 'espresso_messages', |
|
166 | + 'action' => 'delete_ee_message', |
|
167 | + 'MSG_ID' => $message->ID(), |
|
168 | + ), |
|
169 | + admin_url('admin.php') |
|
170 | + ) |
|
171 | + . '">' . __('Delete', 'event_espresso') . '</a>'; |
|
172 | + return esc_html($message->to()) . $this->row_actions($actions); |
|
173 | + } |
|
174 | + |
|
175 | + |
|
176 | + /** |
|
177 | + * @param EE_Message $message |
|
178 | + * @return string The sender of the message |
|
179 | + */ |
|
180 | + public function column_from(EE_Message $message) |
|
181 | + { |
|
182 | + return esc_html($message->from()); |
|
183 | + } |
|
184 | + |
|
185 | + |
|
186 | + /** |
|
187 | + * @param EE_Message $message |
|
188 | + * @return string The messenger used to send the message. |
|
189 | + */ |
|
190 | + public function column_messenger(EE_Message $message) |
|
191 | + { |
|
192 | + return ucwords($message->messenger_label()); |
|
193 | + } |
|
194 | + |
|
195 | + |
|
196 | + /** |
|
197 | + * @param EE_Message $message |
|
198 | + * @return string The message type used to generate the message. |
|
199 | + */ |
|
200 | + public function column_message_type(EE_Message $message) |
|
201 | + { |
|
202 | + return ucwords($message->message_type_label()); |
|
203 | + } |
|
204 | + |
|
205 | + |
|
206 | + /** |
|
207 | + * @param EE_Message $message |
|
208 | + * @return string The context the message was generated for. |
|
209 | + */ |
|
210 | + public function column_context(EE_Message $message) |
|
211 | + { |
|
212 | + return $message->context_label(); |
|
213 | + } |
|
214 | + |
|
215 | + |
|
216 | + /** |
|
217 | + * @param EE_Message $message |
|
218 | + * @return string The timestamp when this message was last modified. |
|
219 | + */ |
|
220 | + public function column_modified(EE_Message $message) |
|
221 | + { |
|
222 | + return $message->modified(); |
|
223 | + } |
|
224 | + |
|
225 | + |
|
226 | + /** |
|
227 | + * @param EE_Message $message |
|
228 | + * @return string Actions that can be done on the current message. |
|
229 | + */ |
|
230 | + public function column_action(EE_Message $message) |
|
231 | + { |
|
232 | + EE_Registry::instance()->load_helper('MSG_Template'); |
|
233 | + $action_links = array( |
|
234 | + 'view' => EEH_MSG_Template::get_message_action_link('view', $message), |
|
235 | + 'error' => EEH_MSG_Template::get_message_action_link('error', $message), |
|
236 | + 'generate_now' => EEH_MSG_Template::get_message_action_link('generate_now', $message), |
|
237 | + 'send_now' => EEH_MSG_Template::get_message_action_link('send_now', $message), |
|
238 | + 'queue_for_resending' => EEH_MSG_Template::get_message_action_link('queue_for_resending', $message), |
|
239 | + 'view_transaction' => EEH_MSG_Template::get_message_action_link('view_transaction', $message), |
|
240 | + ); |
|
241 | + $content = ''; |
|
242 | + switch ($message->STS_ID()) { |
|
243 | + case EEM_Message::status_sent : |
|
244 | + $content = $action_links['view'] . $action_links['queue_for_resending'] . $action_links['view_transaction']; |
|
245 | + break; |
|
246 | + case EEM_Message::status_resend : |
|
247 | + $content = $action_links['view'] . $action_links['send_now'] . $action_links['view_transaction']; |
|
248 | + break; |
|
249 | + case EEM_Message::status_retry : |
|
250 | + $content = $action_links['view'] . $action_links['send_now'] . $action_links['error'] . $action_links['view_transaction']; |
|
251 | + break; |
|
252 | + case EEM_Message::status_failed : |
|
253 | + case EEM_Message::status_debug_only : |
|
254 | + $content = $action_links['error'] . $action_links['view_transaction']; |
|
255 | + break; |
|
256 | + case EEM_Message::status_idle : |
|
257 | + $content = $action_links['view'] . $action_links['send_now'] . $action_links['view_transaction']; |
|
258 | + break; |
|
259 | + case EEM_Message::status_incomplete; |
|
260 | + $content = $action_links['generate_now'] . $action_links['view_transaction']; |
|
261 | + break; |
|
262 | + } |
|
263 | + return $content; |
|
264 | + } |
|
265 | + |
|
266 | + |
|
267 | + /** |
|
268 | + * Retrieve the EE_Message objects for the list table. |
|
269 | + * |
|
270 | + * @param int $perpage The number of items per page |
|
271 | + * @param string $view The view items are being retrieved for |
|
272 | + * @param bool $count Whether to just return a count or not. |
|
273 | + * @param bool $all Disregard any paging info (no limit on data returned). |
|
274 | + * @return int|EE_Message[] |
|
275 | + * @throws \EE_Error |
|
276 | + */ |
|
277 | + protected function _get_messages($perpage = 10, $view = 'all', $count = false, $all = false) |
|
278 | + { |
|
279 | + |
|
280 | + $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged']) |
|
281 | + ? $this->_req_data['paged'] |
|
282 | + : 1; |
|
283 | + |
|
284 | + $per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage']) |
|
285 | + ? $this->_req_data['perpage'] |
|
286 | + : $perpage; |
|
287 | + |
|
288 | + $offset = ($current_page - 1) * $per_page; |
|
289 | + $limit = $all || $count ? null : array($offset, $per_page); |
|
290 | + $query_params = array( |
|
291 | + 'order_by' => empty($this->_req_data['orderby']) ? 'MSG_modified' : $this->_req_data['orderby'], |
|
292 | + 'order' => empty($this->_req_data['order']) ? 'DESC' : $this->_req_data['order'], |
|
293 | + 'limit' => $limit, |
|
294 | + ); |
|
295 | + |
|
296 | + /** |
|
297 | + * Any filters coming in from other routes? |
|
298 | + */ |
|
299 | + if (isset($this->_req_data['filterby'])) { |
|
300 | + $query_params = array_merge($query_params, EEM_Message::instance()->filter_by_query_params()); |
|
301 | + if ( ! $count) { |
|
302 | + $query_params['group_by'] = 'MSG_ID'; |
|
303 | + } |
|
304 | + } |
|
305 | + |
|
306 | + //view conditionals |
|
307 | + if ($view !== 'all' && $count && $all) { |
|
308 | + $query_params[0]['AND*view_conditional'] = array( |
|
309 | + 'STS_ID' => strtoupper($view), |
|
310 | + ); |
|
311 | + } |
|
312 | + |
|
313 | + if (! $all && ! empty($this->_req_data['status']) && $this->_req_data['status'] !== 'all') { |
|
314 | + $query_params[0]['AND*view_conditional'] = $this->_req_data === EEM_Message::status_failed |
|
315 | + ? array( |
|
316 | + 'STS_ID' => array( |
|
317 | + 'IN', |
|
318 | + array(EEM_Message::status_failed, EEM_Message::status_messenger_executing) |
|
319 | + ) |
|
320 | + ) |
|
321 | + : array( 'STS_ID' => strtoupper($this->_req_data['status']) ); |
|
322 | + } |
|
323 | + |
|
324 | + if (! $all && ! empty($this->_req_data['s'])) { |
|
325 | + $search_string = '%' . $this->_req_data['s'] . '%'; |
|
326 | + $query_params[0]['OR'] = array( |
|
327 | + 'MSG_to' => array('LIKE', $search_string), |
|
328 | + 'MSG_from' => array('LIKE', $search_string), |
|
329 | + 'MSG_subject' => array('LIKE', $search_string), |
|
330 | + 'MSG_content' => array('LIKE', $search_string), |
|
331 | + ); |
|
332 | + } |
|
333 | + |
|
334 | + //account for debug only status. We don't show Messages with the EEM_Message::status_debug_only to clients when |
|
335 | + //the messages system is in debug mode. |
|
336 | + //Note: for backward compat with previous iterations, this is necessary because there may be EEM_Message::status_debug_only |
|
337 | + //messages in the database. |
|
338 | + if (! EEM_Message::debug()) { |
|
339 | + $query_params[0]['AND*debug_only_conditional'] = array( |
|
340 | + 'STS_ID' => array('!=', EEM_Message::status_debug_only), |
|
341 | + ); |
|
342 | + } |
|
343 | + |
|
344 | + //account for filters |
|
345 | + if (! $all |
|
346 | + && isset($this->_req_data['ee_messenger_filter_by']) |
|
347 | + && $this->_req_data['ee_messenger_filter_by'] !== 'none_selected' |
|
348 | + ) { |
|
349 | + $query_params[0]['AND*messenger_filter'] = array( |
|
350 | + 'MSG_messenger' => $this->_req_data['ee_messenger_filter_by'], |
|
351 | + ); |
|
352 | + } |
|
353 | + if (! $all |
|
354 | + && ! empty($this->_req_data['ee_message_type_filter_by']) |
|
355 | + && $this->_req_data['ee_message_type_filter_by'] !== 'none_selected' |
|
356 | + ) { |
|
357 | + $query_params[0]['AND*message_type_filter'] = array( |
|
358 | + 'MSG_message_type' => $this->_req_data['ee_message_type_filter_by'], |
|
359 | + ); |
|
360 | + } |
|
361 | + |
|
362 | + if (! $all |
|
363 | + && ! empty($this->_req_data['ee_context_filter_by']) |
|
364 | + && $this->_req_data['ee_context_filter_by'] !== 'none_selected' |
|
365 | + ) { |
|
366 | + $query_params[0]['AND*context_filter'] = array( |
|
367 | + 'MSG_context' => array('IN', explode(',', $this->_req_data['ee_context_filter_by'])), |
|
368 | + ); |
|
369 | + } |
|
370 | + |
|
371 | + return $count |
|
372 | + /** @type int */ |
|
373 | + ? EEM_Message::instance()->count($query_params, null, true) |
|
374 | + /** @type EE_Message[] */ |
|
375 | + : EEM_Message::instance()->get_all($query_params); |
|
376 | + } |
|
377 | + |
|
378 | + |
|
379 | + /** |
|
380 | + * Generate dropdown filter select input for messengers. |
|
381 | + * |
|
382 | + * @return string |
|
383 | + */ |
|
384 | + protected function _get_messengers_dropdown_filter() |
|
385 | + { |
|
386 | + $messenger_options = array(); |
|
387 | + $active_messages_grouped_by_messenger = EEM_Message::instance()->get_all(array('group_by' => 'MSG_messenger')); |
|
388 | + |
|
389 | + //setup array of messenger options |
|
390 | + foreach ($active_messages_grouped_by_messenger as $active_message) { |
|
391 | + if ($active_message instanceof EE_Message) { |
|
392 | + $messenger_options[$active_message->messenger()] = ucwords($active_message->messenger_label()); |
|
393 | + } |
|
394 | + } |
|
395 | + return $this->get_admin_page()->get_messengers_select_input($messenger_options); |
|
396 | + } |
|
397 | + |
|
398 | + |
|
399 | + /** |
|
400 | + * Generate dropdown filter select input for message types |
|
401 | + * |
|
402 | + * @return string |
|
403 | + */ |
|
404 | + protected function _get_message_types_dropdown_filter() |
|
405 | + { |
|
406 | + $message_type_options = array(); |
|
407 | + $active_messages_grouped_by_message_type = EEM_Message::instance()->get_all(array('group_by' => 'MSG_message_type')); |
|
408 | + |
|
409 | + //setup array of message type options |
|
410 | + foreach ($active_messages_grouped_by_message_type as $active_message) { |
|
411 | + if ($active_message instanceof EE_Message) { |
|
412 | + $message_type_options[$active_message->message_type()] = ucwords($active_message->message_type_label()); |
|
413 | + } |
|
414 | + } |
|
415 | + return $this->get_admin_page()->get_message_types_select_input($message_type_options); |
|
416 | + } |
|
417 | + |
|
418 | + |
|
419 | + /** |
|
420 | + * Generate dropdown filter select input for message type contexts |
|
421 | + * |
|
422 | + * @return string |
|
423 | + */ |
|
424 | + protected function _get_contexts_for_message_types_dropdown_filter() |
|
425 | + { |
|
426 | + $context_options = array(); |
|
427 | + $active_messages_grouped_by_context = EEM_Message::instance()->get_all(array('group_by' => 'MSG_context')); |
|
428 | + |
|
429 | + //setup array of context options |
|
430 | + foreach ($active_messages_grouped_by_context as $active_message) { |
|
431 | + if ($active_message instanceof EE_Message) { |
|
432 | + $message_type = $active_message->message_type_object(); |
|
433 | + if ($message_type instanceof EE_message_type) { |
|
434 | + foreach ($message_type->get_contexts() as $context => $context_details) { |
|
435 | + if (isset($context_details['label'])) { |
|
436 | + $context_options[$context] = $context_details['label']; |
|
437 | + } |
|
438 | + } |
|
439 | + } |
|
440 | + } |
|
441 | + } |
|
442 | + return $this->get_admin_page()->get_contexts_for_message_types_select_input($context_options); |
|
443 | + } |
|
444 | 444 | } //end EE_Message_List_Table class |
445 | 445 | \ No newline at end of file |
@@ -1,5 +1,5 @@ discard block |
||
1 | 1 | <?php |
2 | -if (! defined('EVENT_ESPRESSO_VERSION')) { |
|
2 | +if ( ! defined('EVENT_ESPRESSO_VERSION')) { |
|
3 | 3 | exit('NO direct script access allowed'); |
4 | 4 | } |
5 | 5 | |
@@ -81,7 +81,7 @@ discard block |
||
81 | 81 | { |
82 | 82 | $class = parent::_get_row_class($item); |
83 | 83 | //add status class |
84 | - $class .= ' ee-status-strip msg-status-' . $item->STS_ID(); |
|
84 | + $class .= ' ee-status-strip msg-status-'.$item->STS_ID(); |
|
85 | 85 | if ($this->_has_checkbox_column) { |
86 | 86 | $class .= ' has-checkbox-column'; |
87 | 87 | } |
@@ -168,8 +168,8 @@ discard block |
||
168 | 168 | ), |
169 | 169 | admin_url('admin.php') |
170 | 170 | ) |
171 | - . '">' . __('Delete', 'event_espresso') . '</a>'; |
|
172 | - return esc_html($message->to()) . $this->row_actions($actions); |
|
171 | + . '">'.__('Delete', 'event_espresso').'</a>'; |
|
172 | + return esc_html($message->to()).$this->row_actions($actions); |
|
173 | 173 | } |
174 | 174 | |
175 | 175 | |
@@ -238,26 +238,26 @@ discard block |
||
238 | 238 | 'queue_for_resending' => EEH_MSG_Template::get_message_action_link('queue_for_resending', $message), |
239 | 239 | 'view_transaction' => EEH_MSG_Template::get_message_action_link('view_transaction', $message), |
240 | 240 | ); |
241 | - $content = ''; |
|
241 | + $content = ''; |
|
242 | 242 | switch ($message->STS_ID()) { |
243 | 243 | case EEM_Message::status_sent : |
244 | - $content = $action_links['view'] . $action_links['queue_for_resending'] . $action_links['view_transaction']; |
|
244 | + $content = $action_links['view'].$action_links['queue_for_resending'].$action_links['view_transaction']; |
|
245 | 245 | break; |
246 | 246 | case EEM_Message::status_resend : |
247 | - $content = $action_links['view'] . $action_links['send_now'] . $action_links['view_transaction']; |
|
247 | + $content = $action_links['view'].$action_links['send_now'].$action_links['view_transaction']; |
|
248 | 248 | break; |
249 | 249 | case EEM_Message::status_retry : |
250 | - $content = $action_links['view'] . $action_links['send_now'] . $action_links['error'] . $action_links['view_transaction']; |
|
250 | + $content = $action_links['view'].$action_links['send_now'].$action_links['error'].$action_links['view_transaction']; |
|
251 | 251 | break; |
252 | 252 | case EEM_Message::status_failed : |
253 | 253 | case EEM_Message::status_debug_only : |
254 | - $content = $action_links['error'] . $action_links['view_transaction']; |
|
254 | + $content = $action_links['error'].$action_links['view_transaction']; |
|
255 | 255 | break; |
256 | 256 | case EEM_Message::status_idle : |
257 | - $content = $action_links['view'] . $action_links['send_now'] . $action_links['view_transaction']; |
|
257 | + $content = $action_links['view'].$action_links['send_now'].$action_links['view_transaction']; |
|
258 | 258 | break; |
259 | 259 | case EEM_Message::status_incomplete; |
260 | - $content = $action_links['generate_now'] . $action_links['view_transaction']; |
|
260 | + $content = $action_links['generate_now'].$action_links['view_transaction']; |
|
261 | 261 | break; |
262 | 262 | } |
263 | 263 | return $content; |
@@ -310,7 +310,7 @@ discard block |
||
310 | 310 | ); |
311 | 311 | } |
312 | 312 | |
313 | - if (! $all && ! empty($this->_req_data['status']) && $this->_req_data['status'] !== 'all') { |
|
313 | + if ( ! $all && ! empty($this->_req_data['status']) && $this->_req_data['status'] !== 'all') { |
|
314 | 314 | $query_params[0]['AND*view_conditional'] = $this->_req_data === EEM_Message::status_failed |
315 | 315 | ? array( |
316 | 316 | 'STS_ID' => array( |
@@ -318,11 +318,11 @@ discard block |
||
318 | 318 | array(EEM_Message::status_failed, EEM_Message::status_messenger_executing) |
319 | 319 | ) |
320 | 320 | ) |
321 | - : array( 'STS_ID' => strtoupper($this->_req_data['status']) ); |
|
321 | + : array('STS_ID' => strtoupper($this->_req_data['status'])); |
|
322 | 322 | } |
323 | 323 | |
324 | - if (! $all && ! empty($this->_req_data['s'])) { |
|
325 | - $search_string = '%' . $this->_req_data['s'] . '%'; |
|
324 | + if ( ! $all && ! empty($this->_req_data['s'])) { |
|
325 | + $search_string = '%'.$this->_req_data['s'].'%'; |
|
326 | 326 | $query_params[0]['OR'] = array( |
327 | 327 | 'MSG_to' => array('LIKE', $search_string), |
328 | 328 | 'MSG_from' => array('LIKE', $search_string), |
@@ -335,14 +335,14 @@ discard block |
||
335 | 335 | //the messages system is in debug mode. |
336 | 336 | //Note: for backward compat with previous iterations, this is necessary because there may be EEM_Message::status_debug_only |
337 | 337 | //messages in the database. |
338 | - if (! EEM_Message::debug()) { |
|
338 | + if ( ! EEM_Message::debug()) { |
|
339 | 339 | $query_params[0]['AND*debug_only_conditional'] = array( |
340 | 340 | 'STS_ID' => array('!=', EEM_Message::status_debug_only), |
341 | 341 | ); |
342 | 342 | } |
343 | 343 | |
344 | 344 | //account for filters |
345 | - if (! $all |
|
345 | + if ( ! $all |
|
346 | 346 | && isset($this->_req_data['ee_messenger_filter_by']) |
347 | 347 | && $this->_req_data['ee_messenger_filter_by'] !== 'none_selected' |
348 | 348 | ) { |
@@ -350,7 +350,7 @@ discard block |
||
350 | 350 | 'MSG_messenger' => $this->_req_data['ee_messenger_filter_by'], |
351 | 351 | ); |
352 | 352 | } |
353 | - if (! $all |
|
353 | + if ( ! $all |
|
354 | 354 | && ! empty($this->_req_data['ee_message_type_filter_by']) |
355 | 355 | && $this->_req_data['ee_message_type_filter_by'] !== 'none_selected' |
356 | 356 | ) { |
@@ -359,7 +359,7 @@ discard block |
||
359 | 359 | ); |
360 | 360 | } |
361 | 361 | |
362 | - if (! $all |
|
362 | + if ( ! $all |
|
363 | 363 | && ! empty($this->_req_data['ee_context_filter_by']) |
364 | 364 | && $this->_req_data['ee_context_filter_by'] !== 'none_selected' |
365 | 365 | ) { |
@@ -1,5 +1,5 @@ discard block |
||
1 | 1 | <?php |
2 | -if (! defined('EVENT_ESPRESSO_VERSION')) { |
|
2 | +if ( ! defined('EVENT_ESPRESSO_VERSION')) { |
|
3 | 3 | exit('No direct script access allowed'); |
4 | 4 | } |
5 | 5 | |
@@ -38,7 +38,7 @@ discard block |
||
38 | 38 | { |
39 | 39 | $attached = parent::add($message); |
40 | 40 | //ensure $info is an array if not already |
41 | - $info = $info === null ? $info = array() : (array)$info; |
|
41 | + $info = $info === null ? $info = array() : (array) $info; |
|
42 | 42 | $data = $this->_init_data($info, $attached, $message); |
43 | 43 | if ($attached) { |
44 | 44 | $this->set_info($message, $data); |
@@ -103,10 +103,10 @@ discard block |
||
103 | 103 | { |
104 | 104 | $save_tracking = array('updated' => 0, 'notupdated' => 0, 'errors' => array()); |
105 | 105 | |
106 | - if (! $do_hooks_only) { |
|
106 | + if ( ! $do_hooks_only) { |
|
107 | 107 | $this->rewind(); |
108 | 108 | //exit early if there is nothing to save. |
109 | - if (! $this->count() > 0) { |
|
109 | + if ( ! $this->count() > 0) { |
|
110 | 110 | return $save_tracking; |
111 | 111 | } |
112 | 112 |
@@ -1,6 +1,6 @@ discard block |
||
1 | 1 | <?php |
2 | 2 | if (! defined('EVENT_ESPRESSO_VERSION')) { |
3 | - exit('No direct script access allowed'); |
|
3 | + exit('No direct script access allowed'); |
|
4 | 4 | } |
5 | 5 | |
6 | 6 | |
@@ -16,256 +16,256 @@ discard block |
||
16 | 16 | { |
17 | 17 | |
18 | 18 | |
19 | - /** |
|
20 | - * EE_Message_Repository constructor |
|
21 | - */ |
|
22 | - public function __construct() |
|
23 | - { |
|
24 | - $this->interface = 'EE_Message'; |
|
25 | - parent::__construct(); |
|
26 | - } |
|
27 | - |
|
28 | - |
|
29 | - /** |
|
30 | - * Add the EE_Message to the repository. |
|
31 | - * This also ensures that the MSG_token is saves as a part of the info for retrieval. |
|
32 | - * |
|
33 | - * @param EE_Message $message |
|
34 | - * @param mixed $info Any included data is saved in the attached object info array indexed by 'data' |
|
35 | - * @return bool |
|
36 | - */ |
|
37 | - public function add($message, $info = null) |
|
38 | - { |
|
39 | - $attached = parent::add($message); |
|
40 | - //ensure $info is an array if not already |
|
41 | - $info = $info === null ? $info = array() : (array)$info; |
|
42 | - $data = $this->_init_data($info, $attached, $message); |
|
43 | - if ($attached) { |
|
44 | - $this->set_info($message, $data); |
|
45 | - } |
|
46 | - return $attached; |
|
47 | - } |
|
48 | - |
|
49 | - |
|
50 | - /** |
|
51 | - * Initializes the data from the incoming info. |
|
52 | - * |
|
53 | - * @param array $info incoming data. |
|
54 | - * @param bool $attached Indicates whether the object was attached successfully. |
|
55 | - * @param EE_Message $message |
|
56 | - * @return array |
|
57 | - */ |
|
58 | - protected function _init_data($info, $attached, $message) |
|
59 | - { |
|
60 | - $data = array( |
|
61 | - 'test_send' => false, |
|
62 | - 'preview' => false, |
|
63 | - 'data_handler_class_name' => '', |
|
64 | - 'data' => array( |
|
65 | - 'MSG_generation_data' => array(), |
|
66 | - ), |
|
67 | - ); |
|
68 | - if (isset($info['preview'])) { |
|
69 | - $data['preview'] = $info['preview']; |
|
70 | - unset($info['preview']); |
|
71 | - } |
|
72 | - if (isset($info['test_send'])) { |
|
73 | - $data['test_send'] = $info['test_send']; |
|
74 | - unset($info['test_send']); |
|
75 | - } |
|
76 | - if (isset($info['data_handler_class_name'])) { |
|
77 | - $data['data_handler_class_name'] = $info['data_handler_class_name']; |
|
78 | - unset($info['data_handler_class_name']); |
|
79 | - } |
|
80 | - if ($attached && $message->STS_ID() === EEM_Message::status_incomplete) { |
|
81 | - $generation_data = isset($info['MSG_generation_data']) ? $info['MSG_generation_data'] : array(); |
|
82 | - //if data isn't in $info...let's see if its available via the message object |
|
83 | - $generation_data = ! $generation_data ? $message->get_generation_data() : $generation_data; |
|
84 | - //still empty then let's just use info |
|
85 | - $generation_data = ! $generation_data ? $info : $generation_data; |
|
86 | - $data['data']['MSG_generation_data'] = $generation_data; |
|
87 | - } |
|
88 | - return $data; |
|
89 | - } |
|
90 | - |
|
91 | - |
|
92 | - /** |
|
93 | - * Save all EE_Message objects to the db. |
|
94 | - * |
|
95 | - * @param bool $do_hooks_only When true, only the hooks related to saving are fired. |
|
96 | - * @return array array( |
|
97 | - * 'updated' => 0, //count of how many messages updated |
|
98 | - * 'notupdated' => 0, //count of how many messages not updated. |
|
99 | - * 'errors' => array( $token ), //array of message object tokens that had errors in saving |
|
100 | - * ) |
|
101 | - */ |
|
102 | - public function saveAll($do_hooks_only = false) |
|
103 | - { |
|
104 | - $save_tracking = array('updated' => 0, 'notupdated' => 0, 'errors' => array()); |
|
105 | - |
|
106 | - if (! $do_hooks_only) { |
|
107 | - $this->rewind(); |
|
108 | - //exit early if there is nothing to save. |
|
109 | - if (! $this->count() > 0) { |
|
110 | - return $save_tracking; |
|
111 | - } |
|
112 | - |
|
113 | - while ($this->valid()) { |
|
114 | - $saved = $this->current()->save(); |
|
115 | - if ($saved === false) { |
|
116 | - $save_tracking['errors'][] = $this->current()->MSG_token(); |
|
117 | - } elseif ($saved) { |
|
118 | - $save_tracking['updated']++; |
|
119 | - } else { |
|
120 | - $save_tracking['notupdated']++; |
|
121 | - } |
|
122 | - //maybe persist generation data if this is an incomplete EE_Message. |
|
123 | - $this->_maybe_persist_attached_data(); |
|
124 | - |
|
125 | - $this->next(); |
|
126 | - } |
|
127 | - } |
|
128 | - do_action('AHEE__EE_Message_Repository__saveAll__after', $save_tracking, $this, $do_hooks_only); |
|
129 | - return $save_tracking; |
|
130 | - } |
|
131 | - |
|
132 | - |
|
133 | - /** |
|
134 | - * Retrieves a EE_Message from the repository that matches the given token. |
|
135 | - * |
|
136 | - * @param string $token Token. |
|
137 | - * @return EE_Message | null |
|
138 | - */ |
|
139 | - public function getMessageByToken($token) |
|
140 | - { |
|
141 | - $this->rewind(); |
|
142 | - while ($this->valid()) { |
|
143 | - if ($this->current()->MSG_token() === $token) { |
|
144 | - $message = $this->current(); |
|
145 | - $this->rewind(); |
|
146 | - return $message; |
|
147 | - } |
|
148 | - $this->next(); |
|
149 | - } |
|
150 | - return null; |
|
151 | - } |
|
152 | - |
|
153 | - |
|
154 | - /** |
|
155 | - * This retrieves any data required for generation that may be saved with the current EE_Message in storage. |
|
156 | - * |
|
157 | - * @return array(); |
|
158 | - */ |
|
159 | - public function get_generation_data() |
|
160 | - { |
|
161 | - //first verify we're at a valid iterator point. |
|
162 | - if ( ! $this->valid()) { |
|
163 | - return array(); |
|
164 | - } |
|
165 | - $info = $this->getInfo(); |
|
166 | - return isset($info['data']) && isset($info['data']['MSG_generation_data']) ? $info['data']['MSG_generation_data'] : array(); |
|
167 | - } |
|
168 | - |
|
169 | - |
|
170 | - /** |
|
171 | - * Retrieves the data_handler_class_name or reference associated with the current EE_Message object in the iterator. |
|
172 | - * |
|
173 | - * @return string |
|
174 | - */ |
|
175 | - public function get_data_handler() |
|
176 | - { |
|
177 | - if ( ! $this->valid()) { |
|
178 | - return ''; |
|
179 | - } |
|
180 | - $info = $this->getInfo(); |
|
181 | - return isset($info['data_handler_class_name']) ? $info['data_handler_class_name'] : ''; |
|
182 | - } |
|
183 | - |
|
184 | - |
|
185 | - /** |
|
186 | - * Returns whether this EE_Message is for a preview or not. |
|
187 | - * |
|
188 | - * @return bool |
|
189 | - */ |
|
190 | - public function is_preview() |
|
191 | - { |
|
192 | - if ( ! $this->valid()) { |
|
193 | - return false; |
|
194 | - } |
|
195 | - $info = $this->getInfo(); |
|
196 | - return $info['preview']; |
|
197 | - } |
|
198 | - |
|
199 | - |
|
200 | - /** |
|
201 | - * Returns whether the current message pointed to is for a test send. |
|
202 | - * |
|
203 | - * @return bool |
|
204 | - */ |
|
205 | - public function is_test_send() |
|
206 | - { |
|
207 | - if ( ! $this->valid()) { |
|
208 | - return false; |
|
209 | - } |
|
210 | - $info = $this->getInfo(); |
|
211 | - return $info['test_send']; |
|
212 | - } |
|
213 | - |
|
214 | - |
|
215 | - /** |
|
216 | - * This checks if the current EE_Message in the iterator is incomplete. If it is, then |
|
217 | - * data is attached for later retrieval (batch generation). |
|
218 | - */ |
|
219 | - protected function _maybe_persist_attached_data() |
|
220 | - { |
|
221 | - if ( ! $this->valid()) { |
|
222 | - return; |
|
223 | - } |
|
224 | - |
|
225 | - $info = $this->getInfo(); |
|
226 | - $data_handler_class_name = isset($info['data_handler_class_name']) ? $info['data_handler_class_name'] : ''; |
|
227 | - $data = isset($info['data']) && isset($info['data']['MSG_generation_data']) ? $info['data']['MSG_generation_data'] : array(); |
|
228 | - if ($data && $this->current()->STS_ID() === EEM_Message::status_incomplete) { |
|
229 | - $this->current()->set_generation_data($data); |
|
230 | - $this->current()->set_field_or_extra_meta('data_handler_class_name', $data_handler_class_name); |
|
231 | - } |
|
232 | - } |
|
233 | - |
|
234 | - |
|
235 | - /** |
|
236 | - * This method returns a count of messages in the repository that have a given priority. |
|
237 | - * |
|
238 | - * @param int $priority the priority that is being filtered for the count. |
|
239 | - * @param array $status the optional status(es) that will also be filtered by when priority matches. |
|
240 | - * @return int count of messages in the queue matching the conditions. |
|
241 | - */ |
|
242 | - public function count_by_priority_and_status($priority, $status = array()) |
|
243 | - { |
|
244 | - if ( ! empty($status)) { |
|
245 | - $status = is_array($status) ? $status : array($status); |
|
246 | - } |
|
247 | - |
|
248 | - $count = 0; |
|
249 | - $this->rewind(); |
|
250 | - while ($this->valid()) { |
|
251 | - if ($this->current()->priority() === $priority && (($status && in_array($this->current()->STS_ID(), |
|
252 | - $status)) || ! $status) |
|
253 | - ) { |
|
254 | - $count++; |
|
255 | - } |
|
256 | - $this->next(); |
|
257 | - } |
|
258 | - return $count; |
|
259 | - } |
|
260 | - |
|
261 | - |
|
262 | - /** |
|
263 | - * @return EE_Message |
|
264 | - */ |
|
265 | - public function current() |
|
266 | - { |
|
267 | - return parent::current(); |
|
268 | - } |
|
19 | + /** |
|
20 | + * EE_Message_Repository constructor |
|
21 | + */ |
|
22 | + public function __construct() |
|
23 | + { |
|
24 | + $this->interface = 'EE_Message'; |
|
25 | + parent::__construct(); |
|
26 | + } |
|
27 | + |
|
28 | + |
|
29 | + /** |
|
30 | + * Add the EE_Message to the repository. |
|
31 | + * This also ensures that the MSG_token is saves as a part of the info for retrieval. |
|
32 | + * |
|
33 | + * @param EE_Message $message |
|
34 | + * @param mixed $info Any included data is saved in the attached object info array indexed by 'data' |
|
35 | + * @return bool |
|
36 | + */ |
|
37 | + public function add($message, $info = null) |
|
38 | + { |
|
39 | + $attached = parent::add($message); |
|
40 | + //ensure $info is an array if not already |
|
41 | + $info = $info === null ? $info = array() : (array)$info; |
|
42 | + $data = $this->_init_data($info, $attached, $message); |
|
43 | + if ($attached) { |
|
44 | + $this->set_info($message, $data); |
|
45 | + } |
|
46 | + return $attached; |
|
47 | + } |
|
48 | + |
|
49 | + |
|
50 | + /** |
|
51 | + * Initializes the data from the incoming info. |
|
52 | + * |
|
53 | + * @param array $info incoming data. |
|
54 | + * @param bool $attached Indicates whether the object was attached successfully. |
|
55 | + * @param EE_Message $message |
|
56 | + * @return array |
|
57 | + */ |
|
58 | + protected function _init_data($info, $attached, $message) |
|
59 | + { |
|
60 | + $data = array( |
|
61 | + 'test_send' => false, |
|
62 | + 'preview' => false, |
|
63 | + 'data_handler_class_name' => '', |
|
64 | + 'data' => array( |
|
65 | + 'MSG_generation_data' => array(), |
|
66 | + ), |
|
67 | + ); |
|
68 | + if (isset($info['preview'])) { |
|
69 | + $data['preview'] = $info['preview']; |
|
70 | + unset($info['preview']); |
|
71 | + } |
|
72 | + if (isset($info['test_send'])) { |
|
73 | + $data['test_send'] = $info['test_send']; |
|
74 | + unset($info['test_send']); |
|
75 | + } |
|
76 | + if (isset($info['data_handler_class_name'])) { |
|
77 | + $data['data_handler_class_name'] = $info['data_handler_class_name']; |
|
78 | + unset($info['data_handler_class_name']); |
|
79 | + } |
|
80 | + if ($attached && $message->STS_ID() === EEM_Message::status_incomplete) { |
|
81 | + $generation_data = isset($info['MSG_generation_data']) ? $info['MSG_generation_data'] : array(); |
|
82 | + //if data isn't in $info...let's see if its available via the message object |
|
83 | + $generation_data = ! $generation_data ? $message->get_generation_data() : $generation_data; |
|
84 | + //still empty then let's just use info |
|
85 | + $generation_data = ! $generation_data ? $info : $generation_data; |
|
86 | + $data['data']['MSG_generation_data'] = $generation_data; |
|
87 | + } |
|
88 | + return $data; |
|
89 | + } |
|
90 | + |
|
91 | + |
|
92 | + /** |
|
93 | + * Save all EE_Message objects to the db. |
|
94 | + * |
|
95 | + * @param bool $do_hooks_only When true, only the hooks related to saving are fired. |
|
96 | + * @return array array( |
|
97 | + * 'updated' => 0, //count of how many messages updated |
|
98 | + * 'notupdated' => 0, //count of how many messages not updated. |
|
99 | + * 'errors' => array( $token ), //array of message object tokens that had errors in saving |
|
100 | + * ) |
|
101 | + */ |
|
102 | + public function saveAll($do_hooks_only = false) |
|
103 | + { |
|
104 | + $save_tracking = array('updated' => 0, 'notupdated' => 0, 'errors' => array()); |
|
105 | + |
|
106 | + if (! $do_hooks_only) { |
|
107 | + $this->rewind(); |
|
108 | + //exit early if there is nothing to save. |
|
109 | + if (! $this->count() > 0) { |
|
110 | + return $save_tracking; |
|
111 | + } |
|
112 | + |
|
113 | + while ($this->valid()) { |
|
114 | + $saved = $this->current()->save(); |
|
115 | + if ($saved === false) { |
|
116 | + $save_tracking['errors'][] = $this->current()->MSG_token(); |
|
117 | + } elseif ($saved) { |
|
118 | + $save_tracking['updated']++; |
|
119 | + } else { |
|
120 | + $save_tracking['notupdated']++; |
|
121 | + } |
|
122 | + //maybe persist generation data if this is an incomplete EE_Message. |
|
123 | + $this->_maybe_persist_attached_data(); |
|
124 | + |
|
125 | + $this->next(); |
|
126 | + } |
|
127 | + } |
|
128 | + do_action('AHEE__EE_Message_Repository__saveAll__after', $save_tracking, $this, $do_hooks_only); |
|
129 | + return $save_tracking; |
|
130 | + } |
|
131 | + |
|
132 | + |
|
133 | + /** |
|
134 | + * Retrieves a EE_Message from the repository that matches the given token. |
|
135 | + * |
|
136 | + * @param string $token Token. |
|
137 | + * @return EE_Message | null |
|
138 | + */ |
|
139 | + public function getMessageByToken($token) |
|
140 | + { |
|
141 | + $this->rewind(); |
|
142 | + while ($this->valid()) { |
|
143 | + if ($this->current()->MSG_token() === $token) { |
|
144 | + $message = $this->current(); |
|
145 | + $this->rewind(); |
|
146 | + return $message; |
|
147 | + } |
|
148 | + $this->next(); |
|
149 | + } |
|
150 | + return null; |
|
151 | + } |
|
152 | + |
|
153 | + |
|
154 | + /** |
|
155 | + * This retrieves any data required for generation that may be saved with the current EE_Message in storage. |
|
156 | + * |
|
157 | + * @return array(); |
|
158 | + */ |
|
159 | + public function get_generation_data() |
|
160 | + { |
|
161 | + //first verify we're at a valid iterator point. |
|
162 | + if ( ! $this->valid()) { |
|
163 | + return array(); |
|
164 | + } |
|
165 | + $info = $this->getInfo(); |
|
166 | + return isset($info['data']) && isset($info['data']['MSG_generation_data']) ? $info['data']['MSG_generation_data'] : array(); |
|
167 | + } |
|
168 | + |
|
169 | + |
|
170 | + /** |
|
171 | + * Retrieves the data_handler_class_name or reference associated with the current EE_Message object in the iterator. |
|
172 | + * |
|
173 | + * @return string |
|
174 | + */ |
|
175 | + public function get_data_handler() |
|
176 | + { |
|
177 | + if ( ! $this->valid()) { |
|
178 | + return ''; |
|
179 | + } |
|
180 | + $info = $this->getInfo(); |
|
181 | + return isset($info['data_handler_class_name']) ? $info['data_handler_class_name'] : ''; |
|
182 | + } |
|
183 | + |
|
184 | + |
|
185 | + /** |
|
186 | + * Returns whether this EE_Message is for a preview or not. |
|
187 | + * |
|
188 | + * @return bool |
|
189 | + */ |
|
190 | + public function is_preview() |
|
191 | + { |
|
192 | + if ( ! $this->valid()) { |
|
193 | + return false; |
|
194 | + } |
|
195 | + $info = $this->getInfo(); |
|
196 | + return $info['preview']; |
|
197 | + } |
|
198 | + |
|
199 | + |
|
200 | + /** |
|
201 | + * Returns whether the current message pointed to is for a test send. |
|
202 | + * |
|
203 | + * @return bool |
|
204 | + */ |
|
205 | + public function is_test_send() |
|
206 | + { |
|
207 | + if ( ! $this->valid()) { |
|
208 | + return false; |
|
209 | + } |
|
210 | + $info = $this->getInfo(); |
|
211 | + return $info['test_send']; |
|
212 | + } |
|
213 | + |
|
214 | + |
|
215 | + /** |
|
216 | + * This checks if the current EE_Message in the iterator is incomplete. If it is, then |
|
217 | + * data is attached for later retrieval (batch generation). |
|
218 | + */ |
|
219 | + protected function _maybe_persist_attached_data() |
|
220 | + { |
|
221 | + if ( ! $this->valid()) { |
|
222 | + return; |
|
223 | + } |
|
224 | + |
|
225 | + $info = $this->getInfo(); |
|
226 | + $data_handler_class_name = isset($info['data_handler_class_name']) ? $info['data_handler_class_name'] : ''; |
|
227 | + $data = isset($info['data']) && isset($info['data']['MSG_generation_data']) ? $info['data']['MSG_generation_data'] : array(); |
|
228 | + if ($data && $this->current()->STS_ID() === EEM_Message::status_incomplete) { |
|
229 | + $this->current()->set_generation_data($data); |
|
230 | + $this->current()->set_field_or_extra_meta('data_handler_class_name', $data_handler_class_name); |
|
231 | + } |
|
232 | + } |
|
233 | + |
|
234 | + |
|
235 | + /** |
|
236 | + * This method returns a count of messages in the repository that have a given priority. |
|
237 | + * |
|
238 | + * @param int $priority the priority that is being filtered for the count. |
|
239 | + * @param array $status the optional status(es) that will also be filtered by when priority matches. |
|
240 | + * @return int count of messages in the queue matching the conditions. |
|
241 | + */ |
|
242 | + public function count_by_priority_and_status($priority, $status = array()) |
|
243 | + { |
|
244 | + if ( ! empty($status)) { |
|
245 | + $status = is_array($status) ? $status : array($status); |
|
246 | + } |
|
247 | + |
|
248 | + $count = 0; |
|
249 | + $this->rewind(); |
|
250 | + while ($this->valid()) { |
|
251 | + if ($this->current()->priority() === $priority && (($status && in_array($this->current()->STS_ID(), |
|
252 | + $status)) || ! $status) |
|
253 | + ) { |
|
254 | + $count++; |
|
255 | + } |
|
256 | + $this->next(); |
|
257 | + } |
|
258 | + return $count; |
|
259 | + } |
|
260 | + |
|
261 | + |
|
262 | + /** |
|
263 | + * @return EE_Message |
|
264 | + */ |
|
265 | + public function current() |
|
266 | + { |
|
267 | + return parent::current(); |
|
268 | + } |
|
269 | 269 | |
270 | 270 | |
271 | 271 | } |
272 | 272 | \ No newline at end of file |
@@ -73,7 +73,7 @@ discard block |
||
73 | 73 | 'context' => 'normal' |
74 | 74 | ), |
75 | 75 | |
76 | - );/**/ |
|
76 | + ); /**/ |
|
77 | 77 | |
78 | 78 | $this->_remove_metaboxes = array( |
79 | 79 | 0 => array( |
@@ -103,16 +103,16 @@ discard block |
||
103 | 103 | $this->_date_format_strings['time'] = isset($this->_date_format_strings['time']) ? $this->_date_format_strings['time'] : null; |
104 | 104 | |
105 | 105 | //validate format strings |
106 | - $format_validation = EEH_DTT_Helper::validate_format_string($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']); |
|
106 | + $format_validation = EEH_DTT_Helper::validate_format_string($this->_date_format_strings['date'].' '.$this->_date_format_strings['time']); |
|
107 | 107 | if (is_array($format_validation)) { |
108 | - $msg = '<p>' . sprintf(__('The format "%s" was likely added via a filter and is invalid for the following reasons:', |
|
108 | + $msg = '<p>'.sprintf(__('The format "%s" was likely added via a filter and is invalid for the following reasons:', |
|
109 | 109 | 'event_espresso'), |
110 | - $this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']) . '</p><ul>'; |
|
110 | + $this->_date_format_strings['date'].' '.$this->_date_format_strings['time']).'</p><ul>'; |
|
111 | 111 | foreach ($format_validation as $error) { |
112 | - $msg .= '<li>' . $error . '</li>'; |
|
112 | + $msg .= '<li>'.$error.'</li>'; |
|
113 | 113 | } |
114 | - $msg .= '</ul></p><p>' . sprintf(__('%sPlease note that your date and time formats have been reset to "Y-m-d" and "h:i a" respectively.%s', |
|
115 | - 'event_espresso'), '<span style="color:#D54E21;">', '</span>') . '</p>'; |
|
114 | + $msg .= '</ul></p><p>'.sprintf(__('%sPlease note that your date and time formats have been reset to "Y-m-d" and "h:i a" respectively.%s', |
|
115 | + 'event_espresso'), '<span style="color:#D54E21;">', '</span>').'</p>'; |
|
116 | 116 | EE_Error::add_attention($msg, __FILE__, __FUNCTION__, __LINE__); |
117 | 117 | $this->_date_format_strings = array( |
118 | 118 | 'date' => 'Y-m-d', |
@@ -124,11 +124,11 @@ discard block |
||
124 | 124 | $this->_scripts_styles = array( |
125 | 125 | 'registers' => array( |
126 | 126 | 'ee-tickets-datetimes-css' => array( |
127 | - 'url' => PRICING_ASSETS_URL . 'event-tickets-datetimes.css', |
|
127 | + 'url' => PRICING_ASSETS_URL.'event-tickets-datetimes.css', |
|
128 | 128 | 'type' => 'css' |
129 | 129 | ), |
130 | 130 | 'ee-dtt-ticket-metabox' => array( |
131 | - 'url' => PRICING_ASSETS_URL . 'ee-datetime-ticket-metabox.js', |
|
131 | + 'url' => PRICING_ASSETS_URL.'ee-datetime-ticket-metabox.js', |
|
132 | 132 | 'depends' => array('ee-datepicker', 'ee-dialog', 'underscore') |
133 | 133 | ) |
134 | 134 | ), |
@@ -147,21 +147,21 @@ discard block |
||
147 | 147 | 'event_espresso'), |
148 | 148 | 'after_warning' => __('In order to trash this datetime you must first make sure the above ticket(s) are assigned to other datetimes.', |
149 | 149 | 'event_espresso'), |
150 | - 'cancel_button' => '<button class="button-secondary ee-modal-cancel">' . __('Cancel', |
|
151 | - 'event_espresso') . '</button>', |
|
152 | - 'close_button' => '<button class="button-secondary ee-modal-cancel">' . __('Close', |
|
153 | - 'event_espresso') . '</button>', |
|
150 | + 'cancel_button' => '<button class="button-secondary ee-modal-cancel">'.__('Cancel', |
|
151 | + 'event_espresso').'</button>', |
|
152 | + 'close_button' => '<button class="button-secondary ee-modal-cancel">'.__('Close', |
|
153 | + 'event_espresso').'</button>', |
|
154 | 154 | 'single_warning_from_tkt' => __('The Datetime you are attempting to unassign from this ticket is the only remaining datetime for this ticket. Tickets must always have at least one datetime assigned to them.', |
155 | 155 | 'event_espresso'), |
156 | 156 | 'single_warning_from_dtt' => __('The ticket you are attempting to unassign from this datetime cannot be unassigned because the datetime is the only remaining datetime for the ticket. Tickets must always have at least one datetime assigned to them.', |
157 | 157 | 'event_espresso'), |
158 | - 'dismiss_button' => '<button class="button-secondary ee-modal-cancel">' . __('Dismiss', |
|
159 | - 'event_espresso') . '</button>' |
|
158 | + 'dismiss_button' => '<button class="button-secondary ee-modal-cancel">'.__('Dismiss', |
|
159 | + 'event_espresso').'</button>' |
|
160 | 160 | ), |
161 | 161 | 'DTT_ERROR_MSG' => array( |
162 | 162 | 'no_ticket_name' => __('General Admission', 'event_espresso'), |
163 | - 'dismiss_button' => '<div class="save-cancel-button-container"><button class="button-secondary ee-modal-cancel">' . __('Dismiss', |
|
164 | - 'event_espresso') . '</button></div>' |
|
163 | + 'dismiss_button' => '<div class="save-cancel-button-container"><button class="button-secondary ee-modal-cancel">'.__('Dismiss', |
|
164 | + 'event_espresso').'</button></div>' |
|
165 | 165 | ), |
166 | 166 | 'DTT_OVERSELL_WARNING' => array( |
167 | 167 | 'datetime_ticket' => __('You cannot add this ticket to this datetime because it has a sold amount that is greater than the amount of spots remaining for this datetime.', |
@@ -171,7 +171,7 @@ discard block |
||
171 | 171 | ), |
172 | 172 | 'DTT_CONVERTED_FORMATS' => EEH_DTT_Helper::convert_php_to_js_and_moment_date_formats($this->_date_format_strings['date'], |
173 | 173 | $this->_date_format_strings['time']), |
174 | - 'DTT_START_OF_WEEK' => array('dayValue' => (int)get_option('start_of_week')) |
|
174 | + 'DTT_START_OF_WEEK' => array('dayValue' => (int) get_option('start_of_week')) |
|
175 | 175 | ) |
176 | 176 | ) |
177 | 177 | ); |
@@ -231,8 +231,8 @@ discard block |
||
231 | 231 | |
232 | 232 | foreach ($data['edit_event_datetimes'] as $row => $dtt) { |
233 | 233 | //trim all values to ensure any excess whitespace is removed. |
234 | - $dtt = array_map( |
|
235 | - function ($datetime_data) { |
|
234 | + $dtt = array_map( |
|
235 | + function($datetime_data) { |
|
236 | 236 | return is_array($datetime_data) ? $datetime_data : trim($datetime_data); |
237 | 237 | }, |
238 | 238 | $dtt |
@@ -368,7 +368,7 @@ discard block |
||
368 | 368 | |
369 | 369 | // trim inputs to ensure any excess whitespace is removed. |
370 | 370 | $tkt = array_map( |
371 | - function ($ticket_data) { |
|
371 | + function($ticket_data) { |
|
372 | 372 | return is_array($ticket_data) ? $ticket_data : trim($ticket_data); |
373 | 373 | }, |
374 | 374 | $tkt |
@@ -376,7 +376,7 @@ discard block |
||
376 | 376 | |
377 | 377 | //note we are doing conversions to floats here instead of allowing EE_Money_Field to handle because we're doing calcs prior to using the models. |
378 | 378 | //note incoming ['TKT_price'] value is already in standard notation (via js). |
379 | - $ticket_price = isset($tkt['TKT_price']) ? round((float)$tkt['TKT_price'], 3) : 0; |
|
379 | + $ticket_price = isset($tkt['TKT_price']) ? round((float) $tkt['TKT_price'], 3) : 0; |
|
380 | 380 | |
381 | 381 | //note incoming base price needs converted from localized value. |
382 | 382 | $base_price = isset($tkt['TKT_base_price']) ? EEH_Money::convert_to_float_from_localized_money($tkt['TKT_base_price']) : 0; |
@@ -390,7 +390,7 @@ discard block |
||
390 | 390 | if (empty($tkt['TKT_start_date'])) { |
391 | 391 | //lets' use now in the set timezone. |
392 | 392 | $now = new DateTime('now', new DateTimeZone($evtobj->get_timezone())); |
393 | - $tkt['TKT_start_date'] = $now->format($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']); |
|
393 | + $tkt['TKT_start_date'] = $now->format($this->_date_format_strings['date'].' '.$this->_date_format_strings['time']); |
|
394 | 394 | } |
395 | 395 | |
396 | 396 | if (empty($tkt['TKT_end_date'])) { |
@@ -398,7 +398,7 @@ discard block |
||
398 | 398 | * set the TKT_end_date to the first datetime attached to the ticket. |
399 | 399 | */ |
400 | 400 | $first_dtt = $saved_dtts[reset($tkt_dtt_rows)]; |
401 | - $tkt['TKT_end_date'] = $first_dtt->start_date_and_time($this->_date_format_strings['date'] . ' ' . $this->_date_format_string['time']); |
|
401 | + $tkt['TKT_end_date'] = $first_dtt->start_date_and_time($this->_date_format_strings['date'].' '.$this->_date_format_string['time']); |
|
402 | 402 | } |
403 | 403 | |
404 | 404 | $TKT_values = array( |
@@ -628,7 +628,7 @@ discard block |
||
628 | 628 | // first let's add datetimes |
629 | 629 | if ( ! empty($added_datetimes) && is_array($added_datetimes)) { |
630 | 630 | foreach ($added_datetimes as $row_id) { |
631 | - $row_id = (int)$row_id; |
|
631 | + $row_id = (int) $row_id; |
|
632 | 632 | if (isset($saved_datetimes[$row_id]) && $saved_datetimes[$row_id] instanceof EE_Datetime) { |
633 | 633 | $ticket->_add_relation_to($saved_datetimes[$row_id], 'Datetime'); |
634 | 634 | // Is this an existing ticket (has an ID) and does it have any sold? |
@@ -643,7 +643,7 @@ discard block |
||
643 | 643 | // then remove datetimes |
644 | 644 | if ( ! empty($removed_datetimes) && is_array($removed_datetimes)) { |
645 | 645 | foreach ($removed_datetimes as $row_id) { |
646 | - $row_id = (int)$row_id; |
|
646 | + $row_id = (int) $row_id; |
|
647 | 647 | // its entirely possible that a datetime got deleted (instead of just removed from relationship. |
648 | 648 | // So make sure we skip over this if the dtt isn't in the $saved_datetimes array) |
649 | 649 | if (isset($saved_datetimes[$row_id]) && $saved_datetimes[$row_id] instanceof EE_Datetime) { |
@@ -948,9 +948,9 @@ discard block |
||
948 | 948 | $main_template_args['existing_datetime_ids'] = implode(',', $existing_datetime_ids); |
949 | 949 | |
950 | 950 | //sort $all_tickets by order |
951 | - usort($all_tickets, function ($a, $b) { |
|
952 | - $a_order = (int)$a->get('TKT_order'); |
|
953 | - $b_order = (int)$b->get('TKT_order'); |
|
951 | + usort($all_tickets, function($a, $b) { |
|
952 | + $a_order = (int) $a->get('TKT_order'); |
|
953 | + $b_order = (int) $b->get('TKT_order'); |
|
954 | 954 | if ($a_order == $b_order) { |
955 | 955 | return 0; |
956 | 956 | } |
@@ -975,7 +975,7 @@ discard block |
||
975 | 975 | } |
976 | 976 | |
977 | 977 | $main_template_args['ticket_js_structure'] = $this->_get_ticket_js_structure($times, $all_tickets); |
978 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_metabox_main.template.php'; |
|
978 | + $template = PRICING_TEMPLATE_PATH.'event_tickets_metabox_main.template.php'; |
|
979 | 979 | EEH_Template::display_template($template, $main_template_args); |
980 | 980 | |
981 | 981 | return; |
@@ -997,7 +997,7 @@ discard block |
||
997 | 997 | $all_tickets, $default), |
998 | 998 | 'dtt_row' => $default ? 'DTTNUM' : $dttrow |
999 | 999 | ); |
1000 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_row_wrapper.template.php'; |
|
1000 | + $template = PRICING_TEMPLATE_PATH.'event_tickets_datetime_row_wrapper.template.php'; |
|
1001 | 1001 | |
1002 | 1002 | return EEH_Template::display_template($template, $dtt_display_template_args, true); |
1003 | 1003 | } |
@@ -1031,8 +1031,8 @@ discard block |
||
1031 | 1031 | 'DTT_ID' => $default ? '' : $dtt->ID(), |
1032 | 1032 | 'DTT_name' => $default ? '' : $dtt->name(), |
1033 | 1033 | 'DTT_description' => $default ? '' : $dtt->description(), |
1034 | - 'DTT_EVT_start' => $default ? '' : $dtt->start_date($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']), |
|
1035 | - 'DTT_EVT_end' => $default ? '' : $dtt->end_date($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']), |
|
1034 | + 'DTT_EVT_start' => $default ? '' : $dtt->start_date($this->_date_format_strings['date'].' '.$this->_date_format_strings['time']), |
|
1035 | + 'DTT_EVT_end' => $default ? '' : $dtt->end_date($this->_date_format_strings['date'].' '.$this->_date_format_strings['time']), |
|
1036 | 1036 | 'DTT_reg_limit' => $default ? '' : $dtt->get_pretty('DTT_reg_limit', 'input'), |
1037 | 1037 | 'DTT_order' => $default ? 'DTTNUM' : $dttrow, |
1038 | 1038 | 'dtt_sold' => $default ? '0' : $dtt->get('DTT_sold'), |
@@ -1052,7 +1052,7 @@ discard block |
||
1052 | 1052 | $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_dtt_edit_row__template_args', |
1053 | 1053 | $template_args, $dttrow, $dtt, $default, $all_dtts, $this->_is_creating_event); |
1054 | 1054 | |
1055 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_edit_row.template.php'; |
|
1055 | + $template = PRICING_TEMPLATE_PATH.'event_tickets_datetime_edit_row.template.php'; |
|
1056 | 1056 | |
1057 | 1057 | return EEH_Template::display_template($template, $template_args, true); |
1058 | 1058 | } |
@@ -1088,7 +1088,7 @@ discard block |
||
1088 | 1088 | $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_dtt_attached_ticket_row__template_args', |
1089 | 1089 | $template_args, $dttrow, $dtt, $datetime_tickets, $all_tickets, $default, $this->_is_creating_event); |
1090 | 1090 | |
1091 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_attached_tickets_row.template.php'; |
|
1091 | + $template = PRICING_TEMPLATE_PATH.'event_tickets_datetime_attached_tickets_row.template.php'; |
|
1092 | 1092 | |
1093 | 1093 | return EEH_Template::display_template($template, $template_args, true); |
1094 | 1094 | } |
@@ -1106,14 +1106,14 @@ discard block |
||
1106 | 1106 | 'datetime_ticket_checked' => in_array($displayrow, $dtt_tkts) ? ' checked="checked"' : '', |
1107 | 1107 | 'ticket_selected' => in_array($displayrow, $dtt_tkts) ? ' ticket-selected' : '', |
1108 | 1108 | 'TKT_name' => $default && empty($ticket) ? 'TKTNAME' : $ticket->get('TKT_name'), |
1109 | - 'tkt_status_class' => ($default && empty($ticket)) || $this->_is_creating_event ? ' tkt-status-' . EE_Ticket::onsale : ' tkt-status-' . $ticket->ticket_status(), |
|
1109 | + 'tkt_status_class' => ($default && empty($ticket)) || $this->_is_creating_event ? ' tkt-status-'.EE_Ticket::onsale : ' tkt-status-'.$ticket->ticket_status(), |
|
1110 | 1110 | ); |
1111 | 1111 | |
1112 | 1112 | //filter template args |
1113 | 1113 | $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_datetime_tickets_list_item__template_args', |
1114 | 1114 | $template_args, $dttrow, $tktrow, $dtt, $ticket, $datetime_tickets, $default, $this->_is_creating_event); |
1115 | 1115 | |
1116 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_dtt_tickets_list.template.php'; |
|
1116 | + $template = PRICING_TEMPLATE_PATH.'event_tickets_datetime_dtt_tickets_list.template.php'; |
|
1117 | 1117 | |
1118 | 1118 | return EEH_Template::display_template($template, $template_args, true); |
1119 | 1119 | } |
@@ -1168,9 +1168,9 @@ discard block |
||
1168 | 1168 | |
1169 | 1169 | //breaking out complicated condition for ticket_status |
1170 | 1170 | if ($default) { |
1171 | - $ticket_status_class = ' tkt-status-' . EE_Ticket::onsale; |
|
1171 | + $ticket_status_class = ' tkt-status-'.EE_Ticket::onsale; |
|
1172 | 1172 | } else { |
1173 | - $ticket_status_class = $ticket->is_default() ? ' tkt-status-' . EE_Ticket::onsale : ' tkt-status-' . $ticket->ticket_status(); |
|
1173 | + $ticket_status_class = $ticket->is_default() ? ' tkt-status-'.EE_Ticket::onsale : ' tkt-status-'.$ticket->ticket_status(); |
|
1174 | 1174 | } |
1175 | 1175 | |
1176 | 1176 | //breaking out complicated condition for TKT_taxable |
@@ -1191,9 +1191,9 @@ discard block |
||
1191 | 1191 | 'edit_tickets_name' => $default ? 'TICKETNAMEATTR' : 'edit_tickets', |
1192 | 1192 | 'TKT_name' => $default ? '' : $ticket->get('TKT_name'), |
1193 | 1193 | 'TKT_start_date' => $default ? '' : $ticket->get_date('TKT_start_date', |
1194 | - $this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']), |
|
1194 | + $this->_date_format_strings['date'].' '.$this->_date_format_strings['time']), |
|
1195 | 1195 | 'TKT_end_date' => $default ? '' : $ticket->get_date('TKT_end_date', |
1196 | - $this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']), |
|
1196 | + $this->_date_format_strings['date'].' '.$this->_date_format_strings['time']), |
|
1197 | 1197 | 'TKT_status' => $default ? EEH_Template::pretty_status(EE_Ticket::onsale, false, |
1198 | 1198 | 'sentence') : $ticket->is_default() ? EEH_Template::pretty_status(EE_Ticket::onsale, false, |
1199 | 1199 | 'sentence') : $ticket->ticket_status(true), |
@@ -1249,9 +1249,9 @@ discard block |
||
1249 | 1249 | //handle rows that should NOT be empty |
1250 | 1250 | if (empty($template_args['TKT_start_date'])) { |
1251 | 1251 | //if empty then the start date will be now. |
1252 | - $template_args['TKT_start_date'] = date($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time'], |
|
1252 | + $template_args['TKT_start_date'] = date($this->_date_format_strings['date'].' '.$this->_date_format_strings['time'], |
|
1253 | 1253 | current_time('timestamp')); |
1254 | - $template_args['tkt_status_class'] = ' tkt-status-' . EE_Ticket::onsale; |
|
1254 | + $template_args['tkt_status_class'] = ' tkt-status-'.EE_Ticket::onsale; |
|
1255 | 1255 | } |
1256 | 1256 | |
1257 | 1257 | if (empty($template_args['TKT_end_date'])) { |
@@ -1262,13 +1262,13 @@ discard block |
||
1262 | 1262 | |
1263 | 1263 | if ( ! empty($earliest_dtt)) { |
1264 | 1264 | $template_args['TKT_end_date'] = $earliest_dtt->get_datetime('DTT_EVT_start', |
1265 | - $this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']); |
|
1265 | + $this->_date_format_strings['date'].' '.$this->_date_format_strings['time']); |
|
1266 | 1266 | } else { |
1267 | 1267 | //default so let's just use what's been set for the default date-time which is 30 days from now. |
1268 | - $template_args['TKT_end_date'] = date($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time'], |
|
1268 | + $template_args['TKT_end_date'] = date($this->_date_format_strings['date'].' '.$this->_date_format_strings['time'], |
|
1269 | 1269 | mktime(24, 0, 0, date("m"), date("d") + 29, date("Y"))); |
1270 | 1270 | } |
1271 | - $template_args['tkt_status_class'] = ' tkt-status-' . EE_Ticket::onsale; |
|
1271 | + $template_args['tkt_status_class'] = ' tkt-status-'.EE_Ticket::onsale; |
|
1272 | 1272 | } |
1273 | 1273 | |
1274 | 1274 | //generate ticket_datetime items |
@@ -1299,7 +1299,7 @@ discard block |
||
1299 | 1299 | $template_args, $tktrow, $ticket, $ticket_datetimes, $all_dtts, $default, $all_tickets, |
1300 | 1300 | $this->_is_creating_event); |
1301 | 1301 | |
1302 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_row.template.php'; |
|
1302 | + $template = PRICING_TEMPLATE_PATH.'event_tickets_datetime_ticket_row.template.php'; |
|
1303 | 1303 | |
1304 | 1304 | return EEH_Template::display_template($template, $template_args, true); |
1305 | 1305 | } |
@@ -1308,7 +1308,7 @@ discard block |
||
1308 | 1308 | protected function _get_tax_rows($tktrow, $ticket) |
1309 | 1309 | { |
1310 | 1310 | $tax_rows = ''; |
1311 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_tax_row.template.php'; |
|
1311 | + $template = PRICING_TEMPLATE_PATH.'event_tickets_datetime_ticket_tax_row.template.php'; |
|
1312 | 1312 | $template_args = array(); |
1313 | 1313 | $taxes = empty($ticket) ? EE_Taxes::get_taxes_for_admin() : $ticket->get_ticket_taxes_for_admin(); |
1314 | 1314 | foreach ($taxes as $tax) { |
@@ -1377,7 +1377,7 @@ discard block |
||
1377 | 1377 | $template_args, $tktrow, $prcrow, $price, $default, $ticket, $show_trash, $show_create, |
1378 | 1378 | $this->_is_creating_event); |
1379 | 1379 | |
1380 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_price_row.template.php'; |
|
1380 | + $template = PRICING_TEMPLATE_PATH.'event_tickets_datetime_ticket_price_row.template.php'; |
|
1381 | 1381 | |
1382 | 1382 | return EEH_Template::display_template($template, $template_args, true); |
1383 | 1383 | } |
@@ -1404,7 +1404,7 @@ discard block |
||
1404 | 1404 | 'price_selected_operator' => '+', |
1405 | 1405 | 'price_selected_is_percent' => 0 |
1406 | 1406 | ); |
1407 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_type_base.template.php'; |
|
1407 | + $template = PRICING_TEMPLATE_PATH.'event_tickets_datetime_price_type_base.template.php'; |
|
1408 | 1408 | |
1409 | 1409 | $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_base_price_template__template_args', |
1410 | 1410 | $template_args, $tktrow, $prcrow, $price, $default, $this->_is_creating_event); |
@@ -1415,7 +1415,7 @@ discard block |
||
1415 | 1415 | |
1416 | 1416 | protected function _get_price_modifier_template($tktrow, $prcrow, $price, $default, $disabled = false) |
1417 | 1417 | { |
1418 | - $select_name = $default && empty($price) ? 'edit_prices[TICKETNUM][PRICENUM][PRT_ID]' : 'edit_prices[' . $tktrow . '][' . $prcrow . '][PRT_ID]'; |
|
1418 | + $select_name = $default && empty($price) ? 'edit_prices[TICKETNUM][PRICENUM][PRT_ID]' : 'edit_prices['.$tktrow.']['.$prcrow.'][PRT_ID]'; |
|
1419 | 1419 | $price_types = EE_Registry::instance()->load_model('Price_Type')->get_all(array( |
1420 | 1420 | array( |
1421 | 1421 | 'OR' => array( |
@@ -1424,7 +1424,7 @@ discard block |
||
1424 | 1424 | ) |
1425 | 1425 | ) |
1426 | 1426 | )); |
1427 | - $price_option_span_template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_option_span.template.php'; |
|
1427 | + $price_option_span_template = PRICING_TEMPLATE_PATH.'event_tickets_datetime_price_option_span.template.php'; |
|
1428 | 1428 | $all_price_types = $default && empty($price) ? array( |
1429 | 1429 | array( |
1430 | 1430 | 'id' => 0, |
@@ -1451,7 +1451,7 @@ discard block |
||
1451 | 1451 | |
1452 | 1452 | $select_params = $disabled ? 'style="width:auto;" disabled' : 'style="width:auto;"'; |
1453 | 1453 | $main_name = $select_name; |
1454 | - $select_name = $disabled ? 'archive_price[' . $tktrow . '][' . $prcrow . '][PRT_ID]' : $main_name; |
|
1454 | + $select_name = $disabled ? 'archive_price['.$tktrow.']['.$prcrow.'][PRT_ID]' : $main_name; |
|
1455 | 1455 | |
1456 | 1456 | $template_args = array( |
1457 | 1457 | 'tkt_row' => $default ? 'TICKETNUM' : $tktrow, |
@@ -1469,7 +1469,7 @@ discard block |
||
1469 | 1469 | $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_price_modifier_template__template_args', |
1470 | 1470 | $template_args, $tktrow, $prcrow, $price, $default, $disabled, $this->_is_creating_event); |
1471 | 1471 | |
1472 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_modifier_selector.template.php'; |
|
1472 | + $template = PRICING_TEMPLATE_PATH.'event_tickets_datetime_price_modifier_selector.template.php'; |
|
1473 | 1473 | |
1474 | 1474 | return EEH_Template::display_template($template, $template_args, true); |
1475 | 1475 | } |
@@ -1489,7 +1489,7 @@ discard block |
||
1489 | 1489 | |
1490 | 1490 | $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_ticket_datetime_list_item__template_args', |
1491 | 1491 | $template_args, $dttrow, $tktrow, $dtt, $ticket, $ticket_datetimes, $default, $this->_is_creating_event); |
1492 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_datetimes_list_item.template.php'; |
|
1492 | + $template = PRICING_TEMPLATE_PATH.'event_tickets_datetime_ticket_datetimes_list_item.template.php'; |
|
1493 | 1493 | |
1494 | 1494 | return EEH_Template::display_template($template, $template_args, true); |
1495 | 1495 | } |
@@ -1554,7 +1554,7 @@ discard block |
||
1554 | 1554 | $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_ticket_js_structure__template_args', |
1555 | 1555 | $template_args, $all_dtts, $all_tickets, $this->_is_creating_event); |
1556 | 1556 | |
1557 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_js_structure.template.php'; |
|
1557 | + $template = PRICING_TEMPLATE_PATH.'event_tickets_datetime_ticket_js_structure.template.php'; |
|
1558 | 1558 | |
1559 | 1559 | return EEH_Template::display_template($template, $template_args, true); |
1560 | 1560 | } |
@@ -204,7 +204,7 @@ discard block |
||
204 | 204 | * @param EE_Event $evtobj The Event object we're attaching data to |
205 | 205 | * @param array $data The request data from the form |
206 | 206 | * |
207 | - * @return bool success or fail |
|
207 | + * @return boolean|null success or fail |
|
208 | 208 | */ |
209 | 209 | public function dtt_and_tickets_caf_update($evtobj, $data) |
210 | 210 | { |
@@ -982,6 +982,9 @@ discard block |
||
982 | 982 | } |
983 | 983 | |
984 | 984 | |
985 | + /** |
|
986 | + * @param integer $dttrow |
|
987 | + */ |
|
985 | 988 | protected function _get_datetime_row( |
986 | 989 | $dttrow, |
987 | 990 | EE_Datetime $dtt, |
@@ -1014,6 +1017,7 @@ discard block |
||
1014 | 1017 | * object. |
1015 | 1018 | * @param bool $default Whether a default row is being generated or not. |
1016 | 1019 | * @param EE_Datetime[] $all_dtts This is the array of all datetimes used in the editor. |
1020 | + * @param EE_Datetime|null $dtt |
|
1017 | 1021 | * |
1018 | 1022 | * @return string Generated edit row. |
1019 | 1023 | */ |
@@ -1058,6 +1062,10 @@ discard block |
||
1058 | 1062 | } |
1059 | 1063 | |
1060 | 1064 | |
1065 | + /** |
|
1066 | + * @param EE_Datetime|null $dtt |
|
1067 | + * @param boolean $default |
|
1068 | + */ |
|
1061 | 1069 | protected function _get_dtt_attached_tickets_row($dttrow, $dtt, $datetime_tickets, $all_tickets, $default) |
1062 | 1070 | { |
1063 | 1071 | |
@@ -1305,6 +1313,9 @@ discard block |
||
1305 | 1313 | } |
1306 | 1314 | |
1307 | 1315 | |
1316 | + /** |
|
1317 | + * @param integer $tktrow |
|
1318 | + */ |
|
1308 | 1319 | protected function _get_tax_rows($tktrow, $ticket) |
1309 | 1320 | { |
1310 | 1321 | $tax_rows = ''; |
@@ -1340,6 +1351,9 @@ discard block |
||
1340 | 1351 | } |
1341 | 1352 | |
1342 | 1353 | |
1354 | + /** |
|
1355 | + * @param boolean $default |
|
1356 | + */ |
|
1343 | 1357 | protected function _get_ticket_price_row( |
1344 | 1358 | $tktrow, |
1345 | 1359 | $prcrow, |
@@ -1475,6 +1489,9 @@ discard block |
||
1475 | 1489 | } |
1476 | 1490 | |
1477 | 1491 | |
1492 | + /** |
|
1493 | + * @param boolean $default |
|
1494 | + */ |
|
1478 | 1495 | protected function _get_ticket_datetime_list_item($dttrow, $tktrow, $dtt, $ticket, $ticket_datetimes, $default) |
1479 | 1496 | { |
1480 | 1497 | $tkt_dtts = $ticket instanceof EE_Ticket && isset($ticket_datetimes[$ticket->ID()]) ? $ticket_datetimes[$ticket->ID()] : array(); |
@@ -1,6 +1,6 @@ discard block |
||
1 | 1 | <?php |
2 | 2 | if ( ! defined('EVENT_ESPRESSO_VERSION')) { |
3 | - exit('NO direct script access allowed'); |
|
3 | + exit('NO direct script access allowed'); |
|
4 | 4 | } |
5 | 5 | |
6 | 6 | /** |
@@ -31,1533 +31,1533 @@ discard block |
||
31 | 31 | class espresso_events_Pricing_Hooks extends EE_Admin_Hooks |
32 | 32 | { |
33 | 33 | |
34 | - /** |
|
35 | - * This property is just used to hold the status of whether an event is currently being |
|
36 | - * created (true) or edited (false) |
|
37 | - * @access protected |
|
38 | - * @var bool |
|
39 | - */ |
|
40 | - protected $_is_creating_event; |
|
34 | + /** |
|
35 | + * This property is just used to hold the status of whether an event is currently being |
|
36 | + * created (true) or edited (false) |
|
37 | + * @access protected |
|
38 | + * @var bool |
|
39 | + */ |
|
40 | + protected $_is_creating_event; |
|
41 | 41 | |
42 | 42 | |
43 | - /** |
|
44 | - * Used to contain the format strings for date and time that will be used for php date and |
|
45 | - * time. |
|
46 | - * |
|
47 | - * Is set in the _set_hooks_properties() method. |
|
48 | - * |
|
49 | - * @var array |
|
50 | - */ |
|
51 | - protected $_date_format_strings; |
|
43 | + /** |
|
44 | + * Used to contain the format strings for date and time that will be used for php date and |
|
45 | + * time. |
|
46 | + * |
|
47 | + * Is set in the _set_hooks_properties() method. |
|
48 | + * |
|
49 | + * @var array |
|
50 | + */ |
|
51 | + protected $_date_format_strings; |
|
52 | 52 | |
53 | 53 | |
54 | - protected function _set_hooks_properties() |
|
55 | - { |
|
56 | - $this->_name = 'pricing'; |
|
57 | - |
|
58 | - //capability check |
|
59 | - if ( ! EE_Registry::instance()->CAP->current_user_can('ee_read_default_prices', |
|
60 | - 'advanced_ticket_datetime_metabox') |
|
61 | - ) { |
|
62 | - return; |
|
63 | - } |
|
64 | - |
|
65 | - |
|
66 | - //if we were going to add our own metaboxes we'd use the below. |
|
67 | - $this->_metaboxes = array( |
|
68 | - 0 => array( |
|
69 | - 'page_route' => array('edit', 'create_new'), |
|
70 | - 'func' => 'pricing_metabox', |
|
71 | - 'label' => __('Event Tickets & Datetimes', 'event_espresso'), |
|
72 | - 'priority' => 'high', |
|
73 | - 'context' => 'normal' |
|
74 | - ), |
|
75 | - |
|
76 | - );/**/ |
|
77 | - |
|
78 | - $this->_remove_metaboxes = array( |
|
79 | - 0 => array( |
|
80 | - 'page_route' => array('edit', 'create_new'), |
|
81 | - 'id' => 'espresso_event_editor_tickets', |
|
82 | - 'context' => 'normal' |
|
83 | - ) |
|
84 | - ); |
|
85 | - |
|
86 | - /** |
|
87 | - * Format strings for date and time. Defaults are existing behaviour from 4.1. |
|
88 | - * Note, that if you return null as the value for 'date', and 'time' in the array, then |
|
89 | - * EE will automatically use the set wp_options, 'date_format', and 'time_format'. |
|
90 | - * |
|
91 | - * @since 4.6.7 |
|
92 | - * |
|
93 | - * @var array Expected an array returned with 'date' and 'time' keys. |
|
94 | - */ |
|
95 | - $this->_date_format_strings = apply_filters('FHEE__espresso_events_Pricing_Hooks___set_hooks_properties__date_format_strings', |
|
96 | - array( |
|
97 | - 'date' => 'Y-m-d', |
|
98 | - 'time' => 'h:i a' |
|
99 | - )); |
|
100 | - |
|
101 | - //validate |
|
102 | - $this->_date_format_strings['date'] = isset($this->_date_format_strings['date']) ? $this->_date_format_strings['date'] : null; |
|
103 | - $this->_date_format_strings['time'] = isset($this->_date_format_strings['time']) ? $this->_date_format_strings['time'] : null; |
|
104 | - |
|
105 | - //validate format strings |
|
106 | - $format_validation = EEH_DTT_Helper::validate_format_string($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']); |
|
107 | - if (is_array($format_validation)) { |
|
108 | - $msg = '<p>' . sprintf(__('The format "%s" was likely added via a filter and is invalid for the following reasons:', |
|
109 | - 'event_espresso'), |
|
110 | - $this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']) . '</p><ul>'; |
|
111 | - foreach ($format_validation as $error) { |
|
112 | - $msg .= '<li>' . $error . '</li>'; |
|
113 | - } |
|
114 | - $msg .= '</ul></p><p>' . sprintf(__('%sPlease note that your date and time formats have been reset to "Y-m-d" and "h:i a" respectively.%s', |
|
115 | - 'event_espresso'), '<span style="color:#D54E21;">', '</span>') . '</p>'; |
|
116 | - EE_Error::add_attention($msg, __FILE__, __FUNCTION__, __LINE__); |
|
117 | - $this->_date_format_strings = array( |
|
118 | - 'date' => 'Y-m-d', |
|
119 | - 'time' => 'h:i a' |
|
120 | - ); |
|
121 | - } |
|
122 | - |
|
123 | - |
|
124 | - $this->_scripts_styles = array( |
|
125 | - 'registers' => array( |
|
126 | - 'ee-tickets-datetimes-css' => array( |
|
127 | - 'url' => PRICING_ASSETS_URL . 'event-tickets-datetimes.css', |
|
128 | - 'type' => 'css' |
|
129 | - ), |
|
130 | - 'ee-dtt-ticket-metabox' => array( |
|
131 | - 'url' => PRICING_ASSETS_URL . 'ee-datetime-ticket-metabox.js', |
|
132 | - 'depends' => array('ee-datepicker', 'ee-dialog', 'underscore') |
|
133 | - ) |
|
134 | - ), |
|
135 | - 'deregisters' => array( |
|
136 | - 'event-editor-css' => array('type' => 'css'), |
|
137 | - 'event-datetime-metabox' => array('type' => 'js') |
|
138 | - ), |
|
139 | - 'enqueues' => array( |
|
140 | - 'ee-tickets-datetimes-css' => array('edit', 'create_new'), |
|
141 | - 'ee-dtt-ticket-metabox' => array('edit', 'create_new') |
|
142 | - ), |
|
143 | - 'localize' => array( |
|
144 | - 'ee-dtt-ticket-metabox' => array( |
|
145 | - 'DTT_TRASH_BLOCK' => array( |
|
146 | - 'main_warning' => __('The Datetime you are attempting to trash is the only datetime selected for the following ticket(s):', |
|
147 | - 'event_espresso'), |
|
148 | - 'after_warning' => __('In order to trash this datetime you must first make sure the above ticket(s) are assigned to other datetimes.', |
|
149 | - 'event_espresso'), |
|
150 | - 'cancel_button' => '<button class="button-secondary ee-modal-cancel">' . __('Cancel', |
|
151 | - 'event_espresso') . '</button>', |
|
152 | - 'close_button' => '<button class="button-secondary ee-modal-cancel">' . __('Close', |
|
153 | - 'event_espresso') . '</button>', |
|
154 | - 'single_warning_from_tkt' => __('The Datetime you are attempting to unassign from this ticket is the only remaining datetime for this ticket. Tickets must always have at least one datetime assigned to them.', |
|
155 | - 'event_espresso'), |
|
156 | - 'single_warning_from_dtt' => __('The ticket you are attempting to unassign from this datetime cannot be unassigned because the datetime is the only remaining datetime for the ticket. Tickets must always have at least one datetime assigned to them.', |
|
157 | - 'event_espresso'), |
|
158 | - 'dismiss_button' => '<button class="button-secondary ee-modal-cancel">' . __('Dismiss', |
|
159 | - 'event_espresso') . '</button>' |
|
160 | - ), |
|
161 | - 'DTT_ERROR_MSG' => array( |
|
162 | - 'no_ticket_name' => __('General Admission', 'event_espresso'), |
|
163 | - 'dismiss_button' => '<div class="save-cancel-button-container"><button class="button-secondary ee-modal-cancel">' . __('Dismiss', |
|
164 | - 'event_espresso') . '</button></div>' |
|
165 | - ), |
|
166 | - 'DTT_OVERSELL_WARNING' => array( |
|
167 | - 'datetime_ticket' => __('You cannot add this ticket to this datetime because it has a sold amount that is greater than the amount of spots remaining for this datetime.', |
|
168 | - 'event_espresso'), |
|
169 | - 'ticket_datetime' => __('You cannot add this datetime to this ticket because the ticket has a sold amount that is greater than the amount of spots remaining on the datetime.', |
|
170 | - 'event_espresso') |
|
171 | - ), |
|
172 | - 'DTT_CONVERTED_FORMATS' => EEH_DTT_Helper::convert_php_to_js_and_moment_date_formats($this->_date_format_strings['date'], |
|
173 | - $this->_date_format_strings['time']), |
|
174 | - 'DTT_START_OF_WEEK' => array('dayValue' => (int)get_option('start_of_week')) |
|
175 | - ) |
|
176 | - ) |
|
177 | - ); |
|
178 | - |
|
179 | - |
|
180 | - add_action('AHEE__EE_Admin_Page_CPT__do_extra_autosave_stuff__after_Extend_Events_Admin_Page', |
|
181 | - array($this, 'autosave_handling'), 10); |
|
182 | - add_filter('FHEE__Events_Admin_Page___insert_update_cpt_item__event_update_callbacks', |
|
183 | - array($this, 'caf_updates'), 10); |
|
184 | - } |
|
54 | + protected function _set_hooks_properties() |
|
55 | + { |
|
56 | + $this->_name = 'pricing'; |
|
57 | + |
|
58 | + //capability check |
|
59 | + if ( ! EE_Registry::instance()->CAP->current_user_can('ee_read_default_prices', |
|
60 | + 'advanced_ticket_datetime_metabox') |
|
61 | + ) { |
|
62 | + return; |
|
63 | + } |
|
64 | + |
|
65 | + |
|
66 | + //if we were going to add our own metaboxes we'd use the below. |
|
67 | + $this->_metaboxes = array( |
|
68 | + 0 => array( |
|
69 | + 'page_route' => array('edit', 'create_new'), |
|
70 | + 'func' => 'pricing_metabox', |
|
71 | + 'label' => __('Event Tickets & Datetimes', 'event_espresso'), |
|
72 | + 'priority' => 'high', |
|
73 | + 'context' => 'normal' |
|
74 | + ), |
|
75 | + |
|
76 | + );/**/ |
|
77 | + |
|
78 | + $this->_remove_metaboxes = array( |
|
79 | + 0 => array( |
|
80 | + 'page_route' => array('edit', 'create_new'), |
|
81 | + 'id' => 'espresso_event_editor_tickets', |
|
82 | + 'context' => 'normal' |
|
83 | + ) |
|
84 | + ); |
|
85 | + |
|
86 | + /** |
|
87 | + * Format strings for date and time. Defaults are existing behaviour from 4.1. |
|
88 | + * Note, that if you return null as the value for 'date', and 'time' in the array, then |
|
89 | + * EE will automatically use the set wp_options, 'date_format', and 'time_format'. |
|
90 | + * |
|
91 | + * @since 4.6.7 |
|
92 | + * |
|
93 | + * @var array Expected an array returned with 'date' and 'time' keys. |
|
94 | + */ |
|
95 | + $this->_date_format_strings = apply_filters('FHEE__espresso_events_Pricing_Hooks___set_hooks_properties__date_format_strings', |
|
96 | + array( |
|
97 | + 'date' => 'Y-m-d', |
|
98 | + 'time' => 'h:i a' |
|
99 | + )); |
|
100 | + |
|
101 | + //validate |
|
102 | + $this->_date_format_strings['date'] = isset($this->_date_format_strings['date']) ? $this->_date_format_strings['date'] : null; |
|
103 | + $this->_date_format_strings['time'] = isset($this->_date_format_strings['time']) ? $this->_date_format_strings['time'] : null; |
|
104 | + |
|
105 | + //validate format strings |
|
106 | + $format_validation = EEH_DTT_Helper::validate_format_string($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']); |
|
107 | + if (is_array($format_validation)) { |
|
108 | + $msg = '<p>' . sprintf(__('The format "%s" was likely added via a filter and is invalid for the following reasons:', |
|
109 | + 'event_espresso'), |
|
110 | + $this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']) . '</p><ul>'; |
|
111 | + foreach ($format_validation as $error) { |
|
112 | + $msg .= '<li>' . $error . '</li>'; |
|
113 | + } |
|
114 | + $msg .= '</ul></p><p>' . sprintf(__('%sPlease note that your date and time formats have been reset to "Y-m-d" and "h:i a" respectively.%s', |
|
115 | + 'event_espresso'), '<span style="color:#D54E21;">', '</span>') . '</p>'; |
|
116 | + EE_Error::add_attention($msg, __FILE__, __FUNCTION__, __LINE__); |
|
117 | + $this->_date_format_strings = array( |
|
118 | + 'date' => 'Y-m-d', |
|
119 | + 'time' => 'h:i a' |
|
120 | + ); |
|
121 | + } |
|
122 | + |
|
123 | + |
|
124 | + $this->_scripts_styles = array( |
|
125 | + 'registers' => array( |
|
126 | + 'ee-tickets-datetimes-css' => array( |
|
127 | + 'url' => PRICING_ASSETS_URL . 'event-tickets-datetimes.css', |
|
128 | + 'type' => 'css' |
|
129 | + ), |
|
130 | + 'ee-dtt-ticket-metabox' => array( |
|
131 | + 'url' => PRICING_ASSETS_URL . 'ee-datetime-ticket-metabox.js', |
|
132 | + 'depends' => array('ee-datepicker', 'ee-dialog', 'underscore') |
|
133 | + ) |
|
134 | + ), |
|
135 | + 'deregisters' => array( |
|
136 | + 'event-editor-css' => array('type' => 'css'), |
|
137 | + 'event-datetime-metabox' => array('type' => 'js') |
|
138 | + ), |
|
139 | + 'enqueues' => array( |
|
140 | + 'ee-tickets-datetimes-css' => array('edit', 'create_new'), |
|
141 | + 'ee-dtt-ticket-metabox' => array('edit', 'create_new') |
|
142 | + ), |
|
143 | + 'localize' => array( |
|
144 | + 'ee-dtt-ticket-metabox' => array( |
|
145 | + 'DTT_TRASH_BLOCK' => array( |
|
146 | + 'main_warning' => __('The Datetime you are attempting to trash is the only datetime selected for the following ticket(s):', |
|
147 | + 'event_espresso'), |
|
148 | + 'after_warning' => __('In order to trash this datetime you must first make sure the above ticket(s) are assigned to other datetimes.', |
|
149 | + 'event_espresso'), |
|
150 | + 'cancel_button' => '<button class="button-secondary ee-modal-cancel">' . __('Cancel', |
|
151 | + 'event_espresso') . '</button>', |
|
152 | + 'close_button' => '<button class="button-secondary ee-modal-cancel">' . __('Close', |
|
153 | + 'event_espresso') . '</button>', |
|
154 | + 'single_warning_from_tkt' => __('The Datetime you are attempting to unassign from this ticket is the only remaining datetime for this ticket. Tickets must always have at least one datetime assigned to them.', |
|
155 | + 'event_espresso'), |
|
156 | + 'single_warning_from_dtt' => __('The ticket you are attempting to unassign from this datetime cannot be unassigned because the datetime is the only remaining datetime for the ticket. Tickets must always have at least one datetime assigned to them.', |
|
157 | + 'event_espresso'), |
|
158 | + 'dismiss_button' => '<button class="button-secondary ee-modal-cancel">' . __('Dismiss', |
|
159 | + 'event_espresso') . '</button>' |
|
160 | + ), |
|
161 | + 'DTT_ERROR_MSG' => array( |
|
162 | + 'no_ticket_name' => __('General Admission', 'event_espresso'), |
|
163 | + 'dismiss_button' => '<div class="save-cancel-button-container"><button class="button-secondary ee-modal-cancel">' . __('Dismiss', |
|
164 | + 'event_espresso') . '</button></div>' |
|
165 | + ), |
|
166 | + 'DTT_OVERSELL_WARNING' => array( |
|
167 | + 'datetime_ticket' => __('You cannot add this ticket to this datetime because it has a sold amount that is greater than the amount of spots remaining for this datetime.', |
|
168 | + 'event_espresso'), |
|
169 | + 'ticket_datetime' => __('You cannot add this datetime to this ticket because the ticket has a sold amount that is greater than the amount of spots remaining on the datetime.', |
|
170 | + 'event_espresso') |
|
171 | + ), |
|
172 | + 'DTT_CONVERTED_FORMATS' => EEH_DTT_Helper::convert_php_to_js_and_moment_date_formats($this->_date_format_strings['date'], |
|
173 | + $this->_date_format_strings['time']), |
|
174 | + 'DTT_START_OF_WEEK' => array('dayValue' => (int)get_option('start_of_week')) |
|
175 | + ) |
|
176 | + ) |
|
177 | + ); |
|
178 | + |
|
179 | + |
|
180 | + add_action('AHEE__EE_Admin_Page_CPT__do_extra_autosave_stuff__after_Extend_Events_Admin_Page', |
|
181 | + array($this, 'autosave_handling'), 10); |
|
182 | + add_filter('FHEE__Events_Admin_Page___insert_update_cpt_item__event_update_callbacks', |
|
183 | + array($this, 'caf_updates'), 10); |
|
184 | + } |
|
185 | 185 | |
186 | 186 | |
187 | - public function caf_updates($update_callbacks) |
|
188 | - { |
|
189 | - foreach ($update_callbacks as $key => $callback) { |
|
190 | - if ($callback[1] == '_default_tickets_update') { |
|
191 | - unset($update_callbacks[$key]); |
|
192 | - } |
|
193 | - } |
|
194 | - |
|
195 | - $update_callbacks[] = array($this, 'dtt_and_tickets_caf_update'); |
|
196 | - |
|
197 | - return $update_callbacks; |
|
198 | - } |
|
187 | + public function caf_updates($update_callbacks) |
|
188 | + { |
|
189 | + foreach ($update_callbacks as $key => $callback) { |
|
190 | + if ($callback[1] == '_default_tickets_update') { |
|
191 | + unset($update_callbacks[$key]); |
|
192 | + } |
|
193 | + } |
|
194 | + |
|
195 | + $update_callbacks[] = array($this, 'dtt_and_tickets_caf_update'); |
|
196 | + |
|
197 | + return $update_callbacks; |
|
198 | + } |
|
199 | 199 | |
200 | 200 | |
201 | - /** |
|
202 | - * Handles saving everything related to Tickets (datetimes, tickets, prices) |
|
203 | - * |
|
204 | - * @param EE_Event $evtobj The Event object we're attaching data to |
|
205 | - * @param array $data The request data from the form |
|
206 | - * |
|
207 | - * @return bool success or fail |
|
208 | - */ |
|
209 | - public function dtt_and_tickets_caf_update($evtobj, $data) |
|
210 | - { |
|
211 | - //first we need to start with datetimes cause they are the "root" items attached to events. |
|
212 | - $saved_dtts = $this->_update_dtts($evtobj, $data); |
|
213 | - //next tackle the tickets (and prices?) |
|
214 | - $this->_update_tkts($evtobj, $saved_dtts, $data); |
|
215 | - } |
|
201 | + /** |
|
202 | + * Handles saving everything related to Tickets (datetimes, tickets, prices) |
|
203 | + * |
|
204 | + * @param EE_Event $evtobj The Event object we're attaching data to |
|
205 | + * @param array $data The request data from the form |
|
206 | + * |
|
207 | + * @return bool success or fail |
|
208 | + */ |
|
209 | + public function dtt_and_tickets_caf_update($evtobj, $data) |
|
210 | + { |
|
211 | + //first we need to start with datetimes cause they are the "root" items attached to events. |
|
212 | + $saved_dtts = $this->_update_dtts($evtobj, $data); |
|
213 | + //next tackle the tickets (and prices?) |
|
214 | + $this->_update_tkts($evtobj, $saved_dtts, $data); |
|
215 | + } |
|
216 | 216 | |
217 | 217 | |
218 | - /** |
|
219 | - * update event_datetimes |
|
220 | - * |
|
221 | - * @param EE_Event $evt_obj Event being updated |
|
222 | - * @param array $data the request data from the form |
|
223 | - * |
|
224 | - * @return EE_Datetime[] |
|
225 | - */ |
|
226 | - protected function _update_dtts($evt_obj, $data) |
|
227 | - { |
|
228 | - $timezone = isset($data['timezone_string']) ? $data['timezone_string'] : null; |
|
229 | - $saved_dtt_ids = array(); |
|
230 | - $saved_dtt_objs = array(); |
|
231 | - |
|
232 | - foreach ($data['edit_event_datetimes'] as $row => $dtt) { |
|
233 | - //trim all values to ensure any excess whitespace is removed. |
|
234 | - $dtt = array_map( |
|
235 | - function ($datetime_data) { |
|
236 | - return is_array($datetime_data) ? $datetime_data : trim($datetime_data); |
|
237 | - }, |
|
238 | - $dtt |
|
239 | - ); |
|
240 | - $dtt['DTT_EVT_end'] = isset($dtt['DTT_EVT_end']) && ! empty($dtt['DTT_EVT_end']) ? $dtt['DTT_EVT_end'] : $dtt['DTT_EVT_start']; |
|
241 | - $datetime_values = array( |
|
242 | - 'DTT_ID' => ! empty($dtt['DTT_ID']) ? $dtt['DTT_ID'] : null, |
|
243 | - 'DTT_name' => ! empty($dtt['DTT_name']) ? $dtt['DTT_name'] : '', |
|
244 | - 'DTT_description' => ! empty($dtt['DTT_description']) ? $dtt['DTT_description'] : '', |
|
245 | - 'DTT_EVT_start' => $dtt['DTT_EVT_start'], |
|
246 | - 'DTT_EVT_end' => $dtt['DTT_EVT_end'], |
|
247 | - 'DTT_reg_limit' => empty($dtt['DTT_reg_limit']) ? EE_INF : $dtt['DTT_reg_limit'], |
|
248 | - 'DTT_order' => ! isset($dtt['DTT_order']) ? $row : $dtt['DTT_order'], |
|
249 | - ); |
|
218 | + /** |
|
219 | + * update event_datetimes |
|
220 | + * |
|
221 | + * @param EE_Event $evt_obj Event being updated |
|
222 | + * @param array $data the request data from the form |
|
223 | + * |
|
224 | + * @return EE_Datetime[] |
|
225 | + */ |
|
226 | + protected function _update_dtts($evt_obj, $data) |
|
227 | + { |
|
228 | + $timezone = isset($data['timezone_string']) ? $data['timezone_string'] : null; |
|
229 | + $saved_dtt_ids = array(); |
|
230 | + $saved_dtt_objs = array(); |
|
231 | + |
|
232 | + foreach ($data['edit_event_datetimes'] as $row => $dtt) { |
|
233 | + //trim all values to ensure any excess whitespace is removed. |
|
234 | + $dtt = array_map( |
|
235 | + function ($datetime_data) { |
|
236 | + return is_array($datetime_data) ? $datetime_data : trim($datetime_data); |
|
237 | + }, |
|
238 | + $dtt |
|
239 | + ); |
|
240 | + $dtt['DTT_EVT_end'] = isset($dtt['DTT_EVT_end']) && ! empty($dtt['DTT_EVT_end']) ? $dtt['DTT_EVT_end'] : $dtt['DTT_EVT_start']; |
|
241 | + $datetime_values = array( |
|
242 | + 'DTT_ID' => ! empty($dtt['DTT_ID']) ? $dtt['DTT_ID'] : null, |
|
243 | + 'DTT_name' => ! empty($dtt['DTT_name']) ? $dtt['DTT_name'] : '', |
|
244 | + 'DTT_description' => ! empty($dtt['DTT_description']) ? $dtt['DTT_description'] : '', |
|
245 | + 'DTT_EVT_start' => $dtt['DTT_EVT_start'], |
|
246 | + 'DTT_EVT_end' => $dtt['DTT_EVT_end'], |
|
247 | + 'DTT_reg_limit' => empty($dtt['DTT_reg_limit']) ? EE_INF : $dtt['DTT_reg_limit'], |
|
248 | + 'DTT_order' => ! isset($dtt['DTT_order']) ? $row : $dtt['DTT_order'], |
|
249 | + ); |
|
250 | 250 | |
251 | - //if we have an id then let's get existing object first and then set the new values. Otherwise we instantiate a new object for save. |
|
251 | + //if we have an id then let's get existing object first and then set the new values. Otherwise we instantiate a new object for save. |
|
252 | 252 | |
253 | - if ( ! empty($dtt['DTT_ID'])) { |
|
254 | - $DTM = EE_Registry::instance()->load_model('Datetime', array($timezone))->get_one_by_ID($dtt['DTT_ID']); |
|
253 | + if ( ! empty($dtt['DTT_ID'])) { |
|
254 | + $DTM = EE_Registry::instance()->load_model('Datetime', array($timezone))->get_one_by_ID($dtt['DTT_ID']); |
|
255 | 255 | |
256 | - //set date and time format according to what is set in this class. |
|
257 | - $DTM->set_date_format($this->_date_format_strings['date']); |
|
258 | - $DTM->set_time_format($this->_date_format_strings['time']); |
|
256 | + //set date and time format according to what is set in this class. |
|
257 | + $DTM->set_date_format($this->_date_format_strings['date']); |
|
258 | + $DTM->set_time_format($this->_date_format_strings['time']); |
|
259 | 259 | |
260 | - foreach ($datetime_values as $field => $value) { |
|
261 | - $DTM->set($field, $value); |
|
262 | - } |
|
260 | + foreach ($datetime_values as $field => $value) { |
|
261 | + $DTM->set($field, $value); |
|
262 | + } |
|
263 | 263 | |
264 | - // make sure the $dtt_id here is saved just in case after the add_relation_to() the autosave replaces it. |
|
265 | - // We need to do this so we dont' TRASH the parent DTT.(save the ID for both key and value to avoid duplications) |
|
266 | - $saved_dtt_ids[$DTM->ID()] = $DTM->ID(); |
|
264 | + // make sure the $dtt_id here is saved just in case after the add_relation_to() the autosave replaces it. |
|
265 | + // We need to do this so we dont' TRASH the parent DTT.(save the ID for both key and value to avoid duplications) |
|
266 | + $saved_dtt_ids[$DTM->ID()] = $DTM->ID(); |
|
267 | 267 | |
268 | - } else { |
|
269 | - $DTM = EE_Registry::instance()->load_class( |
|
270 | - 'Datetime', |
|
271 | - array( |
|
272 | - $datetime_values, |
|
273 | - $timezone, |
|
274 | - array($this->_date_format_strings['date'], $this->_date_format_strings['time']) |
|
275 | - ), |
|
276 | - false, |
|
277 | - false |
|
278 | - ); |
|
268 | + } else { |
|
269 | + $DTM = EE_Registry::instance()->load_class( |
|
270 | + 'Datetime', |
|
271 | + array( |
|
272 | + $datetime_values, |
|
273 | + $timezone, |
|
274 | + array($this->_date_format_strings['date'], $this->_date_format_strings['time']) |
|
275 | + ), |
|
276 | + false, |
|
277 | + false |
|
278 | + ); |
|
279 | 279 | |
280 | - foreach ($datetime_values as $field => $value) { |
|
281 | - $DTM->set($field, $value); |
|
282 | - } |
|
283 | - } |
|
280 | + foreach ($datetime_values as $field => $value) { |
|
281 | + $DTM->set($field, $value); |
|
282 | + } |
|
283 | + } |
|
284 | 284 | |
285 | 285 | |
286 | - $DTM->save(); |
|
287 | - $DTM = $evt_obj->_add_relation_to($DTM, 'Datetime'); |
|
288 | - $evt_obj->save(); |
|
286 | + $DTM->save(); |
|
287 | + $DTM = $evt_obj->_add_relation_to($DTM, 'Datetime'); |
|
288 | + $evt_obj->save(); |
|
289 | 289 | |
290 | - //before going any further make sure our dates are setup correctly so that the end date is always equal or greater than the start date. |
|
291 | - if ($DTM->get_raw('DTT_EVT_start') > $DTM->get_raw('DTT_EVT_end')) { |
|
292 | - $DTM->set('DTT_EVT_end', $DTM->get('DTT_EVT_start')); |
|
293 | - $DTM = EEH_DTT_Helper::date_time_add($DTM, 'DTT_EVT_end', 'days'); |
|
294 | - $DTM->save(); |
|
295 | - } |
|
290 | + //before going any further make sure our dates are setup correctly so that the end date is always equal or greater than the start date. |
|
291 | + if ($DTM->get_raw('DTT_EVT_start') > $DTM->get_raw('DTT_EVT_end')) { |
|
292 | + $DTM->set('DTT_EVT_end', $DTM->get('DTT_EVT_start')); |
|
293 | + $DTM = EEH_DTT_Helper::date_time_add($DTM, 'DTT_EVT_end', 'days'); |
|
294 | + $DTM->save(); |
|
295 | + } |
|
296 | 296 | |
297 | - // now we have to make sure we add the new DTT_ID to the $saved_dtt_ids array |
|
298 | - // because it is possible there was a new one created for the autosave. |
|
299 | - // (save the ID for both key and value to avoid duplications) |
|
300 | - $saved_dtt_ids[$DTM->ID()] = $DTM->ID(); |
|
301 | - $saved_dtt_objs[$row] = $DTM; |
|
297 | + // now we have to make sure we add the new DTT_ID to the $saved_dtt_ids array |
|
298 | + // because it is possible there was a new one created for the autosave. |
|
299 | + // (save the ID for both key and value to avoid duplications) |
|
300 | + $saved_dtt_ids[$DTM->ID()] = $DTM->ID(); |
|
301 | + $saved_dtt_objs[$row] = $DTM; |
|
302 | 302 | |
303 | - //todo if ANY of these updates fail then we want the appropriate global error message. |
|
304 | - } |
|
305 | - |
|
306 | - //now we need to REMOVE any dtts that got deleted. Keep in mind that this process will only kick in for DTT's that don't have any DTT_sold on them. So its safe to permanently delete at this point. |
|
307 | - $old_datetimes = explode(',', $data['datetime_IDs']); |
|
308 | - $old_datetimes = $old_datetimes[0] == '' ? array() : $old_datetimes; |
|
309 | - |
|
310 | - if (is_array($old_datetimes)) { |
|
311 | - $dtts_to_delete = array_diff($old_datetimes, $saved_dtt_ids); |
|
312 | - foreach ($dtts_to_delete as $id) { |
|
313 | - $id = absint($id); |
|
314 | - if (empty($id)) { |
|
315 | - continue; |
|
316 | - } |
|
303 | + //todo if ANY of these updates fail then we want the appropriate global error message. |
|
304 | + } |
|
305 | + |
|
306 | + //now we need to REMOVE any dtts that got deleted. Keep in mind that this process will only kick in for DTT's that don't have any DTT_sold on them. So its safe to permanently delete at this point. |
|
307 | + $old_datetimes = explode(',', $data['datetime_IDs']); |
|
308 | + $old_datetimes = $old_datetimes[0] == '' ? array() : $old_datetimes; |
|
309 | + |
|
310 | + if (is_array($old_datetimes)) { |
|
311 | + $dtts_to_delete = array_diff($old_datetimes, $saved_dtt_ids); |
|
312 | + foreach ($dtts_to_delete as $id) { |
|
313 | + $id = absint($id); |
|
314 | + if (empty($id)) { |
|
315 | + continue; |
|
316 | + } |
|
317 | 317 | |
318 | - $dtt_to_remove = EE_Registry::instance()->load_model('Datetime')->get_one_by_ID($id); |
|
318 | + $dtt_to_remove = EE_Registry::instance()->load_model('Datetime')->get_one_by_ID($id); |
|
319 | 319 | |
320 | - //remove tkt relationships. |
|
321 | - $related_tickets = $dtt_to_remove->get_many_related('Ticket'); |
|
322 | - foreach ($related_tickets as $tkt) { |
|
323 | - $dtt_to_remove->_remove_relation_to($tkt, 'Ticket'); |
|
324 | - } |
|
320 | + //remove tkt relationships. |
|
321 | + $related_tickets = $dtt_to_remove->get_many_related('Ticket'); |
|
322 | + foreach ($related_tickets as $tkt) { |
|
323 | + $dtt_to_remove->_remove_relation_to($tkt, 'Ticket'); |
|
324 | + } |
|
325 | 325 | |
326 | - $evt_obj->_remove_relation_to($id, 'Datetime'); |
|
327 | - $dtt_to_remove->refresh_cache_of_related_objects(); |
|
326 | + $evt_obj->_remove_relation_to($id, 'Datetime'); |
|
327 | + $dtt_to_remove->refresh_cache_of_related_objects(); |
|
328 | 328 | |
329 | - } |
|
330 | - } |
|
329 | + } |
|
330 | + } |
|
331 | 331 | |
332 | - return $saved_dtt_objs; |
|
333 | - } |
|
332 | + return $saved_dtt_objs; |
|
333 | + } |
|
334 | 334 | |
335 | 335 | |
336 | - /** |
|
337 | - * update tickets |
|
338 | - * |
|
339 | - * @param EE_Event $evtobj Event object being updated |
|
340 | - * @param EE_Datetime[] $saved_dtts an array of datetime ids being updated |
|
341 | - * @param array $data incoming request data |
|
342 | - * |
|
343 | - * @return EE_Ticket[] |
|
344 | - */ |
|
345 | - protected function _update_tkts($evtobj, $saved_dtts, $data) |
|
346 | - { |
|
347 | - |
|
348 | - $new_tkt = null; |
|
349 | - $new_default = null; |
|
350 | - //stripslashes because WP filtered the $_POST ($data) array to add slashes |
|
351 | - $data = stripslashes_deep($data); |
|
352 | - $timezone = isset($data['timezone_string']) ? $data['timezone_string'] : null; |
|
353 | - $saved_tickets = $dtts_on_existing = array(); |
|
354 | - $old_tickets = isset($data['ticket_IDs']) ? explode(',', $data['ticket_IDs']) : array(); |
|
355 | - |
|
356 | - //load money helper |
|
357 | - |
|
358 | - foreach ($data['edit_tickets'] as $row => $tkt) { |
|
336 | + /** |
|
337 | + * update tickets |
|
338 | + * |
|
339 | + * @param EE_Event $evtobj Event object being updated |
|
340 | + * @param EE_Datetime[] $saved_dtts an array of datetime ids being updated |
|
341 | + * @param array $data incoming request data |
|
342 | + * |
|
343 | + * @return EE_Ticket[] |
|
344 | + */ |
|
345 | + protected function _update_tkts($evtobj, $saved_dtts, $data) |
|
346 | + { |
|
347 | + |
|
348 | + $new_tkt = null; |
|
349 | + $new_default = null; |
|
350 | + //stripslashes because WP filtered the $_POST ($data) array to add slashes |
|
351 | + $data = stripslashes_deep($data); |
|
352 | + $timezone = isset($data['timezone_string']) ? $data['timezone_string'] : null; |
|
353 | + $saved_tickets = $dtts_on_existing = array(); |
|
354 | + $old_tickets = isset($data['ticket_IDs']) ? explode(',', $data['ticket_IDs']) : array(); |
|
355 | + |
|
356 | + //load money helper |
|
357 | + |
|
358 | + foreach ($data['edit_tickets'] as $row => $tkt) { |
|
359 | 359 | |
360 | - $update_prices = $create_new_TKT = false; |
|
360 | + $update_prices = $create_new_TKT = false; |
|
361 | 361 | |
362 | - //figure out what dtts were added to the ticket and what dtts were removed from the ticket in the session. |
|
362 | + //figure out what dtts were added to the ticket and what dtts were removed from the ticket in the session. |
|
363 | 363 | |
364 | - $starting_tkt_dtt_rows = explode(',', $data['starting_ticket_datetime_rows'][$row]); |
|
365 | - $tkt_dtt_rows = explode(',', $data['ticket_datetime_rows'][$row]); |
|
366 | - $dtts_added = array_diff($tkt_dtt_rows, $starting_tkt_dtt_rows); |
|
367 | - $dtts_removed = array_diff($starting_tkt_dtt_rows, $tkt_dtt_rows); |
|
364 | + $starting_tkt_dtt_rows = explode(',', $data['starting_ticket_datetime_rows'][$row]); |
|
365 | + $tkt_dtt_rows = explode(',', $data['ticket_datetime_rows'][$row]); |
|
366 | + $dtts_added = array_diff($tkt_dtt_rows, $starting_tkt_dtt_rows); |
|
367 | + $dtts_removed = array_diff($starting_tkt_dtt_rows, $tkt_dtt_rows); |
|
368 | 368 | |
369 | - // trim inputs to ensure any excess whitespace is removed. |
|
370 | - $tkt = array_map( |
|
371 | - function ($ticket_data) { |
|
372 | - return is_array($ticket_data) ? $ticket_data : trim($ticket_data); |
|
373 | - }, |
|
374 | - $tkt |
|
375 | - ); |
|
369 | + // trim inputs to ensure any excess whitespace is removed. |
|
370 | + $tkt = array_map( |
|
371 | + function ($ticket_data) { |
|
372 | + return is_array($ticket_data) ? $ticket_data : trim($ticket_data); |
|
373 | + }, |
|
374 | + $tkt |
|
375 | + ); |
|
376 | 376 | |
377 | - //note we are doing conversions to floats here instead of allowing EE_Money_Field to handle because we're doing calcs prior to using the models. |
|
378 | - //note incoming ['TKT_price'] value is already in standard notation (via js). |
|
379 | - $ticket_price = isset($tkt['TKT_price']) ? round((float)$tkt['TKT_price'], 3) : 0; |
|
377 | + //note we are doing conversions to floats here instead of allowing EE_Money_Field to handle because we're doing calcs prior to using the models. |
|
378 | + //note incoming ['TKT_price'] value is already in standard notation (via js). |
|
379 | + $ticket_price = isset($tkt['TKT_price']) ? round((float)$tkt['TKT_price'], 3) : 0; |
|
380 | 380 | |
381 | - //note incoming base price needs converted from localized value. |
|
382 | - $base_price = isset($tkt['TKT_base_price']) ? EEH_Money::convert_to_float_from_localized_money($tkt['TKT_base_price']) : 0; |
|
383 | - //if ticket price == 0 and $base_price != 0 then ticket price == base_price |
|
384 | - $ticket_price = $ticket_price === 0 && $base_price !== 0 ? $base_price : $ticket_price; |
|
385 | - $base_price_id = isset($tkt['TKT_base_price_ID']) ? $tkt['TKT_base_price_ID'] : 0; |
|
381 | + //note incoming base price needs converted from localized value. |
|
382 | + $base_price = isset($tkt['TKT_base_price']) ? EEH_Money::convert_to_float_from_localized_money($tkt['TKT_base_price']) : 0; |
|
383 | + //if ticket price == 0 and $base_price != 0 then ticket price == base_price |
|
384 | + $ticket_price = $ticket_price === 0 && $base_price !== 0 ? $base_price : $ticket_price; |
|
385 | + $base_price_id = isset($tkt['TKT_base_price_ID']) ? $tkt['TKT_base_price_ID'] : 0; |
|
386 | 386 | |
387 | - $price_rows = is_array($data['edit_prices']) && isset($data['edit_prices'][$row]) ? $data['edit_prices'][$row] : array(); |
|
387 | + $price_rows = is_array($data['edit_prices']) && isset($data['edit_prices'][$row]) ? $data['edit_prices'][$row] : array(); |
|
388 | 388 | |
389 | - $now = null; |
|
390 | - if (empty($tkt['TKT_start_date'])) { |
|
391 | - //lets' use now in the set timezone. |
|
392 | - $now = new DateTime('now', new DateTimeZone($evtobj->get_timezone())); |
|
393 | - $tkt['TKT_start_date'] = $now->format($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']); |
|
394 | - } |
|
389 | + $now = null; |
|
390 | + if (empty($tkt['TKT_start_date'])) { |
|
391 | + //lets' use now in the set timezone. |
|
392 | + $now = new DateTime('now', new DateTimeZone($evtobj->get_timezone())); |
|
393 | + $tkt['TKT_start_date'] = $now->format($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']); |
|
394 | + } |
|
395 | 395 | |
396 | - if (empty($tkt['TKT_end_date'])) { |
|
397 | - /** |
|
398 | - * set the TKT_end_date to the first datetime attached to the ticket. |
|
399 | - */ |
|
400 | - $first_dtt = $saved_dtts[reset($tkt_dtt_rows)]; |
|
401 | - $tkt['TKT_end_date'] = $first_dtt->start_date_and_time($this->_date_format_strings['date'] . ' ' . $this->_date_format_string['time']); |
|
402 | - } |
|
396 | + if (empty($tkt['TKT_end_date'])) { |
|
397 | + /** |
|
398 | + * set the TKT_end_date to the first datetime attached to the ticket. |
|
399 | + */ |
|
400 | + $first_dtt = $saved_dtts[reset($tkt_dtt_rows)]; |
|
401 | + $tkt['TKT_end_date'] = $first_dtt->start_date_and_time($this->_date_format_strings['date'] . ' ' . $this->_date_format_string['time']); |
|
402 | + } |
|
403 | 403 | |
404 | - $TKT_values = array( |
|
405 | - 'TKT_ID' => ! empty($tkt['TKT_ID']) ? $tkt['TKT_ID'] : null, |
|
406 | - 'TTM_ID' => ! empty($tkt['TTM_ID']) ? $tkt['TTM_ID'] : 0, |
|
407 | - 'TKT_name' => ! empty($tkt['TKT_name']) ? $tkt['TKT_name'] : '', |
|
408 | - 'TKT_description' => ! empty($tkt['TKT_description']) && $tkt['TKT_description'] != __('You can modify this description', |
|
409 | - 'event_espresso') ? $tkt['TKT_description'] : '', |
|
410 | - 'TKT_start_date' => $tkt['TKT_start_date'], |
|
411 | - 'TKT_end_date' => $tkt['TKT_end_date'], |
|
412 | - 'TKT_qty' => ! isset($tkt['TKT_qty']) || $tkt['TKT_qty'] === '' ? EE_INF : $tkt['TKT_qty'], |
|
413 | - 'TKT_uses' => ! isset($tkt['TKT_uses']) || $tkt['TKT_uses'] === '' ? EE_INF : $tkt['TKT_uses'], |
|
414 | - 'TKT_min' => empty($tkt['TKT_min']) ? 0 : $tkt['TKT_min'], |
|
415 | - 'TKT_max' => empty($tkt['TKT_max']) ? EE_INF : $tkt['TKT_max'], |
|
416 | - 'TKT_row' => $row, |
|
417 | - 'TKT_order' => isset($tkt['TKT_order']) ? $tkt['TKT_order'] : 0, |
|
418 | - 'TKT_taxable' => ! empty($tkt['TKT_taxable']) ? 1 : 0, |
|
419 | - 'TKT_required' => ! empty($tkt['TKT_required']) ? 1 : 0, |
|
420 | - 'TKT_price' => $ticket_price |
|
421 | - ); |
|
404 | + $TKT_values = array( |
|
405 | + 'TKT_ID' => ! empty($tkt['TKT_ID']) ? $tkt['TKT_ID'] : null, |
|
406 | + 'TTM_ID' => ! empty($tkt['TTM_ID']) ? $tkt['TTM_ID'] : 0, |
|
407 | + 'TKT_name' => ! empty($tkt['TKT_name']) ? $tkt['TKT_name'] : '', |
|
408 | + 'TKT_description' => ! empty($tkt['TKT_description']) && $tkt['TKT_description'] != __('You can modify this description', |
|
409 | + 'event_espresso') ? $tkt['TKT_description'] : '', |
|
410 | + 'TKT_start_date' => $tkt['TKT_start_date'], |
|
411 | + 'TKT_end_date' => $tkt['TKT_end_date'], |
|
412 | + 'TKT_qty' => ! isset($tkt['TKT_qty']) || $tkt['TKT_qty'] === '' ? EE_INF : $tkt['TKT_qty'], |
|
413 | + 'TKT_uses' => ! isset($tkt['TKT_uses']) || $tkt['TKT_uses'] === '' ? EE_INF : $tkt['TKT_uses'], |
|
414 | + 'TKT_min' => empty($tkt['TKT_min']) ? 0 : $tkt['TKT_min'], |
|
415 | + 'TKT_max' => empty($tkt['TKT_max']) ? EE_INF : $tkt['TKT_max'], |
|
416 | + 'TKT_row' => $row, |
|
417 | + 'TKT_order' => isset($tkt['TKT_order']) ? $tkt['TKT_order'] : 0, |
|
418 | + 'TKT_taxable' => ! empty($tkt['TKT_taxable']) ? 1 : 0, |
|
419 | + 'TKT_required' => ! empty($tkt['TKT_required']) ? 1 : 0, |
|
420 | + 'TKT_price' => $ticket_price |
|
421 | + ); |
|
422 | 422 | |
423 | 423 | |
424 | - //if this is a default TKT, then we need to set the TKT_ID to 0 and update accordingly, which means in turn that the prices will become new prices as well. |
|
425 | - if (isset($tkt['TKT_is_default']) && $tkt['TKT_is_default']) { |
|
426 | - $TKT_values['TKT_ID'] = 0; |
|
427 | - $TKT_values['TKT_is_default'] = 0; |
|
428 | - $update_prices = true; |
|
429 | - } |
|
424 | + //if this is a default TKT, then we need to set the TKT_ID to 0 and update accordingly, which means in turn that the prices will become new prices as well. |
|
425 | + if (isset($tkt['TKT_is_default']) && $tkt['TKT_is_default']) { |
|
426 | + $TKT_values['TKT_ID'] = 0; |
|
427 | + $TKT_values['TKT_is_default'] = 0; |
|
428 | + $update_prices = true; |
|
429 | + } |
|
430 | 430 | |
431 | - // if we have a TKT_ID then we need to get that existing TKT_obj and update it |
|
432 | - // we actually do our saves ahead of doing any add_relations to |
|
433 | - // because its entirely possible that this ticket wasn't removed or added to any datetime in the session |
|
434 | - // but DID have it's items modified. |
|
435 | - // keep in mind that if the TKT has been sold (and we have changed pricing information), |
|
436 | - // then we won't be updating the tkt but instead a new tkt will be created and the old one archived. |
|
437 | - if (absint($TKT_values['TKT_ID'])) { |
|
438 | - $TKT = EE_Registry::instance()->load_model('Ticket', array($timezone))->get_one_by_ID($tkt['TKT_ID']); |
|
439 | - if ($TKT instanceof EE_Ticket) { |
|
431 | + // if we have a TKT_ID then we need to get that existing TKT_obj and update it |
|
432 | + // we actually do our saves ahead of doing any add_relations to |
|
433 | + // because its entirely possible that this ticket wasn't removed or added to any datetime in the session |
|
434 | + // but DID have it's items modified. |
|
435 | + // keep in mind that if the TKT has been sold (and we have changed pricing information), |
|
436 | + // then we won't be updating the tkt but instead a new tkt will be created and the old one archived. |
|
437 | + if (absint($TKT_values['TKT_ID'])) { |
|
438 | + $TKT = EE_Registry::instance()->load_model('Ticket', array($timezone))->get_one_by_ID($tkt['TKT_ID']); |
|
439 | + if ($TKT instanceof EE_Ticket) { |
|
440 | 440 | |
441 | - $TKT = $this->_update_ticket_datetimes($TKT, $saved_dtts, $dtts_added, $dtts_removed); |
|
442 | - // are there any registrations using this ticket ? |
|
443 | - $tickets_sold = $TKT->count_related( |
|
444 | - 'Registration', |
|
445 | - array( |
|
446 | - array( |
|
447 | - 'STS_ID' => array('NOT IN', array(EEM_Registration::status_id_incomplete)) |
|
448 | - ) |
|
449 | - ) |
|
450 | - ); |
|
451 | - //set ticket formats |
|
452 | - $TKT->set_date_format($this->_date_format_strings['date']); |
|
453 | - $TKT->set_time_format($this->_date_format_strings['time']); |
|
441 | + $TKT = $this->_update_ticket_datetimes($TKT, $saved_dtts, $dtts_added, $dtts_removed); |
|
442 | + // are there any registrations using this ticket ? |
|
443 | + $tickets_sold = $TKT->count_related( |
|
444 | + 'Registration', |
|
445 | + array( |
|
446 | + array( |
|
447 | + 'STS_ID' => array('NOT IN', array(EEM_Registration::status_id_incomplete)) |
|
448 | + ) |
|
449 | + ) |
|
450 | + ); |
|
451 | + //set ticket formats |
|
452 | + $TKT->set_date_format($this->_date_format_strings['date']); |
|
453 | + $TKT->set_time_format($this->_date_format_strings['time']); |
|
454 | 454 | |
455 | - // let's just check the total price for the existing ticket |
|
456 | - // and determine if it matches the new total price. |
|
457 | - // if they are different then we create a new ticket (if tkts sold) |
|
458 | - // if they aren't different then we go ahead and modify existing ticket. |
|
459 | - $create_new_TKT = $tickets_sold > 0 && $ticket_price != $TKT->price() && ! $TKT->deleted() |
|
460 | - ? true : false; |
|
455 | + // let's just check the total price for the existing ticket |
|
456 | + // and determine if it matches the new total price. |
|
457 | + // if they are different then we create a new ticket (if tkts sold) |
|
458 | + // if they aren't different then we go ahead and modify existing ticket. |
|
459 | + $create_new_TKT = $tickets_sold > 0 && $ticket_price != $TKT->price() && ! $TKT->deleted() |
|
460 | + ? true : false; |
|
461 | 461 | |
462 | - //set new values |
|
463 | - foreach ($TKT_values as $field => $value) { |
|
464 | - if ($field === 'TKT_qty') { |
|
465 | - $TKT->set_qty($value); |
|
466 | - } else { |
|
467 | - $TKT->set($field, $value); |
|
468 | - } |
|
469 | - } |
|
462 | + //set new values |
|
463 | + foreach ($TKT_values as $field => $value) { |
|
464 | + if ($field === 'TKT_qty') { |
|
465 | + $TKT->set_qty($value); |
|
466 | + } else { |
|
467 | + $TKT->set($field, $value); |
|
468 | + } |
|
469 | + } |
|
470 | 470 | |
471 | - //if $create_new_TKT is false then we can safely update the existing ticket. Otherwise we have to create a new ticket. |
|
472 | - if ($create_new_TKT) { |
|
473 | - $new_tkt = $this->_duplicate_ticket($TKT, $price_rows, $ticket_price, $base_price, |
|
474 | - $base_price_id); |
|
475 | - } |
|
476 | - } |
|
471 | + //if $create_new_TKT is false then we can safely update the existing ticket. Otherwise we have to create a new ticket. |
|
472 | + if ($create_new_TKT) { |
|
473 | + $new_tkt = $this->_duplicate_ticket($TKT, $price_rows, $ticket_price, $base_price, |
|
474 | + $base_price_id); |
|
475 | + } |
|
476 | + } |
|
477 | 477 | |
478 | - } else { |
|
479 | - // no TKT_id so a new TKT |
|
480 | - $TKT = EE_Ticket::new_instance( |
|
481 | - $TKT_values, |
|
482 | - $timezone, |
|
483 | - array($this->_date_format_strings['date'], $this->_date_format_strings['time']) |
|
484 | - ); |
|
485 | - if ($TKT instanceof EE_Ticket) { |
|
486 | - // make sure ticket has an ID of setting relations won't work |
|
487 | - $TKT->save(); |
|
488 | - $TKT = $this->_update_ticket_datetimes($TKT, $saved_dtts, $dtts_added, $dtts_removed); |
|
489 | - $update_prices = true; |
|
490 | - } |
|
491 | - } |
|
492 | - //make sure any current values have been saved. |
|
493 | - //$TKT->save(); |
|
478 | + } else { |
|
479 | + // no TKT_id so a new TKT |
|
480 | + $TKT = EE_Ticket::new_instance( |
|
481 | + $TKT_values, |
|
482 | + $timezone, |
|
483 | + array($this->_date_format_strings['date'], $this->_date_format_strings['time']) |
|
484 | + ); |
|
485 | + if ($TKT instanceof EE_Ticket) { |
|
486 | + // make sure ticket has an ID of setting relations won't work |
|
487 | + $TKT->save(); |
|
488 | + $TKT = $this->_update_ticket_datetimes($TKT, $saved_dtts, $dtts_added, $dtts_removed); |
|
489 | + $update_prices = true; |
|
490 | + } |
|
491 | + } |
|
492 | + //make sure any current values have been saved. |
|
493 | + //$TKT->save(); |
|
494 | 494 | |
495 | - //before going any further make sure our dates are setup correctly so that the end date is always equal or greater than the start date. |
|
496 | - if ($TKT->get_raw('TKT_start_date') > $TKT->get_raw('TKT_end_date')) { |
|
497 | - $TKT->set('TKT_end_date', $TKT->get('TKT_start_date')); |
|
498 | - $TKT = EEH_DTT_Helper::date_time_add($TKT, 'TKT_end_date', 'days'); |
|
499 | - } |
|
495 | + //before going any further make sure our dates are setup correctly so that the end date is always equal or greater than the start date. |
|
496 | + if ($TKT->get_raw('TKT_start_date') > $TKT->get_raw('TKT_end_date')) { |
|
497 | + $TKT->set('TKT_end_date', $TKT->get('TKT_start_date')); |
|
498 | + $TKT = EEH_DTT_Helper::date_time_add($TKT, 'TKT_end_date', 'days'); |
|
499 | + } |
|
500 | 500 | |
501 | - //let's make sure the base price is handled |
|
502 | - $TKT = ! $create_new_TKT ? $this->_add_prices_to_ticket(array(), $TKT, $update_prices, $base_price, |
|
503 | - $base_price_id) : $TKT; |
|
501 | + //let's make sure the base price is handled |
|
502 | + $TKT = ! $create_new_TKT ? $this->_add_prices_to_ticket(array(), $TKT, $update_prices, $base_price, |
|
503 | + $base_price_id) : $TKT; |
|
504 | 504 | |
505 | - //add/update price_modifiers |
|
506 | - $TKT = ! $create_new_TKT ? $this->_add_prices_to_ticket($price_rows, $TKT, $update_prices) : $TKT; |
|
505 | + //add/update price_modifiers |
|
506 | + $TKT = ! $create_new_TKT ? $this->_add_prices_to_ticket($price_rows, $TKT, $update_prices) : $TKT; |
|
507 | 507 | |
508 | - //need to make sue that the TKT_price is accurate after saving the prices. |
|
509 | - $TKT->ensure_TKT_Price_correct(); |
|
508 | + //need to make sue that the TKT_price is accurate after saving the prices. |
|
509 | + $TKT->ensure_TKT_Price_correct(); |
|
510 | 510 | |
511 | - //handle CREATING a default tkt from the incoming tkt but ONLY if this isn't an autosave. |
|
512 | - if ( ! defined('DOING_AUTOSAVE')) { |
|
513 | - if ( ! empty($tkt['TKT_is_default_selector'])) { |
|
514 | - $update_prices = true; |
|
515 | - $new_default = clone $TKT; |
|
516 | - $new_default->set('TKT_ID', 0); |
|
517 | - $new_default->set('TKT_is_default', 1); |
|
518 | - $new_default->set('TKT_row', 1); |
|
519 | - $new_default->set('TKT_price', $ticket_price); |
|
520 | - //remove any dtt relations cause we DON'T want dtt relations attached (note this is just removing the cached relations in the object) |
|
521 | - $new_default->_remove_relations('Datetime'); |
|
522 | - //todo we need to add the current attached prices as new prices to the new default ticket. |
|
523 | - $new_default = $this->_add_prices_to_ticket($price_rows, $new_default, $update_prices); |
|
524 | - //don't forget the base price! |
|
525 | - $new_default = $this->_add_prices_to_ticket(array(), $new_default, $update_prices, $base_price, |
|
526 | - $base_price_id); |
|
527 | - $new_default->save(); |
|
528 | - do_action('AHEE__espresso_events_Pricing_Hooks___update_tkts_new_default_ticket', $new_default, |
|
529 | - $row, $TKT, $data); |
|
530 | - } |
|
531 | - } |
|
511 | + //handle CREATING a default tkt from the incoming tkt but ONLY if this isn't an autosave. |
|
512 | + if ( ! defined('DOING_AUTOSAVE')) { |
|
513 | + if ( ! empty($tkt['TKT_is_default_selector'])) { |
|
514 | + $update_prices = true; |
|
515 | + $new_default = clone $TKT; |
|
516 | + $new_default->set('TKT_ID', 0); |
|
517 | + $new_default->set('TKT_is_default', 1); |
|
518 | + $new_default->set('TKT_row', 1); |
|
519 | + $new_default->set('TKT_price', $ticket_price); |
|
520 | + //remove any dtt relations cause we DON'T want dtt relations attached (note this is just removing the cached relations in the object) |
|
521 | + $new_default->_remove_relations('Datetime'); |
|
522 | + //todo we need to add the current attached prices as new prices to the new default ticket. |
|
523 | + $new_default = $this->_add_prices_to_ticket($price_rows, $new_default, $update_prices); |
|
524 | + //don't forget the base price! |
|
525 | + $new_default = $this->_add_prices_to_ticket(array(), $new_default, $update_prices, $base_price, |
|
526 | + $base_price_id); |
|
527 | + $new_default->save(); |
|
528 | + do_action('AHEE__espresso_events_Pricing_Hooks___update_tkts_new_default_ticket', $new_default, |
|
529 | + $row, $TKT, $data); |
|
530 | + } |
|
531 | + } |
|
532 | 532 | |
533 | 533 | |
534 | - //DO ALL dtt relationships for both current tickets and any archived tickets for the given dtt that are related to the current ticket. TODO... not sure exactly how we're going to do this considering we don't know what current ticket the archived tickets are related to (and TKT_parent is used for autosaves so that's not a field we can reliably use). |
|
534 | + //DO ALL dtt relationships for both current tickets and any archived tickets for the given dtt that are related to the current ticket. TODO... not sure exactly how we're going to do this considering we don't know what current ticket the archived tickets are related to (and TKT_parent is used for autosaves so that's not a field we can reliably use). |
|
535 | 535 | |
536 | 536 | |
537 | - //let's assign any tickets that have been setup to the saved_tickets tracker |
|
538 | - //save existing TKT |
|
539 | - $TKT->save(); |
|
540 | - if ($create_new_TKT && $new_tkt instanceof EE_Ticket) { |
|
541 | - //save new TKT |
|
542 | - $new_tkt->save(); |
|
543 | - //add new ticket to array |
|
544 | - $saved_tickets[$new_tkt->ID()] = $new_tkt; |
|
537 | + //let's assign any tickets that have been setup to the saved_tickets tracker |
|
538 | + //save existing TKT |
|
539 | + $TKT->save(); |
|
540 | + if ($create_new_TKT && $new_tkt instanceof EE_Ticket) { |
|
541 | + //save new TKT |
|
542 | + $new_tkt->save(); |
|
543 | + //add new ticket to array |
|
544 | + $saved_tickets[$new_tkt->ID()] = $new_tkt; |
|
545 | 545 | |
546 | - do_action('AHEE__espresso_events_Pricing_Hooks___update_tkts_new_ticket', $new_tkt, $row, $tkt, $data); |
|
546 | + do_action('AHEE__espresso_events_Pricing_Hooks___update_tkts_new_ticket', $new_tkt, $row, $tkt, $data); |
|
547 | 547 | |
548 | - } else { |
|
549 | - //add tkt to saved tkts |
|
550 | - $saved_tickets[$TKT->ID()] = $TKT; |
|
548 | + } else { |
|
549 | + //add tkt to saved tkts |
|
550 | + $saved_tickets[$TKT->ID()] = $TKT; |
|
551 | 551 | |
552 | - do_action('AHEE__espresso_events_Pricing_Hooks___update_tkts_update_ticket', $TKT, $row, $tkt, $data); |
|
553 | - } |
|
552 | + do_action('AHEE__espresso_events_Pricing_Hooks___update_tkts_update_ticket', $TKT, $row, $tkt, $data); |
|
553 | + } |
|
554 | 554 | |
555 | - } |
|
556 | - |
|
557 | - // now we need to handle tickets actually "deleted permanently". |
|
558 | - // There are cases where we'd want this to happen |
|
559 | - // (i.e. autosaves are happening and then in between autosaves the user trashes a ticket). |
|
560 | - // Or a draft event was saved and in the process of editing a ticket is trashed. |
|
561 | - // No sense in keeping all the related data in the db! |
|
562 | - $old_tickets = isset($old_tickets[0]) && $old_tickets[0] == '' ? array() : $old_tickets; |
|
563 | - $tickets_removed = array_diff($old_tickets, array_keys($saved_tickets)); |
|
564 | - |
|
565 | - foreach ($tickets_removed as $id) { |
|
566 | - $id = absint($id); |
|
555 | + } |
|
556 | + |
|
557 | + // now we need to handle tickets actually "deleted permanently". |
|
558 | + // There are cases where we'd want this to happen |
|
559 | + // (i.e. autosaves are happening and then in between autosaves the user trashes a ticket). |
|
560 | + // Or a draft event was saved and in the process of editing a ticket is trashed. |
|
561 | + // No sense in keeping all the related data in the db! |
|
562 | + $old_tickets = isset($old_tickets[0]) && $old_tickets[0] == '' ? array() : $old_tickets; |
|
563 | + $tickets_removed = array_diff($old_tickets, array_keys($saved_tickets)); |
|
564 | + |
|
565 | + foreach ($tickets_removed as $id) { |
|
566 | + $id = absint($id); |
|
567 | 567 | |
568 | - //get the ticket for this id |
|
569 | - $tkt_to_remove = EE_Registry::instance()->load_model('Ticket')->get_one_by_ID($id); |
|
568 | + //get the ticket for this id |
|
569 | + $tkt_to_remove = EE_Registry::instance()->load_model('Ticket')->get_one_by_ID($id); |
|
570 | 570 | |
571 | - //if this tkt is a default tkt we leave it alone cause it won't be attached to the datetime |
|
572 | - if ($tkt_to_remove->get('TKT_is_default')) { |
|
573 | - continue; |
|
574 | - } |
|
571 | + //if this tkt is a default tkt we leave it alone cause it won't be attached to the datetime |
|
572 | + if ($tkt_to_remove->get('TKT_is_default')) { |
|
573 | + continue; |
|
574 | + } |
|
575 | 575 | |
576 | - // if this tkt has any registrations attached so then we just ARCHIVE |
|
577 | - // because we don't actually permanently delete these tickets. |
|
578 | - if ($tkt_to_remove->count_related('Registration') > 0) { |
|
579 | - $tkt_to_remove->delete(); |
|
580 | - continue; |
|
581 | - } |
|
576 | + // if this tkt has any registrations attached so then we just ARCHIVE |
|
577 | + // because we don't actually permanently delete these tickets. |
|
578 | + if ($tkt_to_remove->count_related('Registration') > 0) { |
|
579 | + $tkt_to_remove->delete(); |
|
580 | + continue; |
|
581 | + } |
|
582 | 582 | |
583 | - // need to get all the related datetimes on this ticket and remove from every single one of them |
|
584 | - // (remember this process can ONLY kick off if there are NO tkts_sold) |
|
585 | - $dtts = $tkt_to_remove->get_many_related('Datetime'); |
|
583 | + // need to get all the related datetimes on this ticket and remove from every single one of them |
|
584 | + // (remember this process can ONLY kick off if there are NO tkts_sold) |
|
585 | + $dtts = $tkt_to_remove->get_many_related('Datetime'); |
|
586 | 586 | |
587 | - foreach ($dtts as $dtt) { |
|
588 | - $tkt_to_remove->_remove_relation_to($dtt, 'Datetime'); |
|
589 | - } |
|
587 | + foreach ($dtts as $dtt) { |
|
588 | + $tkt_to_remove->_remove_relation_to($dtt, 'Datetime'); |
|
589 | + } |
|
590 | 590 | |
591 | - // need to do the same for prices (except these prices can also be deleted because again, |
|
592 | - // tickets can only be trashed if they don't have any TKTs sold (otherwise they are just archived)) |
|
593 | - $tkt_to_remove->delete_related_permanently('Price'); |
|
591 | + // need to do the same for prices (except these prices can also be deleted because again, |
|
592 | + // tickets can only be trashed if they don't have any TKTs sold (otherwise they are just archived)) |
|
593 | + $tkt_to_remove->delete_related_permanently('Price'); |
|
594 | 594 | |
595 | - do_action('AHEE__espresso_events_Pricing_Hooks___update_tkts_delete_ticket', $tkt_to_remove); |
|
595 | + do_action('AHEE__espresso_events_Pricing_Hooks___update_tkts_delete_ticket', $tkt_to_remove); |
|
596 | 596 | |
597 | - // finally let's delete this ticket |
|
598 | - // (which should not be blocked at this point b/c we've removed all our relationships) |
|
599 | - $tkt_to_remove->delete_permanently(); |
|
600 | - } |
|
597 | + // finally let's delete this ticket |
|
598 | + // (which should not be blocked at this point b/c we've removed all our relationships) |
|
599 | + $tkt_to_remove->delete_permanently(); |
|
600 | + } |
|
601 | 601 | |
602 | - return $saved_tickets; |
|
603 | - } |
|
602 | + return $saved_tickets; |
|
603 | + } |
|
604 | 604 | |
605 | 605 | |
606 | - /** |
|
607 | - * |
|
608 | - * @access protected |
|
609 | - * |
|
610 | - * @param \EE_Ticket $ticket |
|
611 | - * @param \EE_Datetime[] $saved_datetimes |
|
612 | - * @param \EE_Datetime[] $added_datetimes |
|
613 | - * @param \EE_Datetime[] $removed_datetimes |
|
614 | - * |
|
615 | - * @return \EE_Ticket |
|
616 | - * @throws \EE_Error |
|
617 | - */ |
|
618 | - protected function _update_ticket_datetimes( |
|
619 | - EE_Ticket $ticket, |
|
620 | - $saved_datetimes = array(), |
|
621 | - $added_datetimes = array(), |
|
622 | - $removed_datetimes = array() |
|
623 | - ) { |
|
624 | - |
|
625 | - // to start we have to add the ticket to all the datetimes its supposed to be with, |
|
626 | - // and removing the ticket from datetimes it got removed from. |
|
627 | - |
|
628 | - // first let's add datetimes |
|
629 | - if ( ! empty($added_datetimes) && is_array($added_datetimes)) { |
|
630 | - foreach ($added_datetimes as $row_id) { |
|
631 | - $row_id = (int)$row_id; |
|
632 | - if (isset($saved_datetimes[$row_id]) && $saved_datetimes[$row_id] instanceof EE_Datetime) { |
|
633 | - $ticket->_add_relation_to($saved_datetimes[$row_id], 'Datetime'); |
|
634 | - // Is this an existing ticket (has an ID) and does it have any sold? |
|
635 | - // If so, then we need to add that to the DTT sold because this DTT is getting added. |
|
636 | - if ($ticket->ID() && $ticket->sold() > 0) { |
|
637 | - $saved_datetimes[$row_id]->increase_sold($ticket->sold()); |
|
638 | - $saved_datetimes[$row_id]->save(); |
|
639 | - } |
|
640 | - } |
|
641 | - } |
|
642 | - } |
|
643 | - // then remove datetimes |
|
644 | - if ( ! empty($removed_datetimes) && is_array($removed_datetimes)) { |
|
645 | - foreach ($removed_datetimes as $row_id) { |
|
646 | - $row_id = (int)$row_id; |
|
647 | - // its entirely possible that a datetime got deleted (instead of just removed from relationship. |
|
648 | - // So make sure we skip over this if the dtt isn't in the $saved_datetimes array) |
|
649 | - if (isset($saved_datetimes[$row_id]) && $saved_datetimes[$row_id] instanceof EE_Datetime) { |
|
650 | - $ticket->_remove_relation_to($saved_datetimes[$row_id], 'Datetime'); |
|
651 | - // Is this an existing ticket (has an ID) and does it have any sold? |
|
652 | - // If so, then we need to remove it's sold from the DTT_sold. |
|
653 | - if ($ticket->ID() && $ticket->sold() > 0) { |
|
654 | - $saved_datetimes[$row_id]->decrease_sold($ticket->sold()); |
|
655 | - $saved_datetimes[$row_id]->save(); |
|
656 | - } |
|
657 | - } |
|
658 | - } |
|
659 | - } |
|
660 | - // cap ticket qty by datetime reg limits |
|
661 | - $ticket->set_qty(min($ticket->qty(), $ticket->qty('reg_limit'))); |
|
662 | - |
|
663 | - return $ticket; |
|
664 | - } |
|
606 | + /** |
|
607 | + * |
|
608 | + * @access protected |
|
609 | + * |
|
610 | + * @param \EE_Ticket $ticket |
|
611 | + * @param \EE_Datetime[] $saved_datetimes |
|
612 | + * @param \EE_Datetime[] $added_datetimes |
|
613 | + * @param \EE_Datetime[] $removed_datetimes |
|
614 | + * |
|
615 | + * @return \EE_Ticket |
|
616 | + * @throws \EE_Error |
|
617 | + */ |
|
618 | + protected function _update_ticket_datetimes( |
|
619 | + EE_Ticket $ticket, |
|
620 | + $saved_datetimes = array(), |
|
621 | + $added_datetimes = array(), |
|
622 | + $removed_datetimes = array() |
|
623 | + ) { |
|
624 | + |
|
625 | + // to start we have to add the ticket to all the datetimes its supposed to be with, |
|
626 | + // and removing the ticket from datetimes it got removed from. |
|
627 | + |
|
628 | + // first let's add datetimes |
|
629 | + if ( ! empty($added_datetimes) && is_array($added_datetimes)) { |
|
630 | + foreach ($added_datetimes as $row_id) { |
|
631 | + $row_id = (int)$row_id; |
|
632 | + if (isset($saved_datetimes[$row_id]) && $saved_datetimes[$row_id] instanceof EE_Datetime) { |
|
633 | + $ticket->_add_relation_to($saved_datetimes[$row_id], 'Datetime'); |
|
634 | + // Is this an existing ticket (has an ID) and does it have any sold? |
|
635 | + // If so, then we need to add that to the DTT sold because this DTT is getting added. |
|
636 | + if ($ticket->ID() && $ticket->sold() > 0) { |
|
637 | + $saved_datetimes[$row_id]->increase_sold($ticket->sold()); |
|
638 | + $saved_datetimes[$row_id]->save(); |
|
639 | + } |
|
640 | + } |
|
641 | + } |
|
642 | + } |
|
643 | + // then remove datetimes |
|
644 | + if ( ! empty($removed_datetimes) && is_array($removed_datetimes)) { |
|
645 | + foreach ($removed_datetimes as $row_id) { |
|
646 | + $row_id = (int)$row_id; |
|
647 | + // its entirely possible that a datetime got deleted (instead of just removed from relationship. |
|
648 | + // So make sure we skip over this if the dtt isn't in the $saved_datetimes array) |
|
649 | + if (isset($saved_datetimes[$row_id]) && $saved_datetimes[$row_id] instanceof EE_Datetime) { |
|
650 | + $ticket->_remove_relation_to($saved_datetimes[$row_id], 'Datetime'); |
|
651 | + // Is this an existing ticket (has an ID) and does it have any sold? |
|
652 | + // If so, then we need to remove it's sold from the DTT_sold. |
|
653 | + if ($ticket->ID() && $ticket->sold() > 0) { |
|
654 | + $saved_datetimes[$row_id]->decrease_sold($ticket->sold()); |
|
655 | + $saved_datetimes[$row_id]->save(); |
|
656 | + } |
|
657 | + } |
|
658 | + } |
|
659 | + } |
|
660 | + // cap ticket qty by datetime reg limits |
|
661 | + $ticket->set_qty(min($ticket->qty(), $ticket->qty('reg_limit'))); |
|
662 | + |
|
663 | + return $ticket; |
|
664 | + } |
|
665 | 665 | |
666 | 666 | |
667 | - /** |
|
668 | - * |
|
669 | - * @access protected |
|
670 | - * |
|
671 | - * @param \EE_Ticket $ticket |
|
672 | - * @param array $price_rows |
|
673 | - * @param int $ticket_price |
|
674 | - * @param int $base_price |
|
675 | - * @param int $base_price_id |
|
676 | - * |
|
677 | - * @return \EE_Ticket |
|
678 | - * @throws \EE_Error |
|
679 | - */ |
|
680 | - protected function _duplicate_ticket( |
|
681 | - EE_Ticket $ticket, |
|
682 | - $price_rows = array(), |
|
683 | - $ticket_price = 0, |
|
684 | - $base_price = 0, |
|
685 | - $base_price_id = 0 |
|
686 | - ) { |
|
687 | - |
|
688 | - // create new ticket that's a copy of the existing |
|
689 | - // except a new id of course (and not archived) |
|
690 | - // AND has the new TKT_price associated with it. |
|
691 | - $new_ticket = clone $ticket; |
|
692 | - $new_ticket->set('TKT_ID', 0); |
|
693 | - $new_ticket->set('TKT_deleted', 0); |
|
694 | - $new_ticket->set('TKT_price', $ticket_price); |
|
695 | - $new_ticket->set('TKT_sold', 0); |
|
696 | - // let's get a new ID for this ticket |
|
697 | - $new_ticket->save(); |
|
698 | - // we also need to make sure this new ticket gets the same datetime attachments as the archived ticket |
|
699 | - $datetimes_on_existing = $ticket->get_many_related('Datetime'); |
|
700 | - $new_ticket = $this->_update_ticket_datetimes( |
|
701 | - $new_ticket, |
|
702 | - $datetimes_on_existing, |
|
703 | - array_keys($datetimes_on_existing) |
|
704 | - ); |
|
705 | - |
|
706 | - // $ticket will get archived later b/c we are NOT adding it to the saved_tickets array. |
|
707 | - // if existing $ticket has sold amount, then we need to adjust the qty for the new TKT to = the remaining |
|
708 | - // available. |
|
709 | - if ($ticket->sold() > 0) { |
|
710 | - $new_qty = $ticket->qty() - $ticket->sold(); |
|
711 | - $new_ticket->set_qty($new_qty); |
|
712 | - } |
|
713 | - //now we update the prices just for this ticket |
|
714 | - $new_ticket = $this->_add_prices_to_ticket($price_rows, $new_ticket, true); |
|
715 | - //and we update the base price |
|
716 | - $new_ticket = $this->_add_prices_to_ticket(array(), $new_ticket, true, $base_price, $base_price_id); |
|
717 | - |
|
718 | - return $new_ticket; |
|
719 | - } |
|
667 | + /** |
|
668 | + * |
|
669 | + * @access protected |
|
670 | + * |
|
671 | + * @param \EE_Ticket $ticket |
|
672 | + * @param array $price_rows |
|
673 | + * @param int $ticket_price |
|
674 | + * @param int $base_price |
|
675 | + * @param int $base_price_id |
|
676 | + * |
|
677 | + * @return \EE_Ticket |
|
678 | + * @throws \EE_Error |
|
679 | + */ |
|
680 | + protected function _duplicate_ticket( |
|
681 | + EE_Ticket $ticket, |
|
682 | + $price_rows = array(), |
|
683 | + $ticket_price = 0, |
|
684 | + $base_price = 0, |
|
685 | + $base_price_id = 0 |
|
686 | + ) { |
|
687 | + |
|
688 | + // create new ticket that's a copy of the existing |
|
689 | + // except a new id of course (and not archived) |
|
690 | + // AND has the new TKT_price associated with it. |
|
691 | + $new_ticket = clone $ticket; |
|
692 | + $new_ticket->set('TKT_ID', 0); |
|
693 | + $new_ticket->set('TKT_deleted', 0); |
|
694 | + $new_ticket->set('TKT_price', $ticket_price); |
|
695 | + $new_ticket->set('TKT_sold', 0); |
|
696 | + // let's get a new ID for this ticket |
|
697 | + $new_ticket->save(); |
|
698 | + // we also need to make sure this new ticket gets the same datetime attachments as the archived ticket |
|
699 | + $datetimes_on_existing = $ticket->get_many_related('Datetime'); |
|
700 | + $new_ticket = $this->_update_ticket_datetimes( |
|
701 | + $new_ticket, |
|
702 | + $datetimes_on_existing, |
|
703 | + array_keys($datetimes_on_existing) |
|
704 | + ); |
|
705 | + |
|
706 | + // $ticket will get archived later b/c we are NOT adding it to the saved_tickets array. |
|
707 | + // if existing $ticket has sold amount, then we need to adjust the qty for the new TKT to = the remaining |
|
708 | + // available. |
|
709 | + if ($ticket->sold() > 0) { |
|
710 | + $new_qty = $ticket->qty() - $ticket->sold(); |
|
711 | + $new_ticket->set_qty($new_qty); |
|
712 | + } |
|
713 | + //now we update the prices just for this ticket |
|
714 | + $new_ticket = $this->_add_prices_to_ticket($price_rows, $new_ticket, true); |
|
715 | + //and we update the base price |
|
716 | + $new_ticket = $this->_add_prices_to_ticket(array(), $new_ticket, true, $base_price, $base_price_id); |
|
717 | + |
|
718 | + return $new_ticket; |
|
719 | + } |
|
720 | 720 | |
721 | 721 | |
722 | - /** |
|
723 | - * This attaches a list of given prices to a ticket. |
|
724 | - * Note we dont' have to worry about ever removing relationships (or archiving prices) because if there is a change |
|
725 | - * in price information on a ticket, a new ticket is created anyways so the archived ticket will retain the old |
|
726 | - * price info and prices are automatically "archived" via the ticket. |
|
727 | - * |
|
728 | - * @access private |
|
729 | - * |
|
730 | - * @param array $prices Array of prices from the form. |
|
731 | - * @param EE_Ticket $ticket EE_Ticket object that prices are being attached to. |
|
732 | - * @param bool $new_prices Whether attach existing incoming prices or create new ones. |
|
733 | - * @param int|bool $base_price if FALSE then NOT doing a base price add. |
|
734 | - * @param int|bool $base_price_id if present then this is the base_price_id being updated. |
|
735 | - * |
|
736 | - * @return EE_Ticket |
|
737 | - */ |
|
738 | - protected function _add_prices_to_ticket( |
|
739 | - $prices = array(), |
|
740 | - EE_Ticket $ticket, |
|
741 | - $new_prices = false, |
|
742 | - $base_price = false, |
|
743 | - $base_price_id = false |
|
744 | - ) { |
|
745 | - |
|
746 | - //let's just get any current prices that may exist on the given ticket so we can remove any prices that got trashed in this session. |
|
747 | - $current_prices_on_ticket = $base_price !== false ? $ticket->base_price(true) : $ticket->price_modifiers(); |
|
748 | - |
|
749 | - $updated_prices = array(); |
|
750 | - |
|
751 | - // if $base_price ! FALSE then updating a base price. |
|
752 | - if ($base_price !== false) { |
|
753 | - $prices[1] = array( |
|
754 | - 'PRC_ID' => $new_prices || $base_price_id === 1 ? null : $base_price_id, |
|
755 | - 'PRT_ID' => 1, |
|
756 | - 'PRC_amount' => $base_price, |
|
757 | - 'PRC_name' => $ticket->get('TKT_name'), |
|
758 | - 'PRC_desc' => $ticket->get('TKT_description') |
|
759 | - ); |
|
760 | - } |
|
761 | - |
|
762 | - //possibly need to save tkt |
|
763 | - if ( ! $ticket->ID()) { |
|
764 | - $ticket->save(); |
|
765 | - } |
|
766 | - |
|
767 | - foreach ($prices as $row => $prc) { |
|
768 | - $prt_id = ! empty($prc['PRT_ID']) ? $prc['PRT_ID'] : null; |
|
769 | - if (empty($prt_id)) { |
|
770 | - continue; |
|
771 | - } //prices MUST have a price type id. |
|
772 | - $PRC_values = array( |
|
773 | - 'PRC_ID' => ! empty($prc['PRC_ID']) ? $prc['PRC_ID'] : null, |
|
774 | - 'PRT_ID' => $prt_id, |
|
775 | - 'PRC_amount' => ! empty($prc['PRC_amount']) ? $prc['PRC_amount'] : 0, |
|
776 | - 'PRC_name' => ! empty($prc['PRC_name']) ? $prc['PRC_name'] : '', |
|
777 | - 'PRC_desc' => ! empty($prc['PRC_desc']) ? $prc['PRC_desc'] : '', |
|
778 | - 'PRC_is_default' => false, |
|
779 | - //make sure we set PRC_is_default to false for all ticket saves from event_editor |
|
780 | - 'PRC_order' => $row |
|
781 | - ); |
|
782 | - if ($new_prices || empty($PRC_values['PRC_ID'])) { |
|
783 | - $PRC_values['PRC_ID'] = 0; |
|
784 | - $PRC = EE_Registry::instance()->load_class('Price', array($PRC_values), false, false); |
|
785 | - } else { |
|
786 | - $PRC = EE_Registry::instance()->load_model('Price')->get_one_by_ID($prc['PRC_ID']); |
|
787 | - //update this price with new values |
|
788 | - foreach ($PRC_values as $field => $newprc) { |
|
789 | - $PRC->set($field, $newprc); |
|
790 | - } |
|
791 | - } |
|
792 | - $PRC->save(); |
|
793 | - $prcid = $PRC->ID(); |
|
794 | - $updated_prices[$prcid] = $PRC; |
|
795 | - $ticket->_add_relation_to($PRC, 'Price'); |
|
796 | - } |
|
797 | - |
|
798 | - //now let's remove any prices that got removed from the ticket |
|
799 | - if ( ! empty ($current_prices_on_ticket)) { |
|
800 | - $current = array_keys($current_prices_on_ticket); |
|
801 | - $updated = array_keys($updated_prices); |
|
802 | - $prices_to_remove = array_diff($current, $updated); |
|
803 | - if ( ! empty($prices_to_remove)) { |
|
804 | - foreach ($prices_to_remove as $prc_id) { |
|
805 | - $p = $current_prices_on_ticket[$prc_id]; |
|
806 | - $ticket->_remove_relation_to($p, 'Price'); |
|
722 | + /** |
|
723 | + * This attaches a list of given prices to a ticket. |
|
724 | + * Note we dont' have to worry about ever removing relationships (or archiving prices) because if there is a change |
|
725 | + * in price information on a ticket, a new ticket is created anyways so the archived ticket will retain the old |
|
726 | + * price info and prices are automatically "archived" via the ticket. |
|
727 | + * |
|
728 | + * @access private |
|
729 | + * |
|
730 | + * @param array $prices Array of prices from the form. |
|
731 | + * @param EE_Ticket $ticket EE_Ticket object that prices are being attached to. |
|
732 | + * @param bool $new_prices Whether attach existing incoming prices or create new ones. |
|
733 | + * @param int|bool $base_price if FALSE then NOT doing a base price add. |
|
734 | + * @param int|bool $base_price_id if present then this is the base_price_id being updated. |
|
735 | + * |
|
736 | + * @return EE_Ticket |
|
737 | + */ |
|
738 | + protected function _add_prices_to_ticket( |
|
739 | + $prices = array(), |
|
740 | + EE_Ticket $ticket, |
|
741 | + $new_prices = false, |
|
742 | + $base_price = false, |
|
743 | + $base_price_id = false |
|
744 | + ) { |
|
745 | + |
|
746 | + //let's just get any current prices that may exist on the given ticket so we can remove any prices that got trashed in this session. |
|
747 | + $current_prices_on_ticket = $base_price !== false ? $ticket->base_price(true) : $ticket->price_modifiers(); |
|
748 | + |
|
749 | + $updated_prices = array(); |
|
750 | + |
|
751 | + // if $base_price ! FALSE then updating a base price. |
|
752 | + if ($base_price !== false) { |
|
753 | + $prices[1] = array( |
|
754 | + 'PRC_ID' => $new_prices || $base_price_id === 1 ? null : $base_price_id, |
|
755 | + 'PRT_ID' => 1, |
|
756 | + 'PRC_amount' => $base_price, |
|
757 | + 'PRC_name' => $ticket->get('TKT_name'), |
|
758 | + 'PRC_desc' => $ticket->get('TKT_description') |
|
759 | + ); |
|
760 | + } |
|
761 | + |
|
762 | + //possibly need to save tkt |
|
763 | + if ( ! $ticket->ID()) { |
|
764 | + $ticket->save(); |
|
765 | + } |
|
766 | + |
|
767 | + foreach ($prices as $row => $prc) { |
|
768 | + $prt_id = ! empty($prc['PRT_ID']) ? $prc['PRT_ID'] : null; |
|
769 | + if (empty($prt_id)) { |
|
770 | + continue; |
|
771 | + } //prices MUST have a price type id. |
|
772 | + $PRC_values = array( |
|
773 | + 'PRC_ID' => ! empty($prc['PRC_ID']) ? $prc['PRC_ID'] : null, |
|
774 | + 'PRT_ID' => $prt_id, |
|
775 | + 'PRC_amount' => ! empty($prc['PRC_amount']) ? $prc['PRC_amount'] : 0, |
|
776 | + 'PRC_name' => ! empty($prc['PRC_name']) ? $prc['PRC_name'] : '', |
|
777 | + 'PRC_desc' => ! empty($prc['PRC_desc']) ? $prc['PRC_desc'] : '', |
|
778 | + 'PRC_is_default' => false, |
|
779 | + //make sure we set PRC_is_default to false for all ticket saves from event_editor |
|
780 | + 'PRC_order' => $row |
|
781 | + ); |
|
782 | + if ($new_prices || empty($PRC_values['PRC_ID'])) { |
|
783 | + $PRC_values['PRC_ID'] = 0; |
|
784 | + $PRC = EE_Registry::instance()->load_class('Price', array($PRC_values), false, false); |
|
785 | + } else { |
|
786 | + $PRC = EE_Registry::instance()->load_model('Price')->get_one_by_ID($prc['PRC_ID']); |
|
787 | + //update this price with new values |
|
788 | + foreach ($PRC_values as $field => $newprc) { |
|
789 | + $PRC->set($field, $newprc); |
|
790 | + } |
|
791 | + } |
|
792 | + $PRC->save(); |
|
793 | + $prcid = $PRC->ID(); |
|
794 | + $updated_prices[$prcid] = $PRC; |
|
795 | + $ticket->_add_relation_to($PRC, 'Price'); |
|
796 | + } |
|
797 | + |
|
798 | + //now let's remove any prices that got removed from the ticket |
|
799 | + if ( ! empty ($current_prices_on_ticket)) { |
|
800 | + $current = array_keys($current_prices_on_ticket); |
|
801 | + $updated = array_keys($updated_prices); |
|
802 | + $prices_to_remove = array_diff($current, $updated); |
|
803 | + if ( ! empty($prices_to_remove)) { |
|
804 | + foreach ($prices_to_remove as $prc_id) { |
|
805 | + $p = $current_prices_on_ticket[$prc_id]; |
|
806 | + $ticket->_remove_relation_to($p, 'Price'); |
|
807 | 807 | |
808 | - //delete permanently the price |
|
809 | - $p->delete_permanently(); |
|
810 | - } |
|
811 | - } |
|
812 | - } |
|
813 | - |
|
814 | - return $ticket; |
|
815 | - } |
|
808 | + //delete permanently the price |
|
809 | + $p->delete_permanently(); |
|
810 | + } |
|
811 | + } |
|
812 | + } |
|
813 | + |
|
814 | + return $ticket; |
|
815 | + } |
|
816 | 816 | |
817 | 817 | |
818 | - public function autosave_handling($event_admin_obj) |
|
819 | - { |
|
820 | - return $event_admin_obj; //doing nothing for the moment. |
|
821 | - //todo when I get to this remember that I need to set the template args on the $event_admin_obj (use the set_template_args() method) |
|
822 | - |
|
823 | - /** |
|
824 | - * need to remember to handle TICKET DEFAULT saves correctly: I've got two input fields in the dom: |
|
825 | - * |
|
826 | - * 1. TKT_is_default_selector (visible) |
|
827 | - * 2. TKT_is_default (hidden) |
|
828 | - * |
|
829 | - * I think we'll use the TKT_is_default for recording whether the ticket displayed IS a default ticket (on new event creations). Whereas the TKT_is_default_selector is for the user to indicate they want this ticket to be saved as a default. |
|
830 | - * |
|
831 | - * The tricky part is, on an initial display on create or edit (or after manually updating), the TKT_is_default_selector will always be unselected and the TKT_is_default will only be true if this is a create. However, after an autosave, users will want some sort of indicator that the TKT HAS been saved as a default.. in other words we don't want to remove the check on TKT_is_default_selector. So here's what I'm thinking. |
|
832 | - * On Autosave: |
|
833 | - * 1. If TKT_is_default is true: we create a new TKT, send back the new id and add id to related elements, then set the TKT_is_default to false. |
|
834 | - * 2. If TKT_is_default_selector is true: we create/edit existing ticket (following conditions above as well). We do NOT create a new default ticket. The checkbox stays selected after autosave. |
|
835 | - * 3. only on MANUAL update do we check for the selection and if selected create the new default ticket. |
|
836 | - */ |
|
837 | - } |
|
818 | + public function autosave_handling($event_admin_obj) |
|
819 | + { |
|
820 | + return $event_admin_obj; //doing nothing for the moment. |
|
821 | + //todo when I get to this remember that I need to set the template args on the $event_admin_obj (use the set_template_args() method) |
|
822 | + |
|
823 | + /** |
|
824 | + * need to remember to handle TICKET DEFAULT saves correctly: I've got two input fields in the dom: |
|
825 | + * |
|
826 | + * 1. TKT_is_default_selector (visible) |
|
827 | + * 2. TKT_is_default (hidden) |
|
828 | + * |
|
829 | + * I think we'll use the TKT_is_default for recording whether the ticket displayed IS a default ticket (on new event creations). Whereas the TKT_is_default_selector is for the user to indicate they want this ticket to be saved as a default. |
|
830 | + * |
|
831 | + * The tricky part is, on an initial display on create or edit (or after manually updating), the TKT_is_default_selector will always be unselected and the TKT_is_default will only be true if this is a create. However, after an autosave, users will want some sort of indicator that the TKT HAS been saved as a default.. in other words we don't want to remove the check on TKT_is_default_selector. So here's what I'm thinking. |
|
832 | + * On Autosave: |
|
833 | + * 1. If TKT_is_default is true: we create a new TKT, send back the new id and add id to related elements, then set the TKT_is_default to false. |
|
834 | + * 2. If TKT_is_default_selector is true: we create/edit existing ticket (following conditions above as well). We do NOT create a new default ticket. The checkbox stays selected after autosave. |
|
835 | + * 3. only on MANUAL update do we check for the selection and if selected create the new default ticket. |
|
836 | + */ |
|
837 | + } |
|
838 | 838 | |
839 | 839 | |
840 | - public function pricing_metabox() |
|
841 | - { |
|
842 | - $existing_datetime_ids = $existing_ticket_ids = $datetime_tickets = $ticket_datetimes = array(); |
|
843 | - |
|
844 | - $evtobj = $this->_adminpage_obj->get_cpt_model_obj(); |
|
845 | - |
|
846 | - //set is_creating_event property. |
|
847 | - $evtID = $evtobj->ID(); |
|
848 | - $this->_is_creating_event = absint($evtID) != 0 ? false : true; |
|
849 | - |
|
850 | - //default main template args |
|
851 | - $main_template_args = array( |
|
852 | - 'event_datetime_help_link' => EEH_Template::get_help_tab_link('event_editor_event_datetimes_help_tab', |
|
853 | - $this->_adminpage_obj->page_slug, $this->_adminpage_obj->get_req_action(), false, false), |
|
854 | - //todo need to add a filter to the template for the help text in the Events_Admin_Page core file so we can add further help |
|
855 | - 'existing_datetime_ids' => '', |
|
856 | - 'total_dtt_rows' => 1, |
|
857 | - 'add_new_dtt_help_link' => EEH_Template::get_help_tab_link('add_new_dtt_info', |
|
858 | - $this->_adminpage_obj->page_slug, $this->_adminpage_obj->get_req_action(), false, false), |
|
859 | - //todo need to add this help info id to the Events_Admin_Page core file so we can access it here. |
|
860 | - 'datetime_rows' => '', |
|
861 | - 'show_tickets_container' => '', |
|
862 | - //$this->_adminpage_obj->get_cpt_model_obj()->ID() > 1 ? ' style="display:none;"' : '', |
|
863 | - 'ticket_rows' => '', |
|
864 | - 'existing_ticket_ids' => '', |
|
865 | - 'total_ticket_rows' => 1, |
|
866 | - 'ticket_js_structure' => '', |
|
867 | - 'ee_collapsible_status' => ' ee-collapsible-open' |
|
868 | - //$this->_adminpage_obj->get_cpt_model_obj()->ID() > 0 ? ' ee-collapsible-closed' : ' ee-collapsible-open' |
|
869 | - ); |
|
870 | - |
|
871 | - $timezone = $evtobj instanceof EE_Event ? $evtobj->timezone_string() : null; |
|
872 | - |
|
873 | - do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
|
874 | - |
|
875 | - /** |
|
876 | - * 1. Start with retrieving Datetimes |
|
877 | - * 2. For each datetime get related tickets |
|
878 | - * 3. For each ticket get related prices |
|
879 | - */ |
|
880 | - |
|
881 | - $DTM = EE_Registry::instance()->load_model('Datetime', array($timezone)); |
|
882 | - $times = $DTM->get_all_event_dates($evtID); |
|
883 | - |
|
884 | - |
|
885 | - $main_template_args['total_dtt_rows'] = count($times); |
|
886 | - |
|
887 | - /** @see https://events.codebasehq.com/projects/event-espresso/tickets/9486 for why we are counting $dttrow and then setting that on the Datetime object */ |
|
888 | - $dttrow = 1; |
|
889 | - foreach ($times as $time) { |
|
890 | - $dttid = $time->get('DTT_ID'); |
|
891 | - $time->set('DTT_order', $dttrow); |
|
892 | - $existing_datetime_ids[] = $dttid; |
|
840 | + public function pricing_metabox() |
|
841 | + { |
|
842 | + $existing_datetime_ids = $existing_ticket_ids = $datetime_tickets = $ticket_datetimes = array(); |
|
843 | + |
|
844 | + $evtobj = $this->_adminpage_obj->get_cpt_model_obj(); |
|
845 | + |
|
846 | + //set is_creating_event property. |
|
847 | + $evtID = $evtobj->ID(); |
|
848 | + $this->_is_creating_event = absint($evtID) != 0 ? false : true; |
|
849 | + |
|
850 | + //default main template args |
|
851 | + $main_template_args = array( |
|
852 | + 'event_datetime_help_link' => EEH_Template::get_help_tab_link('event_editor_event_datetimes_help_tab', |
|
853 | + $this->_adminpage_obj->page_slug, $this->_adminpage_obj->get_req_action(), false, false), |
|
854 | + //todo need to add a filter to the template for the help text in the Events_Admin_Page core file so we can add further help |
|
855 | + 'existing_datetime_ids' => '', |
|
856 | + 'total_dtt_rows' => 1, |
|
857 | + 'add_new_dtt_help_link' => EEH_Template::get_help_tab_link('add_new_dtt_info', |
|
858 | + $this->_adminpage_obj->page_slug, $this->_adminpage_obj->get_req_action(), false, false), |
|
859 | + //todo need to add this help info id to the Events_Admin_Page core file so we can access it here. |
|
860 | + 'datetime_rows' => '', |
|
861 | + 'show_tickets_container' => '', |
|
862 | + //$this->_adminpage_obj->get_cpt_model_obj()->ID() > 1 ? ' style="display:none;"' : '', |
|
863 | + 'ticket_rows' => '', |
|
864 | + 'existing_ticket_ids' => '', |
|
865 | + 'total_ticket_rows' => 1, |
|
866 | + 'ticket_js_structure' => '', |
|
867 | + 'ee_collapsible_status' => ' ee-collapsible-open' |
|
868 | + //$this->_adminpage_obj->get_cpt_model_obj()->ID() > 0 ? ' ee-collapsible-closed' : ' ee-collapsible-open' |
|
869 | + ); |
|
870 | + |
|
871 | + $timezone = $evtobj instanceof EE_Event ? $evtobj->timezone_string() : null; |
|
872 | + |
|
873 | + do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
|
874 | + |
|
875 | + /** |
|
876 | + * 1. Start with retrieving Datetimes |
|
877 | + * 2. For each datetime get related tickets |
|
878 | + * 3. For each ticket get related prices |
|
879 | + */ |
|
880 | + |
|
881 | + $DTM = EE_Registry::instance()->load_model('Datetime', array($timezone)); |
|
882 | + $times = $DTM->get_all_event_dates($evtID); |
|
883 | + |
|
884 | + |
|
885 | + $main_template_args['total_dtt_rows'] = count($times); |
|
886 | + |
|
887 | + /** @see https://events.codebasehq.com/projects/event-espresso/tickets/9486 for why we are counting $dttrow and then setting that on the Datetime object */ |
|
888 | + $dttrow = 1; |
|
889 | + foreach ($times as $time) { |
|
890 | + $dttid = $time->get('DTT_ID'); |
|
891 | + $time->set('DTT_order', $dttrow); |
|
892 | + $existing_datetime_ids[] = $dttid; |
|
893 | 893 | |
894 | - //tickets attached |
|
895 | - $related_tickets = $time->ID() > 0 ? $time->get_many_related('Ticket', array( |
|
896 | - array('OR' => array('TKT_deleted' => 1, 'TKT_deleted*' => 0)), |
|
897 | - 'default_where_conditions' => 'none', |
|
898 | - 'order_by' => array('TKT_order' => 'ASC') |
|
899 | - )) : array(); |
|
894 | + //tickets attached |
|
895 | + $related_tickets = $time->ID() > 0 ? $time->get_many_related('Ticket', array( |
|
896 | + array('OR' => array('TKT_deleted' => 1, 'TKT_deleted*' => 0)), |
|
897 | + 'default_where_conditions' => 'none', |
|
898 | + 'order_by' => array('TKT_order' => 'ASC') |
|
899 | + )) : array(); |
|
900 | 900 | |
901 | - //if there are no related tickets this is likely a new event OR autodraft |
|
902 | - // event so we need to generate the default tickets because dtts |
|
903 | - // ALWAYS have at least one related ticket!!. EXCEPT, we dont' do this if there is already more than one |
|
904 | - // datetime on the event. |
|
905 | - if (empty ($related_tickets) && count($times) < 2) { |
|
906 | - $related_tickets = EE_Registry::instance()->load_model('Ticket')->get_all_default_tickets(); |
|
901 | + //if there are no related tickets this is likely a new event OR autodraft |
|
902 | + // event so we need to generate the default tickets because dtts |
|
903 | + // ALWAYS have at least one related ticket!!. EXCEPT, we dont' do this if there is already more than one |
|
904 | + // datetime on the event. |
|
905 | + if (empty ($related_tickets) && count($times) < 2) { |
|
906 | + $related_tickets = EE_Registry::instance()->load_model('Ticket')->get_all_default_tickets(); |
|
907 | 907 | |
908 | - //this should be ordered by TKT_ID, so let's grab the first default ticket (which will be the main default) and ensure it has any default prices added to it (but do NOT save). |
|
909 | - $default_prices = EEM_Price::instance()->get_all_default_prices(); |
|
908 | + //this should be ordered by TKT_ID, so let's grab the first default ticket (which will be the main default) and ensure it has any default prices added to it (but do NOT save). |
|
909 | + $default_prices = EEM_Price::instance()->get_all_default_prices(); |
|
910 | 910 | |
911 | - $main_default_ticket = reset($related_tickets); |
|
912 | - if ($main_default_ticket instanceof EE_Ticket) { |
|
913 | - foreach ($default_prices as $default_price) { |
|
914 | - if ($default_price->is_base_price()) { |
|
915 | - continue; |
|
916 | - } |
|
917 | - $main_default_ticket->cache('Price', $default_price); |
|
918 | - } |
|
919 | - } |
|
920 | - } |
|
911 | + $main_default_ticket = reset($related_tickets); |
|
912 | + if ($main_default_ticket instanceof EE_Ticket) { |
|
913 | + foreach ($default_prices as $default_price) { |
|
914 | + if ($default_price->is_base_price()) { |
|
915 | + continue; |
|
916 | + } |
|
917 | + $main_default_ticket->cache('Price', $default_price); |
|
918 | + } |
|
919 | + } |
|
920 | + } |
|
921 | 921 | |
922 | 922 | |
923 | - //we can't actually setup rows in this loop yet cause we don't know all the unique tickets for this event yet (tickets are linked through all datetimes). So we're going to temporarily cache some of that information. |
|
923 | + //we can't actually setup rows in this loop yet cause we don't know all the unique tickets for this event yet (tickets are linked through all datetimes). So we're going to temporarily cache some of that information. |
|
924 | 924 | |
925 | - //loop through and setup the ticket rows and make sure the order is set. |
|
926 | - foreach ($related_tickets as $ticket) { |
|
927 | - $tktid = $ticket->get('TKT_ID'); |
|
928 | - $tktrow = $ticket->get('TKT_row'); |
|
929 | - //we only want unique tickets in our final display!! |
|
930 | - if ( ! in_array($tktid, $existing_ticket_ids)) { |
|
931 | - $existing_ticket_ids[] = $tktid; |
|
932 | - $all_tickets[] = $ticket; |
|
933 | - } |
|
925 | + //loop through and setup the ticket rows and make sure the order is set. |
|
926 | + foreach ($related_tickets as $ticket) { |
|
927 | + $tktid = $ticket->get('TKT_ID'); |
|
928 | + $tktrow = $ticket->get('TKT_row'); |
|
929 | + //we only want unique tickets in our final display!! |
|
930 | + if ( ! in_array($tktid, $existing_ticket_ids)) { |
|
931 | + $existing_ticket_ids[] = $tktid; |
|
932 | + $all_tickets[] = $ticket; |
|
933 | + } |
|
934 | 934 | |
935 | - //temporary cache of this ticket info for this datetime for later processing of datetime rows. |
|
936 | - $datetime_tickets[$dttid][] = $tktrow; |
|
935 | + //temporary cache of this ticket info for this datetime for later processing of datetime rows. |
|
936 | + $datetime_tickets[$dttid][] = $tktrow; |
|
937 | 937 | |
938 | - //temporary cache of this datetime info for this ticket for later processing of ticket rows. |
|
939 | - if ( ! isset($ticket_datetimes[$tktid]) || ! in_array($dttrow, $ticket_datetimes[$tktid])) { |
|
940 | - $ticket_datetimes[$tktid][] = $dttrow; |
|
941 | - } |
|
942 | - } |
|
943 | - $dttrow++; |
|
944 | - } |
|
945 | - |
|
946 | - $main_template_args['total_ticket_rows'] = count($existing_ticket_ids); |
|
947 | - $main_template_args['existing_ticket_ids'] = implode(',', $existing_ticket_ids); |
|
948 | - $main_template_args['existing_datetime_ids'] = implode(',', $existing_datetime_ids); |
|
949 | - |
|
950 | - //sort $all_tickets by order |
|
951 | - usort($all_tickets, function ($a, $b) { |
|
952 | - $a_order = (int)$a->get('TKT_order'); |
|
953 | - $b_order = (int)$b->get('TKT_order'); |
|
954 | - if ($a_order == $b_order) { |
|
955 | - return 0; |
|
956 | - } |
|
938 | + //temporary cache of this datetime info for this ticket for later processing of ticket rows. |
|
939 | + if ( ! isset($ticket_datetimes[$tktid]) || ! in_array($dttrow, $ticket_datetimes[$tktid])) { |
|
940 | + $ticket_datetimes[$tktid][] = $dttrow; |
|
941 | + } |
|
942 | + } |
|
943 | + $dttrow++; |
|
944 | + } |
|
945 | + |
|
946 | + $main_template_args['total_ticket_rows'] = count($existing_ticket_ids); |
|
947 | + $main_template_args['existing_ticket_ids'] = implode(',', $existing_ticket_ids); |
|
948 | + $main_template_args['existing_datetime_ids'] = implode(',', $existing_datetime_ids); |
|
949 | + |
|
950 | + //sort $all_tickets by order |
|
951 | + usort($all_tickets, function ($a, $b) { |
|
952 | + $a_order = (int)$a->get('TKT_order'); |
|
953 | + $b_order = (int)$b->get('TKT_order'); |
|
954 | + if ($a_order == $b_order) { |
|
955 | + return 0; |
|
956 | + } |
|
957 | 957 | |
958 | - return ($a_order < $b_order) ? -1 : 1; |
|
959 | - }); |
|
960 | - |
|
961 | - //k NOW we have all the data we need for setting up the dtt rows and ticket rows so we start our dtt loop again. |
|
962 | - $dttrow = 1; |
|
963 | - foreach ($times as $time) { |
|
964 | - $main_template_args['datetime_rows'] .= $this->_get_datetime_row($dttrow, $time, $datetime_tickets, |
|
965 | - $all_tickets, false, $times); |
|
966 | - $dttrow++; |
|
967 | - } |
|
968 | - |
|
969 | - //then loop through all tickets for the ticket rows. |
|
970 | - $tktrow = 1; |
|
971 | - foreach ($all_tickets as $ticket) { |
|
972 | - $main_template_args['ticket_rows'] .= $this->_get_ticket_row($tktrow, $ticket, $ticket_datetimes, $times, |
|
973 | - false, $all_tickets); |
|
974 | - $tktrow++; |
|
975 | - } |
|
976 | - |
|
977 | - $main_template_args['ticket_js_structure'] = $this->_get_ticket_js_structure($times, $all_tickets); |
|
978 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_metabox_main.template.php'; |
|
979 | - EEH_Template::display_template($template, $main_template_args); |
|
980 | - |
|
981 | - return; |
|
982 | - } |
|
958 | + return ($a_order < $b_order) ? -1 : 1; |
|
959 | + }); |
|
960 | + |
|
961 | + //k NOW we have all the data we need for setting up the dtt rows and ticket rows so we start our dtt loop again. |
|
962 | + $dttrow = 1; |
|
963 | + foreach ($times as $time) { |
|
964 | + $main_template_args['datetime_rows'] .= $this->_get_datetime_row($dttrow, $time, $datetime_tickets, |
|
965 | + $all_tickets, false, $times); |
|
966 | + $dttrow++; |
|
967 | + } |
|
968 | + |
|
969 | + //then loop through all tickets for the ticket rows. |
|
970 | + $tktrow = 1; |
|
971 | + foreach ($all_tickets as $ticket) { |
|
972 | + $main_template_args['ticket_rows'] .= $this->_get_ticket_row($tktrow, $ticket, $ticket_datetimes, $times, |
|
973 | + false, $all_tickets); |
|
974 | + $tktrow++; |
|
975 | + } |
|
976 | + |
|
977 | + $main_template_args['ticket_js_structure'] = $this->_get_ticket_js_structure($times, $all_tickets); |
|
978 | + $template = PRICING_TEMPLATE_PATH . 'event_tickets_metabox_main.template.php'; |
|
979 | + EEH_Template::display_template($template, $main_template_args); |
|
980 | + |
|
981 | + return; |
|
982 | + } |
|
983 | 983 | |
984 | 984 | |
985 | - protected function _get_datetime_row( |
|
986 | - $dttrow, |
|
987 | - EE_Datetime $dtt, |
|
988 | - $datetime_tickets, |
|
989 | - $all_tickets, |
|
990 | - $default = false, |
|
991 | - $all_dtts = array() |
|
992 | - ) { |
|
993 | - |
|
994 | - $dtt_display_template_args = array( |
|
995 | - 'dtt_edit_row' => $this->_get_dtt_edit_row($dttrow, $dtt, $default, $all_dtts), |
|
996 | - 'dtt_attached_tickets_row' => $this->_get_dtt_attached_tickets_row($dttrow, $dtt, $datetime_tickets, |
|
997 | - $all_tickets, $default), |
|
998 | - 'dtt_row' => $default ? 'DTTNUM' : $dttrow |
|
999 | - ); |
|
1000 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_row_wrapper.template.php'; |
|
1001 | - |
|
1002 | - return EEH_Template::display_template($template, $dtt_display_template_args, true); |
|
1003 | - } |
|
985 | + protected function _get_datetime_row( |
|
986 | + $dttrow, |
|
987 | + EE_Datetime $dtt, |
|
988 | + $datetime_tickets, |
|
989 | + $all_tickets, |
|
990 | + $default = false, |
|
991 | + $all_dtts = array() |
|
992 | + ) { |
|
993 | + |
|
994 | + $dtt_display_template_args = array( |
|
995 | + 'dtt_edit_row' => $this->_get_dtt_edit_row($dttrow, $dtt, $default, $all_dtts), |
|
996 | + 'dtt_attached_tickets_row' => $this->_get_dtt_attached_tickets_row($dttrow, $dtt, $datetime_tickets, |
|
997 | + $all_tickets, $default), |
|
998 | + 'dtt_row' => $default ? 'DTTNUM' : $dttrow |
|
999 | + ); |
|
1000 | + $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_row_wrapper.template.php'; |
|
1001 | + |
|
1002 | + return EEH_Template::display_template($template, $dtt_display_template_args, true); |
|
1003 | + } |
|
1004 | 1004 | |
1005 | 1005 | |
1006 | - /** |
|
1007 | - * This method is used to generate a dtt fields edit row. |
|
1008 | - * The same row is used to generate a row with valid DTT objects and the default row that is used as the |
|
1009 | - * skeleton by the js. |
|
1010 | - * |
|
1011 | - * @param int $dttrow The row number for the row being generated. |
|
1012 | - * @param mixed EE_Datetime|null $dtt If not default row being |
|
1013 | - * generated, this must be a EE_Datetime |
|
1014 | - * object. |
|
1015 | - * @param bool $default Whether a default row is being generated or not. |
|
1016 | - * @param EE_Datetime[] $all_dtts This is the array of all datetimes used in the editor. |
|
1017 | - * |
|
1018 | - * @return string Generated edit row. |
|
1019 | - */ |
|
1020 | - protected function _get_dtt_edit_row($dttrow, $dtt, $default, $all_dtts) |
|
1021 | - { |
|
1022 | - |
|
1023 | - // if the incoming $dtt object is NOT an instance of EE_Datetime then force default to true. |
|
1024 | - $default = ! $dtt instanceof EE_Datetime ? true : false; |
|
1025 | - |
|
1026 | - $template_args = array( |
|
1027 | - 'dtt_row' => $default ? 'DTTNUM' : $dttrow, |
|
1028 | - 'event_datetimes_name' => $default ? 'DTTNAMEATTR' : 'edit_event_datetimes', |
|
1029 | - 'edit_dtt_expanded' => '', |
|
1030 | - //$this->_adminpage_obj->get_cpt_model_obj()->ID() > 0 ? '' : ' ee-edit-editing', |
|
1031 | - 'DTT_ID' => $default ? '' : $dtt->ID(), |
|
1032 | - 'DTT_name' => $default ? '' : $dtt->name(), |
|
1033 | - 'DTT_description' => $default ? '' : $dtt->description(), |
|
1034 | - 'DTT_EVT_start' => $default ? '' : $dtt->start_date($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']), |
|
1035 | - 'DTT_EVT_end' => $default ? '' : $dtt->end_date($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']), |
|
1036 | - 'DTT_reg_limit' => $default ? '' : $dtt->get_pretty('DTT_reg_limit', 'input'), |
|
1037 | - 'DTT_order' => $default ? 'DTTNUM' : $dttrow, |
|
1038 | - 'dtt_sold' => $default ? '0' : $dtt->get('DTT_sold'), |
|
1039 | - 'clone_icon' => ! empty($dtt) && $dtt->get('DTT_sold') > 0 ? '' : 'clone-icon ee-icon ee-icon-clone clickable', |
|
1040 | - 'trash_icon' => ! empty($dtt) && $dtt->get('DTT_sold') > 0 ? 'ee-lock-icon' : 'trash-icon dashicons dashicons-post-trash clickable', |
|
1041 | - 'reg_list_url' => $default || ! $dtt->event() instanceof \EE_Event |
|
1042 | - ? '' |
|
1043 | - : EE_Admin_Page::add_query_args_and_nonce( |
|
1044 | - array('event_id' => $dtt->event()->ID(), 'datetime_id' => $dtt->ID()), |
|
1045 | - REG_ADMIN_URL |
|
1046 | - ) |
|
1047 | - ); |
|
1048 | - |
|
1049 | - $template_args['show_trash'] = count($all_dtts) === 1 && $template_args['trash_icon'] !== 'ee-lock-icon' ? ' style="display:none"' : ''; |
|
1050 | - |
|
1051 | - //allow filtering of template args at this point. |
|
1052 | - $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_dtt_edit_row__template_args', |
|
1053 | - $template_args, $dttrow, $dtt, $default, $all_dtts, $this->_is_creating_event); |
|
1054 | - |
|
1055 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_edit_row.template.php'; |
|
1056 | - |
|
1057 | - return EEH_Template::display_template($template, $template_args, true); |
|
1058 | - } |
|
1006 | + /** |
|
1007 | + * This method is used to generate a dtt fields edit row. |
|
1008 | + * The same row is used to generate a row with valid DTT objects and the default row that is used as the |
|
1009 | + * skeleton by the js. |
|
1010 | + * |
|
1011 | + * @param int $dttrow The row number for the row being generated. |
|
1012 | + * @param mixed EE_Datetime|null $dtt If not default row being |
|
1013 | + * generated, this must be a EE_Datetime |
|
1014 | + * object. |
|
1015 | + * @param bool $default Whether a default row is being generated or not. |
|
1016 | + * @param EE_Datetime[] $all_dtts This is the array of all datetimes used in the editor. |
|
1017 | + * |
|
1018 | + * @return string Generated edit row. |
|
1019 | + */ |
|
1020 | + protected function _get_dtt_edit_row($dttrow, $dtt, $default, $all_dtts) |
|
1021 | + { |
|
1022 | + |
|
1023 | + // if the incoming $dtt object is NOT an instance of EE_Datetime then force default to true. |
|
1024 | + $default = ! $dtt instanceof EE_Datetime ? true : false; |
|
1025 | + |
|
1026 | + $template_args = array( |
|
1027 | + 'dtt_row' => $default ? 'DTTNUM' : $dttrow, |
|
1028 | + 'event_datetimes_name' => $default ? 'DTTNAMEATTR' : 'edit_event_datetimes', |
|
1029 | + 'edit_dtt_expanded' => '', |
|
1030 | + //$this->_adminpage_obj->get_cpt_model_obj()->ID() > 0 ? '' : ' ee-edit-editing', |
|
1031 | + 'DTT_ID' => $default ? '' : $dtt->ID(), |
|
1032 | + 'DTT_name' => $default ? '' : $dtt->name(), |
|
1033 | + 'DTT_description' => $default ? '' : $dtt->description(), |
|
1034 | + 'DTT_EVT_start' => $default ? '' : $dtt->start_date($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']), |
|
1035 | + 'DTT_EVT_end' => $default ? '' : $dtt->end_date($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']), |
|
1036 | + 'DTT_reg_limit' => $default ? '' : $dtt->get_pretty('DTT_reg_limit', 'input'), |
|
1037 | + 'DTT_order' => $default ? 'DTTNUM' : $dttrow, |
|
1038 | + 'dtt_sold' => $default ? '0' : $dtt->get('DTT_sold'), |
|
1039 | + 'clone_icon' => ! empty($dtt) && $dtt->get('DTT_sold') > 0 ? '' : 'clone-icon ee-icon ee-icon-clone clickable', |
|
1040 | + 'trash_icon' => ! empty($dtt) && $dtt->get('DTT_sold') > 0 ? 'ee-lock-icon' : 'trash-icon dashicons dashicons-post-trash clickable', |
|
1041 | + 'reg_list_url' => $default || ! $dtt->event() instanceof \EE_Event |
|
1042 | + ? '' |
|
1043 | + : EE_Admin_Page::add_query_args_and_nonce( |
|
1044 | + array('event_id' => $dtt->event()->ID(), 'datetime_id' => $dtt->ID()), |
|
1045 | + REG_ADMIN_URL |
|
1046 | + ) |
|
1047 | + ); |
|
1048 | + |
|
1049 | + $template_args['show_trash'] = count($all_dtts) === 1 && $template_args['trash_icon'] !== 'ee-lock-icon' ? ' style="display:none"' : ''; |
|
1050 | + |
|
1051 | + //allow filtering of template args at this point. |
|
1052 | + $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_dtt_edit_row__template_args', |
|
1053 | + $template_args, $dttrow, $dtt, $default, $all_dtts, $this->_is_creating_event); |
|
1054 | + |
|
1055 | + $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_edit_row.template.php'; |
|
1056 | + |
|
1057 | + return EEH_Template::display_template($template, $template_args, true); |
|
1058 | + } |
|
1059 | 1059 | |
1060 | 1060 | |
1061 | - protected function _get_dtt_attached_tickets_row($dttrow, $dtt, $datetime_tickets, $all_tickets, $default) |
|
1062 | - { |
|
1063 | - |
|
1064 | - $template_args = array( |
|
1065 | - 'dtt_row' => $default ? 'DTTNUM' : $dttrow, |
|
1066 | - 'event_datetimes_name' => $default ? 'DTTNAMEATTR' : 'edit_event_datetimes', |
|
1067 | - 'DTT_description' => $default ? '' : $dtt->description(), |
|
1068 | - 'datetime_tickets_list' => $default ? '<li class="hidden"></li>' : '', |
|
1069 | - 'show_tickets_row' => ' style="display:none;"', |
|
1070 | - //$default || $this->_adminpage_obj->get_cpt_model_obj()->ID() > 0 ? ' style="display:none;"' : '', |
|
1071 | - 'add_new_datetime_ticket_help_link' => EEH_Template::get_help_tab_link('add_new_ticket_via_datetime', |
|
1072 | - $this->_adminpage_obj->page_slug, $this->_adminpage_obj->get_req_action(), false, false), |
|
1073 | - //todo need to add this help info id to the Events_Admin_Page core file so we can access it here. |
|
1074 | - 'DTT_ID' => $default ? '' : $dtt->ID() |
|
1075 | - ); |
|
1076 | - |
|
1077 | - //need to setup the list items (but only if this isnt' a default skeleton setup) |
|
1078 | - if ( ! $default) { |
|
1079 | - $tktrow = 1; |
|
1080 | - foreach ($all_tickets as $ticket) { |
|
1081 | - $template_args['datetime_tickets_list'] .= $this->_get_datetime_tickets_list_item($dttrow, $tktrow, |
|
1082 | - $dtt, $ticket, $datetime_tickets, $default); |
|
1083 | - $tktrow++; |
|
1084 | - } |
|
1085 | - } |
|
1086 | - |
|
1087 | - //filter template args at this point |
|
1088 | - $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_dtt_attached_ticket_row__template_args', |
|
1089 | - $template_args, $dttrow, $dtt, $datetime_tickets, $all_tickets, $default, $this->_is_creating_event); |
|
1090 | - |
|
1091 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_attached_tickets_row.template.php'; |
|
1092 | - |
|
1093 | - return EEH_Template::display_template($template, $template_args, true); |
|
1094 | - } |
|
1061 | + protected function _get_dtt_attached_tickets_row($dttrow, $dtt, $datetime_tickets, $all_tickets, $default) |
|
1062 | + { |
|
1063 | + |
|
1064 | + $template_args = array( |
|
1065 | + 'dtt_row' => $default ? 'DTTNUM' : $dttrow, |
|
1066 | + 'event_datetimes_name' => $default ? 'DTTNAMEATTR' : 'edit_event_datetimes', |
|
1067 | + 'DTT_description' => $default ? '' : $dtt->description(), |
|
1068 | + 'datetime_tickets_list' => $default ? '<li class="hidden"></li>' : '', |
|
1069 | + 'show_tickets_row' => ' style="display:none;"', |
|
1070 | + //$default || $this->_adminpage_obj->get_cpt_model_obj()->ID() > 0 ? ' style="display:none;"' : '', |
|
1071 | + 'add_new_datetime_ticket_help_link' => EEH_Template::get_help_tab_link('add_new_ticket_via_datetime', |
|
1072 | + $this->_adminpage_obj->page_slug, $this->_adminpage_obj->get_req_action(), false, false), |
|
1073 | + //todo need to add this help info id to the Events_Admin_Page core file so we can access it here. |
|
1074 | + 'DTT_ID' => $default ? '' : $dtt->ID() |
|
1075 | + ); |
|
1076 | + |
|
1077 | + //need to setup the list items (but only if this isnt' a default skeleton setup) |
|
1078 | + if ( ! $default) { |
|
1079 | + $tktrow = 1; |
|
1080 | + foreach ($all_tickets as $ticket) { |
|
1081 | + $template_args['datetime_tickets_list'] .= $this->_get_datetime_tickets_list_item($dttrow, $tktrow, |
|
1082 | + $dtt, $ticket, $datetime_tickets, $default); |
|
1083 | + $tktrow++; |
|
1084 | + } |
|
1085 | + } |
|
1086 | + |
|
1087 | + //filter template args at this point |
|
1088 | + $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_dtt_attached_ticket_row__template_args', |
|
1089 | + $template_args, $dttrow, $dtt, $datetime_tickets, $all_tickets, $default, $this->_is_creating_event); |
|
1090 | + |
|
1091 | + $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_attached_tickets_row.template.php'; |
|
1092 | + |
|
1093 | + return EEH_Template::display_template($template, $template_args, true); |
|
1094 | + } |
|
1095 | 1095 | |
1096 | 1096 | |
1097 | - protected function _get_datetime_tickets_list_item($dttrow, $tktrow, $dtt, $ticket, $datetime_tickets, $default) |
|
1098 | - { |
|
1099 | - $tktid = ! empty($ticket) ? $ticket->ID() : 0; |
|
1100 | - $dtt_tkts = $dtt instanceof EE_Datetime && isset($datetime_tickets[$dtt->ID()]) ? $datetime_tickets[$dtt->ID()] : array(); |
|
1101 | - |
|
1102 | - $displayrow = ! empty($ticket) ? $ticket->get('TKT_row') : 0; |
|
1103 | - $template_args = array( |
|
1104 | - 'dtt_row' => $default ? 'DTTNUM' : $dttrow, |
|
1105 | - 'tkt_row' => $default && empty($ticket) ? 'TICKETNUM' : $tktrow, |
|
1106 | - 'datetime_ticket_checked' => in_array($displayrow, $dtt_tkts) ? ' checked="checked"' : '', |
|
1107 | - 'ticket_selected' => in_array($displayrow, $dtt_tkts) ? ' ticket-selected' : '', |
|
1108 | - 'TKT_name' => $default && empty($ticket) ? 'TKTNAME' : $ticket->get('TKT_name'), |
|
1109 | - 'tkt_status_class' => ($default && empty($ticket)) || $this->_is_creating_event ? ' tkt-status-' . EE_Ticket::onsale : ' tkt-status-' . $ticket->ticket_status(), |
|
1110 | - ); |
|
1111 | - |
|
1112 | - //filter template args |
|
1113 | - $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_datetime_tickets_list_item__template_args', |
|
1114 | - $template_args, $dttrow, $tktrow, $dtt, $ticket, $datetime_tickets, $default, $this->_is_creating_event); |
|
1115 | - |
|
1116 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_dtt_tickets_list.template.php'; |
|
1117 | - |
|
1118 | - return EEH_Template::display_template($template, $template_args, true); |
|
1119 | - } |
|
1097 | + protected function _get_datetime_tickets_list_item($dttrow, $tktrow, $dtt, $ticket, $datetime_tickets, $default) |
|
1098 | + { |
|
1099 | + $tktid = ! empty($ticket) ? $ticket->ID() : 0; |
|
1100 | + $dtt_tkts = $dtt instanceof EE_Datetime && isset($datetime_tickets[$dtt->ID()]) ? $datetime_tickets[$dtt->ID()] : array(); |
|
1101 | + |
|
1102 | + $displayrow = ! empty($ticket) ? $ticket->get('TKT_row') : 0; |
|
1103 | + $template_args = array( |
|
1104 | + 'dtt_row' => $default ? 'DTTNUM' : $dttrow, |
|
1105 | + 'tkt_row' => $default && empty($ticket) ? 'TICKETNUM' : $tktrow, |
|
1106 | + 'datetime_ticket_checked' => in_array($displayrow, $dtt_tkts) ? ' checked="checked"' : '', |
|
1107 | + 'ticket_selected' => in_array($displayrow, $dtt_tkts) ? ' ticket-selected' : '', |
|
1108 | + 'TKT_name' => $default && empty($ticket) ? 'TKTNAME' : $ticket->get('TKT_name'), |
|
1109 | + 'tkt_status_class' => ($default && empty($ticket)) || $this->_is_creating_event ? ' tkt-status-' . EE_Ticket::onsale : ' tkt-status-' . $ticket->ticket_status(), |
|
1110 | + ); |
|
1111 | + |
|
1112 | + //filter template args |
|
1113 | + $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_datetime_tickets_list_item__template_args', |
|
1114 | + $template_args, $dttrow, $tktrow, $dtt, $ticket, $datetime_tickets, $default, $this->_is_creating_event); |
|
1115 | + |
|
1116 | + $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_dtt_tickets_list.template.php'; |
|
1117 | + |
|
1118 | + return EEH_Template::display_template($template, $template_args, true); |
|
1119 | + } |
|
1120 | 1120 | |
1121 | 1121 | |
1122 | - /** |
|
1123 | - * This generates the ticket row for tickets. |
|
1124 | - * This same method is used to generate both the actual rows and the js skeleton row (when default == |
|
1125 | - * true) |
|
1126 | - * |
|
1127 | - * @param int $tktrow Represents the row number being generated. |
|
1128 | - * @param mixed null|EE_Ticket $ticket If default then this will |
|
1129 | - * be null. |
|
1130 | - * @param EE_Datetime[] $ticket_datetimes Either an array of all datetimes on all tickets indexed by |
|
1131 | - * each ticket or empty for default |
|
1132 | - * @param EE_Datetime[] $all_dtts All Datetimes on the event or empty for default. |
|
1133 | - * @param bool $default Whether default row being generated or not. |
|
1134 | - * @param EE_Ticket[] $all_tickets This is an array of all tickets attached to the event (or |
|
1135 | - * empty in the case of defaults) |
|
1136 | - * |
|
1137 | - * @return [type] [description] |
|
1138 | - */ |
|
1139 | - protected function _get_ticket_row( |
|
1140 | - $tktrow, |
|
1141 | - $ticket, |
|
1142 | - $ticket_datetimes, |
|
1143 | - $all_dtts, |
|
1144 | - $default = false, |
|
1145 | - $all_tickets = array() |
|
1146 | - ) { |
|
1147 | - |
|
1148 | - //if $ticket is not an instance of EE_Ticket then force default to true. |
|
1149 | - $default = ! $ticket instanceof EE_Ticket ? true : false; |
|
1150 | - |
|
1151 | - $prices = ! empty($ticket) && ! $default ? $ticket->get_many_related('Price', |
|
1152 | - array('default_where_conditions' => 'none', 'order_by' => array('PRC_order' => 'ASC'))) : array(); |
|
1153 | - |
|
1154 | - //if there is only one price (which would be the base price) or NO prices and this ticket is a default ticket, let's just make sure there are no cached default prices on |
|
1155 | - //the object. This is done by not including any query_params. |
|
1156 | - if ($ticket instanceof EE_Ticket && $ticket->is_default() && (count($prices) === 1 || empty($prices))) { |
|
1157 | - $prices = $ticket->get_many_related('Price'); |
|
1158 | - } |
|
1159 | - |
|
1160 | - // check if we're dealing with a default ticket in which case we don't want any starting_ticket_datetime_row values set (otherwise there won't be any new relationships created for tickets based off of the default ticket). This will future proof in case there is ever any behaviour change between what the primary_key defaults to. |
|
1161 | - $default_dtt = $default || ($ticket instanceof EE_Ticket && $ticket->get('TKT_is_default')) ? true : false; |
|
1162 | - |
|
1163 | - $tkt_dtts = $ticket instanceof EE_Ticket && isset($ticket_datetimes[$ticket->ID()]) ? $ticket_datetimes[$ticket->ID()] : array(); |
|
1164 | - |
|
1165 | - $ticket_subtotal = $default ? 0 : $ticket->get_ticket_subtotal(); |
|
1166 | - $base_price = $default ? null : $ticket->base_price(); |
|
1167 | - $count_price_mods = EEM_Price::instance()->get_all_default_prices(true); |
|
1168 | - |
|
1169 | - //breaking out complicated condition for ticket_status |
|
1170 | - if ($default) { |
|
1171 | - $ticket_status_class = ' tkt-status-' . EE_Ticket::onsale; |
|
1172 | - } else { |
|
1173 | - $ticket_status_class = $ticket->is_default() ? ' tkt-status-' . EE_Ticket::onsale : ' tkt-status-' . $ticket->ticket_status(); |
|
1174 | - } |
|
1175 | - |
|
1176 | - //breaking out complicated condition for TKT_taxable |
|
1177 | - if ($default) { |
|
1178 | - $TKT_taxable = ''; |
|
1179 | - } else { |
|
1180 | - $TKT_taxable = $ticket->get('TKT_taxable') ? ' checked="checked"' : ''; |
|
1181 | - } |
|
1122 | + /** |
|
1123 | + * This generates the ticket row for tickets. |
|
1124 | + * This same method is used to generate both the actual rows and the js skeleton row (when default == |
|
1125 | + * true) |
|
1126 | + * |
|
1127 | + * @param int $tktrow Represents the row number being generated. |
|
1128 | + * @param mixed null|EE_Ticket $ticket If default then this will |
|
1129 | + * be null. |
|
1130 | + * @param EE_Datetime[] $ticket_datetimes Either an array of all datetimes on all tickets indexed by |
|
1131 | + * each ticket or empty for default |
|
1132 | + * @param EE_Datetime[] $all_dtts All Datetimes on the event or empty for default. |
|
1133 | + * @param bool $default Whether default row being generated or not. |
|
1134 | + * @param EE_Ticket[] $all_tickets This is an array of all tickets attached to the event (or |
|
1135 | + * empty in the case of defaults) |
|
1136 | + * |
|
1137 | + * @return [type] [description] |
|
1138 | + */ |
|
1139 | + protected function _get_ticket_row( |
|
1140 | + $tktrow, |
|
1141 | + $ticket, |
|
1142 | + $ticket_datetimes, |
|
1143 | + $all_dtts, |
|
1144 | + $default = false, |
|
1145 | + $all_tickets = array() |
|
1146 | + ) { |
|
1147 | + |
|
1148 | + //if $ticket is not an instance of EE_Ticket then force default to true. |
|
1149 | + $default = ! $ticket instanceof EE_Ticket ? true : false; |
|
1150 | + |
|
1151 | + $prices = ! empty($ticket) && ! $default ? $ticket->get_many_related('Price', |
|
1152 | + array('default_where_conditions' => 'none', 'order_by' => array('PRC_order' => 'ASC'))) : array(); |
|
1153 | + |
|
1154 | + //if there is only one price (which would be the base price) or NO prices and this ticket is a default ticket, let's just make sure there are no cached default prices on |
|
1155 | + //the object. This is done by not including any query_params. |
|
1156 | + if ($ticket instanceof EE_Ticket && $ticket->is_default() && (count($prices) === 1 || empty($prices))) { |
|
1157 | + $prices = $ticket->get_many_related('Price'); |
|
1158 | + } |
|
1159 | + |
|
1160 | + // check if we're dealing with a default ticket in which case we don't want any starting_ticket_datetime_row values set (otherwise there won't be any new relationships created for tickets based off of the default ticket). This will future proof in case there is ever any behaviour change between what the primary_key defaults to. |
|
1161 | + $default_dtt = $default || ($ticket instanceof EE_Ticket && $ticket->get('TKT_is_default')) ? true : false; |
|
1162 | + |
|
1163 | + $tkt_dtts = $ticket instanceof EE_Ticket && isset($ticket_datetimes[$ticket->ID()]) ? $ticket_datetimes[$ticket->ID()] : array(); |
|
1164 | + |
|
1165 | + $ticket_subtotal = $default ? 0 : $ticket->get_ticket_subtotal(); |
|
1166 | + $base_price = $default ? null : $ticket->base_price(); |
|
1167 | + $count_price_mods = EEM_Price::instance()->get_all_default_prices(true); |
|
1168 | + |
|
1169 | + //breaking out complicated condition for ticket_status |
|
1170 | + if ($default) { |
|
1171 | + $ticket_status_class = ' tkt-status-' . EE_Ticket::onsale; |
|
1172 | + } else { |
|
1173 | + $ticket_status_class = $ticket->is_default() ? ' tkt-status-' . EE_Ticket::onsale : ' tkt-status-' . $ticket->ticket_status(); |
|
1174 | + } |
|
1175 | + |
|
1176 | + //breaking out complicated condition for TKT_taxable |
|
1177 | + if ($default) { |
|
1178 | + $TKT_taxable = ''; |
|
1179 | + } else { |
|
1180 | + $TKT_taxable = $ticket->get('TKT_taxable') ? ' checked="checked"' : ''; |
|
1181 | + } |
|
1182 | 1182 | |
1183 | 1183 | |
1184 | - $template_args = array( |
|
1185 | - 'tkt_row' => $default ? 'TICKETNUM' : $tktrow, |
|
1186 | - 'TKT_order' => $default ? 'TICKETNUM' : $tktrow, |
|
1187 | - //on initial page load this will always be the correct order. |
|
1188 | - 'tkt_status_class' => $ticket_status_class, |
|
1189 | - 'display_edit_tkt_row' => ' style="display:none;"', |
|
1190 | - 'edit_tkt_expanded' => '', |
|
1191 | - 'edit_tickets_name' => $default ? 'TICKETNAMEATTR' : 'edit_tickets', |
|
1192 | - 'TKT_name' => $default ? '' : $ticket->get('TKT_name'), |
|
1193 | - 'TKT_start_date' => $default ? '' : $ticket->get_date('TKT_start_date', |
|
1194 | - $this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']), |
|
1195 | - 'TKT_end_date' => $default ? '' : $ticket->get_date('TKT_end_date', |
|
1196 | - $this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']), |
|
1197 | - 'TKT_status' => $default ? EEH_Template::pretty_status(EE_Ticket::onsale, false, |
|
1198 | - 'sentence') : $ticket->is_default() ? EEH_Template::pretty_status(EE_Ticket::onsale, false, |
|
1199 | - 'sentence') : $ticket->ticket_status(true), |
|
1200 | - 'TKT_price' => $default ? '' : EEH_Template::format_currency($ticket->get_ticket_total_with_taxes(), |
|
1201 | - false, false), |
|
1202 | - 'TKT_price_code' => EE_Registry::instance()->CFG->currency->code, |
|
1203 | - 'TKT_price_amount' => $default ? 0 : $ticket_subtotal, |
|
1204 | - 'TKT_qty' => $default ? '' : $ticket->get_pretty('TKT_qty', 'symbol'), |
|
1205 | - 'TKT_qty_for_input' => $default ? '' : $ticket->get_pretty('TKT_qty', 'input'), |
|
1206 | - 'TKT_uses' => $default ? '' : $ticket->get_pretty('TKT_uses', 'input'), |
|
1207 | - 'TKT_min' => $default ? '' : ($ticket->get('TKT_min') === -1 || $ticket->get('TKT_min') === 0 ? '' : $ticket->get('TKT_min')), |
|
1208 | - 'TKT_max' => $default ? '' : $ticket->get_pretty('TKT_max', 'input'), |
|
1209 | - 'TKT_sold' => $default ? 0 : $ticket->tickets_sold('ticket'), |
|
1210 | - 'TKT_registrations' => $default ? 0 : $ticket->count_registrations(array( |
|
1211 | - array( |
|
1212 | - 'STS_ID' => array( |
|
1213 | - '!=', |
|
1214 | - EEM_Registration::status_id_incomplete |
|
1215 | - ) |
|
1216 | - ) |
|
1217 | - )), |
|
1218 | - 'TKT_ID' => $default ? 0 : $ticket->get('TKT_ID'), |
|
1219 | - 'TKT_description' => $default ? '' : $ticket->get('TKT_description'), |
|
1220 | - 'TKT_is_default' => $default ? 0 : $ticket->get('TKT_is_default'), |
|
1221 | - 'TKT_required' => $default ? 0 : $ticket->required(), |
|
1222 | - 'TKT_is_default_selector' => '', |
|
1223 | - 'ticket_price_rows' => '', |
|
1224 | - 'TKT_base_price' => $default || ! $base_price instanceof EE_Price ? '' : $base_price->get_pretty('PRC_amount', |
|
1225 | - 'localized_float'), |
|
1226 | - 'TKT_base_price_ID' => $default || ! $base_price instanceof EE_Price ? 0 : $base_price->ID(), |
|
1227 | - 'show_price_modifier' => count($prices) > 1 || ($default && $count_price_mods > 0) ? '' : ' style="display:none;"', |
|
1228 | - 'show_price_mod_button' => count($prices) > 1 || ($default && $count_price_mods > 0) || ( ! $default && $ticket->get('TKT_deleted')) ? ' style="display:none;"' : '', |
|
1229 | - 'total_price_rows' => count($prices) > 1 ? count($prices) : 1, |
|
1230 | - 'ticket_datetimes_list' => $default ? '<li class="hidden"></li>' : '', |
|
1231 | - 'starting_ticket_datetime_rows' => $default || $default_dtt ? '' : implode(',', $tkt_dtts), |
|
1232 | - 'ticket_datetime_rows' => $default ? '' : implode(',', $tkt_dtts), |
|
1233 | - 'existing_ticket_price_ids' => $default ? '' : implode(',', array_keys($prices)), |
|
1234 | - 'ticket_template_id' => $default ? 0 : $ticket->get('TTM_ID'), |
|
1235 | - 'TKT_taxable' => $TKT_taxable, |
|
1236 | - 'display_subtotal' => $ticket instanceof EE_Ticket && $ticket->get('TKT_taxable') ? '' : ' style="display:none"', |
|
1237 | - 'price_currency_symbol' => EE_Registry::instance()->CFG->currency->sign, |
|
1238 | - 'TKT_subtotal_amount_display' => EEH_Template::format_currency($ticket_subtotal, false, false), |
|
1239 | - 'TKT_subtotal_amount' => $ticket_subtotal, |
|
1240 | - 'tax_rows' => $this->_get_tax_rows($tktrow, $ticket), |
|
1241 | - 'disabled' => $ticket instanceof EE_Ticket && $ticket->get('TKT_deleted') ? true : false, |
|
1242 | - 'ticket_archive_class' => $ticket instanceof EE_Ticket && $ticket->get('TKT_deleted') ? ' ticket-archived' : '', |
|
1243 | - 'trash_icon' => $ticket instanceof EE_Ticket && $ticket->get('TKT_deleted') ? 'ee-lock-icon ' : 'trash-icon dashicons dashicons-post-trash clickable', |
|
1244 | - 'clone_icon' => $ticket instanceof EE_Ticket && $ticket->get('TKT_deleted') ? '' : 'clone-icon ee-icon ee-icon-clone clickable' |
|
1245 | - ); |
|
1246 | - |
|
1247 | - $template_args['trash_hidden'] = count($all_tickets) === 1 && $template_args['trash_icon'] != 'ee-lock-icon' ? ' style="display:none"' : ''; |
|
1248 | - |
|
1249 | - //handle rows that should NOT be empty |
|
1250 | - if (empty($template_args['TKT_start_date'])) { |
|
1251 | - //if empty then the start date will be now. |
|
1252 | - $template_args['TKT_start_date'] = date($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time'], |
|
1253 | - current_time('timestamp')); |
|
1254 | - $template_args['tkt_status_class'] = ' tkt-status-' . EE_Ticket::onsale; |
|
1255 | - } |
|
1256 | - |
|
1257 | - if (empty($template_args['TKT_end_date'])) { |
|
1184 | + $template_args = array( |
|
1185 | + 'tkt_row' => $default ? 'TICKETNUM' : $tktrow, |
|
1186 | + 'TKT_order' => $default ? 'TICKETNUM' : $tktrow, |
|
1187 | + //on initial page load this will always be the correct order. |
|
1188 | + 'tkt_status_class' => $ticket_status_class, |
|
1189 | + 'display_edit_tkt_row' => ' style="display:none;"', |
|
1190 | + 'edit_tkt_expanded' => '', |
|
1191 | + 'edit_tickets_name' => $default ? 'TICKETNAMEATTR' : 'edit_tickets', |
|
1192 | + 'TKT_name' => $default ? '' : $ticket->get('TKT_name'), |
|
1193 | + 'TKT_start_date' => $default ? '' : $ticket->get_date('TKT_start_date', |
|
1194 | + $this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']), |
|
1195 | + 'TKT_end_date' => $default ? '' : $ticket->get_date('TKT_end_date', |
|
1196 | + $this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']), |
|
1197 | + 'TKT_status' => $default ? EEH_Template::pretty_status(EE_Ticket::onsale, false, |
|
1198 | + 'sentence') : $ticket->is_default() ? EEH_Template::pretty_status(EE_Ticket::onsale, false, |
|
1199 | + 'sentence') : $ticket->ticket_status(true), |
|
1200 | + 'TKT_price' => $default ? '' : EEH_Template::format_currency($ticket->get_ticket_total_with_taxes(), |
|
1201 | + false, false), |
|
1202 | + 'TKT_price_code' => EE_Registry::instance()->CFG->currency->code, |
|
1203 | + 'TKT_price_amount' => $default ? 0 : $ticket_subtotal, |
|
1204 | + 'TKT_qty' => $default ? '' : $ticket->get_pretty('TKT_qty', 'symbol'), |
|
1205 | + 'TKT_qty_for_input' => $default ? '' : $ticket->get_pretty('TKT_qty', 'input'), |
|
1206 | + 'TKT_uses' => $default ? '' : $ticket->get_pretty('TKT_uses', 'input'), |
|
1207 | + 'TKT_min' => $default ? '' : ($ticket->get('TKT_min') === -1 || $ticket->get('TKT_min') === 0 ? '' : $ticket->get('TKT_min')), |
|
1208 | + 'TKT_max' => $default ? '' : $ticket->get_pretty('TKT_max', 'input'), |
|
1209 | + 'TKT_sold' => $default ? 0 : $ticket->tickets_sold('ticket'), |
|
1210 | + 'TKT_registrations' => $default ? 0 : $ticket->count_registrations(array( |
|
1211 | + array( |
|
1212 | + 'STS_ID' => array( |
|
1213 | + '!=', |
|
1214 | + EEM_Registration::status_id_incomplete |
|
1215 | + ) |
|
1216 | + ) |
|
1217 | + )), |
|
1218 | + 'TKT_ID' => $default ? 0 : $ticket->get('TKT_ID'), |
|
1219 | + 'TKT_description' => $default ? '' : $ticket->get('TKT_description'), |
|
1220 | + 'TKT_is_default' => $default ? 0 : $ticket->get('TKT_is_default'), |
|
1221 | + 'TKT_required' => $default ? 0 : $ticket->required(), |
|
1222 | + 'TKT_is_default_selector' => '', |
|
1223 | + 'ticket_price_rows' => '', |
|
1224 | + 'TKT_base_price' => $default || ! $base_price instanceof EE_Price ? '' : $base_price->get_pretty('PRC_amount', |
|
1225 | + 'localized_float'), |
|
1226 | + 'TKT_base_price_ID' => $default || ! $base_price instanceof EE_Price ? 0 : $base_price->ID(), |
|
1227 | + 'show_price_modifier' => count($prices) > 1 || ($default && $count_price_mods > 0) ? '' : ' style="display:none;"', |
|
1228 | + 'show_price_mod_button' => count($prices) > 1 || ($default && $count_price_mods > 0) || ( ! $default && $ticket->get('TKT_deleted')) ? ' style="display:none;"' : '', |
|
1229 | + 'total_price_rows' => count($prices) > 1 ? count($prices) : 1, |
|
1230 | + 'ticket_datetimes_list' => $default ? '<li class="hidden"></li>' : '', |
|
1231 | + 'starting_ticket_datetime_rows' => $default || $default_dtt ? '' : implode(',', $tkt_dtts), |
|
1232 | + 'ticket_datetime_rows' => $default ? '' : implode(',', $tkt_dtts), |
|
1233 | + 'existing_ticket_price_ids' => $default ? '' : implode(',', array_keys($prices)), |
|
1234 | + 'ticket_template_id' => $default ? 0 : $ticket->get('TTM_ID'), |
|
1235 | + 'TKT_taxable' => $TKT_taxable, |
|
1236 | + 'display_subtotal' => $ticket instanceof EE_Ticket && $ticket->get('TKT_taxable') ? '' : ' style="display:none"', |
|
1237 | + 'price_currency_symbol' => EE_Registry::instance()->CFG->currency->sign, |
|
1238 | + 'TKT_subtotal_amount_display' => EEH_Template::format_currency($ticket_subtotal, false, false), |
|
1239 | + 'TKT_subtotal_amount' => $ticket_subtotal, |
|
1240 | + 'tax_rows' => $this->_get_tax_rows($tktrow, $ticket), |
|
1241 | + 'disabled' => $ticket instanceof EE_Ticket && $ticket->get('TKT_deleted') ? true : false, |
|
1242 | + 'ticket_archive_class' => $ticket instanceof EE_Ticket && $ticket->get('TKT_deleted') ? ' ticket-archived' : '', |
|
1243 | + 'trash_icon' => $ticket instanceof EE_Ticket && $ticket->get('TKT_deleted') ? 'ee-lock-icon ' : 'trash-icon dashicons dashicons-post-trash clickable', |
|
1244 | + 'clone_icon' => $ticket instanceof EE_Ticket && $ticket->get('TKT_deleted') ? '' : 'clone-icon ee-icon ee-icon-clone clickable' |
|
1245 | + ); |
|
1246 | + |
|
1247 | + $template_args['trash_hidden'] = count($all_tickets) === 1 && $template_args['trash_icon'] != 'ee-lock-icon' ? ' style="display:none"' : ''; |
|
1248 | + |
|
1249 | + //handle rows that should NOT be empty |
|
1250 | + if (empty($template_args['TKT_start_date'])) { |
|
1251 | + //if empty then the start date will be now. |
|
1252 | + $template_args['TKT_start_date'] = date($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time'], |
|
1253 | + current_time('timestamp')); |
|
1254 | + $template_args['tkt_status_class'] = ' tkt-status-' . EE_Ticket::onsale; |
|
1255 | + } |
|
1256 | + |
|
1257 | + if (empty($template_args['TKT_end_date'])) { |
|
1258 | 1258 | |
1259 | - //get the earliest datetime (if present); |
|
1260 | - $earliest_dtt = $this->_adminpage_obj->get_cpt_model_obj()->ID() > 0 ? $this->_adminpage_obj->get_cpt_model_obj()->get_first_related('Datetime', |
|
1261 | - array('order_by' => array('DTT_EVT_start' => 'ASC'))) : null; |
|
1259 | + //get the earliest datetime (if present); |
|
1260 | + $earliest_dtt = $this->_adminpage_obj->get_cpt_model_obj()->ID() > 0 ? $this->_adminpage_obj->get_cpt_model_obj()->get_first_related('Datetime', |
|
1261 | + array('order_by' => array('DTT_EVT_start' => 'ASC'))) : null; |
|
1262 | 1262 | |
1263 | - if ( ! empty($earliest_dtt)) { |
|
1264 | - $template_args['TKT_end_date'] = $earliest_dtt->get_datetime('DTT_EVT_start', |
|
1265 | - $this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']); |
|
1266 | - } else { |
|
1267 | - //default so let's just use what's been set for the default date-time which is 30 days from now. |
|
1268 | - $template_args['TKT_end_date'] = date($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time'], |
|
1269 | - mktime(24, 0, 0, date("m"), date("d") + 29, date("Y"))); |
|
1270 | - } |
|
1271 | - $template_args['tkt_status_class'] = ' tkt-status-' . EE_Ticket::onsale; |
|
1272 | - } |
|
1273 | - |
|
1274 | - //generate ticket_datetime items |
|
1275 | - if ( ! $default) { |
|
1276 | - $dttrow = 1; |
|
1277 | - foreach ($all_dtts as $dtt) { |
|
1278 | - $template_args['ticket_datetimes_list'] .= $this->_get_ticket_datetime_list_item($dttrow, $tktrow, $dtt, |
|
1279 | - $ticket, $ticket_datetimes, $default); |
|
1280 | - $dttrow++; |
|
1281 | - } |
|
1282 | - } |
|
1283 | - |
|
1284 | - $prcrow = 1; |
|
1285 | - foreach ($prices as $price) { |
|
1286 | - if ($price->is_base_price()) { |
|
1287 | - $prcrow++; |
|
1288 | - continue; |
|
1289 | - } |
|
1290 | - $show_trash = (count($prices) > 1 && $prcrow === 1) || count($prices) === 1 ? false : true; |
|
1291 | - $show_create = count($prices) > 1 && count($prices) !== $prcrow ? false : true; |
|
1292 | - $template_args['ticket_price_rows'] .= $this->_get_ticket_price_row($tktrow, $prcrow, $price, $default, |
|
1293 | - $ticket, $show_trash, $show_create); |
|
1294 | - $prcrow++; |
|
1295 | - } |
|
1296 | - |
|
1297 | - //filter $template_args |
|
1298 | - $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_ticket_row__template_args', |
|
1299 | - $template_args, $tktrow, $ticket, $ticket_datetimes, $all_dtts, $default, $all_tickets, |
|
1300 | - $this->_is_creating_event); |
|
1301 | - |
|
1302 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_row.template.php'; |
|
1303 | - |
|
1304 | - return EEH_Template::display_template($template, $template_args, true); |
|
1305 | - } |
|
1263 | + if ( ! empty($earliest_dtt)) { |
|
1264 | + $template_args['TKT_end_date'] = $earliest_dtt->get_datetime('DTT_EVT_start', |
|
1265 | + $this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time']); |
|
1266 | + } else { |
|
1267 | + //default so let's just use what's been set for the default date-time which is 30 days from now. |
|
1268 | + $template_args['TKT_end_date'] = date($this->_date_format_strings['date'] . ' ' . $this->_date_format_strings['time'], |
|
1269 | + mktime(24, 0, 0, date("m"), date("d") + 29, date("Y"))); |
|
1270 | + } |
|
1271 | + $template_args['tkt_status_class'] = ' tkt-status-' . EE_Ticket::onsale; |
|
1272 | + } |
|
1273 | + |
|
1274 | + //generate ticket_datetime items |
|
1275 | + if ( ! $default) { |
|
1276 | + $dttrow = 1; |
|
1277 | + foreach ($all_dtts as $dtt) { |
|
1278 | + $template_args['ticket_datetimes_list'] .= $this->_get_ticket_datetime_list_item($dttrow, $tktrow, $dtt, |
|
1279 | + $ticket, $ticket_datetimes, $default); |
|
1280 | + $dttrow++; |
|
1281 | + } |
|
1282 | + } |
|
1283 | + |
|
1284 | + $prcrow = 1; |
|
1285 | + foreach ($prices as $price) { |
|
1286 | + if ($price->is_base_price()) { |
|
1287 | + $prcrow++; |
|
1288 | + continue; |
|
1289 | + } |
|
1290 | + $show_trash = (count($prices) > 1 && $prcrow === 1) || count($prices) === 1 ? false : true; |
|
1291 | + $show_create = count($prices) > 1 && count($prices) !== $prcrow ? false : true; |
|
1292 | + $template_args['ticket_price_rows'] .= $this->_get_ticket_price_row($tktrow, $prcrow, $price, $default, |
|
1293 | + $ticket, $show_trash, $show_create); |
|
1294 | + $prcrow++; |
|
1295 | + } |
|
1296 | + |
|
1297 | + //filter $template_args |
|
1298 | + $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_ticket_row__template_args', |
|
1299 | + $template_args, $tktrow, $ticket, $ticket_datetimes, $all_dtts, $default, $all_tickets, |
|
1300 | + $this->_is_creating_event); |
|
1301 | + |
|
1302 | + $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_row.template.php'; |
|
1303 | + |
|
1304 | + return EEH_Template::display_template($template, $template_args, true); |
|
1305 | + } |
|
1306 | 1306 | |
1307 | 1307 | |
1308 | - protected function _get_tax_rows($tktrow, $ticket) |
|
1309 | - { |
|
1310 | - $tax_rows = ''; |
|
1311 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_tax_row.template.php'; |
|
1312 | - $template_args = array(); |
|
1313 | - $taxes = empty($ticket) ? EE_Taxes::get_taxes_for_admin() : $ticket->get_ticket_taxes_for_admin(); |
|
1314 | - foreach ($taxes as $tax) { |
|
1315 | - $tax_added = $this->_get_tax_added($tax, $ticket); |
|
1316 | - $template_args = array( |
|
1317 | - 'display_tax' => ! empty($ticket) && $ticket->get('TKT_taxable') ? '' : ' style="display:none;"', |
|
1318 | - 'tax_id' => $tax->ID(), |
|
1319 | - 'tkt_row' => $tktrow, |
|
1320 | - 'tax_label' => $tax->get('PRC_name'), |
|
1321 | - 'tax_added' => $tax_added, |
|
1322 | - 'tax_added_display' => EEH_Template::format_currency($tax_added, false, false), |
|
1323 | - 'tax_amount' => $tax->get('PRC_amount') |
|
1324 | - ); |
|
1325 | - $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_tax_rows__template_args', |
|
1326 | - $template_args, $tktrow, $ticket, $this->_is_creating_event); |
|
1327 | - $tax_rows .= EEH_Template::display_template($template, $template_args, true); |
|
1328 | - } |
|
1329 | - |
|
1330 | - |
|
1331 | - return $tax_rows; |
|
1332 | - } |
|
1308 | + protected function _get_tax_rows($tktrow, $ticket) |
|
1309 | + { |
|
1310 | + $tax_rows = ''; |
|
1311 | + $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_tax_row.template.php'; |
|
1312 | + $template_args = array(); |
|
1313 | + $taxes = empty($ticket) ? EE_Taxes::get_taxes_for_admin() : $ticket->get_ticket_taxes_for_admin(); |
|
1314 | + foreach ($taxes as $tax) { |
|
1315 | + $tax_added = $this->_get_tax_added($tax, $ticket); |
|
1316 | + $template_args = array( |
|
1317 | + 'display_tax' => ! empty($ticket) && $ticket->get('TKT_taxable') ? '' : ' style="display:none;"', |
|
1318 | + 'tax_id' => $tax->ID(), |
|
1319 | + 'tkt_row' => $tktrow, |
|
1320 | + 'tax_label' => $tax->get('PRC_name'), |
|
1321 | + 'tax_added' => $tax_added, |
|
1322 | + 'tax_added_display' => EEH_Template::format_currency($tax_added, false, false), |
|
1323 | + 'tax_amount' => $tax->get('PRC_amount') |
|
1324 | + ); |
|
1325 | + $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_tax_rows__template_args', |
|
1326 | + $template_args, $tktrow, $ticket, $this->_is_creating_event); |
|
1327 | + $tax_rows .= EEH_Template::display_template($template, $template_args, true); |
|
1328 | + } |
|
1329 | + |
|
1330 | + |
|
1331 | + return $tax_rows; |
|
1332 | + } |
|
1333 | 1333 | |
1334 | 1334 | |
1335 | - protected function _get_tax_added(EE_Price $tax, $ticket) |
|
1336 | - { |
|
1337 | - $subtotal = empty($ticket) ? 0 : $ticket->get_ticket_subtotal(); |
|
1335 | + protected function _get_tax_added(EE_Price $tax, $ticket) |
|
1336 | + { |
|
1337 | + $subtotal = empty($ticket) ? 0 : $ticket->get_ticket_subtotal(); |
|
1338 | 1338 | |
1339 | - return $subtotal * $tax->get('PRC_amount') / 100; |
|
1340 | - } |
|
1339 | + return $subtotal * $tax->get('PRC_amount') / 100; |
|
1340 | + } |
|
1341 | 1341 | |
1342 | 1342 | |
1343 | - protected function _get_ticket_price_row( |
|
1344 | - $tktrow, |
|
1345 | - $prcrow, |
|
1346 | - $price, |
|
1347 | - $default, |
|
1348 | - $ticket, |
|
1349 | - $show_trash = true, |
|
1350 | - $show_create = true |
|
1351 | - ) { |
|
1352 | - $send_disabled = ! empty($ticket) && $ticket->get('TKT_deleted') ? true : false; |
|
1353 | - $template_args = array( |
|
1354 | - 'tkt_row' => $default && empty($ticket) ? 'TICKETNUM' : $tktrow, |
|
1355 | - 'PRC_order' => $default && empty($price) ? 'PRICENUM' : $prcrow, |
|
1356 | - 'edit_prices_name' => $default && empty($price) ? 'PRICENAMEATTR' : 'edit_prices', |
|
1357 | - 'price_type_selector' => $default && empty($price) ? $this->_get_base_price_template($tktrow, $prcrow, |
|
1358 | - $price, $default) : $this->_get_price_type_selector($tktrow, $prcrow, $price, $default, $send_disabled), |
|
1359 | - 'PRC_ID' => $default && empty($price) ? 0 : $price->ID(), |
|
1360 | - 'PRC_is_default' => $default && empty($price) ? 0 : $price->get('PRC_is_default'), |
|
1361 | - 'PRC_name' => $default && empty($price) ? '' : $price->get('PRC_name'), |
|
1362 | - 'price_currency_symbol' => EE_Registry::instance()->CFG->currency->sign, |
|
1363 | - 'show_plus_or_minus' => $default && empty($price) ? '' : ' style="display:none;"', |
|
1364 | - 'show_plus' => $default && empty($price) ? ' style="display:none;"' : ($price->is_discount() || $price->is_base_price() ? ' style="display:none;"' : ''), |
|
1365 | - 'show_minus' => $default && empty($price) ? ' style="display:none;"' : ($price->is_discount() ? '' : ' style="display:none;"'), |
|
1366 | - 'show_currency_symbol' => $default && empty($price) ? ' style="display:none"' : ($price->is_percent() ? ' style="display:none"' : ''), |
|
1367 | - 'PRC_amount' => $default && empty($price) ? 0 : $price->get_pretty('PRC_amount', |
|
1368 | - 'localized_float'), |
|
1369 | - 'show_percentage' => $default && empty($price) ? ' style="display:none;"' : ($price->is_percent() ? '' : ' style="display:none;"'), |
|
1370 | - 'show_trash_icon' => $show_trash ? '' : ' style="display:none;"', |
|
1371 | - 'show_create_button' => $show_create ? '' : ' style="display:none;"', |
|
1372 | - 'PRC_desc' => $default && empty($price) ? '' : $price->get('PRC_desc'), |
|
1373 | - 'disabled' => ! empty($ticket) && $ticket->get('TKT_deleted') ? true : false |
|
1374 | - ); |
|
1375 | - |
|
1376 | - $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_ticket_price_row__template_args', |
|
1377 | - $template_args, $tktrow, $prcrow, $price, $default, $ticket, $show_trash, $show_create, |
|
1378 | - $this->_is_creating_event); |
|
1379 | - |
|
1380 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_price_row.template.php'; |
|
1381 | - |
|
1382 | - return EEH_Template::display_template($template, $template_args, true); |
|
1383 | - } |
|
1343 | + protected function _get_ticket_price_row( |
|
1344 | + $tktrow, |
|
1345 | + $prcrow, |
|
1346 | + $price, |
|
1347 | + $default, |
|
1348 | + $ticket, |
|
1349 | + $show_trash = true, |
|
1350 | + $show_create = true |
|
1351 | + ) { |
|
1352 | + $send_disabled = ! empty($ticket) && $ticket->get('TKT_deleted') ? true : false; |
|
1353 | + $template_args = array( |
|
1354 | + 'tkt_row' => $default && empty($ticket) ? 'TICKETNUM' : $tktrow, |
|
1355 | + 'PRC_order' => $default && empty($price) ? 'PRICENUM' : $prcrow, |
|
1356 | + 'edit_prices_name' => $default && empty($price) ? 'PRICENAMEATTR' : 'edit_prices', |
|
1357 | + 'price_type_selector' => $default && empty($price) ? $this->_get_base_price_template($tktrow, $prcrow, |
|
1358 | + $price, $default) : $this->_get_price_type_selector($tktrow, $prcrow, $price, $default, $send_disabled), |
|
1359 | + 'PRC_ID' => $default && empty($price) ? 0 : $price->ID(), |
|
1360 | + 'PRC_is_default' => $default && empty($price) ? 0 : $price->get('PRC_is_default'), |
|
1361 | + 'PRC_name' => $default && empty($price) ? '' : $price->get('PRC_name'), |
|
1362 | + 'price_currency_symbol' => EE_Registry::instance()->CFG->currency->sign, |
|
1363 | + 'show_plus_or_minus' => $default && empty($price) ? '' : ' style="display:none;"', |
|
1364 | + 'show_plus' => $default && empty($price) ? ' style="display:none;"' : ($price->is_discount() || $price->is_base_price() ? ' style="display:none;"' : ''), |
|
1365 | + 'show_minus' => $default && empty($price) ? ' style="display:none;"' : ($price->is_discount() ? '' : ' style="display:none;"'), |
|
1366 | + 'show_currency_symbol' => $default && empty($price) ? ' style="display:none"' : ($price->is_percent() ? ' style="display:none"' : ''), |
|
1367 | + 'PRC_amount' => $default && empty($price) ? 0 : $price->get_pretty('PRC_amount', |
|
1368 | + 'localized_float'), |
|
1369 | + 'show_percentage' => $default && empty($price) ? ' style="display:none;"' : ($price->is_percent() ? '' : ' style="display:none;"'), |
|
1370 | + 'show_trash_icon' => $show_trash ? '' : ' style="display:none;"', |
|
1371 | + 'show_create_button' => $show_create ? '' : ' style="display:none;"', |
|
1372 | + 'PRC_desc' => $default && empty($price) ? '' : $price->get('PRC_desc'), |
|
1373 | + 'disabled' => ! empty($ticket) && $ticket->get('TKT_deleted') ? true : false |
|
1374 | + ); |
|
1375 | + |
|
1376 | + $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_ticket_price_row__template_args', |
|
1377 | + $template_args, $tktrow, $prcrow, $price, $default, $ticket, $show_trash, $show_create, |
|
1378 | + $this->_is_creating_event); |
|
1379 | + |
|
1380 | + $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_price_row.template.php'; |
|
1381 | + |
|
1382 | + return EEH_Template::display_template($template, $template_args, true); |
|
1383 | + } |
|
1384 | 1384 | |
1385 | 1385 | |
1386 | - protected function _get_price_type_selector($tktrow, $prcrow, $price, $default, $disabled = false) |
|
1387 | - { |
|
1388 | - if ($price->is_base_price()) { |
|
1389 | - return $this->_get_base_price_template($tktrow, $prcrow, $price, $default); |
|
1390 | - } else { |
|
1391 | - return $this->_get_price_modifier_template($tktrow, $prcrow, $price, $default, $disabled); |
|
1392 | - } |
|
1393 | - |
|
1394 | - } |
|
1386 | + protected function _get_price_type_selector($tktrow, $prcrow, $price, $default, $disabled = false) |
|
1387 | + { |
|
1388 | + if ($price->is_base_price()) { |
|
1389 | + return $this->_get_base_price_template($tktrow, $prcrow, $price, $default); |
|
1390 | + } else { |
|
1391 | + return $this->_get_price_modifier_template($tktrow, $prcrow, $price, $default, $disabled); |
|
1392 | + } |
|
1393 | + |
|
1394 | + } |
|
1395 | 1395 | |
1396 | 1396 | |
1397 | - protected function _get_base_price_template($tktrow, $prcrow, $price, $default) |
|
1398 | - { |
|
1399 | - $template_args = array( |
|
1400 | - 'tkt_row' => $default ? 'TICKETNUM' : $tktrow, |
|
1401 | - 'PRC_order' => $default && empty($price) ? 'PRICENUM' : $prcrow, |
|
1402 | - 'PRT_ID' => $default && empty($price) ? 1 : $price->get('PRT_ID'), |
|
1403 | - 'PRT_name' => __('Price', 'event_espresso'), |
|
1404 | - 'price_selected_operator' => '+', |
|
1405 | - 'price_selected_is_percent' => 0 |
|
1406 | - ); |
|
1407 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_type_base.template.php'; |
|
1408 | - |
|
1409 | - $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_base_price_template__template_args', |
|
1410 | - $template_args, $tktrow, $prcrow, $price, $default, $this->_is_creating_event); |
|
1411 | - |
|
1412 | - return EEH_Template::display_template($template, $template_args, true); |
|
1413 | - } |
|
1397 | + protected function _get_base_price_template($tktrow, $prcrow, $price, $default) |
|
1398 | + { |
|
1399 | + $template_args = array( |
|
1400 | + 'tkt_row' => $default ? 'TICKETNUM' : $tktrow, |
|
1401 | + 'PRC_order' => $default && empty($price) ? 'PRICENUM' : $prcrow, |
|
1402 | + 'PRT_ID' => $default && empty($price) ? 1 : $price->get('PRT_ID'), |
|
1403 | + 'PRT_name' => __('Price', 'event_espresso'), |
|
1404 | + 'price_selected_operator' => '+', |
|
1405 | + 'price_selected_is_percent' => 0 |
|
1406 | + ); |
|
1407 | + $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_type_base.template.php'; |
|
1408 | + |
|
1409 | + $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_base_price_template__template_args', |
|
1410 | + $template_args, $tktrow, $prcrow, $price, $default, $this->_is_creating_event); |
|
1411 | + |
|
1412 | + return EEH_Template::display_template($template, $template_args, true); |
|
1413 | + } |
|
1414 | 1414 | |
1415 | 1415 | |
1416 | - protected function _get_price_modifier_template($tktrow, $prcrow, $price, $default, $disabled = false) |
|
1417 | - { |
|
1418 | - $select_name = $default && empty($price) ? 'edit_prices[TICKETNUM][PRICENUM][PRT_ID]' : 'edit_prices[' . $tktrow . '][' . $prcrow . '][PRT_ID]'; |
|
1419 | - $price_types = EE_Registry::instance()->load_model('Price_Type')->get_all(array( |
|
1420 | - array( |
|
1421 | - 'OR' => array( |
|
1422 | - 'PBT_ID' => '2', |
|
1423 | - 'PBT_ID*' => '3' |
|
1424 | - ) |
|
1425 | - ) |
|
1426 | - )); |
|
1427 | - $price_option_span_template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_option_span.template.php'; |
|
1428 | - $all_price_types = $default && empty($price) ? array( |
|
1429 | - array( |
|
1430 | - 'id' => 0, |
|
1431 | - 'text' => __('Select Modifier', 'event_espresso') |
|
1432 | - ) |
|
1433 | - ) : array(); |
|
1434 | - $selected_price_type_id = $default && empty($price) ? 0 : $price->type(); |
|
1435 | - $price_option_spans = ''; |
|
1436 | - //setup pricetypes for selector |
|
1437 | - foreach ($price_types as $price_type) { |
|
1438 | - $all_price_types[] = array( |
|
1439 | - 'id' => $price_type->ID(), |
|
1440 | - 'text' => $price_type->get('PRT_name'), |
|
1441 | - ); |
|
1416 | + protected function _get_price_modifier_template($tktrow, $prcrow, $price, $default, $disabled = false) |
|
1417 | + { |
|
1418 | + $select_name = $default && empty($price) ? 'edit_prices[TICKETNUM][PRICENUM][PRT_ID]' : 'edit_prices[' . $tktrow . '][' . $prcrow . '][PRT_ID]'; |
|
1419 | + $price_types = EE_Registry::instance()->load_model('Price_Type')->get_all(array( |
|
1420 | + array( |
|
1421 | + 'OR' => array( |
|
1422 | + 'PBT_ID' => '2', |
|
1423 | + 'PBT_ID*' => '3' |
|
1424 | + ) |
|
1425 | + ) |
|
1426 | + )); |
|
1427 | + $price_option_span_template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_option_span.template.php'; |
|
1428 | + $all_price_types = $default && empty($price) ? array( |
|
1429 | + array( |
|
1430 | + 'id' => 0, |
|
1431 | + 'text' => __('Select Modifier', 'event_espresso') |
|
1432 | + ) |
|
1433 | + ) : array(); |
|
1434 | + $selected_price_type_id = $default && empty($price) ? 0 : $price->type(); |
|
1435 | + $price_option_spans = ''; |
|
1436 | + //setup pricetypes for selector |
|
1437 | + foreach ($price_types as $price_type) { |
|
1438 | + $all_price_types[] = array( |
|
1439 | + 'id' => $price_type->ID(), |
|
1440 | + 'text' => $price_type->get('PRT_name'), |
|
1441 | + ); |
|
1442 | 1442 | |
1443 | - //while we're in the loop let's setup the option spans used by js |
|
1444 | - $spanargs = array( |
|
1445 | - 'PRT_ID' => $price_type->ID(), |
|
1446 | - 'PRT_operator' => $price_type->is_discount() ? '-' : '+', |
|
1447 | - 'PRT_is_percent' => $price_type->get('PRT_is_percent') ? 1 : 0 |
|
1448 | - ); |
|
1449 | - $price_option_spans .= EEH_Template::display_template($price_option_span_template, $spanargs, true); |
|
1450 | - } |
|
1451 | - |
|
1452 | - $select_params = $disabled ? 'style="width:auto;" disabled' : 'style="width:auto;"'; |
|
1453 | - $main_name = $select_name; |
|
1454 | - $select_name = $disabled ? 'archive_price[' . $tktrow . '][' . $prcrow . '][PRT_ID]' : $main_name; |
|
1455 | - |
|
1456 | - $template_args = array( |
|
1457 | - 'tkt_row' => $default ? 'TICKETNUM' : $tktrow, |
|
1458 | - 'PRC_order' => $default && empty($price) ? 'PRICENUM' : $prcrow, |
|
1459 | - 'price_modifier_selector' => EEH_Form_Fields::select_input($select_name, $all_price_types, |
|
1460 | - $selected_price_type_id, $select_params, 'edit-price-PRT_ID'), |
|
1461 | - 'main_name' => $main_name, |
|
1462 | - 'selected_price_type_id' => $selected_price_type_id, |
|
1463 | - 'price_option_spans' => $price_option_spans, |
|
1464 | - 'price_selected_operator' => $default && empty($price) ? '' : ($price->is_discount() ? '-' : '+'), |
|
1465 | - 'price_selected_is_percent' => $default && empty($price) ? '' : ($price->is_percent() ? 1 : 0), |
|
1466 | - 'disabled' => $disabled |
|
1467 | - ); |
|
1468 | - |
|
1469 | - $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_price_modifier_template__template_args', |
|
1470 | - $template_args, $tktrow, $prcrow, $price, $default, $disabled, $this->_is_creating_event); |
|
1471 | - |
|
1472 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_modifier_selector.template.php'; |
|
1473 | - |
|
1474 | - return EEH_Template::display_template($template, $template_args, true); |
|
1475 | - } |
|
1443 | + //while we're in the loop let's setup the option spans used by js |
|
1444 | + $spanargs = array( |
|
1445 | + 'PRT_ID' => $price_type->ID(), |
|
1446 | + 'PRT_operator' => $price_type->is_discount() ? '-' : '+', |
|
1447 | + 'PRT_is_percent' => $price_type->get('PRT_is_percent') ? 1 : 0 |
|
1448 | + ); |
|
1449 | + $price_option_spans .= EEH_Template::display_template($price_option_span_template, $spanargs, true); |
|
1450 | + } |
|
1451 | + |
|
1452 | + $select_params = $disabled ? 'style="width:auto;" disabled' : 'style="width:auto;"'; |
|
1453 | + $main_name = $select_name; |
|
1454 | + $select_name = $disabled ? 'archive_price[' . $tktrow . '][' . $prcrow . '][PRT_ID]' : $main_name; |
|
1455 | + |
|
1456 | + $template_args = array( |
|
1457 | + 'tkt_row' => $default ? 'TICKETNUM' : $tktrow, |
|
1458 | + 'PRC_order' => $default && empty($price) ? 'PRICENUM' : $prcrow, |
|
1459 | + 'price_modifier_selector' => EEH_Form_Fields::select_input($select_name, $all_price_types, |
|
1460 | + $selected_price_type_id, $select_params, 'edit-price-PRT_ID'), |
|
1461 | + 'main_name' => $main_name, |
|
1462 | + 'selected_price_type_id' => $selected_price_type_id, |
|
1463 | + 'price_option_spans' => $price_option_spans, |
|
1464 | + 'price_selected_operator' => $default && empty($price) ? '' : ($price->is_discount() ? '-' : '+'), |
|
1465 | + 'price_selected_is_percent' => $default && empty($price) ? '' : ($price->is_percent() ? 1 : 0), |
|
1466 | + 'disabled' => $disabled |
|
1467 | + ); |
|
1468 | + |
|
1469 | + $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_price_modifier_template__template_args', |
|
1470 | + $template_args, $tktrow, $prcrow, $price, $default, $disabled, $this->_is_creating_event); |
|
1471 | + |
|
1472 | + $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_price_modifier_selector.template.php'; |
|
1473 | + |
|
1474 | + return EEH_Template::display_template($template, $template_args, true); |
|
1475 | + } |
|
1476 | 1476 | |
1477 | 1477 | |
1478 | - protected function _get_ticket_datetime_list_item($dttrow, $tktrow, $dtt, $ticket, $ticket_datetimes, $default) |
|
1479 | - { |
|
1480 | - $tkt_dtts = $ticket instanceof EE_Ticket && isset($ticket_datetimes[$ticket->ID()]) ? $ticket_datetimes[$ticket->ID()] : array(); |
|
1481 | - $template_args = array( |
|
1482 | - 'dtt_row' => $default && ! $dtt instanceof EE_Datetime ? 'DTTNUM' : $dttrow, |
|
1483 | - 'tkt_row' => $default ? 'TICKETNUM' : $tktrow, |
|
1484 | - 'ticket_datetime_selected' => in_array($dttrow, $tkt_dtts) ? ' ticket-selected' : '', |
|
1485 | - 'ticket_datetime_checked' => in_array($dttrow, $tkt_dtts) ? ' checked="checked"' : '', |
|
1486 | - 'DTT_name' => $default && empty($dtt) ? 'DTTNAME' : $dtt->get_dtt_display_name(true), |
|
1487 | - 'tkt_status_class' => '', |
|
1488 | - ); |
|
1489 | - |
|
1490 | - $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_ticket_datetime_list_item__template_args', |
|
1491 | - $template_args, $dttrow, $tktrow, $dtt, $ticket, $ticket_datetimes, $default, $this->_is_creating_event); |
|
1492 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_datetimes_list_item.template.php'; |
|
1493 | - |
|
1494 | - return EEH_Template::display_template($template, $template_args, true); |
|
1495 | - } |
|
1478 | + protected function _get_ticket_datetime_list_item($dttrow, $tktrow, $dtt, $ticket, $ticket_datetimes, $default) |
|
1479 | + { |
|
1480 | + $tkt_dtts = $ticket instanceof EE_Ticket && isset($ticket_datetimes[$ticket->ID()]) ? $ticket_datetimes[$ticket->ID()] : array(); |
|
1481 | + $template_args = array( |
|
1482 | + 'dtt_row' => $default && ! $dtt instanceof EE_Datetime ? 'DTTNUM' : $dttrow, |
|
1483 | + 'tkt_row' => $default ? 'TICKETNUM' : $tktrow, |
|
1484 | + 'ticket_datetime_selected' => in_array($dttrow, $tkt_dtts) ? ' ticket-selected' : '', |
|
1485 | + 'ticket_datetime_checked' => in_array($dttrow, $tkt_dtts) ? ' checked="checked"' : '', |
|
1486 | + 'DTT_name' => $default && empty($dtt) ? 'DTTNAME' : $dtt->get_dtt_display_name(true), |
|
1487 | + 'tkt_status_class' => '', |
|
1488 | + ); |
|
1489 | + |
|
1490 | + $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_ticket_datetime_list_item__template_args', |
|
1491 | + $template_args, $dttrow, $tktrow, $dtt, $ticket, $ticket_datetimes, $default, $this->_is_creating_event); |
|
1492 | + $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_datetimes_list_item.template.php'; |
|
1493 | + |
|
1494 | + return EEH_Template::display_template($template, $template_args, true); |
|
1495 | + } |
|
1496 | 1496 | |
1497 | 1497 | |
1498 | - protected function _get_ticket_js_structure($all_dtts, $all_tickets) |
|
1499 | - { |
|
1500 | - $template_args = array( |
|
1501 | - 'default_datetime_edit_row' => $this->_get_dtt_edit_row('DTTNUM', null, true, $all_dtts), |
|
1502 | - 'default_ticket_row' => $this->_get_ticket_row('TICKETNUM', null, array(), array(), |
|
1503 | - true), |
|
1504 | - 'default_price_row' => $this->_get_ticket_price_row('TICKETNUM', 'PRICENUM', null, |
|
1505 | - true, null), |
|
1506 | - 'default_price_rows' => '', |
|
1507 | - 'default_base_price_amount' => 0, |
|
1508 | - 'default_base_price_name' => '', |
|
1509 | - 'default_base_price_description' => '', |
|
1510 | - 'default_price_modifier_selector_row' => $this->_get_price_modifier_template('TICKETNUM', 'PRICENUM', |
|
1511 | - null, true), |
|
1512 | - 'default_available_tickets_for_datetime' => $this->_get_dtt_attached_tickets_row('DTTNUM', null, array(), |
|
1513 | - array(), true), |
|
1514 | - 'existing_available_datetime_tickets_list' => '', |
|
1515 | - 'existing_available_ticket_datetimes_list' => '', |
|
1516 | - 'new_available_datetime_ticket_list_item' => $this->_get_datetime_tickets_list_item('DTTNUM', 'TICKETNUM', |
|
1517 | - null, null, array(), true), |
|
1518 | - 'new_available_ticket_datetime_list_item' => $this->_get_ticket_datetime_list_item('DTTNUM', 'TICKETNUM', |
|
1519 | - null, null, array(), true) |
|
1520 | - ); |
|
1521 | - |
|
1522 | - $tktrow = 1; |
|
1523 | - foreach ($all_tickets as $ticket) { |
|
1524 | - $template_args['existing_available_datetime_tickets_list'] .= $this->_get_datetime_tickets_list_item('DTTNUM', |
|
1525 | - $tktrow, null, $ticket, array(), true); |
|
1526 | - $tktrow++; |
|
1527 | - } |
|
1528 | - |
|
1529 | - |
|
1530 | - $dttrow = 1; |
|
1531 | - foreach ($all_dtts as $dtt) { |
|
1532 | - $template_args['existing_available_ticket_datetimes_list'] .= $this->_get_ticket_datetime_list_item($dttrow, |
|
1533 | - 'TICKETNUM', $dtt, null, array(), true); |
|
1534 | - $dttrow++; |
|
1535 | - } |
|
1536 | - |
|
1537 | - $default_prices = EE_Registry::instance()->load_model('Price')->get_all_default_prices(); |
|
1538 | - $prcrow = 1; |
|
1539 | - foreach ($default_prices as $price) { |
|
1540 | - if ($price->is_base_price()) { |
|
1541 | - $template_args['default_base_price_amount'] = $price->get_pretty('PRC_amount', 'localized_float'); |
|
1542 | - $template_args['default_base_price_name'] = $price->get('PRC_name'); |
|
1543 | - $template_args['default_base_price_description'] = $price->get('PRC_desc'); |
|
1544 | - $prcrow++; |
|
1545 | - continue; |
|
1546 | - } |
|
1547 | - $show_trash = (count($default_prices) > 1 && $prcrow === 1) || count($default_prices) === 1 ? false : true; |
|
1548 | - $show_create = count($default_prices) > 1 && count($default_prices) !== $prcrow ? false : true; |
|
1549 | - $template_args['default_price_rows'] .= $this->_get_ticket_price_row('TICKETNUM', $prcrow, $price, true, |
|
1550 | - null, $show_trash, $show_create); |
|
1551 | - $prcrow++; |
|
1552 | - } |
|
1553 | - |
|
1554 | - $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_ticket_js_structure__template_args', |
|
1555 | - $template_args, $all_dtts, $all_tickets, $this->_is_creating_event); |
|
1556 | - |
|
1557 | - $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_js_structure.template.php'; |
|
1558 | - |
|
1559 | - return EEH_Template::display_template($template, $template_args, true); |
|
1560 | - } |
|
1498 | + protected function _get_ticket_js_structure($all_dtts, $all_tickets) |
|
1499 | + { |
|
1500 | + $template_args = array( |
|
1501 | + 'default_datetime_edit_row' => $this->_get_dtt_edit_row('DTTNUM', null, true, $all_dtts), |
|
1502 | + 'default_ticket_row' => $this->_get_ticket_row('TICKETNUM', null, array(), array(), |
|
1503 | + true), |
|
1504 | + 'default_price_row' => $this->_get_ticket_price_row('TICKETNUM', 'PRICENUM', null, |
|
1505 | + true, null), |
|
1506 | + 'default_price_rows' => '', |
|
1507 | + 'default_base_price_amount' => 0, |
|
1508 | + 'default_base_price_name' => '', |
|
1509 | + 'default_base_price_description' => '', |
|
1510 | + 'default_price_modifier_selector_row' => $this->_get_price_modifier_template('TICKETNUM', 'PRICENUM', |
|
1511 | + null, true), |
|
1512 | + 'default_available_tickets_for_datetime' => $this->_get_dtt_attached_tickets_row('DTTNUM', null, array(), |
|
1513 | + array(), true), |
|
1514 | + 'existing_available_datetime_tickets_list' => '', |
|
1515 | + 'existing_available_ticket_datetimes_list' => '', |
|
1516 | + 'new_available_datetime_ticket_list_item' => $this->_get_datetime_tickets_list_item('DTTNUM', 'TICKETNUM', |
|
1517 | + null, null, array(), true), |
|
1518 | + 'new_available_ticket_datetime_list_item' => $this->_get_ticket_datetime_list_item('DTTNUM', 'TICKETNUM', |
|
1519 | + null, null, array(), true) |
|
1520 | + ); |
|
1521 | + |
|
1522 | + $tktrow = 1; |
|
1523 | + foreach ($all_tickets as $ticket) { |
|
1524 | + $template_args['existing_available_datetime_tickets_list'] .= $this->_get_datetime_tickets_list_item('DTTNUM', |
|
1525 | + $tktrow, null, $ticket, array(), true); |
|
1526 | + $tktrow++; |
|
1527 | + } |
|
1528 | + |
|
1529 | + |
|
1530 | + $dttrow = 1; |
|
1531 | + foreach ($all_dtts as $dtt) { |
|
1532 | + $template_args['existing_available_ticket_datetimes_list'] .= $this->_get_ticket_datetime_list_item($dttrow, |
|
1533 | + 'TICKETNUM', $dtt, null, array(), true); |
|
1534 | + $dttrow++; |
|
1535 | + } |
|
1536 | + |
|
1537 | + $default_prices = EE_Registry::instance()->load_model('Price')->get_all_default_prices(); |
|
1538 | + $prcrow = 1; |
|
1539 | + foreach ($default_prices as $price) { |
|
1540 | + if ($price->is_base_price()) { |
|
1541 | + $template_args['default_base_price_amount'] = $price->get_pretty('PRC_amount', 'localized_float'); |
|
1542 | + $template_args['default_base_price_name'] = $price->get('PRC_name'); |
|
1543 | + $template_args['default_base_price_description'] = $price->get('PRC_desc'); |
|
1544 | + $prcrow++; |
|
1545 | + continue; |
|
1546 | + } |
|
1547 | + $show_trash = (count($default_prices) > 1 && $prcrow === 1) || count($default_prices) === 1 ? false : true; |
|
1548 | + $show_create = count($default_prices) > 1 && count($default_prices) !== $prcrow ? false : true; |
|
1549 | + $template_args['default_price_rows'] .= $this->_get_ticket_price_row('TICKETNUM', $prcrow, $price, true, |
|
1550 | + null, $show_trash, $show_create); |
|
1551 | + $prcrow++; |
|
1552 | + } |
|
1553 | + |
|
1554 | + $template_args = apply_filters('FHEE__espresso_events_Pricing_Hooks___get_ticket_js_structure__template_args', |
|
1555 | + $template_args, $all_dtts, $all_tickets, $this->_is_creating_event); |
|
1556 | + |
|
1557 | + $template = PRICING_TEMPLATE_PATH . 'event_tickets_datetime_ticket_js_structure.template.php'; |
|
1558 | + |
|
1559 | + return EEH_Template::display_template($template, $template_args, true); |
|
1560 | + } |
|
1561 | 1561 | |
1562 | 1562 | |
1563 | 1563 | } //end class espresso_events_Pricing_Hooks |
@@ -38,15 +38,15 @@ |
||
38 | 38 | if ( EEH_Array::is_multi_dimensional_array( $this->_input->options() )) { |
39 | 39 | EEH_HTML::indent( 1, 'optgroup' ); |
40 | 40 | foreach( $this->_input->options() as $opt_group_label => $opt_group ){ |
41 | - if ( ! empty($opt_group_label)) { |
|
42 | - $html .= EEH_HTML::nl(0, 'optgroup') . '<optgroup label="' . esc_attr($opt_group_label) . '">'; |
|
43 | - } |
|
41 | + if ( ! empty($opt_group_label)) { |
|
42 | + $html .= EEH_HTML::nl(0, 'optgroup') . '<optgroup label="' . esc_attr($opt_group_label) . '">'; |
|
43 | + } |
|
44 | 44 | EEH_HTML::indent( 1, 'option' ); |
45 | 45 | $html .= $this->_display_options( $opt_group ); |
46 | 46 | EEH_HTML::indent( -1, 'option' ); |
47 | - if ( ! empty($opt_group_label)) { |
|
48 | - $html .= EEH_HTML::nl( 0, 'optgroup' ) . '</optgroup>'; |
|
49 | - } |
|
47 | + if ( ! empty($opt_group_label)) { |
|
48 | + $html .= EEH_HTML::nl( 0, 'optgroup' ) . '</optgroup>'; |
|
49 | + } |
|
50 | 50 | } |
51 | 51 | EEH_HTML::indent( -1, 'optgroup' ); |
52 | 52 | } else { |
@@ -81,7 +81,7 @@ |
||
81 | 81 | /** |
82 | 82 | * Checks if that value is the one selected |
83 | 83 | * @param string|int $value unnormalized value option (string) |
84 | - * @return string |
|
84 | + * @return boolean |
|
85 | 85 | */ |
86 | 86 | protected function _check_if_option_selected( $value ){ |
87 | 87 | return $this->_input->raw_value() === $value ? TRUE : FALSE; |
@@ -11,49 +11,49 @@ discard block |
||
11 | 11 | * @since $VID:$ |
12 | 12 | * |
13 | 13 | */ |
14 | -class EE_Select_Display_Strategy extends EE_Display_Strategy_Base{ |
|
14 | +class EE_Select_Display_Strategy extends EE_Display_Strategy_Base { |
|
15 | 15 | |
16 | 16 | /** |
17 | 17 | * |
18 | 18 | * @throws EE_Error |
19 | 19 | * @return string of html to display the field |
20 | 20 | */ |
21 | - function display(){ |
|
22 | - if( ! $this->_input instanceof EE_Form_Input_With_Options_Base){ |
|
23 | - throw new EE_Error( sprintf( __( 'Cannot use Select Display Strategy with an input that doesn\'t have options', 'event_espresso' ))); |
|
21 | + function display() { |
|
22 | + if ( ! $this->_input instanceof EE_Form_Input_With_Options_Base) { |
|
23 | + throw new EE_Error(sprintf(__('Cannot use Select Display Strategy with an input that doesn\'t have options', 'event_espresso'))); |
|
24 | 24 | } |
25 | 25 | |
26 | - $html = EEH_HTML::nl( 0, 'select' ); |
|
26 | + $html = EEH_HTML::nl(0, 'select'); |
|
27 | 27 | $html .= '<select'; |
28 | - $html .= ' id="' . $this->_input->html_id() . '"'; |
|
29 | - $html .= ' name="' . $this->_input->html_name() . '"'; |
|
30 | - $class = $this->_input->required() ? $this->_input->required_css_class() . ' ' . $this->_input->html_class() : $this->_input->html_class(); |
|
31 | - $html .= ' class="' . $class . '"'; |
|
28 | + $html .= ' id="'.$this->_input->html_id().'"'; |
|
29 | + $html .= ' name="'.$this->_input->html_name().'"'; |
|
30 | + $class = $this->_input->required() ? $this->_input->required_css_class().' '.$this->_input->html_class() : $this->_input->html_class(); |
|
31 | + $html .= ' class="'.$class.'"'; |
|
32 | 32 | // add html5 required |
33 | 33 | $html .= $this->_input->required() ? ' required' : ''; |
34 | - $html .= ' style="' . $this->_input->html_style() . '"'; |
|
35 | - $html .= ' ' . $this->_input->other_html_attributes(); |
|
34 | + $html .= ' style="'.$this->_input->html_style().'"'; |
|
35 | + $html .= ' '.$this->_input->other_html_attributes(); |
|
36 | 36 | $html .= '>'; |
37 | 37 | |
38 | - if ( EEH_Array::is_multi_dimensional_array( $this->_input->options() )) { |
|
39 | - EEH_HTML::indent( 1, 'optgroup' ); |
|
40 | - foreach( $this->_input->options() as $opt_group_label => $opt_group ){ |
|
38 | + if (EEH_Array::is_multi_dimensional_array($this->_input->options())) { |
|
39 | + EEH_HTML::indent(1, 'optgroup'); |
|
40 | + foreach ($this->_input->options() as $opt_group_label => $opt_group) { |
|
41 | 41 | if ( ! empty($opt_group_label)) { |
42 | - $html .= EEH_HTML::nl(0, 'optgroup') . '<optgroup label="' . esc_attr($opt_group_label) . '">'; |
|
42 | + $html .= EEH_HTML::nl(0, 'optgroup').'<optgroup label="'.esc_attr($opt_group_label).'">'; |
|
43 | 43 | } |
44 | - EEH_HTML::indent( 1, 'option' ); |
|
45 | - $html .= $this->_display_options( $opt_group ); |
|
44 | + EEH_HTML::indent(1, 'option'); |
|
45 | + $html .= $this->_display_options($opt_group); |
|
46 | 46 | EEH_HTML::indent( -1, 'option' ); |
47 | 47 | if ( ! empty($opt_group_label)) { |
48 | - $html .= EEH_HTML::nl( 0, 'optgroup' ) . '</optgroup>'; |
|
48 | + $html .= EEH_HTML::nl(0, 'optgroup').'</optgroup>'; |
|
49 | 49 | } |
50 | 50 | } |
51 | 51 | EEH_HTML::indent( -1, 'optgroup' ); |
52 | 52 | } else { |
53 | - $html.=$this->_display_options( $this->_input->options() ); |
|
53 | + $html .= $this->_display_options($this->_input->options()); |
|
54 | 54 | } |
55 | 55 | |
56 | - $html.= EEH_HTML::nl( 0, 'select' ) . '</select>'; |
|
56 | + $html .= EEH_HTML::nl(0, 'select').'</select>'; |
|
57 | 57 | return $html; |
58 | 58 | } |
59 | 59 | |
@@ -64,13 +64,13 @@ discard block |
||
64 | 64 | * @param array $options |
65 | 65 | * @return string |
66 | 66 | */ |
67 | - protected function _display_options($options){ |
|
67 | + protected function _display_options($options) { |
|
68 | 68 | $html = ''; |
69 | - EEH_HTML::indent( 1, 'option' ); |
|
70 | - foreach( $options as $value => $display_text ){ |
|
71 | - $unnormalized_value = $this->_input->get_normalization_strategy()->unnormalize_one( $value ); |
|
72 | - $selected = $this->_check_if_option_selected( $unnormalized_value ) ? ' selected="selected"' : ''; |
|
73 | - $html.= EEH_HTML::nl( 0, 'option' ) . '<option value="' . esc_attr( $unnormalized_value ) . '"' . $selected . '>' . $display_text . '</option>'; |
|
69 | + EEH_HTML::indent(1, 'option'); |
|
70 | + foreach ($options as $value => $display_text) { |
|
71 | + $unnormalized_value = $this->_input->get_normalization_strategy()->unnormalize_one($value); |
|
72 | + $selected = $this->_check_if_option_selected($unnormalized_value) ? ' selected="selected"' : ''; |
|
73 | + $html .= EEH_HTML::nl(0, 'option').'<option value="'.esc_attr($unnormalized_value).'"'.$selected.'>'.$display_text.'</option>'; |
|
74 | 74 | } |
75 | 75 | EEH_HTML::indent( -1, 'option' ); |
76 | 76 | return $html; |
@@ -83,7 +83,7 @@ discard block |
||
83 | 83 | * @param string|int $value unnormalized value option (string) |
84 | 84 | * @return string |
85 | 85 | */ |
86 | - protected function _check_if_option_selected( $value ){ |
|
86 | + protected function _check_if_option_selected($value) { |
|
87 | 87 | return $this->_input->raw_value() === $value ? TRUE : FALSE; |
88 | 88 | } |
89 | 89 |
@@ -504,7 +504,7 @@ |
||
504 | 504 | * |
505 | 505 | * @param int $id |
506 | 506 | * @param EEM_Soft_Delete_Base $model |
507 | - * @return boolean |
|
507 | + * @return integer |
|
508 | 508 | */ |
509 | 509 | protected function _delete_item($id, $model) |
510 | 510 | { |
@@ -1,6 +1,6 @@ discard block |
||
1 | 1 | <?php |
2 | 2 | if (! defined('EVENT_ESPRESSO_VERSION')) { |
3 | - exit('NO direct script access allowed'); |
|
3 | + exit('NO direct script access allowed'); |
|
4 | 4 | } |
5 | 5 | |
6 | 6 | /** |
@@ -25,1090 +25,1090 @@ discard block |
||
25 | 25 | { |
26 | 26 | |
27 | 27 | |
28 | - /** |
|
29 | - * @Constructor |
|
30 | - * @param bool $routing indicate whether we want to just load the object and handle routing or just load the object. |
|
31 | - * @access public |
|
32 | - */ |
|
33 | - public function __construct($routing = true) |
|
34 | - { |
|
35 | - define('REGISTRATION_FORM_CAF_ADMIN', EE_CORE_CAF_ADMIN_EXTEND . 'registration_form' . DS); |
|
36 | - define('REGISTRATION_FORM_CAF_ASSETS_PATH', REGISTRATION_FORM_CAF_ADMIN . 'assets' . DS); |
|
37 | - define('REGISTRATION_FORM_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'registration_form/assets/'); |
|
38 | - define('REGISTRATION_FORM_CAF_TEMPLATE_PATH', REGISTRATION_FORM_CAF_ADMIN . 'templates' . DS); |
|
39 | - define('REGISTRATION_FORM_CAF_TEMPLATE_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'registration_form/templates/'); |
|
40 | - parent::__construct($routing); |
|
41 | - } |
|
42 | - |
|
43 | - |
|
44 | - protected function _extend_page_config() |
|
45 | - { |
|
46 | - $this->_admin_base_path = REGISTRATION_FORM_CAF_ADMIN; |
|
47 | - $qst_id = ! empty($this->_req_data['QST_ID']) && ! is_array($this->_req_data['QST_ID']) ? $this->_req_data['QST_ID'] : 0; |
|
48 | - $qsg_id = ! empty($this->_req_data['QSG_ID']) && ! is_array($this->_req_data['QSG_ID']) ? $this->_req_data['QSG_ID'] : 0; |
|
49 | - |
|
50 | - $new_page_routes = array( |
|
51 | - 'question_groups' => array( |
|
52 | - 'func' => '_question_groups_overview_list_table', |
|
53 | - 'capability' => 'ee_read_question_groups', |
|
54 | - ), |
|
55 | - 'add_question' => array( |
|
56 | - 'func' => '_edit_question', |
|
57 | - 'capability' => 'ee_edit_questions', |
|
58 | - ), |
|
59 | - 'insert_question' => array( |
|
60 | - 'func' => '_insert_or_update_question', |
|
61 | - 'args' => array('new_question' => true), |
|
62 | - 'capability' => 'ee_edit_questions', |
|
63 | - 'noheader' => true, |
|
64 | - ), |
|
65 | - 'duplicate_question' => array( |
|
66 | - 'func' => '_duplicate_question', |
|
67 | - 'capability' => 'ee_edit_questions', |
|
68 | - 'noheader' => true, |
|
69 | - ), |
|
70 | - 'trash_question' => array( |
|
71 | - 'func' => '_trash_question', |
|
72 | - 'capability' => 'ee_delete_question', |
|
73 | - 'obj_id' => $qst_id, |
|
74 | - 'noheader' => true, |
|
75 | - ), |
|
76 | - |
|
77 | - 'restore_question' => array( |
|
78 | - 'func' => '_trash_or_restore_questions', |
|
79 | - 'capability' => 'ee_delete_question', |
|
80 | - 'obj_id' => $qst_id, |
|
81 | - 'args' => array('trash' => false), |
|
82 | - 'noheader' => true, |
|
83 | - ), |
|
84 | - |
|
85 | - 'delete_question' => array( |
|
86 | - 'func' => '_delete_question', |
|
87 | - 'capability' => 'ee_delete_question', |
|
88 | - 'obj_id' => $qst_id, |
|
89 | - 'noheader' => true, |
|
90 | - ), |
|
91 | - |
|
92 | - 'trash_questions' => array( |
|
93 | - 'func' => '_trash_or_restore_questions', |
|
94 | - 'capability' => 'ee_delete_questions', |
|
95 | - 'args' => array('trash' => true), |
|
96 | - 'noheader' => true, |
|
97 | - ), |
|
98 | - |
|
99 | - 'restore_questions' => array( |
|
100 | - 'func' => '_trash_or_restore_questions', |
|
101 | - 'capability' => 'ee_delete_questions', |
|
102 | - 'args' => array('trash' => false), |
|
103 | - 'noheader' => true, |
|
104 | - ), |
|
105 | - |
|
106 | - 'delete_questions' => array( |
|
107 | - 'func' => '_delete_questions', |
|
108 | - 'args' => array(), |
|
109 | - 'capability' => 'ee_delete_questions', |
|
110 | - 'noheader' => true, |
|
111 | - ), |
|
112 | - |
|
113 | - 'add_question_group' => array( |
|
114 | - 'func' => '_edit_question_group', |
|
115 | - 'capability' => 'ee_edit_question_groups', |
|
116 | - ), |
|
117 | - |
|
118 | - 'edit_question_group' => array( |
|
119 | - 'func' => '_edit_question_group', |
|
120 | - 'capability' => 'ee_edit_question_group', |
|
121 | - 'obj_id' => $qsg_id, |
|
122 | - 'args' => array('edit'), |
|
123 | - ), |
|
124 | - |
|
125 | - 'delete_question_groups' => array( |
|
126 | - 'func' => '_delete_question_groups', |
|
127 | - 'capability' => 'ee_delete_question_groups', |
|
128 | - 'noheader' => true, |
|
129 | - ), |
|
130 | - |
|
131 | - 'delete_question_group' => array( |
|
132 | - 'func' => '_delete_question_groups', |
|
133 | - 'capability' => 'ee_delete_question_group', |
|
134 | - 'obj_id' => $qsg_id, |
|
135 | - 'noheader' => true, |
|
136 | - ), |
|
137 | - |
|
138 | - 'trash_question_group' => array( |
|
139 | - 'func' => '_trash_or_restore_question_groups', |
|
140 | - 'args' => array('trash' => true), |
|
141 | - 'capability' => 'ee_delete_question_group', |
|
142 | - 'obj_id' => $qsg_id, |
|
143 | - 'noheader' => true, |
|
144 | - ), |
|
145 | - |
|
146 | - 'restore_question_group' => array( |
|
147 | - 'func' => '_trash_or_restore_question_groups', |
|
148 | - 'args' => array('trash' => false), |
|
149 | - 'capability' => 'ee_delete_question_group', |
|
150 | - 'obj_id' => $qsg_id, |
|
151 | - 'noheader' => true, |
|
152 | - ), |
|
153 | - |
|
154 | - 'insert_question_group' => array( |
|
155 | - 'func' => '_insert_or_update_question_group', |
|
156 | - 'args' => array('new_question_group' => true), |
|
157 | - 'capability' => 'ee_edit_question_groups', |
|
158 | - 'noheader' => true, |
|
159 | - ), |
|
160 | - |
|
161 | - 'update_question_group' => array( |
|
162 | - 'func' => '_insert_or_update_question_group', |
|
163 | - 'args' => array('new_question_group' => false), |
|
164 | - 'capability' => 'ee_edit_question_group', |
|
165 | - 'obj_id' => $qsg_id, |
|
166 | - 'noheader' => true, |
|
167 | - ), |
|
168 | - |
|
169 | - 'trash_question_groups' => array( |
|
170 | - 'func' => '_trash_or_restore_question_groups', |
|
171 | - 'args' => array('trash' => true), |
|
172 | - 'capability' => 'ee_delete_question_groups', |
|
173 | - 'noheader' => array('trash' => false), |
|
174 | - ), |
|
175 | - |
|
176 | - 'restore_question_groups' => array( |
|
177 | - 'func' => '_trash_or_restore_question_groups', |
|
178 | - 'args' => array('trash' => false), |
|
179 | - 'capability' => 'ee_delete_question_groups', |
|
180 | - 'noheader' => true, |
|
181 | - ), |
|
182 | - |
|
183 | - |
|
184 | - 'espresso_update_question_group_order' => array( |
|
185 | - 'func' => 'update_question_group_order', |
|
186 | - 'capability' => 'ee_edit_question_groups', |
|
187 | - 'noheader' => true, |
|
188 | - ), |
|
189 | - |
|
190 | - 'view_reg_form_settings' => array( |
|
191 | - 'func' => '_reg_form_settings', |
|
192 | - 'capability' => 'manage_options', |
|
193 | - ), |
|
194 | - |
|
195 | - 'update_reg_form_settings' => array( |
|
196 | - 'func' => '_update_reg_form_settings', |
|
197 | - 'capability' => 'manage_options', |
|
198 | - 'noheader' => true, |
|
199 | - ), |
|
200 | - ); |
|
201 | - $this->_page_routes = array_merge($this->_page_routes, $new_page_routes); |
|
202 | - |
|
203 | - $new_page_config = array( |
|
204 | - |
|
205 | - 'question_groups' => array( |
|
206 | - 'nav' => array( |
|
207 | - 'label' => esc_html__('Question Groups', 'event_espresso'), |
|
208 | - 'order' => 20, |
|
209 | - ), |
|
210 | - 'list_table' => 'Registration_Form_Question_Groups_Admin_List_Table', |
|
211 | - 'help_tabs' => array( |
|
212 | - 'registration_form_question_groups_help_tab' => array( |
|
213 | - 'title' => esc_html__('Question Groups', 'event_espresso'), |
|
214 | - 'filename' => 'registration_form_question_groups', |
|
215 | - ), |
|
216 | - 'registration_form_question_groups_table_column_headings_help_tab' => array( |
|
217 | - 'title' => esc_html__('Question Groups Table Column Headings', 'event_espresso'), |
|
218 | - 'filename' => 'registration_form_question_groups_table_column_headings', |
|
219 | - ), |
|
220 | - 'registration_form_question_groups_views_bulk_actions_search_help_tab' => array( |
|
221 | - 'title' => esc_html__('Question Groups Views & Bulk Actions & Search', 'event_espresso'), |
|
222 | - 'filename' => 'registration_form_question_groups_views_bulk_actions_search', |
|
223 | - ), |
|
224 | - ), |
|
225 | - 'help_tour' => array('Registration_Form_Question_Groups_Help_Tour'), |
|
226 | - 'metaboxes' => $this->_default_espresso_metaboxes, |
|
227 | - 'require_nonce' => false, |
|
228 | - 'qtips' => array( |
|
229 | - 'EE_Registration_Form_Tips', |
|
230 | - ), |
|
231 | - ), |
|
232 | - |
|
233 | - 'add_question' => array( |
|
234 | - 'nav' => array( |
|
235 | - 'label' => esc_html__('Add Question', 'event_espresso'), |
|
236 | - 'order' => 5, |
|
237 | - 'persistent' => false, |
|
238 | - ), |
|
239 | - 'metaboxes' => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')), |
|
240 | - 'help_tabs' => array( |
|
241 | - 'registration_form_add_question_help_tab' => array( |
|
242 | - 'title' => esc_html__('Add Question', 'event_espresso'), |
|
243 | - 'filename' => 'registration_form_add_question', |
|
244 | - ), |
|
245 | - ), |
|
246 | - 'help_tour' => array('Registration_Form_Add_Question_Help_Tour'), |
|
247 | - 'require_nonce' => false, |
|
248 | - ), |
|
249 | - |
|
250 | - 'add_question_group' => array( |
|
251 | - 'nav' => array( |
|
252 | - 'label' => esc_html__('Add Question Group', 'event_espresso'), |
|
253 | - 'order' => 5, |
|
254 | - 'persistent' => false, |
|
255 | - ), |
|
256 | - 'metaboxes' => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')), |
|
257 | - 'help_tabs' => array( |
|
258 | - 'registration_form_add_question_group_help_tab' => array( |
|
259 | - 'title' => esc_html__('Add Question Group', 'event_espresso'), |
|
260 | - 'filename' => 'registration_form_add_question_group', |
|
261 | - ), |
|
262 | - ), |
|
263 | - 'help_tour' => array('Registration_Form_Add_Question_Group_Help_Tour'), |
|
264 | - 'require_nonce' => false, |
|
265 | - ), |
|
266 | - |
|
267 | - 'edit_question_group' => array( |
|
268 | - 'nav' => array( |
|
269 | - 'label' => esc_html__('Edit Question Group', 'event_espresso'), |
|
270 | - 'order' => 5, |
|
271 | - 'persistent' => false, |
|
272 | - 'url' => isset($this->_req_data['question_group_id']) ? add_query_arg(array('question_group_id' => $this->_req_data['question_group_id']), |
|
273 | - $this->_current_page_view_url) : $this->_admin_base_url, |
|
274 | - ), |
|
275 | - 'metaboxes' => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')), |
|
276 | - 'help_tabs' => array( |
|
277 | - 'registration_form_edit_question_group_help_tab' => array( |
|
278 | - 'title' => esc_html__('Edit Question Group', 'event_espresso'), |
|
279 | - 'filename' => 'registration_form_edit_question_group', |
|
280 | - ), |
|
281 | - ), |
|
282 | - 'help_tour' => array('Registration_Form_Edit_Question_Group_Help_Tour'), |
|
283 | - 'require_nonce' => false, |
|
284 | - ), |
|
285 | - |
|
286 | - 'view_reg_form_settings' => array( |
|
287 | - 'nav' => array( |
|
288 | - 'label' => esc_html__('Reg Form Settings', 'event_espresso'), |
|
289 | - 'order' => 40, |
|
290 | - ), |
|
291 | - 'labels' => array( |
|
292 | - 'publishbox' => esc_html__('Update Settings', 'event_espresso'), |
|
293 | - ), |
|
294 | - 'metaboxes' => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')), |
|
295 | - 'help_tabs' => array( |
|
296 | - 'registration_form_reg_form_settings_help_tab' => array( |
|
297 | - 'title' => esc_html__('Registration Form Settings', 'event_espresso'), |
|
298 | - 'filename' => 'registration_form_reg_form_settings', |
|
299 | - ), |
|
300 | - ), |
|
301 | - 'help_tour' => array('Registration_Form_Settings_Help_Tour'), |
|
302 | - 'require_nonce' => false, |
|
303 | - ), |
|
304 | - |
|
305 | - ); |
|
306 | - $this->_page_config = array_merge($this->_page_config, $new_page_config); |
|
307 | - |
|
308 | - //change the list table we're going to use so it's the NEW list table! |
|
309 | - $this->_page_config['default']['list_table'] = 'Extend_Registration_Form_Questions_Admin_List_Table'; |
|
310 | - |
|
311 | - |
|
312 | - //additional labels |
|
313 | - $new_labels = array( |
|
314 | - 'add_question' => esc_html__('Add New Question', 'event_espresso'), |
|
315 | - 'delete_question' => esc_html__('Delete Question', 'event_espresso'), |
|
316 | - 'add_question_group' => esc_html__('Add New Question Group', 'event_espresso'), |
|
317 | - 'edit_question_group' => esc_html__('Edit Question Group', 'event_espresso'), |
|
318 | - 'delete_question_group' => esc_html__('Delete Question Group', 'event_espresso'), |
|
319 | - ); |
|
320 | - $this->_labels['buttons'] = array_merge($this->_labels['buttons'], $new_labels); |
|
321 | - |
|
322 | - } |
|
323 | - |
|
324 | - |
|
325 | - protected function _ajax_hooks() |
|
326 | - { |
|
327 | - add_action('wp_ajax_espresso_update_question_group_order', array($this, 'update_question_group_order')); |
|
328 | - } |
|
329 | - |
|
330 | - |
|
331 | - public function load_scripts_styles_question_groups() |
|
332 | - { |
|
333 | - wp_enqueue_script('espresso_ajax_table_sorting'); |
|
334 | - } |
|
335 | - |
|
336 | - |
|
337 | - public function load_scripts_styles_add_question_group() |
|
338 | - { |
|
339 | - $this->load_scripts_styles_forms(); |
|
340 | - $this->load_sortable_question_script(); |
|
341 | - } |
|
342 | - |
|
343 | - public function load_scripts_styles_edit_question_group() |
|
344 | - { |
|
345 | - $this->load_scripts_styles_forms(); |
|
346 | - $this->load_sortable_question_script(); |
|
347 | - } |
|
348 | - |
|
349 | - |
|
350 | - /** |
|
351 | - * registers and enqueues script for questions |
|
352 | - * |
|
353 | - * @return void |
|
354 | - */ |
|
355 | - public function load_sortable_question_script() |
|
356 | - { |
|
357 | - wp_register_script('ee-question-sortable', REGISTRATION_FORM_CAF_ASSETS_URL . 'ee_question_order.js', |
|
358 | - array('jquery-ui-sortable'), EVENT_ESPRESSO_VERSION, true); |
|
359 | - wp_enqueue_script('ee-question-sortable'); |
|
360 | - } |
|
361 | - |
|
362 | - |
|
363 | - protected function _set_list_table_views_default() |
|
364 | - { |
|
365 | - $this->_views = array( |
|
366 | - 'all' => array( |
|
367 | - 'slug' => 'all', |
|
368 | - 'label' => esc_html__('View All Questions', 'event_espresso'), |
|
369 | - 'count' => 0, |
|
370 | - 'bulk_action' => array( |
|
371 | - 'trash_questions' => esc_html__('Trash', 'event_espresso'), |
|
372 | - ), |
|
373 | - ), |
|
374 | - ); |
|
375 | - |
|
376 | - if (EE_Registry::instance()->CAP->current_user_can('ee_delete_questions', |
|
377 | - 'espresso_registration_form_trash_questions') |
|
378 | - ) { |
|
379 | - $this->_views['trash'] = array( |
|
380 | - 'slug' => 'trash', |
|
381 | - 'label' => esc_html__('Trash', 'event_espresso'), |
|
382 | - 'count' => 0, |
|
383 | - 'bulk_action' => array( |
|
384 | - 'delete_questions' => esc_html__('Delete Permanently', 'event_espresso'), |
|
385 | - 'restore_questions' => esc_html__('Restore', 'event_espresso'), |
|
386 | - ), |
|
387 | - ); |
|
388 | - } |
|
389 | - } |
|
390 | - |
|
391 | - |
|
392 | - protected function _set_list_table_views_question_groups() |
|
393 | - { |
|
394 | - $this->_views = array( |
|
395 | - 'all' => array( |
|
396 | - 'slug' => 'all', |
|
397 | - 'label' => esc_html__('All', 'event_espresso'), |
|
398 | - 'count' => 0, |
|
399 | - 'bulk_action' => array( |
|
400 | - 'trash_question_groups' => esc_html__('Trash', 'event_espresso'), |
|
401 | - ), |
|
402 | - ), |
|
403 | - ); |
|
404 | - |
|
405 | - if (EE_Registry::instance()->CAP->current_user_can('ee_delete_question_groups', |
|
406 | - 'espresso_registration_form_trash_question_groups') |
|
407 | - ) { |
|
408 | - $this->_views['trash'] = array( |
|
409 | - 'slug' => 'trash', |
|
410 | - 'label' => esc_html__('Trash', 'event_espresso'), |
|
411 | - 'count' => 0, |
|
412 | - 'bulk_action' => array( |
|
413 | - 'delete_question_groups' => esc_html__('Delete Permanently', 'event_espresso'), |
|
414 | - 'restore_question_groups' => esc_html__('Restore', 'event_espresso'), |
|
415 | - ), |
|
416 | - ); |
|
417 | - } |
|
418 | - } |
|
419 | - |
|
420 | - |
|
421 | - protected function _questions_overview_list_table() |
|
422 | - { |
|
423 | - $this->_admin_page_title .= ' ' . $this->get_action_link_or_button( |
|
424 | - 'add_question', |
|
425 | - 'add_question', |
|
426 | - array(), |
|
427 | - 'add-new-h2' |
|
428 | - ); |
|
429 | - parent::_questions_overview_list_table(); |
|
430 | - } |
|
431 | - |
|
432 | - |
|
433 | - protected function _question_groups_overview_list_table() |
|
434 | - { |
|
435 | - $this->_search_btn_label = esc_html__('Question Groups', 'event_espresso'); |
|
436 | - $this->_admin_page_title .= ' ' . $this->get_action_link_or_button( |
|
437 | - 'add_question_group', |
|
438 | - 'add_question_group', |
|
439 | - array(), |
|
440 | - 'add-new-h2' |
|
441 | - ); |
|
442 | - $this->display_admin_list_table_page_with_sidebar(); |
|
443 | - } |
|
444 | - |
|
445 | - |
|
446 | - protected function _delete_question() |
|
447 | - { |
|
448 | - $success = $this->_delete_items($this->_question_model); |
|
449 | - $this->_redirect_after_action( |
|
450 | - $success, |
|
451 | - $this->_question_model->item_name($success), |
|
452 | - 'deleted', |
|
453 | - array('action' => 'default', 'status' => 'all') |
|
454 | - ); |
|
455 | - } |
|
456 | - |
|
457 | - |
|
458 | - protected function _delete_questions() |
|
459 | - { |
|
460 | - $success = $this->_delete_items($this->_question_model); |
|
461 | - $this->_redirect_after_action( |
|
462 | - $success, |
|
463 | - $this->_question_model->item_name($success), |
|
464 | - 'deleted permanently', |
|
465 | - array('action' => 'default', 'status' => 'trash') |
|
466 | - ); |
|
467 | - } |
|
468 | - |
|
469 | - |
|
470 | - /** |
|
471 | - * Performs the deletion of a single or multiple questions or question groups. |
|
472 | - * |
|
473 | - * @param EEM_Soft_Delete_Base $model |
|
474 | - * @return int number of items deleted permanently |
|
475 | - */ |
|
476 | - private function _delete_items(EEM_Soft_Delete_Base $model) |
|
477 | - { |
|
478 | - $success = 0; |
|
479 | - do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
|
480 | - if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) { |
|
481 | - // if array has more than one element than success message should be plural |
|
482 | - $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1; |
|
483 | - // cycle thru bulk action checkboxes |
|
484 | - while (list($ID, $value) = each($this->_req_data['checkbox'])) { |
|
485 | - if (! $this->_delete_item($ID, $model)) { |
|
486 | - $success = 0; |
|
487 | - } |
|
488 | - } |
|
489 | - |
|
490 | - } elseif (! empty($this->_req_data['QSG_ID'])) { |
|
491 | - $success = $this->_delete_item($this->_req_data['QSG_ID'], $model); |
|
492 | - |
|
493 | - } elseif (! empty($this->_req_data['QST_ID'])) { |
|
494 | - $success = $this->_delete_item($this->_req_data['QST_ID'], $model); |
|
495 | - } else { |
|
496 | - EE_Error::add_error(sprintf(esc_html__("No Questions or Question Groups were selected for deleting. This error usually shows when you've attempted to delete via bulk action but there were no selections.", |
|
497 | - "event_espresso")), __FILE__, __FUNCTION__, __LINE__); |
|
498 | - } |
|
499 | - return $success; |
|
500 | - } |
|
501 | - |
|
502 | - /** |
|
503 | - * Deletes the specified question (and its associated question options) or question group |
|
504 | - * |
|
505 | - * @param int $id |
|
506 | - * @param EEM_Soft_Delete_Base $model |
|
507 | - * @return boolean |
|
508 | - */ |
|
509 | - protected function _delete_item($id, $model) |
|
510 | - { |
|
511 | - if ($model instanceof EEM_Question) { |
|
512 | - EEM_Question_Option::instance()->delete_permanently(array(array('QST_ID' => absint($id)))); |
|
513 | - } |
|
514 | - return $model->delete_permanently_by_ID(absint($id)); |
|
515 | - } |
|
516 | - |
|
517 | - |
|
518 | - /****************************** QUESTION GROUPS ******************************/ |
|
519 | - |
|
520 | - |
|
521 | - protected function _edit_question_group($type = 'add') |
|
522 | - { |
|
523 | - do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
|
524 | - $ID = isset($this->_req_data['QSG_ID']) && ! empty($this->_req_data['QSG_ID']) ? absint($this->_req_data['QSG_ID']) : false; |
|
525 | - |
|
526 | - switch ($this->_req_action) { |
|
527 | - case 'add_question_group' : |
|
528 | - $this->_admin_page_title = esc_html__('Add Question Group', 'event_espresso'); |
|
529 | - break; |
|
530 | - case 'edit_question_group' : |
|
531 | - $this->_admin_page_title = esc_html__('Edit Question Group', 'event_espresso'); |
|
532 | - break; |
|
533 | - default : |
|
534 | - $this->_admin_page_title = ucwords(str_replace('_', ' ', $this->_req_action)); |
|
535 | - } |
|
536 | - // add ID to title if editing |
|
537 | - $this->_admin_page_title = $ID ? $this->_admin_page_title . ' # ' . $ID : $this->_admin_page_title; |
|
538 | - if ($ID) { |
|
539 | - /** @var EE_Question_Group $questionGroup */ |
|
540 | - $questionGroup = $this->_question_group_model->get_one_by_ID($ID); |
|
541 | - $additional_hidden_fields = array('QSG_ID' => array('type' => 'hidden', 'value' => $ID)); |
|
542 | - $this->_set_add_edit_form_tags('update_question_group', $additional_hidden_fields); |
|
543 | - } else { |
|
544 | - /** @var EE_Question_Group $questionGroup */ |
|
545 | - $questionGroup = EEM_Question_Group::instance()->create_default_object(); |
|
546 | - $questionGroup->set_order_to_latest(); |
|
547 | - $this->_set_add_edit_form_tags('insert_question_group'); |
|
548 | - } |
|
549 | - $this->_template_args['values'] = $this->_yes_no_values; |
|
550 | - $this->_template_args['all_questions'] = $questionGroup->questions_in_and_not_in_group(); |
|
551 | - $this->_template_args['QSG_ID'] = $ID ? $ID : true; |
|
552 | - $this->_template_args['question_group'] = $questionGroup; |
|
553 | - |
|
554 | - $redirect_URL = add_query_arg(array('action' => 'question_groups'), $this->_admin_base_url); |
|
555 | - $this->_set_publish_post_box_vars('id', $ID, false, $redirect_URL); |
|
556 | - $this->_template_args['admin_page_content'] = EEH_Template::display_template(REGISTRATION_FORM_CAF_TEMPLATE_PATH . 'question_groups_main_meta_box.template.php', |
|
557 | - $this->_template_args, true); |
|
558 | - |
|
559 | - // the details template wrapper |
|
560 | - $this->display_admin_page_with_sidebar(); |
|
561 | - } |
|
562 | - |
|
563 | - |
|
564 | - protected function _delete_question_groups() |
|
565 | - { |
|
566 | - $success = $this->_delete_items($this->_question_group_model); |
|
567 | - $this->_redirect_after_action($success, $this->_question_group_model->item_name($success), |
|
568 | - 'deleted permanently', array('action' => 'question_groups', 'status' => 'trash')); |
|
569 | - } |
|
570 | - |
|
571 | - |
|
572 | - /** |
|
573 | - * @param bool $new_question_group |
|
574 | - */ |
|
575 | - protected function _insert_or_update_question_group($new_question_group = true) |
|
576 | - { |
|
577 | - do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
|
578 | - $set_column_values = $this->_set_column_values_for($this->_question_group_model); |
|
579 | - if ($new_question_group) { |
|
580 | - $QSG_ID = $this->_question_group_model->insert($set_column_values); |
|
581 | - $success = $QSG_ID ? 1 : 0; |
|
582 | - } else { |
|
583 | - $QSG_ID = absint($this->_req_data['QSG_ID']); |
|
584 | - unset($set_column_values['QSG_ID']); |
|
585 | - $success = $this->_question_group_model->update($set_column_values, array(array('QSG_ID' => $QSG_ID))); |
|
586 | - } |
|
587 | - $phone_question_id = EEM_Question::instance()->get_Question_ID_from_system_string(EEM_Attendee::system_question_phone); |
|
588 | - // update the existing related questions |
|
589 | - // BUT FIRST... delete the phone question from the Question_Group_Question if it is being added to this question group (therefore removed from the existing group) |
|
590 | - if (isset($this->_req_data['questions'], $this->_req_data['questions'][$phone_question_id])) { |
|
591 | - // delete where QST ID = system phone question ID and Question Group ID is NOT this group |
|
592 | - EEM_Question_Group_Question::instance()->delete(array( |
|
593 | - array( |
|
594 | - 'QST_ID' => $phone_question_id, |
|
595 | - 'QSG_ID' => array('!=', $QSG_ID), |
|
596 | - ), |
|
597 | - )); |
|
598 | - } |
|
599 | - /** @type EE_Question_Group $question_group */ |
|
600 | - $question_group = $this->_question_group_model->get_one_by_ID($QSG_ID); |
|
601 | - $questions = $question_group->questions(); |
|
602 | - // make sure system phone question is added to list of questions for this group |
|
603 | - if (! isset($questions[$phone_question_id])) { |
|
604 | - $questions[$phone_question_id] = EEM_Question::instance()->get_one_by_ID($phone_question_id); |
|
605 | - } |
|
606 | - |
|
607 | - foreach ($questions as $question_ID => $question) { |
|
608 | - // first we always check for order. |
|
609 | - if (! empty($this->_req_data['question_orders'][$question_ID])) { |
|
610 | - //update question order |
|
611 | - $question_group->update_question_order($question_ID, $this->_req_data['question_orders'][$question_ID]); |
|
612 | - } |
|
613 | - |
|
614 | - // then we always check if adding or removing. |
|
615 | - if (isset($this->_req_data['questions'], $this->_req_data['questions'][$question_ID])) { |
|
616 | - $question_group->add_question($question_ID); |
|
617 | - } else { |
|
618 | - // not found, remove it (but only if not a system question for the personal group with the exception of lname system question - we allow removal of it) |
|
619 | - if ( |
|
620 | - in_array( |
|
621 | - $question->system_ID(), |
|
622 | - EEM_Question::instance()->required_system_questions_in_system_question_group($question_group->system_group()) |
|
623 | - ) |
|
624 | - ) { |
|
625 | - continue; |
|
626 | - } else { |
|
627 | - $question_group->remove_question($question_ID); |
|
628 | - } |
|
629 | - } |
|
630 | - } |
|
631 | - // save new related questions |
|
632 | - if (isset($this->_req_data['questions'])) { |
|
633 | - foreach ($this->_req_data['questions'] as $QST_ID) { |
|
634 | - $question_group->add_question($QST_ID); |
|
635 | - if (isset($this->_req_data['question_orders'][$QST_ID])) { |
|
636 | - $question_group->update_question_order($QST_ID, $this->_req_data['question_orders'][$QST_ID]); |
|
637 | - } |
|
638 | - } |
|
639 | - } |
|
640 | - |
|
641 | - if ($success !== false) { |
|
642 | - $msg = $new_question_group ? sprintf(esc_html__('The %s has been created', 'event_espresso'), |
|
643 | - $this->_question_group_model->item_name()) : sprintf(esc_html__('The %s has been updated', |
|
644 | - 'event_espresso'), $this->_question_group_model->item_name()); |
|
645 | - EE_Error::add_success($msg); |
|
646 | - } |
|
647 | - $this->_redirect_after_action(false, '', '', array('action' => 'edit_question_group', 'QSG_ID' => $QSG_ID), |
|
648 | - true); |
|
649 | - |
|
650 | - } |
|
651 | - |
|
652 | - /** |
|
653 | - * duplicates a question and all its question options and redirects to the new question. |
|
654 | - */ |
|
655 | - public function _duplicate_question() |
|
656 | - { |
|
657 | - $question_ID = (int)$this->_req_data['QST_ID']; |
|
658 | - $question = EEM_Question::instance()->get_one_by_ID($question_ID); |
|
659 | - if ($question instanceof EE_Question) { |
|
660 | - $new_question = $question->duplicate(); |
|
661 | - if ($new_question instanceof EE_Question) { |
|
662 | - $this->_redirect_after_action(true, esc_html__('Question', 'event_espresso'), |
|
663 | - esc_html__('Duplicated', 'event_espresso'), |
|
664 | - array('action' => 'edit_question', 'QST_ID' => $new_question->ID()), true); |
|
665 | - } else { |
|
666 | - global $wpdb; |
|
667 | - EE_Error::add_error(sprintf(esc_html__('Could not duplicate question with ID %1$d because: %2$s', |
|
668 | - 'event_espresso'), $question_ID, $wpdb->last_error), __FILE__, __FUNCTION__, __LINE__); |
|
669 | - $this->_redirect_after_action(false, '', '', array('action' => 'default'), false); |
|
670 | - } |
|
671 | - } else { |
|
672 | - EE_Error::add_error(sprintf(esc_html__('Could not duplicate question with ID %d because it didn\'t exist!', |
|
673 | - 'event_espresso'), $question_ID), __FILE__, __FUNCTION__, __LINE__); |
|
674 | - $this->_redirect_after_action(false, '', '', array('action' => 'default'), false); |
|
675 | - } |
|
676 | - } |
|
677 | - |
|
678 | - |
|
679 | - /** |
|
680 | - * @param bool $trash |
|
681 | - */ |
|
682 | - protected function _trash_or_restore_question_groups($trash = true) |
|
683 | - { |
|
684 | - $this->_trash_or_restore_items($this->_question_group_model, $trash); |
|
685 | - } |
|
686 | - |
|
687 | - |
|
688 | - /** |
|
689 | - *_trash_question |
|
690 | - */ |
|
691 | - protected function _trash_question() |
|
692 | - { |
|
693 | - $success = $this->_question_model->delete_by_ID((int)$this->_req_data['QST_ID']); |
|
694 | - $query_args = array('action' => 'default', 'status' => 'all'); |
|
695 | - $this->_redirect_after_action($success, $this->_question_model->item_name($success), 'trashed', $query_args); |
|
696 | - } |
|
697 | - |
|
698 | - |
|
699 | - /** |
|
700 | - * @param bool $trash |
|
701 | - */ |
|
702 | - protected function _trash_or_restore_questions($trash = true) |
|
703 | - { |
|
704 | - $this->_trash_or_restore_items($this->_question_model, $trash); |
|
705 | - } |
|
706 | - |
|
707 | - |
|
708 | - /** |
|
709 | - * Internally used to delete or restore items, using the request data. Meant to be |
|
710 | - * flexible between question or question groups |
|
711 | - * |
|
712 | - * @param EEM_Soft_Delete_Base $model |
|
713 | - * @param boolean $trash whether to trash or restore |
|
714 | - */ |
|
715 | - private function _trash_or_restore_items(EEM_Soft_Delete_Base $model, $trash = true) |
|
716 | - { |
|
717 | - |
|
718 | - do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
|
719 | - |
|
720 | - $success = 1; |
|
721 | - //Checkboxes |
|
722 | - //echo "trash $trash"; |
|
723 | - //var_dump($this->_req_data['checkbox']);die; |
|
724 | - if (isset($this->_req_data['checkbox'])) { |
|
725 | - if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) { |
|
726 | - // if array has more than one element than success message should be plural |
|
727 | - $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1; |
|
728 | - // cycle thru bulk action checkboxes |
|
729 | - while (list($ID, $value) = each($this->_req_data['checkbox'])) { |
|
730 | - if (! $model->delete_or_restore_by_ID($trash, absint($ID))) { |
|
731 | - $success = 0; |
|
732 | - } |
|
733 | - } |
|
734 | - |
|
735 | - } else { |
|
736 | - // grab single id and delete |
|
737 | - $ID = absint($this->_req_data['checkbox']); |
|
738 | - if (! $model->delete_or_restore_by_ID($trash, $ID)) { |
|
739 | - $success = 0; |
|
740 | - } |
|
741 | - } |
|
742 | - |
|
743 | - } else { |
|
744 | - // delete via trash link |
|
745 | - // grab single id and delete |
|
746 | - $ID = absint($this->_req_data[$model->primary_key_name()]); |
|
747 | - if (! $model->delete_or_restore_by_ID($trash, $ID)) { |
|
748 | - $success = 0; |
|
749 | - } |
|
750 | - |
|
751 | - } |
|
752 | - |
|
753 | - |
|
754 | - $action = $model instanceof EEM_Question ? 'default' : 'question_groups';//strtolower( $model->item_name(2) ); |
|
755 | - //echo "action :$action"; |
|
756 | - //$action = 'questions' ? 'default' : $action; |
|
757 | - if ($trash) { |
|
758 | - $action_desc = 'trashed'; |
|
759 | - $status = 'trash'; |
|
760 | - } else { |
|
761 | - $action_desc = 'restored'; |
|
762 | - $status = 'all'; |
|
763 | - } |
|
764 | - $this->_redirect_after_action($success, $model->item_name($success), $action_desc, |
|
765 | - array('action' => $action, 'status' => $status)); |
|
766 | - } |
|
767 | - |
|
768 | - |
|
769 | - /** |
|
770 | - * @param $per_page |
|
771 | - * @param int $current_page |
|
772 | - * @param bool|false $count |
|
773 | - * @return \EE_Soft_Delete_Base_Class[]|int |
|
774 | - */ |
|
775 | - public function get_trashed_questions($per_page, $current_page = 1, $count = false) |
|
776 | - { |
|
777 | - $query_params = $this->get_query_params(EEM_Question::instance(), $per_page, $current_page); |
|
778 | - |
|
779 | - if ($count) { |
|
780 | - //note: this a subclass of EEM_Soft_Delete_Base, so this is actually only getting non-trashed items |
|
781 | - $where = isset($query_params[0]) ? array($query_params[0]) : array(); |
|
782 | - $results = $this->_question_model->count_deleted($where); |
|
783 | - } else { |
|
784 | - //note: this a subclass of EEM_Soft_Delete_Base, so this is actually only getting non-trashed items |
|
785 | - $results = $this->_question_model->get_all_deleted($query_params); |
|
786 | - } |
|
787 | - return $results; |
|
788 | - } |
|
789 | - |
|
790 | - |
|
791 | - /** |
|
792 | - * @param $per_page |
|
793 | - * @param int $current_page |
|
794 | - * @param bool|false $count |
|
795 | - * @return \EE_Soft_Delete_Base_Class[] |
|
796 | - */ |
|
797 | - public function get_question_groups($per_page, $current_page = 1, $count = false) |
|
798 | - { |
|
799 | - $questionGroupModel = EEM_Question_Group::instance(); |
|
800 | - $query_params = $this->get_query_params($questionGroupModel, $per_page, $current_page); |
|
801 | - if ($count) { |
|
802 | - $where = isset($query_params[0]) ? array($query_params[0]) : array(); |
|
803 | - $results = $questionGroupModel->count($where); |
|
804 | - } else { |
|
805 | - $results = $questionGroupModel->get_all($query_params); |
|
806 | - } |
|
807 | - return $results; |
|
808 | - } |
|
809 | - |
|
810 | - |
|
811 | - /** |
|
812 | - * @param $per_page |
|
813 | - * @param int $current_page |
|
814 | - * @param bool $count |
|
815 | - * @return \EE_Soft_Delete_Base_Class[]|int |
|
816 | - */ |
|
817 | - public function get_trashed_question_groups($per_page, $current_page = 1, $count = false) |
|
818 | - { |
|
819 | - $questionGroupModel = EEM_Question_Group::instance(); |
|
820 | - $query_params = $this->get_query_params($questionGroupModel, $per_page, $current_page); |
|
821 | - if ($count) { |
|
822 | - $where = isset($query_params[0]) ? array($query_params[0]) : array(); |
|
823 | - $query_params['limit'] = null; |
|
824 | - $results = $questionGroupModel->count_deleted($where); |
|
825 | - } else { |
|
826 | - $results = $questionGroupModel->get_all_deleted($query_params); |
|
827 | - } |
|
828 | - return $results; |
|
829 | - } |
|
830 | - |
|
831 | - |
|
832 | - /** |
|
833 | - * method for performing updates to question order |
|
834 | - * |
|
835 | - * @return array results array |
|
836 | - */ |
|
837 | - public function update_question_group_order() |
|
838 | - { |
|
839 | - |
|
840 | - $success = esc_html__('Question group order was updated successfully.', 'event_espresso'); |
|
841 | - |
|
842 | - // grab our row IDs |
|
843 | - $row_ids = isset($this->_req_data['row_ids']) && ! empty($this->_req_data['row_ids']) |
|
844 | - ? explode(',', rtrim($this->_req_data['row_ids'], ',')) |
|
845 | - : array(); |
|
846 | - |
|
847 | - $perpage = ! empty($this->_req_data['perpage']) |
|
848 | - ? (int)$this->_req_data['perpage'] |
|
849 | - : null; |
|
850 | - $curpage = ! empty($this->_req_data['curpage']) |
|
851 | - ? (int)$this->_req_data['curpage'] |
|
852 | - : null; |
|
853 | - |
|
854 | - if (! empty($row_ids)) { |
|
855 | - //figure out where we start the row_id count at for the current page. |
|
856 | - $qsgcount = empty($curpage) ? 0 : ($curpage - 1) * $perpage; |
|
857 | - |
|
858 | - $row_count = count($row_ids); |
|
859 | - for ($i = 0; $i < $row_count; $i++) { |
|
860 | - //Update the questions when re-ordering |
|
861 | - $updated = EEM_Question_Group::instance()->update( |
|
862 | - array('QSG_order' => $qsgcount), |
|
863 | - array(array('QSG_ID' => $row_ids[$i])) |
|
864 | - ); |
|
865 | - if ($updated === false) { |
|
866 | - $success = false; |
|
867 | - } |
|
868 | - $qsgcount++; |
|
869 | - } |
|
870 | - } else { |
|
871 | - $success = false; |
|
872 | - } |
|
873 | - |
|
874 | - $errors = ! $success |
|
875 | - ? esc_html__('An error occurred. The question group order was not updated.', 'event_espresso') |
|
876 | - : false; |
|
877 | - |
|
878 | - echo wp_json_encode(array('return_data' => false, 'success' => $success, 'errors' => $errors)); |
|
879 | - die(); |
|
880 | - |
|
881 | - } |
|
882 | - |
|
883 | - |
|
884 | - |
|
885 | - /*************************************** REGISTRATION SETTINGS ***************************************/ |
|
886 | - |
|
887 | - |
|
888 | - /** |
|
889 | - * _reg_form_settings |
|
890 | - * |
|
891 | - * @throws \EE_Error |
|
892 | - */ |
|
893 | - protected function _reg_form_settings() |
|
894 | - { |
|
895 | - $this->_template_args['values'] = $this->_yes_no_values; |
|
896 | - add_action( |
|
897 | - 'AHEE__Extend_Registration_Form_Admin_Page___reg_form_settings_template', |
|
898 | - array($this, 'email_validation_settings_form'), |
|
899 | - 2 |
|
900 | - ); |
|
901 | - $this->_template_args = (array)apply_filters( |
|
902 | - 'FHEE__Extend_Registration_Form_Admin_Page___reg_form_settings___template_args', |
|
903 | - $this->_template_args |
|
904 | - ); |
|
905 | - $this->_set_add_edit_form_tags('update_reg_form_settings'); |
|
906 | - $this->_set_publish_post_box_vars(null, false, false, null, false); |
|
907 | - $this->_template_args['admin_page_content'] = EEH_Template::display_template( |
|
908 | - REGISTRATION_FORM_CAF_TEMPLATE_PATH . 'reg_form_settings.template.php', |
|
909 | - $this->_template_args, |
|
910 | - true |
|
911 | - ); |
|
912 | - $this->display_admin_page_with_sidebar(); |
|
913 | - } |
|
914 | - |
|
915 | - |
|
916 | - /** |
|
917 | - * _update_reg_form_settings |
|
918 | - */ |
|
919 | - protected function _update_reg_form_settings() |
|
920 | - { |
|
921 | - EE_Registry::instance()->CFG->registration = $this->update_email_validation_settings_form( |
|
922 | - EE_Registry::instance()->CFG->registration |
|
923 | - ); |
|
924 | - EE_Registry::instance()->CFG->registration = apply_filters( |
|
925 | - 'FHEE__Extend_Registration_Form_Admin_Page___update_reg_form_settings__CFG_registration', |
|
926 | - EE_Registry::instance()->CFG->registration |
|
927 | - ); |
|
928 | - $success = $this->_update_espresso_configuration( |
|
929 | - esc_html__('Registration Form Options', 'event_espresso'), |
|
930 | - EE_Registry::instance()->CFG, |
|
931 | - __FILE__, __FUNCTION__, __LINE__ |
|
932 | - ); |
|
933 | - $this->_redirect_after_action($success, esc_html__('Registration Form Options', 'event_espresso'), 'updated', |
|
934 | - array('action' => 'view_reg_form_settings')); |
|
935 | - } |
|
936 | - |
|
937 | - |
|
938 | - /** |
|
939 | - * email_validation_settings_form |
|
940 | - * |
|
941 | - * @access public |
|
942 | - * @return void |
|
943 | - * @throws \EE_Error |
|
944 | - */ |
|
945 | - public function email_validation_settings_form() |
|
946 | - { |
|
947 | - echo $this->_email_validation_settings_form()->get_html(); |
|
948 | - } |
|
949 | - |
|
950 | - |
|
951 | - /** |
|
952 | - * _email_validation_settings_form |
|
953 | - * |
|
954 | - * @access protected |
|
955 | - * @return EE_Form_Section_Proper |
|
956 | - * @throws \EE_Error |
|
957 | - */ |
|
958 | - protected function _email_validation_settings_form() |
|
959 | - { |
|
960 | - return new EE_Form_Section_Proper( |
|
961 | - array( |
|
962 | - 'name' => 'email_validation_settings', |
|
963 | - 'html_id' => 'email_validation_settings', |
|
964 | - 'layout_strategy' => new EE_Admin_Two_Column_Layout(), |
|
965 | - 'subsections' => array( |
|
966 | - 'email_validation_hdr' => new EE_Form_Section_HTML( |
|
967 | - EEH_HTML::h2(esc_html__('Email Validation Settings', 'event_espresso')) |
|
968 | - ), |
|
969 | - 'email_validation_level' => new EE_Select_Input( |
|
970 | - array( |
|
971 | - 'basic' => esc_html__('Basic', 'event_espresso'), |
|
972 | - 'wp_default' => esc_html__('WordPress Default', 'event_espresso'), |
|
973 | - 'i18n' => esc_html__('International', 'event_espresso'), |
|
974 | - 'i18n_dns' => esc_html__('International + DNS Check', 'event_espresso'), |
|
975 | - ), |
|
976 | - array( |
|
977 | - 'html_label_text' => esc_html__('Email Validation Level', 'event_espresso') |
|
978 | - . EEH_Template::get_help_tab_link('email_validation_info'), |
|
979 | - 'html_help_text' => esc_html__('These levels range from basic validation ( ie: [email protected] ) to more advanced checks against international email addresses (ie: üñîçøðé@example.com ) with additional MX and A record checks to confirm the domain actually exists. More information on on each level can be found within the help section.', |
|
980 | - 'event_espresso'), |
|
981 | - 'default' => isset(EE_Registry::instance()->CFG->registration->email_validation_level) |
|
982 | - ? EE_Registry::instance()->CFG->registration->email_validation_level |
|
983 | - : 'wp_default', |
|
984 | - 'required' => false, |
|
985 | - ) |
|
986 | - ), |
|
987 | - ), |
|
988 | - ) |
|
989 | - ); |
|
990 | - } |
|
991 | - |
|
992 | - |
|
993 | - /** |
|
994 | - * update_email_validation_settings_form |
|
995 | - * |
|
996 | - * @access public |
|
997 | - * @param \EE_Registration_Config $EE_Registration_Config |
|
998 | - * @return \EE_Registration_Config |
|
999 | - */ |
|
1000 | - public function update_email_validation_settings_form(EE_Registration_Config $EE_Registration_Config) |
|
1001 | - { |
|
1002 | - $prev_email_validation_level = $EE_Registration_Config->email_validation_level; |
|
1003 | - try { |
|
1004 | - $email_validation_settings_form = $this->_email_validation_settings_form(); |
|
1005 | - // if not displaying a form, then check for form submission |
|
1006 | - if ($email_validation_settings_form->was_submitted()) { |
|
1007 | - // capture form data |
|
1008 | - $email_validation_settings_form->receive_form_submission(); |
|
1009 | - // validate form data |
|
1010 | - if ($email_validation_settings_form->is_valid()) { |
|
1011 | - // grab validated data from form |
|
1012 | - $valid_data = $email_validation_settings_form->valid_data(); |
|
1013 | - if (isset($valid_data['email_validation_level'])) { |
|
1014 | - $email_validation_level = $valid_data['email_validation_level']; |
|
1015 | - // now if they want to use international email addresses |
|
1016 | - if ($email_validation_level === 'i18n' || $email_validation_level === 'i18n_dns') { |
|
1017 | - // in case we need to reset their email validation level, |
|
1018 | - // make sure that the previous value wasn't already set to one of the i18n options. |
|
1019 | - if ($prev_email_validation_level === 'i18n' || $prev_email_validation_level === 'i18n_dns') { |
|
1020 | - // if so, then reset it back to "basic" since that is the only other option that, |
|
1021 | - // despite offering poor validation, supports i18n email addresses |
|
1022 | - $prev_email_validation_level = 'basic'; |
|
1023 | - } |
|
1024 | - // confirm our i18n email validation will work on the server |
|
1025 | - if (! $this->_verify_pcre_support($EE_Registration_Config, $email_validation_level)) { |
|
1026 | - // or reset email validation level to previous value |
|
1027 | - $email_validation_level = $prev_email_validation_level; |
|
1028 | - } |
|
1029 | - } |
|
1030 | - $EE_Registration_Config->email_validation_level = $email_validation_level; |
|
1031 | - } else { |
|
1032 | - EE_Error::add_error( |
|
1033 | - esc_html__( |
|
1034 | - 'Invalid or missing Email Validation settings. Please refresh the form and try again.', |
|
1035 | - 'event_espresso' |
|
1036 | - ), |
|
1037 | - __FILE__, __FUNCTION__, __LINE__ |
|
1038 | - ); |
|
1039 | - } |
|
1040 | - } else { |
|
1041 | - if ($email_validation_settings_form->submission_error_message() !== '') { |
|
1042 | - EE_Error::add_error( |
|
1043 | - $email_validation_settings_form->submission_error_message(), |
|
1044 | - __FILE__, __FUNCTION__, __LINE__ |
|
1045 | - ); |
|
1046 | - } |
|
1047 | - } |
|
1048 | - } |
|
1049 | - } catch (EE_Error $e) { |
|
1050 | - $e->get_error(); |
|
1051 | - } |
|
1052 | - return $EE_Registration_Config; |
|
1053 | - } |
|
1054 | - |
|
1055 | - |
|
1056 | - /** |
|
1057 | - * confirms that the server's PHP version has the PCRE module enabled, |
|
1058 | - * and that the PCRE version works with our i18n email validation |
|
1059 | - * |
|
1060 | - * @param \EE_Registration_Config $EE_Registration_Config |
|
1061 | - * @param string $email_validation_level |
|
1062 | - * @return bool |
|
1063 | - */ |
|
1064 | - private function _verify_pcre_support(EE_Registration_Config $EE_Registration_Config, $email_validation_level) |
|
1065 | - { |
|
1066 | - // first check that PCRE is enabled |
|
1067 | - if (! defined('PREG_BAD_UTF8_ERROR')) { |
|
1068 | - EE_Error::add_error( |
|
1069 | - sprintf( |
|
1070 | - esc_html__( |
|
1071 | - 'We\'re sorry, but it appears that your server\'s version of PHP was not compiled with PCRE unicode support.%1$sPlease contact your hosting company and ask them whether the PCRE compiled with your version of PHP on your server can be been built with the "--enable-unicode-properties" and "--enable-utf8" configuration switches to enable more complex regex expressions.%1$sIf they are unable, or unwilling to do so, then your server will not support international email addresses using UTF-8 unicode characters. This means you will either have to lower your email validation level to "Basic" or "WordPress Default", or switch to a hosting company that has/can enable PCRE unicode support on the server.', |
|
1072 | - 'event_espresso' |
|
1073 | - ), |
|
1074 | - '<br />' |
|
1075 | - ), |
|
1076 | - __FILE__, |
|
1077 | - __FUNCTION__, |
|
1078 | - __LINE__ |
|
1079 | - ); |
|
1080 | - return false; |
|
1081 | - } else { |
|
1082 | - // PCRE support is enabled, but let's still |
|
1083 | - // perform a test to see if the server will support it. |
|
1084 | - // but first, save the updated validation level to the config, |
|
1085 | - // so that the validation strategy picks it up. |
|
1086 | - // this will get bumped back down if it doesn't work |
|
1087 | - $EE_Registration_Config->email_validation_level = $email_validation_level; |
|
1088 | - try { |
|
1089 | - $email_validator = new EE_Email_Validation_Strategy(); |
|
1090 | - $i18n_email_address = apply_filters( |
|
1091 | - 'FHEE__Extend_Registration_Form_Admin_Page__update_email_validation_settings_form__i18n_email_address', |
|
1092 | - 'jägerjü[email protected]' |
|
1093 | - ); |
|
1094 | - $email_validator->validate($i18n_email_address); |
|
1095 | - } catch (Exception $e) { |
|
1096 | - EE_Error::add_error( |
|
1097 | - sprintf( |
|
1098 | - esc_html__( |
|
1099 | - 'We\'re sorry, but it appears that your server\'s configuration will not support the "International" or "International + DNS Check" email validation levels.%1$sTo correct this issue, please consult with your hosting company regarding your server\'s PCRE settings.%1$sIt is recommended that your PHP version be configured to use PCRE 8.10 or newer.%1$sMore information regarding PCRE versions and installation can be found here: %2$s', |
|
1100 | - 'event_espresso' |
|
1101 | - ), |
|
1102 | - '<br />', |
|
1103 | - '<a href="http://php.net/manual/en/pcre.installation.php" target="_blank">http://php.net/manual/en/pcre.installation.php</a>' |
|
1104 | - ), |
|
1105 | - __FILE__, __FUNCTION__, __LINE__ |
|
1106 | - ); |
|
1107 | - return false; |
|
1108 | - } |
|
1109 | - } |
|
1110 | - return true; |
|
1111 | - } |
|
28 | + /** |
|
29 | + * @Constructor |
|
30 | + * @param bool $routing indicate whether we want to just load the object and handle routing or just load the object. |
|
31 | + * @access public |
|
32 | + */ |
|
33 | + public function __construct($routing = true) |
|
34 | + { |
|
35 | + define('REGISTRATION_FORM_CAF_ADMIN', EE_CORE_CAF_ADMIN_EXTEND . 'registration_form' . DS); |
|
36 | + define('REGISTRATION_FORM_CAF_ASSETS_PATH', REGISTRATION_FORM_CAF_ADMIN . 'assets' . DS); |
|
37 | + define('REGISTRATION_FORM_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'registration_form/assets/'); |
|
38 | + define('REGISTRATION_FORM_CAF_TEMPLATE_PATH', REGISTRATION_FORM_CAF_ADMIN . 'templates' . DS); |
|
39 | + define('REGISTRATION_FORM_CAF_TEMPLATE_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'registration_form/templates/'); |
|
40 | + parent::__construct($routing); |
|
41 | + } |
|
42 | + |
|
43 | + |
|
44 | + protected function _extend_page_config() |
|
45 | + { |
|
46 | + $this->_admin_base_path = REGISTRATION_FORM_CAF_ADMIN; |
|
47 | + $qst_id = ! empty($this->_req_data['QST_ID']) && ! is_array($this->_req_data['QST_ID']) ? $this->_req_data['QST_ID'] : 0; |
|
48 | + $qsg_id = ! empty($this->_req_data['QSG_ID']) && ! is_array($this->_req_data['QSG_ID']) ? $this->_req_data['QSG_ID'] : 0; |
|
49 | + |
|
50 | + $new_page_routes = array( |
|
51 | + 'question_groups' => array( |
|
52 | + 'func' => '_question_groups_overview_list_table', |
|
53 | + 'capability' => 'ee_read_question_groups', |
|
54 | + ), |
|
55 | + 'add_question' => array( |
|
56 | + 'func' => '_edit_question', |
|
57 | + 'capability' => 'ee_edit_questions', |
|
58 | + ), |
|
59 | + 'insert_question' => array( |
|
60 | + 'func' => '_insert_or_update_question', |
|
61 | + 'args' => array('new_question' => true), |
|
62 | + 'capability' => 'ee_edit_questions', |
|
63 | + 'noheader' => true, |
|
64 | + ), |
|
65 | + 'duplicate_question' => array( |
|
66 | + 'func' => '_duplicate_question', |
|
67 | + 'capability' => 'ee_edit_questions', |
|
68 | + 'noheader' => true, |
|
69 | + ), |
|
70 | + 'trash_question' => array( |
|
71 | + 'func' => '_trash_question', |
|
72 | + 'capability' => 'ee_delete_question', |
|
73 | + 'obj_id' => $qst_id, |
|
74 | + 'noheader' => true, |
|
75 | + ), |
|
76 | + |
|
77 | + 'restore_question' => array( |
|
78 | + 'func' => '_trash_or_restore_questions', |
|
79 | + 'capability' => 'ee_delete_question', |
|
80 | + 'obj_id' => $qst_id, |
|
81 | + 'args' => array('trash' => false), |
|
82 | + 'noheader' => true, |
|
83 | + ), |
|
84 | + |
|
85 | + 'delete_question' => array( |
|
86 | + 'func' => '_delete_question', |
|
87 | + 'capability' => 'ee_delete_question', |
|
88 | + 'obj_id' => $qst_id, |
|
89 | + 'noheader' => true, |
|
90 | + ), |
|
91 | + |
|
92 | + 'trash_questions' => array( |
|
93 | + 'func' => '_trash_or_restore_questions', |
|
94 | + 'capability' => 'ee_delete_questions', |
|
95 | + 'args' => array('trash' => true), |
|
96 | + 'noheader' => true, |
|
97 | + ), |
|
98 | + |
|
99 | + 'restore_questions' => array( |
|
100 | + 'func' => '_trash_or_restore_questions', |
|
101 | + 'capability' => 'ee_delete_questions', |
|
102 | + 'args' => array('trash' => false), |
|
103 | + 'noheader' => true, |
|
104 | + ), |
|
105 | + |
|
106 | + 'delete_questions' => array( |
|
107 | + 'func' => '_delete_questions', |
|
108 | + 'args' => array(), |
|
109 | + 'capability' => 'ee_delete_questions', |
|
110 | + 'noheader' => true, |
|
111 | + ), |
|
112 | + |
|
113 | + 'add_question_group' => array( |
|
114 | + 'func' => '_edit_question_group', |
|
115 | + 'capability' => 'ee_edit_question_groups', |
|
116 | + ), |
|
117 | + |
|
118 | + 'edit_question_group' => array( |
|
119 | + 'func' => '_edit_question_group', |
|
120 | + 'capability' => 'ee_edit_question_group', |
|
121 | + 'obj_id' => $qsg_id, |
|
122 | + 'args' => array('edit'), |
|
123 | + ), |
|
124 | + |
|
125 | + 'delete_question_groups' => array( |
|
126 | + 'func' => '_delete_question_groups', |
|
127 | + 'capability' => 'ee_delete_question_groups', |
|
128 | + 'noheader' => true, |
|
129 | + ), |
|
130 | + |
|
131 | + 'delete_question_group' => array( |
|
132 | + 'func' => '_delete_question_groups', |
|
133 | + 'capability' => 'ee_delete_question_group', |
|
134 | + 'obj_id' => $qsg_id, |
|
135 | + 'noheader' => true, |
|
136 | + ), |
|
137 | + |
|
138 | + 'trash_question_group' => array( |
|
139 | + 'func' => '_trash_or_restore_question_groups', |
|
140 | + 'args' => array('trash' => true), |
|
141 | + 'capability' => 'ee_delete_question_group', |
|
142 | + 'obj_id' => $qsg_id, |
|
143 | + 'noheader' => true, |
|
144 | + ), |
|
145 | + |
|
146 | + 'restore_question_group' => array( |
|
147 | + 'func' => '_trash_or_restore_question_groups', |
|
148 | + 'args' => array('trash' => false), |
|
149 | + 'capability' => 'ee_delete_question_group', |
|
150 | + 'obj_id' => $qsg_id, |
|
151 | + 'noheader' => true, |
|
152 | + ), |
|
153 | + |
|
154 | + 'insert_question_group' => array( |
|
155 | + 'func' => '_insert_or_update_question_group', |
|
156 | + 'args' => array('new_question_group' => true), |
|
157 | + 'capability' => 'ee_edit_question_groups', |
|
158 | + 'noheader' => true, |
|
159 | + ), |
|
160 | + |
|
161 | + 'update_question_group' => array( |
|
162 | + 'func' => '_insert_or_update_question_group', |
|
163 | + 'args' => array('new_question_group' => false), |
|
164 | + 'capability' => 'ee_edit_question_group', |
|
165 | + 'obj_id' => $qsg_id, |
|
166 | + 'noheader' => true, |
|
167 | + ), |
|
168 | + |
|
169 | + 'trash_question_groups' => array( |
|
170 | + 'func' => '_trash_or_restore_question_groups', |
|
171 | + 'args' => array('trash' => true), |
|
172 | + 'capability' => 'ee_delete_question_groups', |
|
173 | + 'noheader' => array('trash' => false), |
|
174 | + ), |
|
175 | + |
|
176 | + 'restore_question_groups' => array( |
|
177 | + 'func' => '_trash_or_restore_question_groups', |
|
178 | + 'args' => array('trash' => false), |
|
179 | + 'capability' => 'ee_delete_question_groups', |
|
180 | + 'noheader' => true, |
|
181 | + ), |
|
182 | + |
|
183 | + |
|
184 | + 'espresso_update_question_group_order' => array( |
|
185 | + 'func' => 'update_question_group_order', |
|
186 | + 'capability' => 'ee_edit_question_groups', |
|
187 | + 'noheader' => true, |
|
188 | + ), |
|
189 | + |
|
190 | + 'view_reg_form_settings' => array( |
|
191 | + 'func' => '_reg_form_settings', |
|
192 | + 'capability' => 'manage_options', |
|
193 | + ), |
|
194 | + |
|
195 | + 'update_reg_form_settings' => array( |
|
196 | + 'func' => '_update_reg_form_settings', |
|
197 | + 'capability' => 'manage_options', |
|
198 | + 'noheader' => true, |
|
199 | + ), |
|
200 | + ); |
|
201 | + $this->_page_routes = array_merge($this->_page_routes, $new_page_routes); |
|
202 | + |
|
203 | + $new_page_config = array( |
|
204 | + |
|
205 | + 'question_groups' => array( |
|
206 | + 'nav' => array( |
|
207 | + 'label' => esc_html__('Question Groups', 'event_espresso'), |
|
208 | + 'order' => 20, |
|
209 | + ), |
|
210 | + 'list_table' => 'Registration_Form_Question_Groups_Admin_List_Table', |
|
211 | + 'help_tabs' => array( |
|
212 | + 'registration_form_question_groups_help_tab' => array( |
|
213 | + 'title' => esc_html__('Question Groups', 'event_espresso'), |
|
214 | + 'filename' => 'registration_form_question_groups', |
|
215 | + ), |
|
216 | + 'registration_form_question_groups_table_column_headings_help_tab' => array( |
|
217 | + 'title' => esc_html__('Question Groups Table Column Headings', 'event_espresso'), |
|
218 | + 'filename' => 'registration_form_question_groups_table_column_headings', |
|
219 | + ), |
|
220 | + 'registration_form_question_groups_views_bulk_actions_search_help_tab' => array( |
|
221 | + 'title' => esc_html__('Question Groups Views & Bulk Actions & Search', 'event_espresso'), |
|
222 | + 'filename' => 'registration_form_question_groups_views_bulk_actions_search', |
|
223 | + ), |
|
224 | + ), |
|
225 | + 'help_tour' => array('Registration_Form_Question_Groups_Help_Tour'), |
|
226 | + 'metaboxes' => $this->_default_espresso_metaboxes, |
|
227 | + 'require_nonce' => false, |
|
228 | + 'qtips' => array( |
|
229 | + 'EE_Registration_Form_Tips', |
|
230 | + ), |
|
231 | + ), |
|
232 | + |
|
233 | + 'add_question' => array( |
|
234 | + 'nav' => array( |
|
235 | + 'label' => esc_html__('Add Question', 'event_espresso'), |
|
236 | + 'order' => 5, |
|
237 | + 'persistent' => false, |
|
238 | + ), |
|
239 | + 'metaboxes' => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')), |
|
240 | + 'help_tabs' => array( |
|
241 | + 'registration_form_add_question_help_tab' => array( |
|
242 | + 'title' => esc_html__('Add Question', 'event_espresso'), |
|
243 | + 'filename' => 'registration_form_add_question', |
|
244 | + ), |
|
245 | + ), |
|
246 | + 'help_tour' => array('Registration_Form_Add_Question_Help_Tour'), |
|
247 | + 'require_nonce' => false, |
|
248 | + ), |
|
249 | + |
|
250 | + 'add_question_group' => array( |
|
251 | + 'nav' => array( |
|
252 | + 'label' => esc_html__('Add Question Group', 'event_espresso'), |
|
253 | + 'order' => 5, |
|
254 | + 'persistent' => false, |
|
255 | + ), |
|
256 | + 'metaboxes' => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')), |
|
257 | + 'help_tabs' => array( |
|
258 | + 'registration_form_add_question_group_help_tab' => array( |
|
259 | + 'title' => esc_html__('Add Question Group', 'event_espresso'), |
|
260 | + 'filename' => 'registration_form_add_question_group', |
|
261 | + ), |
|
262 | + ), |
|
263 | + 'help_tour' => array('Registration_Form_Add_Question_Group_Help_Tour'), |
|
264 | + 'require_nonce' => false, |
|
265 | + ), |
|
266 | + |
|
267 | + 'edit_question_group' => array( |
|
268 | + 'nav' => array( |
|
269 | + 'label' => esc_html__('Edit Question Group', 'event_espresso'), |
|
270 | + 'order' => 5, |
|
271 | + 'persistent' => false, |
|
272 | + 'url' => isset($this->_req_data['question_group_id']) ? add_query_arg(array('question_group_id' => $this->_req_data['question_group_id']), |
|
273 | + $this->_current_page_view_url) : $this->_admin_base_url, |
|
274 | + ), |
|
275 | + 'metaboxes' => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')), |
|
276 | + 'help_tabs' => array( |
|
277 | + 'registration_form_edit_question_group_help_tab' => array( |
|
278 | + 'title' => esc_html__('Edit Question Group', 'event_espresso'), |
|
279 | + 'filename' => 'registration_form_edit_question_group', |
|
280 | + ), |
|
281 | + ), |
|
282 | + 'help_tour' => array('Registration_Form_Edit_Question_Group_Help_Tour'), |
|
283 | + 'require_nonce' => false, |
|
284 | + ), |
|
285 | + |
|
286 | + 'view_reg_form_settings' => array( |
|
287 | + 'nav' => array( |
|
288 | + 'label' => esc_html__('Reg Form Settings', 'event_espresso'), |
|
289 | + 'order' => 40, |
|
290 | + ), |
|
291 | + 'labels' => array( |
|
292 | + 'publishbox' => esc_html__('Update Settings', 'event_espresso'), |
|
293 | + ), |
|
294 | + 'metaboxes' => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')), |
|
295 | + 'help_tabs' => array( |
|
296 | + 'registration_form_reg_form_settings_help_tab' => array( |
|
297 | + 'title' => esc_html__('Registration Form Settings', 'event_espresso'), |
|
298 | + 'filename' => 'registration_form_reg_form_settings', |
|
299 | + ), |
|
300 | + ), |
|
301 | + 'help_tour' => array('Registration_Form_Settings_Help_Tour'), |
|
302 | + 'require_nonce' => false, |
|
303 | + ), |
|
304 | + |
|
305 | + ); |
|
306 | + $this->_page_config = array_merge($this->_page_config, $new_page_config); |
|
307 | + |
|
308 | + //change the list table we're going to use so it's the NEW list table! |
|
309 | + $this->_page_config['default']['list_table'] = 'Extend_Registration_Form_Questions_Admin_List_Table'; |
|
310 | + |
|
311 | + |
|
312 | + //additional labels |
|
313 | + $new_labels = array( |
|
314 | + 'add_question' => esc_html__('Add New Question', 'event_espresso'), |
|
315 | + 'delete_question' => esc_html__('Delete Question', 'event_espresso'), |
|
316 | + 'add_question_group' => esc_html__('Add New Question Group', 'event_espresso'), |
|
317 | + 'edit_question_group' => esc_html__('Edit Question Group', 'event_espresso'), |
|
318 | + 'delete_question_group' => esc_html__('Delete Question Group', 'event_espresso'), |
|
319 | + ); |
|
320 | + $this->_labels['buttons'] = array_merge($this->_labels['buttons'], $new_labels); |
|
321 | + |
|
322 | + } |
|
323 | + |
|
324 | + |
|
325 | + protected function _ajax_hooks() |
|
326 | + { |
|
327 | + add_action('wp_ajax_espresso_update_question_group_order', array($this, 'update_question_group_order')); |
|
328 | + } |
|
329 | + |
|
330 | + |
|
331 | + public function load_scripts_styles_question_groups() |
|
332 | + { |
|
333 | + wp_enqueue_script('espresso_ajax_table_sorting'); |
|
334 | + } |
|
335 | + |
|
336 | + |
|
337 | + public function load_scripts_styles_add_question_group() |
|
338 | + { |
|
339 | + $this->load_scripts_styles_forms(); |
|
340 | + $this->load_sortable_question_script(); |
|
341 | + } |
|
342 | + |
|
343 | + public function load_scripts_styles_edit_question_group() |
|
344 | + { |
|
345 | + $this->load_scripts_styles_forms(); |
|
346 | + $this->load_sortable_question_script(); |
|
347 | + } |
|
348 | + |
|
349 | + |
|
350 | + /** |
|
351 | + * registers and enqueues script for questions |
|
352 | + * |
|
353 | + * @return void |
|
354 | + */ |
|
355 | + public function load_sortable_question_script() |
|
356 | + { |
|
357 | + wp_register_script('ee-question-sortable', REGISTRATION_FORM_CAF_ASSETS_URL . 'ee_question_order.js', |
|
358 | + array('jquery-ui-sortable'), EVENT_ESPRESSO_VERSION, true); |
|
359 | + wp_enqueue_script('ee-question-sortable'); |
|
360 | + } |
|
361 | + |
|
362 | + |
|
363 | + protected function _set_list_table_views_default() |
|
364 | + { |
|
365 | + $this->_views = array( |
|
366 | + 'all' => array( |
|
367 | + 'slug' => 'all', |
|
368 | + 'label' => esc_html__('View All Questions', 'event_espresso'), |
|
369 | + 'count' => 0, |
|
370 | + 'bulk_action' => array( |
|
371 | + 'trash_questions' => esc_html__('Trash', 'event_espresso'), |
|
372 | + ), |
|
373 | + ), |
|
374 | + ); |
|
375 | + |
|
376 | + if (EE_Registry::instance()->CAP->current_user_can('ee_delete_questions', |
|
377 | + 'espresso_registration_form_trash_questions') |
|
378 | + ) { |
|
379 | + $this->_views['trash'] = array( |
|
380 | + 'slug' => 'trash', |
|
381 | + 'label' => esc_html__('Trash', 'event_espresso'), |
|
382 | + 'count' => 0, |
|
383 | + 'bulk_action' => array( |
|
384 | + 'delete_questions' => esc_html__('Delete Permanently', 'event_espresso'), |
|
385 | + 'restore_questions' => esc_html__('Restore', 'event_espresso'), |
|
386 | + ), |
|
387 | + ); |
|
388 | + } |
|
389 | + } |
|
390 | + |
|
391 | + |
|
392 | + protected function _set_list_table_views_question_groups() |
|
393 | + { |
|
394 | + $this->_views = array( |
|
395 | + 'all' => array( |
|
396 | + 'slug' => 'all', |
|
397 | + 'label' => esc_html__('All', 'event_espresso'), |
|
398 | + 'count' => 0, |
|
399 | + 'bulk_action' => array( |
|
400 | + 'trash_question_groups' => esc_html__('Trash', 'event_espresso'), |
|
401 | + ), |
|
402 | + ), |
|
403 | + ); |
|
404 | + |
|
405 | + if (EE_Registry::instance()->CAP->current_user_can('ee_delete_question_groups', |
|
406 | + 'espresso_registration_form_trash_question_groups') |
|
407 | + ) { |
|
408 | + $this->_views['trash'] = array( |
|
409 | + 'slug' => 'trash', |
|
410 | + 'label' => esc_html__('Trash', 'event_espresso'), |
|
411 | + 'count' => 0, |
|
412 | + 'bulk_action' => array( |
|
413 | + 'delete_question_groups' => esc_html__('Delete Permanently', 'event_espresso'), |
|
414 | + 'restore_question_groups' => esc_html__('Restore', 'event_espresso'), |
|
415 | + ), |
|
416 | + ); |
|
417 | + } |
|
418 | + } |
|
419 | + |
|
420 | + |
|
421 | + protected function _questions_overview_list_table() |
|
422 | + { |
|
423 | + $this->_admin_page_title .= ' ' . $this->get_action_link_or_button( |
|
424 | + 'add_question', |
|
425 | + 'add_question', |
|
426 | + array(), |
|
427 | + 'add-new-h2' |
|
428 | + ); |
|
429 | + parent::_questions_overview_list_table(); |
|
430 | + } |
|
431 | + |
|
432 | + |
|
433 | + protected function _question_groups_overview_list_table() |
|
434 | + { |
|
435 | + $this->_search_btn_label = esc_html__('Question Groups', 'event_espresso'); |
|
436 | + $this->_admin_page_title .= ' ' . $this->get_action_link_or_button( |
|
437 | + 'add_question_group', |
|
438 | + 'add_question_group', |
|
439 | + array(), |
|
440 | + 'add-new-h2' |
|
441 | + ); |
|
442 | + $this->display_admin_list_table_page_with_sidebar(); |
|
443 | + } |
|
444 | + |
|
445 | + |
|
446 | + protected function _delete_question() |
|
447 | + { |
|
448 | + $success = $this->_delete_items($this->_question_model); |
|
449 | + $this->_redirect_after_action( |
|
450 | + $success, |
|
451 | + $this->_question_model->item_name($success), |
|
452 | + 'deleted', |
|
453 | + array('action' => 'default', 'status' => 'all') |
|
454 | + ); |
|
455 | + } |
|
456 | + |
|
457 | + |
|
458 | + protected function _delete_questions() |
|
459 | + { |
|
460 | + $success = $this->_delete_items($this->_question_model); |
|
461 | + $this->_redirect_after_action( |
|
462 | + $success, |
|
463 | + $this->_question_model->item_name($success), |
|
464 | + 'deleted permanently', |
|
465 | + array('action' => 'default', 'status' => 'trash') |
|
466 | + ); |
|
467 | + } |
|
468 | + |
|
469 | + |
|
470 | + /** |
|
471 | + * Performs the deletion of a single or multiple questions or question groups. |
|
472 | + * |
|
473 | + * @param EEM_Soft_Delete_Base $model |
|
474 | + * @return int number of items deleted permanently |
|
475 | + */ |
|
476 | + private function _delete_items(EEM_Soft_Delete_Base $model) |
|
477 | + { |
|
478 | + $success = 0; |
|
479 | + do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
|
480 | + if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) { |
|
481 | + // if array has more than one element than success message should be plural |
|
482 | + $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1; |
|
483 | + // cycle thru bulk action checkboxes |
|
484 | + while (list($ID, $value) = each($this->_req_data['checkbox'])) { |
|
485 | + if (! $this->_delete_item($ID, $model)) { |
|
486 | + $success = 0; |
|
487 | + } |
|
488 | + } |
|
489 | + |
|
490 | + } elseif (! empty($this->_req_data['QSG_ID'])) { |
|
491 | + $success = $this->_delete_item($this->_req_data['QSG_ID'], $model); |
|
492 | + |
|
493 | + } elseif (! empty($this->_req_data['QST_ID'])) { |
|
494 | + $success = $this->_delete_item($this->_req_data['QST_ID'], $model); |
|
495 | + } else { |
|
496 | + EE_Error::add_error(sprintf(esc_html__("No Questions or Question Groups were selected for deleting. This error usually shows when you've attempted to delete via bulk action but there were no selections.", |
|
497 | + "event_espresso")), __FILE__, __FUNCTION__, __LINE__); |
|
498 | + } |
|
499 | + return $success; |
|
500 | + } |
|
501 | + |
|
502 | + /** |
|
503 | + * Deletes the specified question (and its associated question options) or question group |
|
504 | + * |
|
505 | + * @param int $id |
|
506 | + * @param EEM_Soft_Delete_Base $model |
|
507 | + * @return boolean |
|
508 | + */ |
|
509 | + protected function _delete_item($id, $model) |
|
510 | + { |
|
511 | + if ($model instanceof EEM_Question) { |
|
512 | + EEM_Question_Option::instance()->delete_permanently(array(array('QST_ID' => absint($id)))); |
|
513 | + } |
|
514 | + return $model->delete_permanently_by_ID(absint($id)); |
|
515 | + } |
|
516 | + |
|
517 | + |
|
518 | + /****************************** QUESTION GROUPS ******************************/ |
|
519 | + |
|
520 | + |
|
521 | + protected function _edit_question_group($type = 'add') |
|
522 | + { |
|
523 | + do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
|
524 | + $ID = isset($this->_req_data['QSG_ID']) && ! empty($this->_req_data['QSG_ID']) ? absint($this->_req_data['QSG_ID']) : false; |
|
525 | + |
|
526 | + switch ($this->_req_action) { |
|
527 | + case 'add_question_group' : |
|
528 | + $this->_admin_page_title = esc_html__('Add Question Group', 'event_espresso'); |
|
529 | + break; |
|
530 | + case 'edit_question_group' : |
|
531 | + $this->_admin_page_title = esc_html__('Edit Question Group', 'event_espresso'); |
|
532 | + break; |
|
533 | + default : |
|
534 | + $this->_admin_page_title = ucwords(str_replace('_', ' ', $this->_req_action)); |
|
535 | + } |
|
536 | + // add ID to title if editing |
|
537 | + $this->_admin_page_title = $ID ? $this->_admin_page_title . ' # ' . $ID : $this->_admin_page_title; |
|
538 | + if ($ID) { |
|
539 | + /** @var EE_Question_Group $questionGroup */ |
|
540 | + $questionGroup = $this->_question_group_model->get_one_by_ID($ID); |
|
541 | + $additional_hidden_fields = array('QSG_ID' => array('type' => 'hidden', 'value' => $ID)); |
|
542 | + $this->_set_add_edit_form_tags('update_question_group', $additional_hidden_fields); |
|
543 | + } else { |
|
544 | + /** @var EE_Question_Group $questionGroup */ |
|
545 | + $questionGroup = EEM_Question_Group::instance()->create_default_object(); |
|
546 | + $questionGroup->set_order_to_latest(); |
|
547 | + $this->_set_add_edit_form_tags('insert_question_group'); |
|
548 | + } |
|
549 | + $this->_template_args['values'] = $this->_yes_no_values; |
|
550 | + $this->_template_args['all_questions'] = $questionGroup->questions_in_and_not_in_group(); |
|
551 | + $this->_template_args['QSG_ID'] = $ID ? $ID : true; |
|
552 | + $this->_template_args['question_group'] = $questionGroup; |
|
553 | + |
|
554 | + $redirect_URL = add_query_arg(array('action' => 'question_groups'), $this->_admin_base_url); |
|
555 | + $this->_set_publish_post_box_vars('id', $ID, false, $redirect_URL); |
|
556 | + $this->_template_args['admin_page_content'] = EEH_Template::display_template(REGISTRATION_FORM_CAF_TEMPLATE_PATH . 'question_groups_main_meta_box.template.php', |
|
557 | + $this->_template_args, true); |
|
558 | + |
|
559 | + // the details template wrapper |
|
560 | + $this->display_admin_page_with_sidebar(); |
|
561 | + } |
|
562 | + |
|
563 | + |
|
564 | + protected function _delete_question_groups() |
|
565 | + { |
|
566 | + $success = $this->_delete_items($this->_question_group_model); |
|
567 | + $this->_redirect_after_action($success, $this->_question_group_model->item_name($success), |
|
568 | + 'deleted permanently', array('action' => 'question_groups', 'status' => 'trash')); |
|
569 | + } |
|
570 | + |
|
571 | + |
|
572 | + /** |
|
573 | + * @param bool $new_question_group |
|
574 | + */ |
|
575 | + protected function _insert_or_update_question_group($new_question_group = true) |
|
576 | + { |
|
577 | + do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
|
578 | + $set_column_values = $this->_set_column_values_for($this->_question_group_model); |
|
579 | + if ($new_question_group) { |
|
580 | + $QSG_ID = $this->_question_group_model->insert($set_column_values); |
|
581 | + $success = $QSG_ID ? 1 : 0; |
|
582 | + } else { |
|
583 | + $QSG_ID = absint($this->_req_data['QSG_ID']); |
|
584 | + unset($set_column_values['QSG_ID']); |
|
585 | + $success = $this->_question_group_model->update($set_column_values, array(array('QSG_ID' => $QSG_ID))); |
|
586 | + } |
|
587 | + $phone_question_id = EEM_Question::instance()->get_Question_ID_from_system_string(EEM_Attendee::system_question_phone); |
|
588 | + // update the existing related questions |
|
589 | + // BUT FIRST... delete the phone question from the Question_Group_Question if it is being added to this question group (therefore removed from the existing group) |
|
590 | + if (isset($this->_req_data['questions'], $this->_req_data['questions'][$phone_question_id])) { |
|
591 | + // delete where QST ID = system phone question ID and Question Group ID is NOT this group |
|
592 | + EEM_Question_Group_Question::instance()->delete(array( |
|
593 | + array( |
|
594 | + 'QST_ID' => $phone_question_id, |
|
595 | + 'QSG_ID' => array('!=', $QSG_ID), |
|
596 | + ), |
|
597 | + )); |
|
598 | + } |
|
599 | + /** @type EE_Question_Group $question_group */ |
|
600 | + $question_group = $this->_question_group_model->get_one_by_ID($QSG_ID); |
|
601 | + $questions = $question_group->questions(); |
|
602 | + // make sure system phone question is added to list of questions for this group |
|
603 | + if (! isset($questions[$phone_question_id])) { |
|
604 | + $questions[$phone_question_id] = EEM_Question::instance()->get_one_by_ID($phone_question_id); |
|
605 | + } |
|
606 | + |
|
607 | + foreach ($questions as $question_ID => $question) { |
|
608 | + // first we always check for order. |
|
609 | + if (! empty($this->_req_data['question_orders'][$question_ID])) { |
|
610 | + //update question order |
|
611 | + $question_group->update_question_order($question_ID, $this->_req_data['question_orders'][$question_ID]); |
|
612 | + } |
|
613 | + |
|
614 | + // then we always check if adding or removing. |
|
615 | + if (isset($this->_req_data['questions'], $this->_req_data['questions'][$question_ID])) { |
|
616 | + $question_group->add_question($question_ID); |
|
617 | + } else { |
|
618 | + // not found, remove it (but only if not a system question for the personal group with the exception of lname system question - we allow removal of it) |
|
619 | + if ( |
|
620 | + in_array( |
|
621 | + $question->system_ID(), |
|
622 | + EEM_Question::instance()->required_system_questions_in_system_question_group($question_group->system_group()) |
|
623 | + ) |
|
624 | + ) { |
|
625 | + continue; |
|
626 | + } else { |
|
627 | + $question_group->remove_question($question_ID); |
|
628 | + } |
|
629 | + } |
|
630 | + } |
|
631 | + // save new related questions |
|
632 | + if (isset($this->_req_data['questions'])) { |
|
633 | + foreach ($this->_req_data['questions'] as $QST_ID) { |
|
634 | + $question_group->add_question($QST_ID); |
|
635 | + if (isset($this->_req_data['question_orders'][$QST_ID])) { |
|
636 | + $question_group->update_question_order($QST_ID, $this->_req_data['question_orders'][$QST_ID]); |
|
637 | + } |
|
638 | + } |
|
639 | + } |
|
640 | + |
|
641 | + if ($success !== false) { |
|
642 | + $msg = $new_question_group ? sprintf(esc_html__('The %s has been created', 'event_espresso'), |
|
643 | + $this->_question_group_model->item_name()) : sprintf(esc_html__('The %s has been updated', |
|
644 | + 'event_espresso'), $this->_question_group_model->item_name()); |
|
645 | + EE_Error::add_success($msg); |
|
646 | + } |
|
647 | + $this->_redirect_after_action(false, '', '', array('action' => 'edit_question_group', 'QSG_ID' => $QSG_ID), |
|
648 | + true); |
|
649 | + |
|
650 | + } |
|
651 | + |
|
652 | + /** |
|
653 | + * duplicates a question and all its question options and redirects to the new question. |
|
654 | + */ |
|
655 | + public function _duplicate_question() |
|
656 | + { |
|
657 | + $question_ID = (int)$this->_req_data['QST_ID']; |
|
658 | + $question = EEM_Question::instance()->get_one_by_ID($question_ID); |
|
659 | + if ($question instanceof EE_Question) { |
|
660 | + $new_question = $question->duplicate(); |
|
661 | + if ($new_question instanceof EE_Question) { |
|
662 | + $this->_redirect_after_action(true, esc_html__('Question', 'event_espresso'), |
|
663 | + esc_html__('Duplicated', 'event_espresso'), |
|
664 | + array('action' => 'edit_question', 'QST_ID' => $new_question->ID()), true); |
|
665 | + } else { |
|
666 | + global $wpdb; |
|
667 | + EE_Error::add_error(sprintf(esc_html__('Could not duplicate question with ID %1$d because: %2$s', |
|
668 | + 'event_espresso'), $question_ID, $wpdb->last_error), __FILE__, __FUNCTION__, __LINE__); |
|
669 | + $this->_redirect_after_action(false, '', '', array('action' => 'default'), false); |
|
670 | + } |
|
671 | + } else { |
|
672 | + EE_Error::add_error(sprintf(esc_html__('Could not duplicate question with ID %d because it didn\'t exist!', |
|
673 | + 'event_espresso'), $question_ID), __FILE__, __FUNCTION__, __LINE__); |
|
674 | + $this->_redirect_after_action(false, '', '', array('action' => 'default'), false); |
|
675 | + } |
|
676 | + } |
|
677 | + |
|
678 | + |
|
679 | + /** |
|
680 | + * @param bool $trash |
|
681 | + */ |
|
682 | + protected function _trash_or_restore_question_groups($trash = true) |
|
683 | + { |
|
684 | + $this->_trash_or_restore_items($this->_question_group_model, $trash); |
|
685 | + } |
|
686 | + |
|
687 | + |
|
688 | + /** |
|
689 | + *_trash_question |
|
690 | + */ |
|
691 | + protected function _trash_question() |
|
692 | + { |
|
693 | + $success = $this->_question_model->delete_by_ID((int)$this->_req_data['QST_ID']); |
|
694 | + $query_args = array('action' => 'default', 'status' => 'all'); |
|
695 | + $this->_redirect_after_action($success, $this->_question_model->item_name($success), 'trashed', $query_args); |
|
696 | + } |
|
697 | + |
|
698 | + |
|
699 | + /** |
|
700 | + * @param bool $trash |
|
701 | + */ |
|
702 | + protected function _trash_or_restore_questions($trash = true) |
|
703 | + { |
|
704 | + $this->_trash_or_restore_items($this->_question_model, $trash); |
|
705 | + } |
|
706 | + |
|
707 | + |
|
708 | + /** |
|
709 | + * Internally used to delete or restore items, using the request data. Meant to be |
|
710 | + * flexible between question or question groups |
|
711 | + * |
|
712 | + * @param EEM_Soft_Delete_Base $model |
|
713 | + * @param boolean $trash whether to trash or restore |
|
714 | + */ |
|
715 | + private function _trash_or_restore_items(EEM_Soft_Delete_Base $model, $trash = true) |
|
716 | + { |
|
717 | + |
|
718 | + do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
|
719 | + |
|
720 | + $success = 1; |
|
721 | + //Checkboxes |
|
722 | + //echo "trash $trash"; |
|
723 | + //var_dump($this->_req_data['checkbox']);die; |
|
724 | + if (isset($this->_req_data['checkbox'])) { |
|
725 | + if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) { |
|
726 | + // if array has more than one element than success message should be plural |
|
727 | + $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1; |
|
728 | + // cycle thru bulk action checkboxes |
|
729 | + while (list($ID, $value) = each($this->_req_data['checkbox'])) { |
|
730 | + if (! $model->delete_or_restore_by_ID($trash, absint($ID))) { |
|
731 | + $success = 0; |
|
732 | + } |
|
733 | + } |
|
734 | + |
|
735 | + } else { |
|
736 | + // grab single id and delete |
|
737 | + $ID = absint($this->_req_data['checkbox']); |
|
738 | + if (! $model->delete_or_restore_by_ID($trash, $ID)) { |
|
739 | + $success = 0; |
|
740 | + } |
|
741 | + } |
|
742 | + |
|
743 | + } else { |
|
744 | + // delete via trash link |
|
745 | + // grab single id and delete |
|
746 | + $ID = absint($this->_req_data[$model->primary_key_name()]); |
|
747 | + if (! $model->delete_or_restore_by_ID($trash, $ID)) { |
|
748 | + $success = 0; |
|
749 | + } |
|
750 | + |
|
751 | + } |
|
752 | + |
|
753 | + |
|
754 | + $action = $model instanceof EEM_Question ? 'default' : 'question_groups';//strtolower( $model->item_name(2) ); |
|
755 | + //echo "action :$action"; |
|
756 | + //$action = 'questions' ? 'default' : $action; |
|
757 | + if ($trash) { |
|
758 | + $action_desc = 'trashed'; |
|
759 | + $status = 'trash'; |
|
760 | + } else { |
|
761 | + $action_desc = 'restored'; |
|
762 | + $status = 'all'; |
|
763 | + } |
|
764 | + $this->_redirect_after_action($success, $model->item_name($success), $action_desc, |
|
765 | + array('action' => $action, 'status' => $status)); |
|
766 | + } |
|
767 | + |
|
768 | + |
|
769 | + /** |
|
770 | + * @param $per_page |
|
771 | + * @param int $current_page |
|
772 | + * @param bool|false $count |
|
773 | + * @return \EE_Soft_Delete_Base_Class[]|int |
|
774 | + */ |
|
775 | + public function get_trashed_questions($per_page, $current_page = 1, $count = false) |
|
776 | + { |
|
777 | + $query_params = $this->get_query_params(EEM_Question::instance(), $per_page, $current_page); |
|
778 | + |
|
779 | + if ($count) { |
|
780 | + //note: this a subclass of EEM_Soft_Delete_Base, so this is actually only getting non-trashed items |
|
781 | + $where = isset($query_params[0]) ? array($query_params[0]) : array(); |
|
782 | + $results = $this->_question_model->count_deleted($where); |
|
783 | + } else { |
|
784 | + //note: this a subclass of EEM_Soft_Delete_Base, so this is actually only getting non-trashed items |
|
785 | + $results = $this->_question_model->get_all_deleted($query_params); |
|
786 | + } |
|
787 | + return $results; |
|
788 | + } |
|
789 | + |
|
790 | + |
|
791 | + /** |
|
792 | + * @param $per_page |
|
793 | + * @param int $current_page |
|
794 | + * @param bool|false $count |
|
795 | + * @return \EE_Soft_Delete_Base_Class[] |
|
796 | + */ |
|
797 | + public function get_question_groups($per_page, $current_page = 1, $count = false) |
|
798 | + { |
|
799 | + $questionGroupModel = EEM_Question_Group::instance(); |
|
800 | + $query_params = $this->get_query_params($questionGroupModel, $per_page, $current_page); |
|
801 | + if ($count) { |
|
802 | + $where = isset($query_params[0]) ? array($query_params[0]) : array(); |
|
803 | + $results = $questionGroupModel->count($where); |
|
804 | + } else { |
|
805 | + $results = $questionGroupModel->get_all($query_params); |
|
806 | + } |
|
807 | + return $results; |
|
808 | + } |
|
809 | + |
|
810 | + |
|
811 | + /** |
|
812 | + * @param $per_page |
|
813 | + * @param int $current_page |
|
814 | + * @param bool $count |
|
815 | + * @return \EE_Soft_Delete_Base_Class[]|int |
|
816 | + */ |
|
817 | + public function get_trashed_question_groups($per_page, $current_page = 1, $count = false) |
|
818 | + { |
|
819 | + $questionGroupModel = EEM_Question_Group::instance(); |
|
820 | + $query_params = $this->get_query_params($questionGroupModel, $per_page, $current_page); |
|
821 | + if ($count) { |
|
822 | + $where = isset($query_params[0]) ? array($query_params[0]) : array(); |
|
823 | + $query_params['limit'] = null; |
|
824 | + $results = $questionGroupModel->count_deleted($where); |
|
825 | + } else { |
|
826 | + $results = $questionGroupModel->get_all_deleted($query_params); |
|
827 | + } |
|
828 | + return $results; |
|
829 | + } |
|
830 | + |
|
831 | + |
|
832 | + /** |
|
833 | + * method for performing updates to question order |
|
834 | + * |
|
835 | + * @return array results array |
|
836 | + */ |
|
837 | + public function update_question_group_order() |
|
838 | + { |
|
839 | + |
|
840 | + $success = esc_html__('Question group order was updated successfully.', 'event_espresso'); |
|
841 | + |
|
842 | + // grab our row IDs |
|
843 | + $row_ids = isset($this->_req_data['row_ids']) && ! empty($this->_req_data['row_ids']) |
|
844 | + ? explode(',', rtrim($this->_req_data['row_ids'], ',')) |
|
845 | + : array(); |
|
846 | + |
|
847 | + $perpage = ! empty($this->_req_data['perpage']) |
|
848 | + ? (int)$this->_req_data['perpage'] |
|
849 | + : null; |
|
850 | + $curpage = ! empty($this->_req_data['curpage']) |
|
851 | + ? (int)$this->_req_data['curpage'] |
|
852 | + : null; |
|
853 | + |
|
854 | + if (! empty($row_ids)) { |
|
855 | + //figure out where we start the row_id count at for the current page. |
|
856 | + $qsgcount = empty($curpage) ? 0 : ($curpage - 1) * $perpage; |
|
857 | + |
|
858 | + $row_count = count($row_ids); |
|
859 | + for ($i = 0; $i < $row_count; $i++) { |
|
860 | + //Update the questions when re-ordering |
|
861 | + $updated = EEM_Question_Group::instance()->update( |
|
862 | + array('QSG_order' => $qsgcount), |
|
863 | + array(array('QSG_ID' => $row_ids[$i])) |
|
864 | + ); |
|
865 | + if ($updated === false) { |
|
866 | + $success = false; |
|
867 | + } |
|
868 | + $qsgcount++; |
|
869 | + } |
|
870 | + } else { |
|
871 | + $success = false; |
|
872 | + } |
|
873 | + |
|
874 | + $errors = ! $success |
|
875 | + ? esc_html__('An error occurred. The question group order was not updated.', 'event_espresso') |
|
876 | + : false; |
|
877 | + |
|
878 | + echo wp_json_encode(array('return_data' => false, 'success' => $success, 'errors' => $errors)); |
|
879 | + die(); |
|
880 | + |
|
881 | + } |
|
882 | + |
|
883 | + |
|
884 | + |
|
885 | + /*************************************** REGISTRATION SETTINGS ***************************************/ |
|
886 | + |
|
887 | + |
|
888 | + /** |
|
889 | + * _reg_form_settings |
|
890 | + * |
|
891 | + * @throws \EE_Error |
|
892 | + */ |
|
893 | + protected function _reg_form_settings() |
|
894 | + { |
|
895 | + $this->_template_args['values'] = $this->_yes_no_values; |
|
896 | + add_action( |
|
897 | + 'AHEE__Extend_Registration_Form_Admin_Page___reg_form_settings_template', |
|
898 | + array($this, 'email_validation_settings_form'), |
|
899 | + 2 |
|
900 | + ); |
|
901 | + $this->_template_args = (array)apply_filters( |
|
902 | + 'FHEE__Extend_Registration_Form_Admin_Page___reg_form_settings___template_args', |
|
903 | + $this->_template_args |
|
904 | + ); |
|
905 | + $this->_set_add_edit_form_tags('update_reg_form_settings'); |
|
906 | + $this->_set_publish_post_box_vars(null, false, false, null, false); |
|
907 | + $this->_template_args['admin_page_content'] = EEH_Template::display_template( |
|
908 | + REGISTRATION_FORM_CAF_TEMPLATE_PATH . 'reg_form_settings.template.php', |
|
909 | + $this->_template_args, |
|
910 | + true |
|
911 | + ); |
|
912 | + $this->display_admin_page_with_sidebar(); |
|
913 | + } |
|
914 | + |
|
915 | + |
|
916 | + /** |
|
917 | + * _update_reg_form_settings |
|
918 | + */ |
|
919 | + protected function _update_reg_form_settings() |
|
920 | + { |
|
921 | + EE_Registry::instance()->CFG->registration = $this->update_email_validation_settings_form( |
|
922 | + EE_Registry::instance()->CFG->registration |
|
923 | + ); |
|
924 | + EE_Registry::instance()->CFG->registration = apply_filters( |
|
925 | + 'FHEE__Extend_Registration_Form_Admin_Page___update_reg_form_settings__CFG_registration', |
|
926 | + EE_Registry::instance()->CFG->registration |
|
927 | + ); |
|
928 | + $success = $this->_update_espresso_configuration( |
|
929 | + esc_html__('Registration Form Options', 'event_espresso'), |
|
930 | + EE_Registry::instance()->CFG, |
|
931 | + __FILE__, __FUNCTION__, __LINE__ |
|
932 | + ); |
|
933 | + $this->_redirect_after_action($success, esc_html__('Registration Form Options', 'event_espresso'), 'updated', |
|
934 | + array('action' => 'view_reg_form_settings')); |
|
935 | + } |
|
936 | + |
|
937 | + |
|
938 | + /** |
|
939 | + * email_validation_settings_form |
|
940 | + * |
|
941 | + * @access public |
|
942 | + * @return void |
|
943 | + * @throws \EE_Error |
|
944 | + */ |
|
945 | + public function email_validation_settings_form() |
|
946 | + { |
|
947 | + echo $this->_email_validation_settings_form()->get_html(); |
|
948 | + } |
|
949 | + |
|
950 | + |
|
951 | + /** |
|
952 | + * _email_validation_settings_form |
|
953 | + * |
|
954 | + * @access protected |
|
955 | + * @return EE_Form_Section_Proper |
|
956 | + * @throws \EE_Error |
|
957 | + */ |
|
958 | + protected function _email_validation_settings_form() |
|
959 | + { |
|
960 | + return new EE_Form_Section_Proper( |
|
961 | + array( |
|
962 | + 'name' => 'email_validation_settings', |
|
963 | + 'html_id' => 'email_validation_settings', |
|
964 | + 'layout_strategy' => new EE_Admin_Two_Column_Layout(), |
|
965 | + 'subsections' => array( |
|
966 | + 'email_validation_hdr' => new EE_Form_Section_HTML( |
|
967 | + EEH_HTML::h2(esc_html__('Email Validation Settings', 'event_espresso')) |
|
968 | + ), |
|
969 | + 'email_validation_level' => new EE_Select_Input( |
|
970 | + array( |
|
971 | + 'basic' => esc_html__('Basic', 'event_espresso'), |
|
972 | + 'wp_default' => esc_html__('WordPress Default', 'event_espresso'), |
|
973 | + 'i18n' => esc_html__('International', 'event_espresso'), |
|
974 | + 'i18n_dns' => esc_html__('International + DNS Check', 'event_espresso'), |
|
975 | + ), |
|
976 | + array( |
|
977 | + 'html_label_text' => esc_html__('Email Validation Level', 'event_espresso') |
|
978 | + . EEH_Template::get_help_tab_link('email_validation_info'), |
|
979 | + 'html_help_text' => esc_html__('These levels range from basic validation ( ie: [email protected] ) to more advanced checks against international email addresses (ie: üñîçøðé@example.com ) with additional MX and A record checks to confirm the domain actually exists. More information on on each level can be found within the help section.', |
|
980 | + 'event_espresso'), |
|
981 | + 'default' => isset(EE_Registry::instance()->CFG->registration->email_validation_level) |
|
982 | + ? EE_Registry::instance()->CFG->registration->email_validation_level |
|
983 | + : 'wp_default', |
|
984 | + 'required' => false, |
|
985 | + ) |
|
986 | + ), |
|
987 | + ), |
|
988 | + ) |
|
989 | + ); |
|
990 | + } |
|
991 | + |
|
992 | + |
|
993 | + /** |
|
994 | + * update_email_validation_settings_form |
|
995 | + * |
|
996 | + * @access public |
|
997 | + * @param \EE_Registration_Config $EE_Registration_Config |
|
998 | + * @return \EE_Registration_Config |
|
999 | + */ |
|
1000 | + public function update_email_validation_settings_form(EE_Registration_Config $EE_Registration_Config) |
|
1001 | + { |
|
1002 | + $prev_email_validation_level = $EE_Registration_Config->email_validation_level; |
|
1003 | + try { |
|
1004 | + $email_validation_settings_form = $this->_email_validation_settings_form(); |
|
1005 | + // if not displaying a form, then check for form submission |
|
1006 | + if ($email_validation_settings_form->was_submitted()) { |
|
1007 | + // capture form data |
|
1008 | + $email_validation_settings_form->receive_form_submission(); |
|
1009 | + // validate form data |
|
1010 | + if ($email_validation_settings_form->is_valid()) { |
|
1011 | + // grab validated data from form |
|
1012 | + $valid_data = $email_validation_settings_form->valid_data(); |
|
1013 | + if (isset($valid_data['email_validation_level'])) { |
|
1014 | + $email_validation_level = $valid_data['email_validation_level']; |
|
1015 | + // now if they want to use international email addresses |
|
1016 | + if ($email_validation_level === 'i18n' || $email_validation_level === 'i18n_dns') { |
|
1017 | + // in case we need to reset their email validation level, |
|
1018 | + // make sure that the previous value wasn't already set to one of the i18n options. |
|
1019 | + if ($prev_email_validation_level === 'i18n' || $prev_email_validation_level === 'i18n_dns') { |
|
1020 | + // if so, then reset it back to "basic" since that is the only other option that, |
|
1021 | + // despite offering poor validation, supports i18n email addresses |
|
1022 | + $prev_email_validation_level = 'basic'; |
|
1023 | + } |
|
1024 | + // confirm our i18n email validation will work on the server |
|
1025 | + if (! $this->_verify_pcre_support($EE_Registration_Config, $email_validation_level)) { |
|
1026 | + // or reset email validation level to previous value |
|
1027 | + $email_validation_level = $prev_email_validation_level; |
|
1028 | + } |
|
1029 | + } |
|
1030 | + $EE_Registration_Config->email_validation_level = $email_validation_level; |
|
1031 | + } else { |
|
1032 | + EE_Error::add_error( |
|
1033 | + esc_html__( |
|
1034 | + 'Invalid or missing Email Validation settings. Please refresh the form and try again.', |
|
1035 | + 'event_espresso' |
|
1036 | + ), |
|
1037 | + __FILE__, __FUNCTION__, __LINE__ |
|
1038 | + ); |
|
1039 | + } |
|
1040 | + } else { |
|
1041 | + if ($email_validation_settings_form->submission_error_message() !== '') { |
|
1042 | + EE_Error::add_error( |
|
1043 | + $email_validation_settings_form->submission_error_message(), |
|
1044 | + __FILE__, __FUNCTION__, __LINE__ |
|
1045 | + ); |
|
1046 | + } |
|
1047 | + } |
|
1048 | + } |
|
1049 | + } catch (EE_Error $e) { |
|
1050 | + $e->get_error(); |
|
1051 | + } |
|
1052 | + return $EE_Registration_Config; |
|
1053 | + } |
|
1054 | + |
|
1055 | + |
|
1056 | + /** |
|
1057 | + * confirms that the server's PHP version has the PCRE module enabled, |
|
1058 | + * and that the PCRE version works with our i18n email validation |
|
1059 | + * |
|
1060 | + * @param \EE_Registration_Config $EE_Registration_Config |
|
1061 | + * @param string $email_validation_level |
|
1062 | + * @return bool |
|
1063 | + */ |
|
1064 | + private function _verify_pcre_support(EE_Registration_Config $EE_Registration_Config, $email_validation_level) |
|
1065 | + { |
|
1066 | + // first check that PCRE is enabled |
|
1067 | + if (! defined('PREG_BAD_UTF8_ERROR')) { |
|
1068 | + EE_Error::add_error( |
|
1069 | + sprintf( |
|
1070 | + esc_html__( |
|
1071 | + 'We\'re sorry, but it appears that your server\'s version of PHP was not compiled with PCRE unicode support.%1$sPlease contact your hosting company and ask them whether the PCRE compiled with your version of PHP on your server can be been built with the "--enable-unicode-properties" and "--enable-utf8" configuration switches to enable more complex regex expressions.%1$sIf they are unable, or unwilling to do so, then your server will not support international email addresses using UTF-8 unicode characters. This means you will either have to lower your email validation level to "Basic" or "WordPress Default", or switch to a hosting company that has/can enable PCRE unicode support on the server.', |
|
1072 | + 'event_espresso' |
|
1073 | + ), |
|
1074 | + '<br />' |
|
1075 | + ), |
|
1076 | + __FILE__, |
|
1077 | + __FUNCTION__, |
|
1078 | + __LINE__ |
|
1079 | + ); |
|
1080 | + return false; |
|
1081 | + } else { |
|
1082 | + // PCRE support is enabled, but let's still |
|
1083 | + // perform a test to see if the server will support it. |
|
1084 | + // but first, save the updated validation level to the config, |
|
1085 | + // so that the validation strategy picks it up. |
|
1086 | + // this will get bumped back down if it doesn't work |
|
1087 | + $EE_Registration_Config->email_validation_level = $email_validation_level; |
|
1088 | + try { |
|
1089 | + $email_validator = new EE_Email_Validation_Strategy(); |
|
1090 | + $i18n_email_address = apply_filters( |
|
1091 | + 'FHEE__Extend_Registration_Form_Admin_Page__update_email_validation_settings_form__i18n_email_address', |
|
1092 | + 'jägerjü[email protected]' |
|
1093 | + ); |
|
1094 | + $email_validator->validate($i18n_email_address); |
|
1095 | + } catch (Exception $e) { |
|
1096 | + EE_Error::add_error( |
|
1097 | + sprintf( |
|
1098 | + esc_html__( |
|
1099 | + 'We\'re sorry, but it appears that your server\'s configuration will not support the "International" or "International + DNS Check" email validation levels.%1$sTo correct this issue, please consult with your hosting company regarding your server\'s PCRE settings.%1$sIt is recommended that your PHP version be configured to use PCRE 8.10 or newer.%1$sMore information regarding PCRE versions and installation can be found here: %2$s', |
|
1100 | + 'event_espresso' |
|
1101 | + ), |
|
1102 | + '<br />', |
|
1103 | + '<a href="http://php.net/manual/en/pcre.installation.php" target="_blank">http://php.net/manual/en/pcre.installation.php</a>' |
|
1104 | + ), |
|
1105 | + __FILE__, __FUNCTION__, __LINE__ |
|
1106 | + ); |
|
1107 | + return false; |
|
1108 | + } |
|
1109 | + } |
|
1110 | + return true; |
|
1111 | + } |
|
1112 | 1112 | |
1113 | 1113 | |
1114 | 1114 | } |
@@ -1,5 +1,5 @@ discard block |
||
1 | 1 | <?php |
2 | -if (! defined('EVENT_ESPRESSO_VERSION')) { |
|
2 | +if ( ! defined('EVENT_ESPRESSO_VERSION')) { |
|
3 | 3 | exit('NO direct script access allowed'); |
4 | 4 | } |
5 | 5 | |
@@ -32,11 +32,11 @@ discard block |
||
32 | 32 | */ |
33 | 33 | public function __construct($routing = true) |
34 | 34 | { |
35 | - define('REGISTRATION_FORM_CAF_ADMIN', EE_CORE_CAF_ADMIN_EXTEND . 'registration_form' . DS); |
|
36 | - define('REGISTRATION_FORM_CAF_ASSETS_PATH', REGISTRATION_FORM_CAF_ADMIN . 'assets' . DS); |
|
37 | - define('REGISTRATION_FORM_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'registration_form/assets/'); |
|
38 | - define('REGISTRATION_FORM_CAF_TEMPLATE_PATH', REGISTRATION_FORM_CAF_ADMIN . 'templates' . DS); |
|
39 | - define('REGISTRATION_FORM_CAF_TEMPLATE_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'registration_form/templates/'); |
|
35 | + define('REGISTRATION_FORM_CAF_ADMIN', EE_CORE_CAF_ADMIN_EXTEND.'registration_form'.DS); |
|
36 | + define('REGISTRATION_FORM_CAF_ASSETS_PATH', REGISTRATION_FORM_CAF_ADMIN.'assets'.DS); |
|
37 | + define('REGISTRATION_FORM_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL.'registration_form/assets/'); |
|
38 | + define('REGISTRATION_FORM_CAF_TEMPLATE_PATH', REGISTRATION_FORM_CAF_ADMIN.'templates'.DS); |
|
39 | + define('REGISTRATION_FORM_CAF_TEMPLATE_URL', EE_CORE_CAF_ADMIN_EXTEND_URL.'registration_form/templates/'); |
|
40 | 40 | parent::__construct($routing); |
41 | 41 | } |
42 | 42 | |
@@ -47,7 +47,7 @@ discard block |
||
47 | 47 | $qst_id = ! empty($this->_req_data['QST_ID']) && ! is_array($this->_req_data['QST_ID']) ? $this->_req_data['QST_ID'] : 0; |
48 | 48 | $qsg_id = ! empty($this->_req_data['QSG_ID']) && ! is_array($this->_req_data['QSG_ID']) ? $this->_req_data['QSG_ID'] : 0; |
49 | 49 | |
50 | - $new_page_routes = array( |
|
50 | + $new_page_routes = array( |
|
51 | 51 | 'question_groups' => array( |
52 | 52 | 'func' => '_question_groups_overview_list_table', |
53 | 53 | 'capability' => 'ee_read_question_groups', |
@@ -310,7 +310,7 @@ discard block |
||
310 | 310 | |
311 | 311 | |
312 | 312 | //additional labels |
313 | - $new_labels = array( |
|
313 | + $new_labels = array( |
|
314 | 314 | 'add_question' => esc_html__('Add New Question', 'event_espresso'), |
315 | 315 | 'delete_question' => esc_html__('Delete Question', 'event_espresso'), |
316 | 316 | 'add_question_group' => esc_html__('Add New Question Group', 'event_espresso'), |
@@ -354,7 +354,7 @@ discard block |
||
354 | 354 | */ |
355 | 355 | public function load_sortable_question_script() |
356 | 356 | { |
357 | - wp_register_script('ee-question-sortable', REGISTRATION_FORM_CAF_ASSETS_URL . 'ee_question_order.js', |
|
357 | + wp_register_script('ee-question-sortable', REGISTRATION_FORM_CAF_ASSETS_URL.'ee_question_order.js', |
|
358 | 358 | array('jquery-ui-sortable'), EVENT_ESPRESSO_VERSION, true); |
359 | 359 | wp_enqueue_script('ee-question-sortable'); |
360 | 360 | } |
@@ -420,7 +420,7 @@ discard block |
||
420 | 420 | |
421 | 421 | protected function _questions_overview_list_table() |
422 | 422 | { |
423 | - $this->_admin_page_title .= ' ' . $this->get_action_link_or_button( |
|
423 | + $this->_admin_page_title .= ' '.$this->get_action_link_or_button( |
|
424 | 424 | 'add_question', |
425 | 425 | 'add_question', |
426 | 426 | array(), |
@@ -433,7 +433,7 @@ discard block |
||
433 | 433 | protected function _question_groups_overview_list_table() |
434 | 434 | { |
435 | 435 | $this->_search_btn_label = esc_html__('Question Groups', 'event_espresso'); |
436 | - $this->_admin_page_title .= ' ' . $this->get_action_link_or_button( |
|
436 | + $this->_admin_page_title .= ' '.$this->get_action_link_or_button( |
|
437 | 437 | 'add_question_group', |
438 | 438 | 'add_question_group', |
439 | 439 | array(), |
@@ -477,20 +477,20 @@ discard block |
||
477 | 477 | { |
478 | 478 | $success = 0; |
479 | 479 | do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
480 | - if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) { |
|
480 | + if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) { |
|
481 | 481 | // if array has more than one element than success message should be plural |
482 | 482 | $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1; |
483 | 483 | // cycle thru bulk action checkboxes |
484 | 484 | while (list($ID, $value) = each($this->_req_data['checkbox'])) { |
485 | - if (! $this->_delete_item($ID, $model)) { |
|
485 | + if ( ! $this->_delete_item($ID, $model)) { |
|
486 | 486 | $success = 0; |
487 | 487 | } |
488 | 488 | } |
489 | 489 | |
490 | - } elseif (! empty($this->_req_data['QSG_ID'])) { |
|
490 | + } elseif ( ! empty($this->_req_data['QSG_ID'])) { |
|
491 | 491 | $success = $this->_delete_item($this->_req_data['QSG_ID'], $model); |
492 | 492 | |
493 | - } elseif (! empty($this->_req_data['QST_ID'])) { |
|
493 | + } elseif ( ! empty($this->_req_data['QST_ID'])) { |
|
494 | 494 | $success = $this->_delete_item($this->_req_data['QST_ID'], $model); |
495 | 495 | } else { |
496 | 496 | EE_Error::add_error(sprintf(esc_html__("No Questions or Question Groups were selected for deleting. This error usually shows when you've attempted to delete via bulk action but there were no selections.", |
@@ -534,7 +534,7 @@ discard block |
||
534 | 534 | $this->_admin_page_title = ucwords(str_replace('_', ' ', $this->_req_action)); |
535 | 535 | } |
536 | 536 | // add ID to title if editing |
537 | - $this->_admin_page_title = $ID ? $this->_admin_page_title . ' # ' . $ID : $this->_admin_page_title; |
|
537 | + $this->_admin_page_title = $ID ? $this->_admin_page_title.' # '.$ID : $this->_admin_page_title; |
|
538 | 538 | if ($ID) { |
539 | 539 | /** @var EE_Question_Group $questionGroup */ |
540 | 540 | $questionGroup = $this->_question_group_model->get_one_by_ID($ID); |
@@ -553,7 +553,7 @@ discard block |
||
553 | 553 | |
554 | 554 | $redirect_URL = add_query_arg(array('action' => 'question_groups'), $this->_admin_base_url); |
555 | 555 | $this->_set_publish_post_box_vars('id', $ID, false, $redirect_URL); |
556 | - $this->_template_args['admin_page_content'] = EEH_Template::display_template(REGISTRATION_FORM_CAF_TEMPLATE_PATH . 'question_groups_main_meta_box.template.php', |
|
556 | + $this->_template_args['admin_page_content'] = EEH_Template::display_template(REGISTRATION_FORM_CAF_TEMPLATE_PATH.'question_groups_main_meta_box.template.php', |
|
557 | 557 | $this->_template_args, true); |
558 | 558 | |
559 | 559 | // the details template wrapper |
@@ -600,13 +600,13 @@ discard block |
||
600 | 600 | $question_group = $this->_question_group_model->get_one_by_ID($QSG_ID); |
601 | 601 | $questions = $question_group->questions(); |
602 | 602 | // make sure system phone question is added to list of questions for this group |
603 | - if (! isset($questions[$phone_question_id])) { |
|
603 | + if ( ! isset($questions[$phone_question_id])) { |
|
604 | 604 | $questions[$phone_question_id] = EEM_Question::instance()->get_one_by_ID($phone_question_id); |
605 | 605 | } |
606 | 606 | |
607 | 607 | foreach ($questions as $question_ID => $question) { |
608 | 608 | // first we always check for order. |
609 | - if (! empty($this->_req_data['question_orders'][$question_ID])) { |
|
609 | + if ( ! empty($this->_req_data['question_orders'][$question_ID])) { |
|
610 | 610 | //update question order |
611 | 611 | $question_group->update_question_order($question_ID, $this->_req_data['question_orders'][$question_ID]); |
612 | 612 | } |
@@ -654,7 +654,7 @@ discard block |
||
654 | 654 | */ |
655 | 655 | public function _duplicate_question() |
656 | 656 | { |
657 | - $question_ID = (int)$this->_req_data['QST_ID']; |
|
657 | + $question_ID = (int) $this->_req_data['QST_ID']; |
|
658 | 658 | $question = EEM_Question::instance()->get_one_by_ID($question_ID); |
659 | 659 | if ($question instanceof EE_Question) { |
660 | 660 | $new_question = $question->duplicate(); |
@@ -690,7 +690,7 @@ discard block |
||
690 | 690 | */ |
691 | 691 | protected function _trash_question() |
692 | 692 | { |
693 | - $success = $this->_question_model->delete_by_ID((int)$this->_req_data['QST_ID']); |
|
693 | + $success = $this->_question_model->delete_by_ID((int) $this->_req_data['QST_ID']); |
|
694 | 694 | $query_args = array('action' => 'default', 'status' => 'all'); |
695 | 695 | $this->_redirect_after_action($success, $this->_question_model->item_name($success), 'trashed', $query_args); |
696 | 696 | } |
@@ -722,12 +722,12 @@ discard block |
||
722 | 722 | //echo "trash $trash"; |
723 | 723 | //var_dump($this->_req_data['checkbox']);die; |
724 | 724 | if (isset($this->_req_data['checkbox'])) { |
725 | - if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) { |
|
725 | + if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) { |
|
726 | 726 | // if array has more than one element than success message should be plural |
727 | 727 | $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1; |
728 | 728 | // cycle thru bulk action checkboxes |
729 | 729 | while (list($ID, $value) = each($this->_req_data['checkbox'])) { |
730 | - if (! $model->delete_or_restore_by_ID($trash, absint($ID))) { |
|
730 | + if ( ! $model->delete_or_restore_by_ID($trash, absint($ID))) { |
|
731 | 731 | $success = 0; |
732 | 732 | } |
733 | 733 | } |
@@ -735,7 +735,7 @@ discard block |
||
735 | 735 | } else { |
736 | 736 | // grab single id and delete |
737 | 737 | $ID = absint($this->_req_data['checkbox']); |
738 | - if (! $model->delete_or_restore_by_ID($trash, $ID)) { |
|
738 | + if ( ! $model->delete_or_restore_by_ID($trash, $ID)) { |
|
739 | 739 | $success = 0; |
740 | 740 | } |
741 | 741 | } |
@@ -744,14 +744,14 @@ discard block |
||
744 | 744 | // delete via trash link |
745 | 745 | // grab single id and delete |
746 | 746 | $ID = absint($this->_req_data[$model->primary_key_name()]); |
747 | - if (! $model->delete_or_restore_by_ID($trash, $ID)) { |
|
747 | + if ( ! $model->delete_or_restore_by_ID($trash, $ID)) { |
|
748 | 748 | $success = 0; |
749 | 749 | } |
750 | 750 | |
751 | 751 | } |
752 | 752 | |
753 | 753 | |
754 | - $action = $model instanceof EEM_Question ? 'default' : 'question_groups';//strtolower( $model->item_name(2) ); |
|
754 | + $action = $model instanceof EEM_Question ? 'default' : 'question_groups'; //strtolower( $model->item_name(2) ); |
|
755 | 755 | //echo "action :$action"; |
756 | 756 | //$action = 'questions' ? 'default' : $action; |
757 | 757 | if ($trash) { |
@@ -845,13 +845,13 @@ discard block |
||
845 | 845 | : array(); |
846 | 846 | |
847 | 847 | $perpage = ! empty($this->_req_data['perpage']) |
848 | - ? (int)$this->_req_data['perpage'] |
|
848 | + ? (int) $this->_req_data['perpage'] |
|
849 | 849 | : null; |
850 | 850 | $curpage = ! empty($this->_req_data['curpage']) |
851 | - ? (int)$this->_req_data['curpage'] |
|
851 | + ? (int) $this->_req_data['curpage'] |
|
852 | 852 | : null; |
853 | 853 | |
854 | - if (! empty($row_ids)) { |
|
854 | + if ( ! empty($row_ids)) { |
|
855 | 855 | //figure out where we start the row_id count at for the current page. |
856 | 856 | $qsgcount = empty($curpage) ? 0 : ($curpage - 1) * $perpage; |
857 | 857 | |
@@ -898,14 +898,14 @@ discard block |
||
898 | 898 | array($this, 'email_validation_settings_form'), |
899 | 899 | 2 |
900 | 900 | ); |
901 | - $this->_template_args = (array)apply_filters( |
|
901 | + $this->_template_args = (array) apply_filters( |
|
902 | 902 | 'FHEE__Extend_Registration_Form_Admin_Page___reg_form_settings___template_args', |
903 | 903 | $this->_template_args |
904 | 904 | ); |
905 | 905 | $this->_set_add_edit_form_tags('update_reg_form_settings'); |
906 | 906 | $this->_set_publish_post_box_vars(null, false, false, null, false); |
907 | 907 | $this->_template_args['admin_page_content'] = EEH_Template::display_template( |
908 | - REGISTRATION_FORM_CAF_TEMPLATE_PATH . 'reg_form_settings.template.php', |
|
908 | + REGISTRATION_FORM_CAF_TEMPLATE_PATH.'reg_form_settings.template.php', |
|
909 | 909 | $this->_template_args, |
910 | 910 | true |
911 | 911 | ); |
@@ -925,7 +925,7 @@ discard block |
||
925 | 925 | 'FHEE__Extend_Registration_Form_Admin_Page___update_reg_form_settings__CFG_registration', |
926 | 926 | EE_Registry::instance()->CFG->registration |
927 | 927 | ); |
928 | - $success = $this->_update_espresso_configuration( |
|
928 | + $success = $this->_update_espresso_configuration( |
|
929 | 929 | esc_html__('Registration Form Options', 'event_espresso'), |
930 | 930 | EE_Registry::instance()->CFG, |
931 | 931 | __FILE__, __FUNCTION__, __LINE__ |
@@ -1022,7 +1022,7 @@ discard block |
||
1022 | 1022 | $prev_email_validation_level = 'basic'; |
1023 | 1023 | } |
1024 | 1024 | // confirm our i18n email validation will work on the server |
1025 | - if (! $this->_verify_pcre_support($EE_Registration_Config, $email_validation_level)) { |
|
1025 | + if ( ! $this->_verify_pcre_support($EE_Registration_Config, $email_validation_level)) { |
|
1026 | 1026 | // or reset email validation level to previous value |
1027 | 1027 | $email_validation_level = $prev_email_validation_level; |
1028 | 1028 | } |
@@ -1064,7 +1064,7 @@ discard block |
||
1064 | 1064 | private function _verify_pcre_support(EE_Registration_Config $EE_Registration_Config, $email_validation_level) |
1065 | 1065 | { |
1066 | 1066 | // first check that PCRE is enabled |
1067 | - if (! defined('PREG_BAD_UTF8_ERROR')) { |
|
1067 | + if ( ! defined('PREG_BAD_UTF8_ERROR')) { |
|
1068 | 1068 | EE_Error::add_error( |
1069 | 1069 | sprintf( |
1070 | 1070 | esc_html__( |
@@ -1,5 +1,5 @@ discard block |
||
1 | 1 | <?php if ( ! defined('EVENT_ESPRESSO_VERSION')) { |
2 | - exit('No direct script access allowed'); |
|
2 | + exit('No direct script access allowed'); |
|
3 | 3 | } |
4 | 4 | require_once(EE_MODELS . 'EEM_Base.model.php'); |
5 | 5 | |
@@ -15,192 +15,192 @@ discard block |
||
15 | 15 | class EEM_Transaction extends EEM_Base |
16 | 16 | { |
17 | 17 | |
18 | - // private instance of the Transaction object |
|
19 | - protected static $_instance; |
|
18 | + // private instance of the Transaction object |
|
19 | + protected static $_instance; |
|
20 | 20 | |
21 | - /** |
|
22 | - * Status ID(STS_ID on esp_status table) to indicate the transaction is complete, |
|
23 | - * but payment is pending. This is the state for transactions where payment is promised |
|
24 | - * from an offline gateway. |
|
25 | - */ |
|
26 | - // const open_status_code = 'TPN'; |
|
21 | + /** |
|
22 | + * Status ID(STS_ID on esp_status table) to indicate the transaction is complete, |
|
23 | + * but payment is pending. This is the state for transactions where payment is promised |
|
24 | + * from an offline gateway. |
|
25 | + */ |
|
26 | + // const open_status_code = 'TPN'; |
|
27 | 27 | |
28 | - /** |
|
29 | - * Status ID(STS_ID on esp_status table) to indicate the transaction failed, |
|
30 | - * either due to a technical reason (server or computer crash during registration), |
|
31 | - * or some other reason that prevent the collection of any useful contact information from any of the registrants |
|
32 | - */ |
|
33 | - const failed_status_code = 'TFL'; |
|
28 | + /** |
|
29 | + * Status ID(STS_ID on esp_status table) to indicate the transaction failed, |
|
30 | + * either due to a technical reason (server or computer crash during registration), |
|
31 | + * or some other reason that prevent the collection of any useful contact information from any of the registrants |
|
32 | + */ |
|
33 | + const failed_status_code = 'TFL'; |
|
34 | 34 | |
35 | - /** |
|
36 | - * Status ID(STS_ID on esp_status table) to indicate the transaction was abandoned, |
|
37 | - * either due to a technical reason (server or computer crash during registration), |
|
38 | - * or due to an abandoned cart after registrant chose not to complete the registration process |
|
39 | - * HOWEVER... |
|
40 | - * an abandoned TXN differs from a failed TXN in that it was able to capture contact information for at least one |
|
41 | - * registrant |
|
42 | - */ |
|
43 | - const abandoned_status_code = 'TAB'; |
|
35 | + /** |
|
36 | + * Status ID(STS_ID on esp_status table) to indicate the transaction was abandoned, |
|
37 | + * either due to a technical reason (server or computer crash during registration), |
|
38 | + * or due to an abandoned cart after registrant chose not to complete the registration process |
|
39 | + * HOWEVER... |
|
40 | + * an abandoned TXN differs from a failed TXN in that it was able to capture contact information for at least one |
|
41 | + * registrant |
|
42 | + */ |
|
43 | + const abandoned_status_code = 'TAB'; |
|
44 | 44 | |
45 | - /** |
|
46 | - * Status ID(STS_ID on esp_status table) to indicate an incomplete transaction, |
|
47 | - * meaning that monies are still owing: TXN_paid < TXN_total |
|
48 | - */ |
|
49 | - const incomplete_status_code = 'TIN'; |
|
45 | + /** |
|
46 | + * Status ID(STS_ID on esp_status table) to indicate an incomplete transaction, |
|
47 | + * meaning that monies are still owing: TXN_paid < TXN_total |
|
48 | + */ |
|
49 | + const incomplete_status_code = 'TIN'; |
|
50 | 50 | |
51 | - /** |
|
52 | - * Status ID (STS_ID on esp_status table) to indicate a complete transaction. |
|
53 | - * meaning that NO monies are owing: TXN_paid == TXN_total |
|
54 | - */ |
|
55 | - const complete_status_code = 'TCM'; |
|
51 | + /** |
|
52 | + * Status ID (STS_ID on esp_status table) to indicate a complete transaction. |
|
53 | + * meaning that NO monies are owing: TXN_paid == TXN_total |
|
54 | + */ |
|
55 | + const complete_status_code = 'TCM'; |
|
56 | 56 | |
57 | - /** |
|
58 | - * Status ID(STS_ID on esp_status table) to indicate the transaction is overpaid. |
|
59 | - * This is the same as complete, but site admins actually owe clients the moneys! TXN_paid > TXN_total |
|
60 | - */ |
|
61 | - const overpaid_status_code = 'TOP'; |
|
57 | + /** |
|
58 | + * Status ID(STS_ID on esp_status table) to indicate the transaction is overpaid. |
|
59 | + * This is the same as complete, but site admins actually owe clients the moneys! TXN_paid > TXN_total |
|
60 | + */ |
|
61 | + const overpaid_status_code = 'TOP'; |
|
62 | 62 | |
63 | 63 | |
64 | - /** |
|
65 | - * private constructor to prevent direct creation |
|
66 | - * |
|
67 | - * @Constructor |
|
68 | - * @access protected |
|
69 | - * |
|
70 | - * @param string $timezone string representing the timezone we want to set for returned Date Time Strings (and any |
|
71 | - * incoming timezone data that gets saved). Note this just sends the timezone info to the |
|
72 | - * date time model field objects. Default is NULL (and will be assumed using the set |
|
73 | - * timezone in the 'timezone_string' wp option) |
|
74 | - * |
|
75 | - * @return EEM_Transaction |
|
76 | - * @throws \EE_Error |
|
77 | - */ |
|
78 | - protected function __construct($timezone) |
|
79 | - { |
|
80 | - $this->singular_item = __('Transaction', 'event_espresso'); |
|
81 | - $this->plural_item = __('Transactions', 'event_espresso'); |
|
64 | + /** |
|
65 | + * private constructor to prevent direct creation |
|
66 | + * |
|
67 | + * @Constructor |
|
68 | + * @access protected |
|
69 | + * |
|
70 | + * @param string $timezone string representing the timezone we want to set for returned Date Time Strings (and any |
|
71 | + * incoming timezone data that gets saved). Note this just sends the timezone info to the |
|
72 | + * date time model field objects. Default is NULL (and will be assumed using the set |
|
73 | + * timezone in the 'timezone_string' wp option) |
|
74 | + * |
|
75 | + * @return EEM_Transaction |
|
76 | + * @throws \EE_Error |
|
77 | + */ |
|
78 | + protected function __construct($timezone) |
|
79 | + { |
|
80 | + $this->singular_item = __('Transaction', 'event_espresso'); |
|
81 | + $this->plural_item = __('Transactions', 'event_espresso'); |
|
82 | 82 | |
83 | - $this->_tables = array( |
|
84 | - 'TransactionTable' => new EE_Primary_Table('esp_transaction', 'TXN_ID') |
|
85 | - ); |
|
86 | - $this->_fields = array( |
|
87 | - 'TransactionTable' => array( |
|
88 | - 'TXN_ID' => new EE_Primary_Key_Int_Field('TXN_ID', __('Transaction ID', 'event_espresso')), |
|
89 | - 'TXN_timestamp' => new EE_Datetime_Field('TXN_timestamp', |
|
90 | - __('date when transaction was created', 'event_espresso'), false, EE_Datetime_Field::now, |
|
91 | - $timezone), |
|
92 | - 'TXN_total' => new EE_Money_Field('TXN_total', |
|
93 | - __('Total value of Transaction', 'event_espresso'), false, 0), |
|
94 | - 'TXN_paid' => new EE_Money_Field('TXN_paid', |
|
95 | - __('Amount paid towards transaction to date', 'event_espresso'), false, 0), |
|
96 | - 'STS_ID' => new EE_Foreign_Key_String_Field('STS_ID', __('Status ID', 'event_espresso'), |
|
97 | - false, EEM_Transaction::failed_status_code, 'Status'), |
|
98 | - 'TXN_session_data' => new EE_Serialized_Text_Field('TXN_session_data', |
|
99 | - __('Serialized session data', 'event_espresso'), true, ''), |
|
100 | - 'TXN_hash_salt' => new EE_Plain_Text_Field('TXN_hash_salt', |
|
101 | - __('Transaction Hash Salt', 'event_espresso'), true, ''), |
|
102 | - 'PMD_ID' => new EE_Foreign_Key_Int_Field('PMD_ID', |
|
103 | - __("Last Used Payment Method", 'event_espresso'), true, null, 'Payment_Method'), |
|
104 | - 'TXN_reg_steps' => new EE_Serialized_Text_Field('TXN_reg_steps', |
|
105 | - __('Registration Steps', 'event_espresso'), false, array()), |
|
106 | - ) |
|
107 | - ); |
|
108 | - $this->_model_relations = array( |
|
109 | - 'Registration' => new EE_Has_Many_Relation(), |
|
110 | - 'Payment' => new EE_Has_Many_Relation(), |
|
111 | - 'Status' => new EE_Belongs_To_Relation(), |
|
112 | - 'Line_Item' => new EE_Has_Many_Relation(false), |
|
113 | - //you can delete a transaction without needing to delete its line items |
|
114 | - 'Payment_Method' => new EE_Belongs_To_Relation(), |
|
115 | - 'Message' => new EE_Has_Many_Relation() |
|
116 | - ); |
|
117 | - $this->_model_chain_to_wp_user = 'Registration.Event'; |
|
118 | - parent::__construct($timezone); |
|
83 | + $this->_tables = array( |
|
84 | + 'TransactionTable' => new EE_Primary_Table('esp_transaction', 'TXN_ID') |
|
85 | + ); |
|
86 | + $this->_fields = array( |
|
87 | + 'TransactionTable' => array( |
|
88 | + 'TXN_ID' => new EE_Primary_Key_Int_Field('TXN_ID', __('Transaction ID', 'event_espresso')), |
|
89 | + 'TXN_timestamp' => new EE_Datetime_Field('TXN_timestamp', |
|
90 | + __('date when transaction was created', 'event_espresso'), false, EE_Datetime_Field::now, |
|
91 | + $timezone), |
|
92 | + 'TXN_total' => new EE_Money_Field('TXN_total', |
|
93 | + __('Total value of Transaction', 'event_espresso'), false, 0), |
|
94 | + 'TXN_paid' => new EE_Money_Field('TXN_paid', |
|
95 | + __('Amount paid towards transaction to date', 'event_espresso'), false, 0), |
|
96 | + 'STS_ID' => new EE_Foreign_Key_String_Field('STS_ID', __('Status ID', 'event_espresso'), |
|
97 | + false, EEM_Transaction::failed_status_code, 'Status'), |
|
98 | + 'TXN_session_data' => new EE_Serialized_Text_Field('TXN_session_data', |
|
99 | + __('Serialized session data', 'event_espresso'), true, ''), |
|
100 | + 'TXN_hash_salt' => new EE_Plain_Text_Field('TXN_hash_salt', |
|
101 | + __('Transaction Hash Salt', 'event_espresso'), true, ''), |
|
102 | + 'PMD_ID' => new EE_Foreign_Key_Int_Field('PMD_ID', |
|
103 | + __("Last Used Payment Method", 'event_espresso'), true, null, 'Payment_Method'), |
|
104 | + 'TXN_reg_steps' => new EE_Serialized_Text_Field('TXN_reg_steps', |
|
105 | + __('Registration Steps', 'event_espresso'), false, array()), |
|
106 | + ) |
|
107 | + ); |
|
108 | + $this->_model_relations = array( |
|
109 | + 'Registration' => new EE_Has_Many_Relation(), |
|
110 | + 'Payment' => new EE_Has_Many_Relation(), |
|
111 | + 'Status' => new EE_Belongs_To_Relation(), |
|
112 | + 'Line_Item' => new EE_Has_Many_Relation(false), |
|
113 | + //you can delete a transaction without needing to delete its line items |
|
114 | + 'Payment_Method' => new EE_Belongs_To_Relation(), |
|
115 | + 'Message' => new EE_Has_Many_Relation() |
|
116 | + ); |
|
117 | + $this->_model_chain_to_wp_user = 'Registration.Event'; |
|
118 | + parent::__construct($timezone); |
|
119 | 119 | |
120 | - } |
|
120 | + } |
|
121 | 121 | |
122 | 122 | |
123 | - /** |
|
124 | - * txn_status_array |
|
125 | - * get list of transaction statuses |
|
126 | - * |
|
127 | - * @access public |
|
128 | - * @return array |
|
129 | - */ |
|
130 | - public static function txn_status_array() |
|
131 | - { |
|
132 | - return apply_filters( |
|
133 | - 'FHEE__EEM_Transaction__txn_status_array', |
|
134 | - array( |
|
135 | - EEM_Transaction::overpaid_status_code, |
|
136 | - EEM_Transaction::complete_status_code, |
|
137 | - EEM_Transaction::incomplete_status_code, |
|
138 | - EEM_Transaction::abandoned_status_code, |
|
139 | - EEM_Transaction::failed_status_code, |
|
140 | - ) |
|
141 | - ); |
|
142 | - } |
|
123 | + /** |
|
124 | + * txn_status_array |
|
125 | + * get list of transaction statuses |
|
126 | + * |
|
127 | + * @access public |
|
128 | + * @return array |
|
129 | + */ |
|
130 | + public static function txn_status_array() |
|
131 | + { |
|
132 | + return apply_filters( |
|
133 | + 'FHEE__EEM_Transaction__txn_status_array', |
|
134 | + array( |
|
135 | + EEM_Transaction::overpaid_status_code, |
|
136 | + EEM_Transaction::complete_status_code, |
|
137 | + EEM_Transaction::incomplete_status_code, |
|
138 | + EEM_Transaction::abandoned_status_code, |
|
139 | + EEM_Transaction::failed_status_code, |
|
140 | + ) |
|
141 | + ); |
|
142 | + } |
|
143 | 143 | |
144 | - /** |
|
145 | - * get the revenue per day for the Transaction Admin page Reports Tab |
|
146 | - * |
|
147 | - * @access public |
|
148 | - * |
|
149 | - * @param string $period |
|
150 | - * |
|
151 | - * @return \stdClass[] |
|
152 | - */ |
|
153 | - public function get_revenue_per_day_report($period = '-1 month') |
|
154 | - { |
|
155 | - $sql_date = $this->convert_datetime_for_query('TXN_timestamp', date('Y-m-d H:i:s', strtotime($period)), |
|
156 | - 'Y-m-d H:i:s', 'UTC'); |
|
144 | + /** |
|
145 | + * get the revenue per day for the Transaction Admin page Reports Tab |
|
146 | + * |
|
147 | + * @access public |
|
148 | + * |
|
149 | + * @param string $period |
|
150 | + * |
|
151 | + * @return \stdClass[] |
|
152 | + */ |
|
153 | + public function get_revenue_per_day_report($period = '-1 month') |
|
154 | + { |
|
155 | + $sql_date = $this->convert_datetime_for_query('TXN_timestamp', date('Y-m-d H:i:s', strtotime($period)), |
|
156 | + 'Y-m-d H:i:s', 'UTC'); |
|
157 | 157 | |
158 | - $query_interval = EEH_DTT_Helper::get_sql_query_interval_for_offset($this->get_timezone(), 'TXN_timestamp'); |
|
158 | + $query_interval = EEH_DTT_Helper::get_sql_query_interval_for_offset($this->get_timezone(), 'TXN_timestamp'); |
|
159 | 159 | |
160 | - return $this->_get_all_wpdb_results( |
|
161 | - array( |
|
162 | - array( |
|
163 | - 'TXN_timestamp' => array('>=', $sql_date) |
|
164 | - ), |
|
165 | - 'group_by' => 'txnDate', |
|
166 | - 'order_by' => array('TXN_timestamp' => 'ASC') |
|
167 | - ), |
|
168 | - OBJECT, |
|
169 | - array( |
|
170 | - 'txnDate' => array('DATE(' . $query_interval . ')', '%s'), |
|
171 | - 'revenue' => array('SUM(TransactionTable.TXN_paid)', '%d') |
|
172 | - ) |
|
173 | - ); |
|
174 | - } |
|
160 | + return $this->_get_all_wpdb_results( |
|
161 | + array( |
|
162 | + array( |
|
163 | + 'TXN_timestamp' => array('>=', $sql_date) |
|
164 | + ), |
|
165 | + 'group_by' => 'txnDate', |
|
166 | + 'order_by' => array('TXN_timestamp' => 'ASC') |
|
167 | + ), |
|
168 | + OBJECT, |
|
169 | + array( |
|
170 | + 'txnDate' => array('DATE(' . $query_interval . ')', '%s'), |
|
171 | + 'revenue' => array('SUM(TransactionTable.TXN_paid)', '%d') |
|
172 | + ) |
|
173 | + ); |
|
174 | + } |
|
175 | 175 | |
176 | 176 | |
177 | - /** |
|
178 | - * get the revenue per event for the Transaction Admin page Reports Tab |
|
179 | - * |
|
180 | - * @access public |
|
181 | - * |
|
182 | - * @param string $period |
|
183 | - * |
|
184 | - * @throws \EE_Error |
|
185 | - * @return mixed |
|
186 | - */ |
|
187 | - public function get_revenue_per_event_report($period = '-1 month') |
|
188 | - { |
|
189 | - global $wpdb; |
|
190 | - $transaction_table = $wpdb->prefix . 'esp_transaction'; |
|
191 | - $registration_table = $wpdb->prefix . 'esp_registration'; |
|
192 | - $event_table = $wpdb->posts; |
|
193 | - $payment_table = $wpdb->prefix . 'esp_payment'; |
|
194 | - $sql_date = date('Y-m-d H:i:s', strtotime($period)); |
|
195 | - $approved_payment_status = EEM_Payment::status_id_approved; |
|
196 | - $extra_event_on_join = ''; |
|
197 | - //exclude events not authored by user if permissions in effect |
|
198 | - if ( ! EE_Registry::instance()->CAP->current_user_can('ee_read_others_registrations', 'reg_per_event_report')) { |
|
199 | - $extra_event_on_join = ' AND Event.post_author = ' . get_current_user_id(); |
|
200 | - } |
|
177 | + /** |
|
178 | + * get the revenue per event for the Transaction Admin page Reports Tab |
|
179 | + * |
|
180 | + * @access public |
|
181 | + * |
|
182 | + * @param string $period |
|
183 | + * |
|
184 | + * @throws \EE_Error |
|
185 | + * @return mixed |
|
186 | + */ |
|
187 | + public function get_revenue_per_event_report($period = '-1 month') |
|
188 | + { |
|
189 | + global $wpdb; |
|
190 | + $transaction_table = $wpdb->prefix . 'esp_transaction'; |
|
191 | + $registration_table = $wpdb->prefix . 'esp_registration'; |
|
192 | + $event_table = $wpdb->posts; |
|
193 | + $payment_table = $wpdb->prefix . 'esp_payment'; |
|
194 | + $sql_date = date('Y-m-d H:i:s', strtotime($period)); |
|
195 | + $approved_payment_status = EEM_Payment::status_id_approved; |
|
196 | + $extra_event_on_join = ''; |
|
197 | + //exclude events not authored by user if permissions in effect |
|
198 | + if ( ! EE_Registry::instance()->CAP->current_user_can('ee_read_others_registrations', 'reg_per_event_report')) { |
|
199 | + $extra_event_on_join = ' AND Event.post_author = ' . get_current_user_id(); |
|
200 | + } |
|
201 | 201 | |
202 | - return $wpdb->get_results( |
|
203 | - "SELECT |
|
202 | + return $wpdb->get_results( |
|
203 | + "SELECT |
|
204 | 204 | Transaction_Event.event_name AS event_name, |
205 | 205 | SUM(Transaction_Event.paid) AS revenue |
206 | 206 | FROM |
@@ -220,158 +220,158 @@ discard block |
||
220 | 220 | $extra_event_on_join |
221 | 221 | ) AS Transaction_Event |
222 | 222 | GROUP BY event_name", |
223 | - OBJECT |
|
224 | - ); |
|
225 | - } |
|
223 | + OBJECT |
|
224 | + ); |
|
225 | + } |
|
226 | 226 | |
227 | 227 | |
228 | - /** |
|
229 | - * Gets the current transaction given the reg_url_link, or assumes the reg_url_link is in the |
|
230 | - * $_REQUEST global variable. Either way, tries to find the current transaction (through |
|
231 | - * the registration pointed to by reg_url_link), if not returns null |
|
232 | - * |
|
233 | - * @param string $reg_url_link |
|
234 | - * |
|
235 | - * @return EE_Transaction |
|
236 | - */ |
|
237 | - public function get_transaction_from_reg_url_link($reg_url_link = '') |
|
238 | - { |
|
239 | - return $this->get_one(array( |
|
240 | - array( |
|
241 | - 'Registration.REG_url_link' => ! empty($reg_url_link) ? $reg_url_link : EE_Registry::instance()->REQ->get('e_reg_url_link', |
|
242 | - '') |
|
243 | - ) |
|
244 | - )); |
|
245 | - } |
|
228 | + /** |
|
229 | + * Gets the current transaction given the reg_url_link, or assumes the reg_url_link is in the |
|
230 | + * $_REQUEST global variable. Either way, tries to find the current transaction (through |
|
231 | + * the registration pointed to by reg_url_link), if not returns null |
|
232 | + * |
|
233 | + * @param string $reg_url_link |
|
234 | + * |
|
235 | + * @return EE_Transaction |
|
236 | + */ |
|
237 | + public function get_transaction_from_reg_url_link($reg_url_link = '') |
|
238 | + { |
|
239 | + return $this->get_one(array( |
|
240 | + array( |
|
241 | + 'Registration.REG_url_link' => ! empty($reg_url_link) ? $reg_url_link : EE_Registry::instance()->REQ->get('e_reg_url_link', |
|
242 | + '') |
|
243 | + ) |
|
244 | + )); |
|
245 | + } |
|
246 | 246 | |
247 | 247 | |
248 | - /** |
|
249 | - * Updates the provided EE_Transaction with all the applicable payments |
|
250 | - * (or fetch the EE_Transaction from its ID) |
|
251 | - * |
|
252 | - * @deprecated |
|
253 | - * |
|
254 | - * @param EE_Transaction|int $transaction_obj_or_id |
|
255 | - * @param boolean $save_txn whether or not to save the transaction during this function call |
|
256 | - * |
|
257 | - * @return boolean |
|
258 | - * @throws \EE_Error |
|
259 | - */ |
|
260 | - public function update_based_on_payments($transaction_obj_or_id, $save_txn = true) |
|
261 | - { |
|
262 | - EE_Error::doing_it_wrong( |
|
263 | - __CLASS__ . '::' . __FUNCTION__, |
|
264 | - sprintf(__('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
|
265 | - 'EE_Transaction_Processor::update_transaction_and_registrations_after_checkout_or_payment()'), |
|
266 | - '4.6.0' |
|
267 | - ); |
|
268 | - /** @type EE_Transaction_Processor $transaction_processor */ |
|
269 | - $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor'); |
|
248 | + /** |
|
249 | + * Updates the provided EE_Transaction with all the applicable payments |
|
250 | + * (or fetch the EE_Transaction from its ID) |
|
251 | + * |
|
252 | + * @deprecated |
|
253 | + * |
|
254 | + * @param EE_Transaction|int $transaction_obj_or_id |
|
255 | + * @param boolean $save_txn whether or not to save the transaction during this function call |
|
256 | + * |
|
257 | + * @return boolean |
|
258 | + * @throws \EE_Error |
|
259 | + */ |
|
260 | + public function update_based_on_payments($transaction_obj_or_id, $save_txn = true) |
|
261 | + { |
|
262 | + EE_Error::doing_it_wrong( |
|
263 | + __CLASS__ . '::' . __FUNCTION__, |
|
264 | + sprintf(__('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
|
265 | + 'EE_Transaction_Processor::update_transaction_and_registrations_after_checkout_or_payment()'), |
|
266 | + '4.6.0' |
|
267 | + ); |
|
268 | + /** @type EE_Transaction_Processor $transaction_processor */ |
|
269 | + $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor'); |
|
270 | 270 | |
271 | - return $transaction_processor->update_transaction_and_registrations_after_checkout_or_payment( |
|
272 | - $this->ensure_is_obj($transaction_obj_or_id) |
|
273 | - ); |
|
274 | - } |
|
271 | + return $transaction_processor->update_transaction_and_registrations_after_checkout_or_payment( |
|
272 | + $this->ensure_is_obj($transaction_obj_or_id) |
|
273 | + ); |
|
274 | + } |
|
275 | 275 | |
276 | - /** |
|
277 | - * Deletes "junk" transactions that were probably added by bots. There might be TONS |
|
278 | - * of these, so we are very careful to NOT select (which the models do even when deleting), |
|
279 | - * and so we only use wpdb directly and only do minimal joins. |
|
280 | - * Transactions are considered "junk" if they're failed for longer than a week. |
|
281 | - * Also, there is an extra check for payments related to the transaction, because if a transaction has a payment on |
|
282 | - * it, it's probably not junk (regardless of what status it has). |
|
283 | - * The downside to this approach is that is addons are listening for object deletions |
|
284 | - * on EEM_Base::delete() they won't be notified of this. However, there is an action that plugins can hook into |
|
285 | - * to catch these types of deletions. |
|
286 | - * |
|
287 | - * @global WPDB $wpdb |
|
288 | - * @return mixed |
|
289 | - */ |
|
290 | - public function delete_junk_transactions() |
|
291 | - { |
|
292 | - /** @type WPDB $wpdb */ |
|
293 | - global $wpdb; |
|
294 | - $deleted = false; |
|
295 | - $time_to_leave_alone = apply_filters( |
|
296 | - 'FHEE__EEM_Transaction__delete_junk_transactions__time_to_leave_alone' |
|
297 | - , WEEK_IN_SECONDS |
|
298 | - ); |
|
276 | + /** |
|
277 | + * Deletes "junk" transactions that were probably added by bots. There might be TONS |
|
278 | + * of these, so we are very careful to NOT select (which the models do even when deleting), |
|
279 | + * and so we only use wpdb directly and only do minimal joins. |
|
280 | + * Transactions are considered "junk" if they're failed for longer than a week. |
|
281 | + * Also, there is an extra check for payments related to the transaction, because if a transaction has a payment on |
|
282 | + * it, it's probably not junk (regardless of what status it has). |
|
283 | + * The downside to this approach is that is addons are listening for object deletions |
|
284 | + * on EEM_Base::delete() they won't be notified of this. However, there is an action that plugins can hook into |
|
285 | + * to catch these types of deletions. |
|
286 | + * |
|
287 | + * @global WPDB $wpdb |
|
288 | + * @return mixed |
|
289 | + */ |
|
290 | + public function delete_junk_transactions() |
|
291 | + { |
|
292 | + /** @type WPDB $wpdb */ |
|
293 | + global $wpdb; |
|
294 | + $deleted = false; |
|
295 | + $time_to_leave_alone = apply_filters( |
|
296 | + 'FHEE__EEM_Transaction__delete_junk_transactions__time_to_leave_alone' |
|
297 | + , WEEK_IN_SECONDS |
|
298 | + ); |
|
299 | 299 | |
300 | 300 | |
301 | - /** |
|
302 | - * This allows code to filter the query arguments used for retrieving the transaction IDs to delete. |
|
303 | - * Useful for plugins that want to exclude transactions matching certain query parameters. |
|
304 | - * The query parameters should be in the format accepted by the EEM_Base model queries. |
|
305 | - */ |
|
306 | - $ids_query = apply_filters( |
|
307 | - 'FHEE__EEM_Transaction__delete_junk_transactions__initial_query_args', |
|
308 | - array( |
|
309 | - 0 => array( |
|
310 | - 'STS_ID' => EEM_Transaction::failed_status_code, |
|
311 | - 'Payment.PAY_ID' => array( 'IS NULL' ), |
|
312 | - 'TXN_timestamp' => array('<', time() - $time_to_leave_alone) |
|
313 | - ) |
|
314 | - ), |
|
315 | - $time_to_leave_alone |
|
316 | - ); |
|
301 | + /** |
|
302 | + * This allows code to filter the query arguments used for retrieving the transaction IDs to delete. |
|
303 | + * Useful for plugins that want to exclude transactions matching certain query parameters. |
|
304 | + * The query parameters should be in the format accepted by the EEM_Base model queries. |
|
305 | + */ |
|
306 | + $ids_query = apply_filters( |
|
307 | + 'FHEE__EEM_Transaction__delete_junk_transactions__initial_query_args', |
|
308 | + array( |
|
309 | + 0 => array( |
|
310 | + 'STS_ID' => EEM_Transaction::failed_status_code, |
|
311 | + 'Payment.PAY_ID' => array( 'IS NULL' ), |
|
312 | + 'TXN_timestamp' => array('<', time() - $time_to_leave_alone) |
|
313 | + ) |
|
314 | + ), |
|
315 | + $time_to_leave_alone |
|
316 | + ); |
|
317 | 317 | |
318 | 318 | |
319 | - /** |
|
320 | - * This filter is for when code needs to filter the list of transaction ids that represent transactions |
|
321 | - * about to be deleted based on some other criteria that isn't easily done via the query args filter. |
|
322 | - */ |
|
323 | - $txn_ids = apply_filters( |
|
324 | - 'FHEE__EEM_Transaction__delete_junk_transactions__transaction_ids_to_delete', |
|
325 | - EEM_Transaction::instance()->get_col($ids_query, 'TXN_ID'), |
|
326 | - $time_to_leave_alone |
|
327 | - ); |
|
328 | - //now that we have the ids to delete |
|
329 | - if (! empty($txn_ids) && is_array($txn_ids)) { |
|
330 | - // first, make sure these TXN's are removed the "ee_locked_transactions" array |
|
331 | - EEM_Transaction::unset_locked_transactions($txn_ids); |
|
332 | - // let's get deletin'... |
|
333 | - // Why no wpdb->prepare? Because the data is trusted. |
|
334 | - // We got the ids from the original query to get them FROM |
|
335 | - // the db (which is sanitized) so no need to prepare them again. |
|
336 | - $query = ' |
|
319 | + /** |
|
320 | + * This filter is for when code needs to filter the list of transaction ids that represent transactions |
|
321 | + * about to be deleted based on some other criteria that isn't easily done via the query args filter. |
|
322 | + */ |
|
323 | + $txn_ids = apply_filters( |
|
324 | + 'FHEE__EEM_Transaction__delete_junk_transactions__transaction_ids_to_delete', |
|
325 | + EEM_Transaction::instance()->get_col($ids_query, 'TXN_ID'), |
|
326 | + $time_to_leave_alone |
|
327 | + ); |
|
328 | + //now that we have the ids to delete |
|
329 | + if (! empty($txn_ids) && is_array($txn_ids)) { |
|
330 | + // first, make sure these TXN's are removed the "ee_locked_transactions" array |
|
331 | + EEM_Transaction::unset_locked_transactions($txn_ids); |
|
332 | + // let's get deletin'... |
|
333 | + // Why no wpdb->prepare? Because the data is trusted. |
|
334 | + // We got the ids from the original query to get them FROM |
|
335 | + // the db (which is sanitized) so no need to prepare them again. |
|
336 | + $query = ' |
|
337 | 337 | DELETE |
338 | 338 | FROM ' . $this->table() . ' |
339 | 339 | WHERE |
340 | 340 | TXN_ID IN ( ' . implode(",", $txn_ids) . ')'; |
341 | - $deleted = $wpdb->query($query); |
|
342 | - } |
|
343 | - if ($deleted) { |
|
344 | - /** |
|
345 | - * Allows code to do something after the transactions have been deleted. |
|
346 | - */ |
|
347 | - do_action('AHEE__EEM_Transaction__delete_junk_transactions__successful_deletion', $txn_ids); |
|
348 | - } |
|
341 | + $deleted = $wpdb->query($query); |
|
342 | + } |
|
343 | + if ($deleted) { |
|
344 | + /** |
|
345 | + * Allows code to do something after the transactions have been deleted. |
|
346 | + */ |
|
347 | + do_action('AHEE__EEM_Transaction__delete_junk_transactions__successful_deletion', $txn_ids); |
|
348 | + } |
|
349 | 349 | |
350 | - return $deleted; |
|
351 | - } |
|
350 | + return $deleted; |
|
351 | + } |
|
352 | 352 | |
353 | 353 | |
354 | - /** |
|
355 | - * @param array $transaction_IDs |
|
356 | - * |
|
357 | - * @return bool |
|
358 | - */ |
|
359 | - public static function unset_locked_transactions(array $transaction_IDs) |
|
360 | - { |
|
361 | - $locked_transactions = get_option('ee_locked_transactions', array()); |
|
362 | - $update = false; |
|
363 | - foreach ($transaction_IDs as $TXN_ID) { |
|
364 | - if (isset($locked_transactions[$TXN_ID])) { |
|
365 | - unset($locked_transactions[$TXN_ID]); |
|
366 | - $update = true; |
|
367 | - } |
|
368 | - } |
|
369 | - if ($update) { |
|
370 | - update_option('ee_locked_transactions', $locked_transactions); |
|
371 | - } |
|
354 | + /** |
|
355 | + * @param array $transaction_IDs |
|
356 | + * |
|
357 | + * @return bool |
|
358 | + */ |
|
359 | + public static function unset_locked_transactions(array $transaction_IDs) |
|
360 | + { |
|
361 | + $locked_transactions = get_option('ee_locked_transactions', array()); |
|
362 | + $update = false; |
|
363 | + foreach ($transaction_IDs as $TXN_ID) { |
|
364 | + if (isset($locked_transactions[$TXN_ID])) { |
|
365 | + unset($locked_transactions[$TXN_ID]); |
|
366 | + $update = true; |
|
367 | + } |
|
368 | + } |
|
369 | + if ($update) { |
|
370 | + update_option('ee_locked_transactions', $locked_transactions); |
|
371 | + } |
|
372 | 372 | |
373 | - return $update; |
|
374 | - } |
|
373 | + return $update; |
|
374 | + } |
|
375 | 375 | |
376 | 376 | |
377 | 377 | } |
@@ -1,7 +1,7 @@ discard block |
||
1 | 1 | <?php if ( ! defined('EVENT_ESPRESSO_VERSION')) { |
2 | 2 | exit('No direct script access allowed'); |
3 | 3 | } |
4 | -require_once(EE_MODELS . 'EEM_Base.model.php'); |
|
4 | +require_once(EE_MODELS.'EEM_Base.model.php'); |
|
5 | 5 | |
6 | 6 | /** |
7 | 7 | * |
@@ -105,7 +105,7 @@ discard block |
||
105 | 105 | __('Registration Steps', 'event_espresso'), false, array()), |
106 | 106 | ) |
107 | 107 | ); |
108 | - $this->_model_relations = array( |
|
108 | + $this->_model_relations = array( |
|
109 | 109 | 'Registration' => new EE_Has_Many_Relation(), |
110 | 110 | 'Payment' => new EE_Has_Many_Relation(), |
111 | 111 | 'Status' => new EE_Belongs_To_Relation(), |
@@ -167,7 +167,7 @@ discard block |
||
167 | 167 | ), |
168 | 168 | OBJECT, |
169 | 169 | array( |
170 | - 'txnDate' => array('DATE(' . $query_interval . ')', '%s'), |
|
170 | + 'txnDate' => array('DATE('.$query_interval.')', '%s'), |
|
171 | 171 | 'revenue' => array('SUM(TransactionTable.TXN_paid)', '%d') |
172 | 172 | ) |
173 | 173 | ); |
@@ -187,16 +187,16 @@ discard block |
||
187 | 187 | public function get_revenue_per_event_report($period = '-1 month') |
188 | 188 | { |
189 | 189 | global $wpdb; |
190 | - $transaction_table = $wpdb->prefix . 'esp_transaction'; |
|
191 | - $registration_table = $wpdb->prefix . 'esp_registration'; |
|
190 | + $transaction_table = $wpdb->prefix.'esp_transaction'; |
|
191 | + $registration_table = $wpdb->prefix.'esp_registration'; |
|
192 | 192 | $event_table = $wpdb->posts; |
193 | - $payment_table = $wpdb->prefix . 'esp_payment'; |
|
193 | + $payment_table = $wpdb->prefix.'esp_payment'; |
|
194 | 194 | $sql_date = date('Y-m-d H:i:s', strtotime($period)); |
195 | 195 | $approved_payment_status = EEM_Payment::status_id_approved; |
196 | 196 | $extra_event_on_join = ''; |
197 | 197 | //exclude events not authored by user if permissions in effect |
198 | 198 | if ( ! EE_Registry::instance()->CAP->current_user_can('ee_read_others_registrations', 'reg_per_event_report')) { |
199 | - $extra_event_on_join = ' AND Event.post_author = ' . get_current_user_id(); |
|
199 | + $extra_event_on_join = ' AND Event.post_author = '.get_current_user_id(); |
|
200 | 200 | } |
201 | 201 | |
202 | 202 | return $wpdb->get_results( |
@@ -260,7 +260,7 @@ discard block |
||
260 | 260 | public function update_based_on_payments($transaction_obj_or_id, $save_txn = true) |
261 | 261 | { |
262 | 262 | EE_Error::doing_it_wrong( |
263 | - __CLASS__ . '::' . __FUNCTION__, |
|
263 | + __CLASS__.'::'.__FUNCTION__, |
|
264 | 264 | sprintf(__('This method is deprecated. Please use "%s" instead', 'event_espresso'), |
265 | 265 | 'EE_Transaction_Processor::update_transaction_and_registrations_after_checkout_or_payment()'), |
266 | 266 | '4.6.0' |
@@ -308,7 +308,7 @@ discard block |
||
308 | 308 | array( |
309 | 309 | 0 => array( |
310 | 310 | 'STS_ID' => EEM_Transaction::failed_status_code, |
311 | - 'Payment.PAY_ID' => array( 'IS NULL' ), |
|
311 | + 'Payment.PAY_ID' => array('IS NULL'), |
|
312 | 312 | 'TXN_timestamp' => array('<', time() - $time_to_leave_alone) |
313 | 313 | ) |
314 | 314 | ), |
@@ -326,18 +326,18 @@ discard block |
||
326 | 326 | $time_to_leave_alone |
327 | 327 | ); |
328 | 328 | //now that we have the ids to delete |
329 | - if (! empty($txn_ids) && is_array($txn_ids)) { |
|
329 | + if ( ! empty($txn_ids) && is_array($txn_ids)) { |
|
330 | 330 | // first, make sure these TXN's are removed the "ee_locked_transactions" array |
331 | 331 | EEM_Transaction::unset_locked_transactions($txn_ids); |
332 | 332 | // let's get deletin'... |
333 | 333 | // Why no wpdb->prepare? Because the data is trusted. |
334 | 334 | // We got the ids from the original query to get them FROM |
335 | 335 | // the db (which is sanitized) so no need to prepare them again. |
336 | - $query = ' |
|
336 | + $query = ' |
|
337 | 337 | DELETE |
338 | - FROM ' . $this->table() . ' |
|
338 | + FROM ' . $this->table().' |
|
339 | 339 | WHERE |
340 | - TXN_ID IN ( ' . implode(",", $txn_ids) . ')'; |
|
340 | + TXN_ID IN ( ' . implode(",", $txn_ids).')'; |
|
341 | 341 | $deleted = $wpdb->query($query); |
342 | 342 | } |
343 | 343 | if ($deleted) { |