/**
  * Prepare the fields displayed in the form.
  *
  * @since  1.0.0
  * @return array
  */
 public function prepare_fields()
 {
     $membership = $this->data['membership'];
     $fields = array('type' => array('id' => 'type', 'type' => MS_Helper_Html::INPUT_TYPE_RADIO, 'value' => $membership->type ? $membership->type : MS_Model_Membership::TYPE_STANDARD, 'class' => 'ms-choose-type', 'field_options' => array(MS_Model_Membership::TYPE_STANDARD => array('text' => __('Standard Membership', MS_TEXT_DOMAIN), 'desc' => __('Make your content available to Members and hidden to Guests (logged-out users).', MS_TEXT_DOMAIN)), MS_Model_Membership::TYPE_DRIPPED => array('text' => __('Dripped Content Membership.', MS_TEXT_DOMAIN), 'desc' => __('Set-up membership content to be released / made available in intervals.', MS_TEXT_DOMAIN)), MS_Model_Membership::TYPE_GUEST => array('text' => __('Guest Membership', MS_TEXT_DOMAIN), 'desc' => __('Make your content available only to Guests (logged-out users).', MS_TEXT_DOMAIN)), MS_Model_Membership::TYPE_USER => array('text' => __('Default Membership', MS_TEXT_DOMAIN), 'desc' => __('Content is available to all logged-in users that did not join any other Membership yet.', MS_TEXT_DOMAIN)))), 'name' => array('id' => 'name', 'type' => MS_Helper_Html::INPUT_TYPE_TEXT, 'title' => __('Name Your Membership:', MS_TEXT_DOMAIN), 'value' => $membership->name, 'class' => 'ms-text-large', 'placeholder' => __('Choose a name that will identify this membership...', MS_TEXT_DOMAIN), 'label_type' => 'h3'), 'config_fields' => array('public' => array('id' => 'public', 'type' => MS_Helper_Html::INPUT_TYPE_CHECKBOX, 'title' => __('Allow users to register for this membership.', MS_TEXT_DOMAIN), 'desc' => __('If selected, registration experience will be added to your site. Do not tick if you want to make this a private membership.', MS_TEXT_DOMAIN), 'after' => sprintf('<span class="locked-info">%1$s</span>', __('Not available for the Guest Membership', MS_TEXT_DOMAIN)), 'value' => !$membership->private), 'public_flag' => array('id' => 'set_public_flag', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => 1), 'paid' => array('id' => 'paid', 'type' => MS_Helper_Html::INPUT_TYPE_CHECKBOX, 'title' => __('This is a paid membership.', MS_TEXT_DOMAIN), 'desc' => __('Choose this if you want to receive payments from members via Payment Gateways.', MS_TEXT_DOMAIN), 'after' => sprintf('<span class="locked-info">%1$s</span>', __('Not available for the Guest Membership', MS_TEXT_DOMAIN)), 'value' => !$membership->is_free()), 'paid_flag' => array('id' => 'set_paid_flag', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => 1)), 'control_fields' => array('membership_id' => array('id' => 'membership_id', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $membership->id), 'step' => array('id' => 'step', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $this->data['step']), 'action' => array('id' => 'action', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => $this->data['action']), '_wpnonce' => array('id' => '_wpnonce', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => wp_create_nonce($this->data['action'])), 'cancel' => array('id' => 'cancel', 'type' => MS_Helper_Html::INPUT_TYPE_BUTTON, 'value' => __('Cancel', MS_TEXT_DOMAIN), 'data_ms' => array('action' => MS_Controller_Settings::AJAX_ACTION_UPDATE_SETTING, 'field' => 'initial_setup', 'value' => '0')), 'save' => array('id' => 'save', 'type' => MS_Helper_Html::INPUT_TYPE_SUBMIT, 'value' => __('Save and continue', MS_TEXT_DOMAIN) . ' &raquo;')));
     // Only one Guest Membership can be added
     if (MS_Model_Membership::get_guest()->is_valid()) {
         unset($fields['type']['field_options'][MS_Model_Membership::TYPE_GUEST]);
     }
     // Only one User Membership can be added
     if (MS_Model_Membership::get_user()->is_valid()) {
         unset($fields['type']['field_options'][MS_Model_Membership::TYPE_USER]);
     }
     // Wizard can only be cancelled when at least one membership exists in DB.
     $count = MS_Model_Membership::get_membership_count();
     if (!$count) {
         unset($fields['control_fields']['cancel']);
     }
     return $fields;
 }
 /**
  * Initialise current member.
  *
  * Get current member and membership relationships.
  * If user is not logged in (visitor), assign a visitor membership.
  * If user is logged in but has not any memberships, assign a default membership.
  * Deactivated users (active == false) get visitor membership assigned.
  *
  * @since  1.0.0
  */
 public function init_member()
 {
     do_action('ms_load_member', $this);
     $this->member = MS_Model_Member::get_current_member();
     if (MS_Plugin::is_enabled()) {
         if (!is_user_logged_in()) {
             // If a Guest-Membership exists we also assign it to the user.
             $ms_guest = MS_Model_Membership::get_guest();
             if ($ms_guest->is_valid() && $ms_guest->active) {
                 $this->member->add_membership($ms_guest->id);
             }
         } elseif (!$this->member->has_membership()) {
             // Apply User-Membership to logged-in users without subscriptions.
             $ms_user = MS_Model_Membership::get_user();
             if ($ms_user->is_valid() && $ms_user->active) {
                 $this->member->add_membership($ms_user->id);
             }
         } elseif (!$this->member->is_member) {
             $this->member->subscriptions = array();
         }
         // No subscription: Assign the base membership, which only denies access.
         if (!$this->member->has_membership()) {
             $this->member->add_membership(MS_Model_Membership::get_base()->id);
         }
     }
     /**
      * At this point the plugin is initialized and we are here:
      *   - All Add-Ons are registered
      *   - All Rules are registered
      *   - Know the current User
      *     - All Subscriptions/Memberships of the user are loaded
      *     - System memberships are already assigned (guest/base)
      *   - Payment gateways are registered
      *   - Communication settings are loaded
      *
      * Next we tell everybody that we are ready to get serious!
      *
      * What happens next:
      *   1. All Membership-Rules are initialized/merged
      *   2. Front-End Protection is applied
      *   3. Admin-Side Protection is applied
      */
     do_action('ms_init_done', $this);
 }