Esempio n. 1
0
 /**
  * Determines if the current user is permitted to even think about using
  * simulation. If not allowed, then most of this class will not be used.
  *
  * @since  1.0.0
  * @return bool
  */
 public static function can_simulate()
 {
     if (defined('DOING_CRON') && DOING_CRON) {
         // No simulation during cron jobs...
         return false;
     }
     if (MS_Model_Member::is_admin_user()) {
         return true;
     }
     return false;
 }
 /**
  * Verify if current user can perform management actions.
  *
  * @since  1.0.0
  *
  * @return boolean True if can, false otherwise.
  */
 public function is_admin_user()
 {
     $is_admin_user = MS_Model_Member::is_admin_user();
     return apply_filters('ms_controller_is_admin_user', $is_admin_user);
 }
 /**
  * Returns true only then, when the current user can edit menu items.
  *
  * Reasons why it might be denied:
  * - There are no menus where items can be added to.
  * - The user is no admin.
  *
  * @since  1.0.0
  * @return bool
  */
 public static function can_edit_menus()
 {
     $Can_Edit_Menus = null;
     if (null === $Can_Edit_Menus) {
         $Can_Edit_Menus = false;
         if (!MS_Plugin::is_network_wide()) {
             $menus = wp_get_nav_menus();
             if (MS_Model_Member::is_admin_user() && !empty($menus)) {
                 $Can_Edit_Menus = true;
             }
         }
         $Can_Edit_Menus = apply_filters('ms_model_pages_can_edit_menus', $Can_Edit_Menus);
     }
     return $Can_Edit_Menus;
 }
 /**
  * Create membership column.
  *
  * @since  1.0.0
  *
  * @param MS_Model_Member $member The member object.
  */
 public function column_membership($member)
 {
     if (MS_Model_Member::is_admin_user($member->id)) {
         $html = '<b>' . __('Admin User', MS_TEXT_DOMAIN) . '</b>';
     } else {
         $subscriptions = $member->get_membership_ids();
         $visitor = array('id' => 'ms-empty-' . $member->id, 'type' => MS_Helper_Html::TYPE_HTML_TEXT, 'value' => __('(Visitor)'), 'after' => 'Edit', 'class' => 'ms-empty-note');
         $list = array('id' => 'ms-memberships-' . $member->id, 'type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'value' => $subscriptions, 'field_options' => self::$memberships, 'multiple' => true, 'class' => 'ms-memberships', 'ajax_data' => array('action' => MS_Controller_Member::AJAX_ACTION_CHANGE_MEMBERSHIPS, 'member' => $member->id));
         $html = sprintf('<div class="no-auto-init">%1$s%2$s</div>', MS_Helper_Html::html_element($visitor, true), MS_Helper_Html::html_element($list, true));
     }
     return apply_filters('ms_helper_listtable_member_column_membership', $html, $member, $this);
 }
 /**
  * Redirect user to account page.
  *
  * Only redirect when no previous redirect_to is set or when going to /wp-admin/.
  *
  * @since  1.0.0
  *
  * @param string $redirect_to URL to redirect to.
  * @param string $request URL the user is coming from.
  * @param object $user Logged user's data.
  * @return string The redirect url.
  */
 public function login_redirect($redirect_to, $request, $user)
 {
     if (!empty($user->ID) && !MS_Model_Member::is_admin_user($user->ID) && (empty($redirect_to) || admin_url() == $redirect_to)) {
         $redirect_to = MS_Model_Pages::get_page_url(MS_Model_Pages::MS_PAGE_ACCOUNT);
     }
     return apply_filters('ms_controller_frontend_login_redirect', $redirect_to, $request, $user, $this);
 }
 /**
  * Customize the Admin Toolbar.
  *
  * Related Action Hooks:
  * - wp_before_admin_bar_render
  *
  * @since  1.0.0
  */
 public function customize_toolbar()
 {
     if (MS_Model_Member::is_admin_user() && MS_Plugin::is_enabled() && !is_network_admin() && MS_Model_Simulate::can_simulate()) {
         if ($this->simulate->is_simulating()) {
             $this->add_detail_nodes();
         } else {
             $this->add_test_membership_node();
         }
     } else {
         if (!MS_Plugin::is_enabled()) {
             $this->add_unprotected_node();
         }
     }
 }
 /**
  * Save model.
  *
  * Only saves if is not admin user and not a visitor.
  * Don't save automatically assigned visitor/system memberships.
  *
  * @since  1.0.0
  * @api
  */
 public function save()
 {
     do_action('ms_model_relationship_save_before', $this);
     if (!empty($this->user_id) && !MS_Model_Member::is_admin_user($this->user_id)) {
         if (!$this->is_system()) {
             parent::save();
             parent::store_singleton();
         }
     }
     do_action('ms_model_relationship_after', $this);
 }
 /**
  * Special Shortcode Callback: Replace shortcodes with empty value.
  *
  *     All Shortcodes use this callback function
  *     when Content Protection is DISABLED!
  *
  * @since  1.0.0
  * @param  mixed[] $atts Shortcode attributes.
  * @param  string $content
  * @return string
  */
 public function ms_no_value($atts, $content = '')
 {
     static $Done = false;
     if ($Done) {
         return '';
     }
     $Done = true;
     if (MS_Model_Member::is_admin_user()) {
         $content = sprintf('<p class="ms-alert-box ms-alert-error ms-unprotected">%s<br /><br /><em>(%s)</em></p>', __('Content Protection is disabled. Please enable the protection to see this shortcode.', 'membership2'), __('This message is only displayed to Site Administrators', 'membership2'));
     } else {
         $content = '';
     }
     return apply_filters('ms_controller_shortcode_ms_no_value', $content, $this);
 }
    public function to_html()
    {
        global $post;
        /**
         * Provide a customized account page.
         *
         * @since  1.0.0
         */
        $html = apply_filters('ms_shortcode_custom_account', '', $this->data);
        if (!empty($html)) {
            return $html;
        } else {
            $html = '';
        }
        $member = MS_Model_Member::get_current_member();
        $fields = $this->prepare_fields();
        // Extract shortcode options.
        extract($this->data);
        ob_start();
        ?>
		<div class="ms-account-wrapper">
			<?php 
        if (MS_Model_Member::is_logged_in()) {
            ?>

				<?php 
            // ================================================= MEMBERSHIPS
            if ($show_membership) {
                ?>
				<div id="account-membership">
				<h2>
					<?php 
                echo $membership_title;
                if ($show_membership_change) {
                    $signup_url = MS_Model_Pages::get_page_url(MS_Model_Pages::MS_PAGE_REGISTER);
                    printf('<a href="%s" class="ms-edit-profile">%s</a>', $signup_url, $membership_change_label);
                }
                ?>
				</h2>
				<?php 
                /**
                 * Add custom content right before the memberships list.
                 *
                 * @since  1.0.0
                 */
                do_action('ms_view_account_memberships_top', $member, $this);
                if (MS_Model_Member::is_admin_user()) {
                    _e('You are an admin user and have access to all memberships', 'membership2');
                } else {
                    if (!empty($this->data['subscription'])) {
                        ?>
						<table>
							<tr>
								<th class="ms-col-membership"><?php 
                        _e('Membership name', 'membership2');
                        ?>
</th>
								<th class="ms-col-status"><?php 
                        _e('Status', 'membership2');
                        ?>
</th>
								<th class="ms-col-expire-date"><?php 
                        _e('Expire date', 'membership2');
                        ?>
</th>
							</tr>
							<?php 
                        $empty = true;
                        // These subscriptions have no expire date
                        $no_expire_list = array(MS_Model_Relationship::STATUS_PENDING, MS_Model_Relationship::STATUS_WAITING, MS_Model_Relationship::STATUS_DEACTIVATED);
                        // These subscriptions display the trial-expire date
                        $trial_expire_list = array(MS_Model_Relationship::STATUS_TRIAL, MS_Model_Relationship::STATUS_TRIAL_EXPIRED);
                        foreach ($this->data['subscription'] as $subscription) {
                            $empty = false;
                            $membership = $subscription->get_membership();
                            $subs_classes = array('ms-subscription-' . $subscription->id, 'ms-status-' . $subscription->status, 'ms-type-' . $membership->type, 'ms-payment-' . $membership->payment_type, 'ms-gateway-' . $subscription->gateway_id, 'ms-membership-' . $subscription->membership_id, $subscription->has_trial() ? 'ms-with-trial' : 'ms-no-trial');
                            ?>
								<tr class="<?php 
                            echo esc_attr(implode(' ', $subs_classes));
                            ?>
">
									<td class="ms-col-membership"><?php 
                            echo esc_html($membership->name);
                            ?>
</td>
									<td class="ms-col-status">
									<?php 
                            if (MS_Model_Relationship::STATUS_PENDING == $subscription->status) {
                                // Display a "Purchase" link when status is Pending
                                $code = sprintf('[%s id="%s" label="%s"]', MS_Helper_Shortcode::SCODE_MS_BUY, $membership->id, __('Pending', 'membership2'));
                                echo do_shortcode($code);
                            } else {
                                echo esc_html($subscription->status_text());
                            }
                            ?>
									</td>
									<td class="ms-col-expire-date"><?php 
                            if (in_array($subscription->status, $no_expire_list)) {
                                echo '&nbsp;';
                            } elseif (in_array($subscription->status, $trial_expire_list)) {
                                echo esc_html(MS_Helper_Period::format_date($subscription->trial_expire_date));
                            } elseif ($subscription->expire_date) {
                                echo esc_html(MS_Helper_Period::format_date($subscription->expire_date));
                            } else {
                                _e('Never', 'membership2');
                            }
                            ?>
</td>
								</tr>
							<?php 
                        }
                        if ($empty) {
                            $cols = 3;
                            if (MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_TRIAL)) {
                                $cols += 1;
                            }
                            printf('<tr><td colspan="%1$s">%2$s</td></tr>', $cols, __('(No Membership)', 'membership2'));
                        }
                        ?>
						</table>
					<?php 
                    } else {
                        _e('No memberships', 'membership2');
                    }
                }
                /**
                 * Add custom content right after the memberships list.
                 *
                 * @since  1.0.0
                 */
                do_action('ms_view_account_memberships_bottom', $member, $this);
                ?>
				</div>
				<?php 
            }
            // END: if ( $show_membership )
            // =============================================================
            ?>

				<?php 
            // ===================================================== PROFILE
            if ($show_profile) {
                ?>
				<div id="account-profile">
				<h2>
					<?php 
                echo $profile_title;
                if ($show_profile_change) {
                    $edit_url = esc_url_raw(add_query_arg(array('action' => MS_Controller_Frontend::ACTION_EDIT_PROFILE)));
                    printf('<a href="%s" class="ms-edit-profile">%s</a>', $edit_url, $profile_change_label);
                }
                ?>
				</h2>
				<?php 
                /**
                 * Add custom content right before the profile overview.
                 *
                 * @since  1.0.0
                 */
                do_action('ms_view_account_profile_top', $member, $this);
                ?>
				<table>
					<?php 
                foreach ($fields['personal_info'] as $field => $title) {
                    ?>
						<tr>
							<th class="ms-label-title"><?php 
                    echo esc_html($title);
                    ?>
: </th>
							<td class="ms-label-field"><?php 
                    echo esc_html($this->data['member']->{$field});
                    ?>
</td>
						</tr>
					<?php 
                }
                ?>
				</table>
				<?php 
                do_action('ms_view_shortcode_account_card_info', $this->data);
                /**
                 * Add custom content right after the profile overview.
                 *
                 * @since  1.0.0
                 */
                do_action('ms_view_account_profile_bottom', $member, $this);
                ?>
				</div>
				<?php 
            }
            // END: if ( $show_profile )
            // =============================================================
            ?>

				<?php 
            // ==================================================== INVOICES
            if ($show_invoices) {
                ?>
				<div id="account-invoices">
				<h2>
					<?php 
                echo $invoices_title;
                if ($show_all_invoices) {
                    $detail_url = esc_url_raw(add_query_arg(array('action' => MS_Controller_Frontend::ACTION_VIEW_INVOICES)));
                    printf('<a href="%s" class="ms-all-invoices">%s</a>', $detail_url, $invoices_details_label);
                }
                ?>
				</h2>
				<?php 
                /**
                 * Add custom content right before the invoice overview list.
                 *
                 * @since  1.0.0
                 */
                do_action('ms_view_account_invoices_top', $member, $this);
                ?>
				<table>
					<thead>
						<tr>
							<th class="ms-col-invoice-no"><?php 
                _e('Invoice #', 'membership2');
                ?>
</th>
							<th class="ms-col-invoice-status"><?php 
                _e('Status', 'membership2');
                ?>
</th>
							<th class="ms-col-invoice-total"><?php 
                printf('%s (%s)', __('Total', 'membership2'), MS_Plugin::instance()->settings->currency);
                ?>
</th>
							<th class="ms-col-invoice-title"><?php 
                _e('Membership', 'membership2');
                ?>
</th>
							<th class="ms-col-invoice-due"><?php 
                _e('Due date', 'membership2');
                ?>
</th>
						</tr>
					</thead>
					<tbody>
					<?php 
                foreach ($this->data['invoices'] as $invoice) {
                    $inv_membership = MS_Factory::load('MS_Model_Membership', $invoice->membership_id);
                    $inv_classes = array('ms-invoice-' . $invoice->id, 'ms-subscription-' . $invoice->ms_relationship_id, 'ms-invoice-' . $invoice->status, 'ms-gateway-' . $invoice->gateway_id, 'ms-membership-' . $invoice->membership_id, 'ms-type-' . $inv_membership->type, 'ms-payment-' . $inv_membership->payment_type);
                    ?>
						<tr class="<?php 
                    echo esc_attr(implode(' ', $inv_classes));
                    ?>
">
							<td class="ms-col-invoice-no"><?php 
                    printf('<a href="%s">%s</a>', get_permalink($invoice->id), $invoice->get_invoice_number());
                    ?>
</td>
							<td class="ms-col-invoice-status"><?php 
                    echo esc_html($invoice->status_text());
                    ?>
</td>
							<td class="ms-col-invoice-total"><?php 
                    echo esc_html(MS_Helper_Billing::format_price($invoice->total));
                    ?>
</td>
							<td class="ms-col-invoice-title"><?php 
                    echo esc_html($inv_membership->name);
                    ?>
</td>
							<td class="ms-col-invoice-due"><?php 
                    echo esc_html(MS_Helper_Period::format_date($invoice->due_date, __('F j', 'membership2')));
                    ?>
</td>
						</tr>
					<?php 
                }
                ?>
					</tbody>
				</table>
				<?php 
                /**
                 * Add custom content right after the invoices overview list.
                 *
                 * @since  1.0.0
                 */
                do_action('ms_view_account_invoices_bottom', $member, $this);
                ?>
				</div>
				<?php 
            }
            // END: if ( $show_invoices )
            // =============================================================
            ?>

				<?php 
            // ==================================================== ACTIVITY
            if ($show_activity) {
                ?>
				<div id="account-activity">
				<h2>
					<?php 
                echo $activity_title;
                if ($show_all_activities) {
                    $detail_url = esc_url_raw(add_query_arg(array('action' => MS_Controller_Frontend::ACTION_VIEW_ACTIVITIES)));
                    printf('<a href="%s" class="ms-all-activities">%s</a>', $detail_url, $activity_details_label);
                }
                ?>
				</h2>
				<?php 
                /**
                 * Add custom content right before the activities overview list.
                 *
                 * @since  1.0.0
                 */
                do_action('ms_view_account_activity_top', $member, $this);
                ?>
				<table>
					<thead>
						<tr>
							<th class="ms-col-activity-date"><?php 
                _e('Date', 'membership2');
                ?>
</th>
							<th class="ms-col-activity-title"><?php 
                _e('Activity', 'membership2');
                ?>
</th>
						</tr>
					</thead>
					<tbody>
					<?php 
                foreach ($this->data['events'] as $event) {
                    $ev_classes = array('ms-activity-topic-' . $event->topic, 'ms-activity-type-' . $event->type, 'ms-membership-' . $event->membership_id);
                    ?>
						<tr class="<?php 
                    echo esc_attr(implode(' ', $ev_classes));
                    ?>
">
							<td class="ms-col-activity-date"><?php 
                    echo esc_html(MS_Helper_Period::format_date($event->post_modified));
                    ?>
</td>
							<td class="ms-col-activity-title"><?php 
                    echo esc_html($event->description);
                    ?>
</td>
						</tr>
					<?php 
                }
                ?>
					</tbody>
				</table>
				<?php 
                /**
                 * Add custom content right after the activities overview list.
                 *
                 * @since  1.0.0
                 */
                do_action('ms_view_account_activity_bottom', $member, $this);
                ?>
				</div>
				<?php 
            }
            // END: if ( $show_activity )
            // =============================================================
            ?>

			<?php 
        } else {
            $has_login_form = MS_Helper_Shortcode::has_shortcode(MS_Helper_Shortcode::SCODE_LOGIN, $post->post_content);
            if (!$has_login_form) {
                $redirect = esc_url_raw(add_query_arg(array()));
                $title = __('Your account', 'membership2');
                $scode = sprintf('[%1$s redirect="%2$s" title="%3$s"]', MS_Helper_Shortcode::SCODE_LOGIN, esc_url($redirect), esc_attr($title));
                echo do_shortcode($scode);
            }
        }
        ?>
		</div>
		<?php 
        $html = ob_get_clean();
        $html = apply_filters('ms_compact_code', $html);
        return apply_filters('ms_shortcode_account', $html, $this->data);
    }
    /**
     * Returns the HTML code for the Purchase-Membership form.
     *
     * @since  1.0.0
     * @return string
     */
    public function to_html()
    {
        $membership = $this->data['membership'];
        $invoice = $this->data['invoice'];
        $subscription = $this->data['ms_relationship'];
        $class = 'ms-alert-success';
        $msg = __('Please check the details of the membership below and click ' . 'on the relevant button to complete the signup.', 'membership2');
        if (!empty($this->data['error'])) {
            $class = 'ms-alert-error';
            $msg = $this->data['error'];
        }
        /**
         * Log the users IP and current timestamp inside the invoice.
         *
         * @since 1.0.2.0
         */
        $invoice->checkout_ip = lib3()->net->current_ip()->ip;
        $invoice->checkout_date = date('Y-m-d H:i:s');
        $invoice->save();
        $cancel_warning = false;
        if (!MS_Model_Member::is_admin_user()) {
            if (!MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_MULTI_MEMBERSHIPS)) {
                // Member can only sign up to one membership.
                $valid_status = array(MS_Model_Relationship::STATUS_TRIAL, MS_Model_Relationship::STATUS_ACTIVE, MS_Model_Relationship::STATUS_PENDING);
                foreach ($this->data['member']->subscriptions as $tmp_subscription) {
                    if ($tmp_subscription->is_system()) {
                        continue;
                    }
                    if (in_array($tmp_subscription->status, $valid_status)) {
                        $cancel_warning = __('Your other Memberships will be cancelled when you complete this payment.', 'membership2');
                        break;
                    }
                }
            } elseif ($subscription->move_from_id) {
                $move_from_ids = explode(',', $subscription->move_from_id);
                $names = array();
                foreach ($move_from_ids as $id) {
                    $ms = MS_Factory::load('MS_Model_Membership', $id);
                    if ($ms->is_system()) {
                        continue;
                    }
                    $names[] = $ms->name;
                }
                if (1 == count($names)) {
                    $cancel_warning = sprintf(__('When you complete this payment your Membership "%s" will be cancelled.', 'membership2'), $names[0]);
                } elseif (1 < count($names)) {
                    $cancel_warning = sprintf(__('When you complete this payment the following Memberships will be cancelled: %s.', 'membership2'), implode(', ', $names));
                }
            }
        }
        // Check if the user goes through a trial period before first payment.
        $is_trial = $invoice->uses_trial;
        $skip_form = !MS_Model_Member::is_admin_user() && !$cancel_warning && $membership->is_free();
        /**
         * Filter the flag to allow Add-ons like "Invitation codes" to override
         * the state and force the form to display.
         *
         * @var bool
         */
        $skip_form = apply_filters('ms_view_frontend_payment_skip_form', $skip_form, $invoice, $this);
        if ($skip_form) {
            // No confirmation required. Simply register for this membership!
            $args = array();
            $args['ms_relationship_id'] = $subscription->id;
            $args['gateway'] = MS_Gateway_Free::ID;
            $args['step'] = MS_Controller_Frontend::STEP_PROCESS_PURCHASE;
            $args['_wpnonce'] = wp_create_nonce($args['gateway'] . '_' . $args['ms_relationship_id']);
            $url = esc_url_raw(add_query_arg($args));
            /*
             * Very likely the html output has already began.
             * So we redirect by using javascript.
             */
            ?>
			<script>window.location.href = '<?php 
            echo $url;
            ?>
';</script>
			<?php 
            exit;
        }
        $show_tax = MS_Model_Addon::is_enabled(MS_Addon_Taxamo::ID);
        /**
         * Trigger an action before the payment form is displayed. This hook
         * can be used by Add-ons or plugins to initialize payment settings or
         * add custom code.
         */
        do_action('ms_view_frontend_payment_form_start', $invoice, $this);
        $classes = array('ms-membership-form-wrapper', 'ms-subscription-' . $subscription->id, 'ms-invoice-' . $invoice->id);
        ob_start();
        ?>
		<div class="<?php 
        echo esc_attr(implode(' ', $classes));
        ?>
