includes/notifications/controllers/class.llms.notification.controller.purchase.receipt.php
<?php
/**
* Notification Controller: Transaction Success
*
* @package LifterLMS/Notifications/Controllers/Classes
*
* @since 3.8.0
* @version 3.24.0
*/
defined( 'ABSPATH' ) || exit;
/**
* Notification Controller: Transaction Success
*
* @since 3.8.0
* @since 3.24.0 Unknown
*/
class LLMS_Notification_Controller_Purchase_Receipt extends LLMS_Abstract_Notification_Controller {
/**
* Trigger Identifier
*
* @var string
*/
public $id = 'purchase_receipt';
/**
* Number of accepted arguments passed to the callback function
*
* @var integer
*/
protected $action_accepted_args = 1;
/**
* Action hooks used to trigger sending of the notification
*
* @var array
*/
protected $action_hooks = array(
'lifterlms_resend_transaction_receipt',
'lifterlms_transaction_status_succeeded',
);
/**
* Determines if test notifications can be sent
*
* @var bool
*/
protected $testable = array(
'basic' => false,
'email' => true,
);
/**
* Callback function called when a lesson is completed by a student
*
* @since 3.8.0
*
* @param int $transaction Instance of a LLMS_Transaction.
* @return void
*/
public function action_callback( $transaction = null ) {
$order = $transaction->get_order();
$this->user_id = $order->get( 'user_id' );
$this->post_id = $transaction->get( 'id' );
$this->send();
}
/**
* Takes a subscriber type (student, author, etc) and retrieves a User ID
*
* @since 3.8.0
* @since 3.10.2 Unknown.
*
* @param string $subscriber Subscriber type string.
* @return int|false
*/
protected function get_subscriber( $subscriber ) {
switch ( $subscriber ) {
case 'author':
$txn = llms_get_post( $this->post_id );
$order = $txn->get_order();
if ( ! $order ) {
return false;
}
$product = $order->get_product();
if ( ! $product ) {
return false;
}
$uid = $product->get( 'author' );
break;
case 'student':
$uid = $this->user_id;
break;
default:
$uid = false;
}
return $uid;
}
/**
* Determine what types are supported
*
* Extending classes can override this function in order to add or remove support.
* 3rd parties should add support via filter on $this->get_supported_types().
*
* @since 3.8.0
*
* @return array Associative array, keys are the ID/db type, values should be translated display types.
*/
protected function set_supported_types() {
return array(
'email' => __( 'Email', 'lifterlms' ),
);
}
/**
* Get an array of LifterLMS Admin Page settings to send test notifications
*
* @since 3.24.0
*
* @param string $type Notification type [basic|email].
* @return array
*/
public function get_test_settings( $type ) {
$query = new WP_Query(
array(
'post_type' => 'llms_transaction',
'posts_per_page' => 25,
)
);
$options = array(
'' => '',
);
foreach ( $query->posts as $post ) {
$transaction = llms_get_post( $post );
$order = $transaction->get_order();
$student = llms_get_student( $order->get( 'user_id' ) );
if ( $transaction && $student ) {
$options[ $transaction->get( 'id' ) ] = esc_attr(
sprintf(
// Translators: %1$d = The Order ID; %2$s The customer's full name; %3$s The product title.
__( 'Order #%1$d from %2$s for "%3$s"', 'lifterlms' ),
$order->get( 'id' ),
$student->get_name(),
$order->get( 'product_title' )
)
);
}
}
return array(
array(
'class' => 'llms-select2',
'custom_attributes' => array(
'data-allow-clear' => true,
'data-placeholder' => __( 'Select a transaction', 'lifterlms' ),
),
'default' => '',
'id' => 'transaction_id',
'desc' => '<br/>' . __( 'Send yourself a test notification using information from the selected transaction.', 'lifterlms' ),
'options' => $options,
'title' => __( 'Send a Test', 'lifterlms' ),
'type' => 'select',
// 'selected' => false,
),
);
}
/**
* Get the translatable title for the notification
*
* Used on settings screens.
*
* @since 3.8.0
*
* @return string
*/
public function get_title() {
return __( 'Purchase Receipt', 'lifterlms' );
}
/**
* Send a test notification to the currently logged in users
*
* Extending classes should redefine this in order to properly setup the controller with post_id and user_id data.
*
* @since 3.24.0
*
* @param string $type Notification type [basic|email].
* @param array $data Array of test notification data as specified by $this->get_test_data().
* @return int|false
*/
public function send_test( $type, $data = array() ) {
if ( empty( $data['transaction_id'] ) ) {
return;
}
$transaction = llms_get_post( $data['transaction_id'] );
$order = $transaction->get_order();
$this->user_id = $order->get( 'user_id' );
$this->post_id = $transaction->get( 'id' );
return parent::send_test( $type );
}
/**
* Setup the subscriber options for the notification
*
* @since 3.8.0
*
* @param string $type Notification type id.
* @return array
*/
protected function set_subscriber_options( $type ) {
$options = array();
switch ( $type ) {
case 'email':
$options[] = $this->get_subscriber_option_array( 'author', 'yes' );
$options[] = $this->get_subscriber_option_array( 'student', 'yes' );
$options[] = $this->get_subscriber_option_array( 'custom', 'no' );
break;
}
return $options;
}
}
return LLMS_Notification_Controller_Purchase_Receipt::instance();