">
			<legend><?php 
        _e('Join Membership', 'membership2');
        ?>
</legend>
			<p class="ms-alert-box <?php 
        echo esc_attr($class);
        ?>
">
				<?php 
        echo $msg;
        ?>
			</p>
			<table class="ms-purchase-table">
				<tr>
					<td class="ms-title-column">
						<?php 
        _e('Name', 'membership2');
        ?>
					</td>
					<td class="ms-details-column">
						<?php 
        echo esc_html($membership->name);
        ?>
					</td>
				</tr>

				<?php 
        if ($membership->description) {
            ?>
					<tr>
						<td class="ms-title-column">
							<?php 
            _e('Description', 'membership2');
            ?>
						</td>
						<td class="ms-desc-column">
							<span class="ms-membership-description"><?php 
            echo $membership->get_description();
            ?>
</span>
						</td>
					</tr>
				<?php 
        }
        ?>

				<?php 
        if (!$membership->is_free()) {
            ?>
					<?php 
            if ($invoice->discount || $invoice->pro_rate || $invoice->tax_rate) {
                ?>
					<tr>
						<td class="ms-title-column">
							<?php 
                _e('Price', 'membership2');
                ?>
						</td>
						<td class="ms-details-column">
							<?php 
                if ($membership->price > 0) {
                    printf('<span class="price">%s %s</span>', $invoice->currency, MS_Helper_Billing::format_price($membership->price));
                } else {
                    _e('Free', 'membership2');
                }
                ?>
						</td>
					</tr>
					<?php 
            }
            ?>

					<?php 
            if ($invoice->discount) {
                ?>
						<tr>
							<td class="ms-title-column">
								<?php 
                _e('Coupon Discount', 'membership2');
                ?>
							</td>
							<td class="ms-price-column">
								<?php 
                printf('%s -%s', $invoice->currency, MS_Helper_Billing::format_price($invoice->discount));
                ?>
							</td>
						</tr>
					<?php 
            }
            ?>

					<?php 
            if ($invoice->pro_rate) {
                ?>
						<tr>
							<td class="ms-title-column">
								<?php 
                _e('Pro-Rate Discount', 'membership2');
                ?>
							</td>
							<td class="ms-price-column">
								<?php 
                printf('%s -%s', $invoice->currency, MS_Helper_Billing::format_price($invoice->pro_rate));
                ?>
							</td>
						</tr>
					<?php 
            }
            ?>

					<?php 
            if ($show_tax) {
                ?>
						<tr>
							<td class="ms-title-column">
								<?php 
                printf(__('Taxes %s', 'membership2'), '<a href="#" class="ms-tax-editor"><small>(' . $invoice->tax_name . ')</small></a>');
                ?>
							</td>
							<td class="ms-price-column">
								<?php 
                printf('%s %s', $invoice->currency, MS_Helper_Billing::format_price($invoice->tax));
                ?>
							</td>
						</tr>
					<?php 
            }
            ?>

					<tr>
						<td class="ms-title-column">
							<?php 
            _e('Total', 'membership2');
            ?>
						</td>
						<td class="ms-price-column ms-total">
							<?php 
            if ($invoice->total > 0) {
                printf('<span class="price">%s %s</span>', $invoice->currency, MS_Helper_Billing::format_price($invoice->total));
            } else {
                _e('Free', 'membership2');
            }
            ?>
						</td>
					</tr>

					<?php 
            if ($is_trial) {
                ?>
						<tr>
							<td class="ms-title-column">
								<?php 
                _e('Payment due', 'membership2');
                ?>
							</td>
							<td class="ms-desc-column"><?php 
                echo MS_Helper_Period::format_date($invoice->due_date);
                ?>
</td>
						</tr>
						<tr>
							<td class="ms-title-column">
								<?php 
                _e('Trial price', 'membership2');
                ?>
							</td>
							<td class="ms-desc-column">
							<?php 
                if ($invoice->trial_price > 0) {
                    printf('<span class="price">%s %s</span>', $invoice->currency, MS_Helper_Billing::format_price($invoice->trial_price));
                } else {
                    _e('Free', 'membership2');
                }
                ?>
							</td>
						</tr>
					<?php 
            }
            ?>

					<?php 
            do_action('ms_view_frontend_payment_after_total_row', $subscription, $invoice, $this);
            ?>

					<tr>
						<td class="ms-desc-column" colspan="2">
							<span class="ms-membership-description"><?php 
            echo $subscription->get_payment_description($invoice);
            ?>
</span>
						</td>
					</tr>
				<?php 
        }
        ?>

				<?php 
        if ($cancel_warning) {
            ?>
					<tr>
						<td class="ms-desc-warning" colspan="2">
							<span class="ms-cancel-other-memberships"><?php 
            echo $cancel_warning;
            ?>
</span>
						</td>
					</tr>
				<?php 
        }
        if (MS_Model_Member::is_admin_user()) {
            ?>
					<tr>
						<td class="ms-desc-adminnote" colspan="2">
							<em><?php 
            _e('As admin user you already have access to this membership', 'membership2');
            ?>
</em>
						</td>
					</tr>
				<?php 
        } else {
            do_action('ms_view_frontend_payment_purchase_button', $subscription, $invoice, $this);
        }
        ?>
			</table>
		</div>
		<?php 
        do_action('ms_view_frontend_payment_after', $this->data, $this);
        do_action('ms_show_prices');
        if ($show_tax) {
            do_action('ms_tax_editor', $invoice);
        }
        ?>
		<div style="clear:both;"></div>
		<?php 
        $html = ob_get_clean();
        $html = apply_filters('ms_compact_code', $html);
        $html = apply_filters('ms_view_frontend_payment_form', $html, $this);
        return $html;
    }