public function to_html()
    {
        $membership = MS_Model_Membership::get_base();
        $rule = $membership->get_rule(MS_Rule_CptItem::RULE_ID);
        $rule_listtable = new MS_Rule_CptItem_ListTable($rule);
        $rule_listtable->prepare_items();
        $header_data = apply_filters('ms_view_membership_protectedcontent_header', array('title' => __('Choose Custom Post Types you want to protect', MS_TEXT_DOMAIN), 'desc' => ''), MS_Rule_CptItem::RULE_ID, $this);
        ob_start();
        ?>
		<div class="ms-settings">
			<?php 
        MS_Helper_Html::settings_tab_header($header_data);
        $rule_listtable->views();
        $rule_listtable->search_box(__('Posts', MS_TEXT_DOMAIN));
        ?>
			<form action="" method="post">
				<?php 
        $rule_listtable->display();
        do_action('ms_view_membership_protectedcontent_footer', MS_Rule_CptItem::RULE_ID, $this);
        ?>
			</form>
		</div>
		<?php 
        MS_Helper_Html::settings_footer();
        return ob_get_clean();
    }
 /**
  * Initialize the rule object.
  *
  * @since  4.6
  */
 protected function init()
 {
     global $wpdb;
     $this->filename = basename(__FILE__);
     // 'pc_subscription' rule.
     $this->add_rule('pc_subscription', __('For Members (Membership 2)', PO_LANG), __('Only shows the PopUp if the user has subscribed to a certain Membership (Membership2 plugin).', PO_LANG), 'pc_unsubscription', 25);
     // 'pc_unsubscription' rule.
     $this->add_rule('pc_unsubscription', __('For Non-Members (Membership 2)', PO_LANG), __('Only shows the PopUp if the user has not yet subscribed to a certain Membership (Membership2 plugin).', PO_LANG), 'pc_subscription', 25);
     // -- Initialize rule.
     /**
      * Note we're not using the M2 API yet, because it was introduced only
      * a few releases back and some people that use older version of M2/PC
      * will have problems if we do.
      *
      * @todo replace with official API function anytime in 2016
      *
      * $this->is_active = false;
      * if ( apply_filters( 'ms_active', false ) ) {
      *   $this->is_active = true;
      *   $this->memberships = MS_Plugin::$api->list_memberships( true );
      * }
      *
      */
     $this->is_active = class_exists('MS_Plugin');
     if (!$this->is_active) {
         return;
     }
     $args = array('include_base' => false, 'include_guest' => true);
     $list = MS_Model_Membership::get_memberships($args);
     $this->memberships = $list;
 }
    public function to_html()
    {
        $membership = MS_Model_Membership::get_base();
        $rule = $membership->get_rule(MS_Rule_Adminside::RULE_ID);
        $rule_listtable = new MS_Rule_Adminside_ListTable($rule);
        $rule_listtable->prepare_items();
        $header_data = apply_filters('ms_view_membership_protectedcontent_header', array('title' => __('Protect Admin Side pages', 'membership2'), 'desc' => array(__('Note that WordPress also restricts access to pages before Content Protection is applied.', 'membership2'), __('Tip: Combine with the <b>User Role</b> rules to grant your members additional permission if required!', 'membership2'))), MS_Rule_Adminside::RULE_ID, $this);
        ob_start();
        ?>
		<div class="ms-settings">
			<?php 
        MS_Helper_Html::settings_tab_header($header_data);
        $rule_listtable->views();
        $rule_listtable->search_box();
        ?>
			<form action="" method="post">
				<?php 
        $rule_listtable->display();
        do_action('ms_view_membership_protectedcontent_footer', MS_Rule_Adminside::RULE_ID, $this);
        ?>
			</form>
		</div>
		<?php 
        MS_Helper_Html::settings_footer();
        return ob_get_clean();
    }
    public function to_html()
    {
        $membership = MS_Model_Membership::get_base();
        $rule = $membership->get_rule(MS_Rule_Page::RULE_ID);
        $rule_listtable = new MS_Rule_Page_ListTable($rule);
        $rule_listtable->prepare_items();
        $header_data = apply_filters('ms_view_membership_protectedcontent_header', array('title' => __('Apply protection to Pages and and grant access to members', 'membership2'), 'desc' => __('All pages that do not have Content Protection applied are visible to Everyone', 'membership2')), MS_Rule_Page::RULE_ID, $this);
        ob_start();
        ?>
		<div class="ms-settings">
			<?php 
        MS_Helper_Html::settings_tab_header($header_data);
        $rule_listtable->views();
        $rule_listtable->search_box(__('Pages', 'membership2'));
        ?>
			<form action="" method="post">
				<?php 
        $rule_listtable->display();
        do_action('ms_view_membership_protectedcontent_footer', MS_Rule_Page::RULE_ID, $this);
        ?>
			</form>
		</div>
		<?php 
        MS_Helper_Html::settings_footer();
        return ob_get_clean();
    }
    public function to_html()
    {
        $membership = MS_Model_Membership::get_base();
        $rule = $membership->get_rule(MS_Rule_MemberRoles::RULE_ID);
        $rule_listtable = new MS_Rule_MemberRoles_ListTable($rule);
        $rule_listtable->prepare_items();
        $header_data['title'] = __('Assign WordPress User Roles to your Members', MS_TEXT_DOMAIN);
        $header_data['desc'] = array(__('When assigning a Membership to any role, then this role will be added to all members of that Membership. You can even assign multiple roles to a single Membership.', MS_TEXT_DOMAIN), __('For security reasons the Administrator role cannot be assigned to a Membership.', MS_TEXT_DOMAIN));
        $header_data = apply_filters('ms_view_membership_protectedcontent_header', $header_data, MS_Rule_MemberRoles::RULE_ID, $this);
        ob_start();
        ?>
		<div class="ms-settings">
			<?php 
        MS_Helper_Html::settings_tab_header($header_data);
        $rule_listtable->views();
        $rule_listtable->search_box(__('Capability', MS_TEXT_DOMAIN));
        ?>
			<form action="" method="post">
				<?php 
        $rule_listtable->display();
        do_action('ms_view_membership_protectedcontent_footer', MS_Rule_MemberRoles::RULE_ID, $this);
        ?>
			</form>
		</div>
		<?php 
        MS_Helper_Html::settings_footer();
        return ob_get_clean();
    }
    public function to_html()
    {
        $membership = MS_Model_Membership::get_base();
        $rule = $membership->get_rule(MS_Rule_Content::RULE_ID);
        // This fixes the list-title generated by MS_Helper_ListTable_Rule.
        unset($_GET['status']);
        $rule_listtable = new MS_Rule_Content_ListTable($rule);
        $rule_listtable->prepare_items();
        $header_data = apply_filters('ms_view_membership_protectedcontent_header', array('title' => __('Comments & More Tag', MS_TEXT_DOMAIN), 'desc' => __('Decide how to protect Comments and More Tag contents.', MS_TEXT_DOMAIN)), MS_Rule_Content::RULE_ID, $this);
        ob_start();
        ?>
		<div class="ms-settings">
			<?php 
        MS_Helper_Html::settings_tab_header($header_data);
        $rule_listtable->views();
        $rule_listtable->search_box(__('Pages', MS_TEXT_DOMAIN));
        ?>
			<form action="" method="post">
				<?php 
        $rule_listtable->display();
        do_action('ms_view_membership_protectedcontent_footer', MS_Rule_Content::RULE_ID, $this);
        ?>
			</form>
		</div>
		<?php 
        MS_Helper_Html::settings_footer();
        return ob_get_clean();
    }
    public function to_html()
    {
        $membership = MS_Model_Membership::get_base();
        $rule = $membership->get_rule(MS_Rule_Category::RULE_ID);
        $rule_listtable = new MS_Rule_Category_ListTable($rule);
        $rule_listtable->prepare_items();
        $header_data = array();
        $header_data['title'] = __('Choose which Categories you want to protect', 'membership2');
        $header_data['desc'] = '';
        $header_data = apply_filters('ms_view_membership_protectedcontent_header', $header_data, MS_Rule_Category::RULE_ID, $this);
        ob_start();
        ?>
		<div class="ms-settings ">
			<?php 
        MS_Helper_Html::settings_tab_header($header_data);
        $rule_listtable->views();
        $rule_listtable->search_box(__('Categories', 'membership2'), 'search-cat');
        ?>
			<form action="" method="post">
				<?php 
        $rule_listtable->display();
        do_action('ms_view_membership_protectedcontent_footer', MS_Rule_Category::RULE_ID, $this);
        ?>
			</form>
		</div>
		<?php 
        MS_Helper_Html::settings_footer();
        return ob_get_clean();
    }
    public function to_html()
    {
        $membership = MS_Model_Membership::get_base();
        $rule = $membership->get_rule(MS_Rule_MemberCaps::RULE_ID);
        $rule_listtable = new MS_Rule_MemberCaps_ListTable($rule);
        $rule_listtable->prepare_items();
        $header_data = array();
        $header_data['title'] = __('Assign WordPress Capabilities to your Members', 'membership2');
        $header_data['desc'] = array(__('Fine-tune member permissions by assigning certain Capabilities to each Membership. All Members of that Membership are granted the specified Capabilities.', 'membership2'), __('Important: All users that are not inside these Memberships will be striped of any Protected Capability!', 'membership2'), __('You should only use these rules if you know what you are doing! Granting the wrong capabilities makes your website prone to abuse. For a bit of security we already removed the most critical Capabilities from this list.', 'membership2'));
        $header_data = apply_filters('ms_view_membership_protectedcontent_header', $header_data, MS_Rule_MemberCaps::RULE_ID, $this);
        ob_start();
        ?>
		<div class="ms-settings">
			<?php 
        MS_Helper_Html::settings_tab_header($header_data);
        $rule_listtable->views();
        $rule_listtable->search_box(__('Capability', 'membership2'));
        ?>
			<form action="" method="post">
				<?php 
        $rule_listtable->display();
        do_action('ms_view_membership_protectedcontent_footer', MS_Rule_MemberCaps::RULE_ID, $this);
        ?>
			</form>
		</div>
		<?php 
        MS_Helper_Html::settings_footer();
        return ob_get_clean();
    }
    public function to_html()
    {
        $membership = MS_Model_Membership::get_base();
        $rule = $membership->get_rule(MS_Rule_ReplaceMenu::RULE_ID);
        // This fixes the list-title generated by MS_Helper_ListTable_Rule.
        unset($_GET['status']);
        $listtable = new MS_Rule_ReplaceMenu_ListTable($rule);
        $listtable->prepare_items();
        $header_data = apply_filters('ms_view_membership_protectedcontent_header', array('title' => __('Replace Menus', 'membership2'), 'desc' => __('Replace or protect WordPress menus.', 'membership2')), MS_Rule_ReplaceMenu::RULE_ID, $this);
        ob_start();
        ?>
		<div class="ms-settings">
			<?php 
        MS_Helper_Html::settings_tab_header($header_data);
        $listtable->views();
        $listtable->search_box();
        ?>
			<form action="" method="post">
				<?php 
        $listtable->display();
        do_action('ms_view_membership_protectedcontent_footer', MS_Rule_ReplaceMenu::RULE_ID, $this);
        ?>
			</form>
		</div>
		<?php 
        MS_Helper_Html::settings_footer();
        return ob_get_clean();
    }
 /**
  * Prepares fields for the edit form.
  *
  * @since  1.0.1.0
  * @return array
  */
 protected function get_fields()
 {
     $args = array('include_guest' => false);
     $memberships = MS_Model_Membership::get_memberships($args);
     $membership = $this->data['membership'];
     $action = MS_Controller_Membership::AJAX_ACTION_UPDATE_MEMBERSHIP;
     $nonce = wp_create_nonce($action);
     $fields = array();
     /*
      * The value of "allow_val" is negated, because the radio-slider is
      * reversed. So allow_val == false means that upgrading is allowed.
      *
      * This is just a UI tweak, the function ->update_allowed() returns true
      * when upgrading is allowed.
      */
     $list = array();
     $list['guest'] = array('allow' => __('Users without Membership can subscribe', 'membership2'), 'allow_val' => !$membership->update_allowed('guest'));
     foreach ($memberships as $item) {
         if ($item->id == $membership->id) {
             continue;
         }
         $list[$item->id] = array('allow' => sprintf(__('Members of %s can subscribe', 'membership2'), $item->get_name_tag()), 'allow_val' => !$membership->update_allowed($item->id));
         if (MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_MULTI_MEMBERSHIPS)) {
             $list[$item->id]['replace'] = sprintf(__('Cancel %s on subscription', 'membership2'), $item->get_name_tag());
             $list[$item->id]['replace_val'] = $membership->update_replaces($item->id);
         }
     }
     foreach ($list as $id => $data) {
         $fields[] = array('id' => 'deny_update[' . $id . ']', 'type' => MS_Helper_Html::INPUT_TYPE_RADIO_SLIDER, 'title' => $data['allow'], 'value' => $data['allow_val'], 'before' => __('Allow', 'membership2'), 'after' => __('Deny', 'membership2'), 'class' => 'reverse', 'wrapper_class' => 'ms-block inline-label ms-allow', 'ajax_data' => array(1));
         if (!empty($data['replace'])) {
             if (MS_Addon_Prorate::is_active()) {
                 $after_label = __('Cancel and Pro-Rate', 'membership2');
             } else {
                 $after_label = __('Cancel', 'membership2');
             }
             $fields[] = array('id' => 'replace_update[' . $id . ']', 'type' => MS_Helper_Html::INPUT_TYPE_RADIO_SLIDER, 'title' => $data['replace'], 'value' => $data['replace_val'], 'before' => __('Keep', 'membership2'), 'after' => $after_label, 'class' => 'reverse', 'wrapper_class' => 'ms-block inline-label ms-update-replace', 'ajax_data' => array(1));
         }
         $fields[] = array('type' => MS_Helper_Html::TYPE_HTML_SEPARATOR);
     }
     foreach ($fields as $key => $field) {
         if (!empty($field['ajax_data'])) {
             if (!empty($field['ajax_data']['action'])) {
                 continue;
             }
             if (!isset($fields[$key]['ajax_data']['field'])) {
                 $fields[$key]['ajax_data']['field'] = $fields[$key]['id'];
             }
             $fields[$key]['ajax_data']['_wpnonce'] = $nonce;
             $fields[$key]['ajax_data']['action'] = $action;
             $fields[$key]['ajax_data']['membership_id'] = $membership->id;
         }
     }
     return $fields;
 }
 public function prepare_items()
 {
     $this->_column_headers = array($this->get_columns(), $this->get_hidden_columns(), $this->get_sortable_columns());
     $args = array();
     if (!empty($_REQUEST['orderby']) && !empty($_REQUEST['order'])) {
         $args['orderby'] = $_REQUEST['orderby'];
         $args['order'] = $_REQUEST['order'];
     }
     // Prepare order by statement.
     if (!empty($args['orderby']) && property_exists('MS_Model_Membership', $args['orderby'])) {
         $args['meta_key'] = $args['orderby'];
         $args['orderby'] = 'meta_value';
     }
     $this->items = apply_filters('membership_helper_listtable_membership_items', MS_Model_Membership::get_memberships($args));
 }
 public function column_membership($item)
 {
     $html = '';
     $is_any = true;
     foreach ($item->membership_id as $id) {
         if (MS_Model_Membership::is_valid_membership($id)) {
             $is_any = false;
             $membership = MS_Factory::load('MS_Model_Membership', $id);
             $html .= sprintf('<span class="ms-bold">%s</span><br />', $membership->name);
         }
     }
     if ($is_any) {
         $html = sprintf('<span class="ms-low">%s</span>', __('Any', 'membership2'));
     }
     return $html;
 }
    public function to_html()
    {
        $membership = MS_Model_Membership::get_base();
        $rule = $membership->get_rule(MS_Rule_Url::RULE_ID);
        $listtable = new MS_Rule_Url_ListTable($rule);
        $listtable->prepare_items();
        if ($listtable->list_shows_base_items()) {
            $add_fields = array('url' => array('id' => 'url_value', 'title' => __('Add new URL Address', 'membership2'), 'type' => MS_Helper_Html::INPUT_TYPE_TEXT, 'class' => 'ms-text-medium'), 'url_add' => array('id' => 'url_add', 'type' => MS_Helper_Html::INPUT_TYPE_SUBMIT, 'value' => __('Protect this URL', 'membership2'), 'button_type' => 'button'), 'url_action' => array('name' => 'rule_action', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => MS_Rule_Url::ACTION_ADD), 'url_nonce' => array('name' => '_wpnonce', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'value' => wp_create_nonce(MS_Rule_Url::ACTION_ADD)));
        }
        $header_data = apply_filters('ms_view_membership_protectedcontent_header', array('title' => __('URL Restriction', 'membership2'), 'desc' => array(__('Specify URLs that you want to protect.', 'membership2'), __('e.g. <b>example.com/protectme/</b> will protect all URLs that contain <b>example.com/protectme/</b>, including any child page.', 'membership2')), 'class' => ''), MS_Rule_Url::RULE_ID, $this);
        ob_start();
        ?>
		<div class="ms-settings">
			<?php 
        MS_Helper_Html::settings_tab_header($header_data);
        ?>

			<form action="" method="post">
			<?php 
        if ($listtable->list_shows_base_items()) {
            foreach ($add_fields as $field) {
                MS_Helper_Html::html_element($field);
            }
        }
        ?>
			</form>

			<?php 
        $listtable->views();
        $listtable->search_box();
        ?>
			<form action="" method="post">
				<?php 
        $listtable->display();
        do_action('ms_view_membership_protectedcontent_footer', MS_Rule_Url::RULE_ID, $this);
        ?>
			</form>
		</div>
		<?php 
        MS_Helper_Html::settings_footer();
        return ob_get_clean();
    }
    /**
     * Display a filter to select the current membership
     *
     * @since  1.0.0
     */
    public function membership_filter()
    {
        $memberships = MS_Model_Membership::get_membership_names(array('active' => true, 'include_guest' => false));
        $url = esc_url_raw(remove_query_arg(array('membership_id', 'paged')));
        $links = array();
        $links['all'] = array('label' => __('All', MS_TEXT_DOMAIN), 'url' => $url);
        foreach ($memberships as $id => $name) {
            if (empty($name)) {
                $name = __('(No Name)', MS_TEXT_DOMAIN);
            }
            $filter_url = esc_url_raw(add_query_arg(array('membership_id' => $id), $url));
            $links['ms-' . $id] = array('label' => esc_html($name), 'url' => $filter_url);
        }
        ?>
		<div class="wp-filter">
			<ul class="filter-links">
				<?php 
        foreach ($links as $key => $item) {
            $is_current = MS_Helper_Utility::is_current_url($item['url']);
            $class = $is_current ? 'current' : '';
            ?>
					<li>
						<a href="<?php 
            echo esc_url($item['url']);
            ?>
" class="<?php 
            echo esc_attr($class);
            ?>
">
							<?php 
            echo esc_html($item['label']);
            ?>
						</a>
					</li>
				<?php 
        }
        ?>
			</ul>
		</div>
		<?php 
    }
    public function to_html()
    {
        $membership = MS_Model_Membership::get_base();
        $menus = $membership->get_rule(MS_Rule_MenuItem::RULE_ID)->get_menu_array();
        $menu_ids = array_keys($menus);
        $menu_id = reset($menu_ids);
        if (isset($_REQUEST['menu_id'])) {
            $menu_id = $_REQUEST['menu_id'];
        }
        // This fixes the list-title generated by MS_Helper_ListTable_Rule.
        unset($_GET['status']);
        $rule_menu = $membership->get_rule(MS_Rule_MenuItem::RULE_ID);
        $rule_listtable = new MS_Rule_MenuItem_ListTable($rule_menu, $menus, $menu_id);
        $fields['rule_menu'] = array('id' => 'rule_menu', 'name' => 'rule', 'value' => 'menu', 'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN);
        $menu_url = esc_url_raw(add_query_arg(array('menu_id' => $menu_id)));
        $rule_listtable->prepare_items();
        $header_data = apply_filters('ms_view_membership_protectedcontent_header', array('title' => __('Menu Items', MS_TEXT_DOMAIN), 'desc' => __('Protect individual menu items.', MS_TEXT_DOMAIN)), MS_Rule_MenuItem::RULE_ID, $this);
        ob_start();
        ?>
		<div class="ms-settings">
			<?php 
        MS_Helper_Html::settings_tab_header($header_data);
        ?>

			<form id="ms-menu-form" method="post" action="<?php 
        echo '' . $menu_url;
        ?>
">
				<?php 
        MS_Helper_Html::html_element($fields['rule_menu']);
        $rule_listtable->views();
        $rule_listtable->display();
        do_action('ms_view_membership_protectedcontent_footer', MS_Rule_MenuItem::RULE_ID, $this);
        ?>
			</form>
		</div>
		<?php 
        MS_Helper_Html::settings_footer();
        return ob_get_clean();
    }
 /**
  * Prepares fields for the edit form.
  *
  * @since  1.0.1.0
  * @return array
  */
 protected function get_fields()
 {
     $membership = $this->data['membership'];
     $action = MS_Controller_Membership::AJAX_ACTION_UPDATE_MEMBERSHIP;
     $nonce = wp_create_nonce($action);
     $fields = array();
     // Prepare the form fields.
     $fields['name'] = array('id' => 'name', 'type' => MS_Helper_Html::INPUT_TYPE_TEXT, 'title' => apply_filters('ms_translation_flag', __('Name:', MS_TEXT_DOMAIN), 'membership-name'), 'value' => $membership->name, 'ajax_data' => array(1));
     $fields['description'] = array('id' => 'description', 'type' => MS_Helper_Html::INPUT_TYPE_TEXT_AREA, 'title' => apply_filters('ms_translation_flag', __('Description:', MS_TEXT_DOMAIN), 'membership-name'), 'value' => $membership->description, 'ajax_data' => array(1));
     $fields['active'] = array('id' => 'active', 'type' => MS_Helper_Html::INPUT_TYPE_RADIO_SLIDER, 'title' => __('This membership is active', MS_TEXT_DOMAIN), 'before' => __('No', MS_TEXT_DOMAIN), 'after' => __('Yes', MS_TEXT_DOMAIN), 'class' => 'ms-active', 'value' => $membership->active, 'ajax_data' => array(1));
     $fields['public'] = array('id' => 'public', 'type' => MS_Helper_Html::INPUT_TYPE_RADIO_SLIDER, 'title' => __('This membership is public', MS_TEXT_DOMAIN), 'desc' => __('Users can see it listed on your site and can register for it', MS_TEXT_DOMAIN), 'before' => __('No', MS_TEXT_DOMAIN), 'after' => __('Yes', MS_TEXT_DOMAIN), 'class' => 'ms-public', 'value' => $membership->public, 'ajax_data' => array(1));
     $fields['paid'] = array('id' => 'is_paid', 'type' => MS_Helper_Html::INPUT_TYPE_RADIO_SLIDER, 'title' => __('This is a paid membership', MS_TEXT_DOMAIN), 'before' => __('No', MS_TEXT_DOMAIN), 'after' => __('Yes', MS_TEXT_DOMAIN), 'class' => 'ms-paid', 'value' => $membership->is_paid, 'ajax_data' => array(1));
     $priority_list = array();
     $args = array('include_guest' => 0);
     $count = MS_Model_Membership::get_membership_count($args);
     for ($i = 1; $i <= $count; $i += 1) {
         $priority_list[$i] = $i;
     }
     $priority_list[$membership->priority] = $membership->priority;
     $fields['priority'] = array('id' => 'priority', 'type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'title' => __('Membership order', MS_TEXT_DOMAIN), 'desc' => __('This defines the display order on the Membership Page.', MS_TEXT_DOMAIN), 'class' => 'ms-priority', 'before' => __('Order', MS_TEXT_DOMAIN), 'value' => $membership->priority, 'field_options' => $priority_list, 'ajax_data' => array(1));
     if (MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_MULTI_MEMBERSHIPS)) {
         $fields['priority']['desc'] .= '<br>' . __('It also controlls which Protection Message is used in case a member has multiple memberships (the lowest value wins)', MS_TEXT_DOMAIN);
     }
     foreach ($fields as $key => $field) {
         if (!empty($field['ajax_data'])) {
             if (!empty($field['ajax_data']['action'])) {
                 continue;
             }
             if (!isset($fields[$key]['ajax_data']['field'])) {
                 $fields[$key]['ajax_data']['field'] = $fields[$key]['id'];
             }
             $fields[$key]['ajax_data']['_wpnonce'] = $nonce;
             $fields[$key]['ajax_data']['action'] = $action;
             $fields[$key]['ajax_data']['membership_id'] = $membership->id;
         }
     }
     return $fields;
 }
    public function to_html()
    {
        $membership = MS_Model_Membership::get_base();
        $rule = $membership->get_rule(MS_Addon_Bbpress_Rule::RULE_ID);
        $listtable = new MS_Addon_Bbpress_Rule_Listtable($rule);
        $listtable->prepare_items();
        $header_data = apply_filters('ms_view_membership_protectedcontent_header', array('title' => __('bbPress', MS_TEXT_DOMAIN), 'desc' => __('Protect the following bbPress content to members only.', MS_TEXT_DOMAIN)), MS_Addon_Bbpress_Rule::RULE_ID, $this);
        ob_start();
        ?>
		<div class="ms-settings">
			<?php 
        MS_Helper_Html::settings_tab_header($header_data);
        $listtable->views();
        ?>
			<form action="" method="post">
				<?php 
        $listtable->display();
        ?>
			</form>
		</div>
		<?php 
        MS_Helper_Html::settings_footer();
        return ob_get_clean();
    }
Example #18
0
 /**
  * Returns a list of post_ids to exclude or include to fullfil the specified
  * Membership/Status filter.
  *
  * @since  1.0.0
  * @param  array $args
  * @return array {
  *     List of post_ids to exclude or include
  *
  *     array $include
  *     array $exclude
  * }
  */
 public function get_exclude_include($args)
 {
     // Filter for Membership and Protection status via 'exclude'/'include'
     $include = array();
     $exclude = array();
     $base_rule = $this;
     $child_rule = $this;
     if (!$this->is_base_rule) {
         $base_rule = MS_Model_Membership::get_base()->get_rule($this->rule_type);
     }
     if (!empty($args['membership_id'])) {
         $child_membership = MS_Factory::load('MS_Model_Membership', $args['membership_id']);
         $child_rule = $child_membership->get_rule($this->rule_type);
     }
     $base_items = array_keys($base_rule->rule_value, true);
     $child_items = array_keys($child_rule->rule_value, true);
     $status = !empty($args['rule_status']) ? $args['rule_status'] : null;
     switch ($status) {
         case MS_Model_Rule::FILTER_PROTECTED:
             if (!empty($args['membership_id'])) {
                 $include = array_intersect($child_items, $base_items);
             } else {
                 $include = $child_items;
             }
             if (empty($include)) {
                 $include = array(-1);
             }
             break;
         case MS_Model_Rule::FILTER_NOT_PROTECTED:
             if (!empty($args['membership_id'])) {
                 $include = array_diff($base_items, $child_items);
                 if (empty($include) && empty($exclude)) {
                     $include = array(-1);
                 }
             } else {
                 $exclude = $child_items;
                 if (empty($include) && empty($exclude)) {
                     $exclude = array(-1);
                 }
             }
             break;
         default:
             // If not visitor membership, just show all Membership2
             if (!$child_rule->is_base_rule) {
                 $include = $base_items;
             }
             break;
     }
     /**
      * Allow rules/Add-ons to modify the exclude/include list.
      *
      * @since  1.0.0
      */
     $exclude = array_unique(apply_filters('ms_rule_exclude_items-' . $this->rule_type, $exclude, $args));
     $include = array_unique(apply_filters('ms_rule_include_items-' . $this->rule_type, $include, $args));
     $res = (object) array('include' => null, 'exclude' => null);
     if (!empty($include)) {
         $res->include = $include;
     } elseif (!empty($exclude)) {
         $res->exclude = $exclude;
     } elseif (!empty($args['membership_id'])) {
         $res->include = array(-1);
     }
     return $res;
 }
 /**
  * Processes a form submit and changes the rule values, if valid form data
  * is found.
  *
  * @since  1.0.0
  */
 private function process_form()
 {
     $action = false;
     if (isset($_POST['rule_action'])) {
         $action = $_POST['rule_action'];
         if (!$this->verify_nonce($action)) {
             $action = false;
         }
     } elseif (isset($_GET['rule_action'])) {
         $action = $_GET['rule_action'];
         if (!$this->verify_nonce($action, 'GET')) {
             $action = false;
         }
     }
     if (empty($action)) {
         return;
     }
     $redirect = false;
     switch ($action) {
         case self::ACTION_ADD:
             lib3()->array->strip_slashes($_POST, 'url_value');
             $url = $_POST['url_value'];
             $base = MS_Model_Membership::get_base();
             $rule = $base->get_rule(self::RULE_ID);
             $rule->add_url($url);
             $base->set_rule(self::RULE_ID, $rule);
             $base->save();
             $redirect = true;
             break;
         case self::ACTION_DELETE:
             $id = $_REQUEST['item'];
             $base = MS_Model_Membership::get_base();
             $rule = $base->get_rule(self::RULE_ID);
             $rule->delete_url($id);
             $base->set_rule(self::RULE_ID, $rule);
             $base->save();
             $redirect = true;
             break;
     }
     if ($redirect) {
         $target = esc_url_raw(remove_query_arg(array('_wpnonce', 'item', 'rule_action')));
         wp_safe_redirect($target);
         exit;
     }
 }
 /**
  * Bulk actions options.
  *
  * @since  1.0.0
  *
  * @param array {
  *     @type string $action The action name.
  *     @type mixed $desciption The action description.
  * }
  */
 public function get_bulk_actions()
 {
     $protect_key = __('Add Membership', MS_TEXT_DOMAIN);
     $unprotect_key = __('Drop Membership', MS_TEXT_DOMAIN);
     $bulk_actions = array('drop-all' => __('Drop all Memberships', MS_TEXT_DOMAIN), $protect_key => array(), $unprotect_key => array());
     $args = array('include_guest' => 0);
     $memberships = MS_Model_Membership::get_membership_names($args);
     $txt_add = __('Add: %s', MS_TEXT_DOMAIN);
     $txt_rem = __('Drop: %s', MS_TEXT_DOMAIN);
     foreach ($memberships as $id => $name) {
         $bulk_actions[$protect_key]['add-' . $id] = sprintf($txt_add, $name);
         $bulk_actions[$unprotect_key]['drop-' . $id] = sprintf($txt_rem, $name);
     }
     return apply_filters('ms_helper_listtable_member_get_bulk_actions', $bulk_actions, $this);
 }
 /**
  * Adds a special membership that represents the search index.
  *
  * @since 1.0.1.0
  */
 protected function create_membership()
 {
     $this->membership = MS_Model_Membership::_get_system_membership(self::MEMBERSHIP_TYPE, true);
 }
 /**
  * Main entry point: Handles the export action.
  *
  * This task will exit the current request as the result will be a download
  * and no HTML page that is displayed.
  *
  * @since  1.0.0
  */
 public function process()
 {
     $data = (object) array();
     $data->source_key = self::KEY;
     $data->source = 'Membership2';
     $data->plugin_version = MS_PLUGIN_VERSION;
     $data->export_time = date('Y-m-d H:i');
     $data->notes = array(__('Exported data:', MS_TEXT_DOMAIN), __('- Memberships (without protection rules)', MS_TEXT_DOMAIN), __('- Members (including Stripe/Authorize payment settings)', MS_TEXT_DOMAIN), __('- Subscriptions (link between Members and Memberships)', MS_TEXT_DOMAIN), __('- Invoices', MS_TEXT_DOMAIN));
     $data->memberships = array();
     // Export the base membership (i.e. the Membership2 settings)
     $membership = MS_Model_Membership::get_base();
     $data->memberships[] = $this->export_membership($membership->id);
     // Export all memberships.
     $memberships = MS_Model_Membership::get_memberships(array('post_parent' => 0));
     foreach ($memberships as $membership) {
         $data->memberships[] = $this->export_membership($membership->id);
     }
     // Export the members.
     $members = MS_Model_Member::get_members();
     $data->members = array();
     foreach ($members as $member) {
         if (!$member->is_member) {
             continue;
         }
         $data->members[] = $this->export_member($member->id);
     }
     // Export plugin settings.
     $obj = array();
     $data->settings = $this->export_settings();
     // Export Coupons.
     $data->coupons = array();
     lib2()->net->file_download(json_encode($data), 'membership2-export.json');
 }
 /**
  * Returns a list of supported payment types.
  *
  * @since  1.0.0
  * @return array Payment types, index is the type-key / value the label.
  */
 public function supported_payment_types()
 {
     static $Payment_Types = array();
     if (!isset($Payment_Types[$this->id])) {
         $Payment_Types[$this->id] = MS_Model_Membership::get_payment_types();
         foreach ($this->unsupported_payment_types as $remove) {
             unset($Payment_Types[$this->id][$remove]);
         }
     }
     return $Payment_Types[$this->id];
 }
 /**
  * Get available tabs for Membership2 page.
  *
  * @since  1.0.0
  *
  * @return array The tabs configuration.
  */
 public function get_edit_tabs()
 {
     static $Tabs = null;
     if (null === $Tabs) {
         $membership = $this->load_membership();
         $args = array('include_guest' => false);
         $count = MS_Model_Membership::get_membership_count($args);
         $Tabs = array(self::TAB_DETAILS => array('title' => __('Details', 'membership2')), self::TAB_TYPE => array('title' => __('Membership Type', 'membership2')), self::TAB_PAYMENT => array('title' => __('Payment options', 'membership2')), self::TAB_UPGRADE => array('title' => __('Upgrade paths', 'membership2')), self::TAB_MESSAGES => array('title' => __('Protection Messages', 'membership2')), self::TAB_EMAILS => array('title' => __('Automated Email Responses', 'membership2')));
         if ($membership->is_system()) {
             unset($Tabs[self::TAB_TYPE]);
             unset($Tabs[self::TAB_PAYMENT]);
             unset($Tabs[self::TAB_EMAILS]);
             unset($Tabs[self::TAB_UPGRADE]);
         } elseif ($membership->is_free) {
             $Tabs[self::TAB_PAYMENT]['title'] = __('Access options', 'membership2');
         }
         if ($count < 2) {
             unset($Tabs[self::TAB_UPGRADE]);
         }
         // Allow Add-ons to add or remove rule tabs
         $Tabs = apply_filters('ms_controller_membership_tabs', $Tabs);
         foreach ($Tabs as $key => $tab) {
             if (!empty($Tabs['key']['url'])) {
                 continue;
             }
             $url = sprintf('%1$s?page=%2$s&step=%3$s&tab=%4$s&membership_id=%5$s', admin_url('admin.php'), esc_attr($_REQUEST['page']), MS_Controller_Membership::STEP_EDIT, $key, $membership->id);
             $Tabs[$key]['url'] = $url;
         }
     }
     return $Tabs;
 }
 /**
  * Prepare the HTML fields that can be displayed
  *
  * @since  1.0.0
  *
  * @return array
  */
 protected function prepare_fields($data)
 {
     // List of known Membership types; used to display the nice-name
     $ms_types = MS_Model_Membership::get_types();
     $ms_paytypes = MS_Model_Membership::get_payment_types();
     // Prepare the "Memberships" table
     $memberships = array(array(__('Membership name', 'membership2'), __('Membership Type', 'membership2'), __('Payment Type', 'membership2'), __('Description', 'membership2')));
     foreach ($data->memberships as $item) {
         if (!isset($ms_types[$item->type])) {
             $item->type = MS_Model_Membership::TYPE_STANDARD;
         }
         switch ($item->pay_type) {
             case 'recurring':
                 $payment_type = MS_Model_Membership::PAYMENT_TYPE_RECURRING;
                 break;
             case 'finite':
                 $payment_type = MS_Model_Membership::PAYMENT_TYPE_FINITE;
                 break;
             case 'date':
                 $payment_type = MS_Model_Membership::PAYMENT_TYPE_DATE_RANGE;
                 break;
             default:
                 $payment_type = MS_Model_Membership::PAYMENT_TYPE_PERMANENT;
                 break;
         }
         $memberships[] = array($item->name, $ms_types[$item->type], $ms_paytypes[$payment_type], $item->description);
     }
     // Prepare the "Members" table
     $members = array(array(__('Username', 'membership2'), __('Email', 'membership2'), __('Subscriptions', 'membership2'), __('Invoices', 'membership2')));
     foreach ($data->members as $item) {
         $inv_count = 0;
         if (isset($item->subscriptions) && is_array($item->subscriptions)) {
             foreach ($item->subscriptions as $registration) {
                 $inv_count += count($registration->invoices);
             }
         }
         $members[] = array($item->username, $item->email, count($item->subscriptions), $inv_count);
     }
     $settings = array();
     foreach ($data->settings as $setting => $value) {
         switch ($setting) {
             case 'addons':
                 $model = MS_Factory::load('MS_Model_Addon');
                 $list = $model->get_addon_list();
                 $code = '';
                 foreach ($value as $addon => $state) {
                     if ($state) {
                         $code .= __('Activate: ', 'membership2');
                     } else {
                         $code .= __('Dectivate: ', 'membership2');
                     }
                     $code .= $list[$addon]->name . '<br/>';
                 }
                 $settings[] = array(__('Add-Ons', 'membership2'), $code);
                 break;
         }
     }
     if (empty($settings)) {
         $settings[] = array('', __('(No settings are changed)', 'membership2'));
     }
     // Prepare the return value.
     $fields = array();
     // Export-Notes
     $notes = '';
     if (isset($data->notes)) {
         if (is_scalar($data->notes)) {
             $notes = array($data->notes);
         }
         $in_sub = false;
         $notes = '<ul class="ms-import-notes">';
         foreach ($data->notes as $line => $text) {
             $is_sub = strpos($text, '- ') === 0;
             if ($in_sub != $is_sub) {
                 $in_sub = $is_sub;
                 if ($is_sub) {
                     $notes .= '<ul>';
                 } else {
                     $notes .= '</ul>';
                 }
             }
             if ($in_sub) {
                 $text = substr($text, 2);
             }
             $notes .= '<li>' . $text;
         }
         $notes .= '</ul>';
     }
     $fields['details'] = array('type' => MS_Helper_Html::TYPE_HTML_TABLE, 'class' => 'ms-import-preview', 'value' => array(array(__('Data source', 'membership2'), $data->source . ' &emsp; <small>' . sprintf(__('exported on %1$s', 'membership2'), $data->export_time) . '</small>'), array(__('Content', 'membership2'), sprintf(_n('%1$s Membership', '%1$s Memberships', count($data->memberships), 'membership2'), '<b>' . count($data->memberships) . '</b>') . ' / ' . sprintf(_n('%1$s Member', '%1$s Members', count($data->members), 'membership2'), '<b>' . count($data->members) . '</b>'))), 'field_options' => array('head_col' => true, 'head_row' => false, 'col_class' => array('preview-label', 'preview-data')));
     if (!empty($notes)) {
         $fields['details']['value'][] = array(__('Please note', 'membership2'), $notes);
     }
     $batchsizes = array(10 => __('Small (10 items)'), 30 => __('Normal (30 items)'), 100 => __('Big (100 items)'));
     $fields['batchsize'] = array('id' => 'batchsize', 'type' => MS_Helper_Html::INPUT_TYPE_SELECT, 'title' => __('Batch size for import', 'membership2'), 'desc' => __('Big batches will be processed faster but may result in PHP Memory errors.', 'membership2'), 'value' => 30, 'field_options' => $batchsizes, 'class' => 'sel-batchsize');
     $fields['clear_all'] = array('id' => 'clear_all', 'type' => MS_Helper_Html::INPUT_TYPE_CHECKBOX, 'title' => __('Replace current content with import data (removes existing Memberships/Members before importing data)', 'membership2'), 'class' => 'widefat');
     $fields['memberships'] = array('type' => MS_Helper_Html::TYPE_HTML_TABLE, 'class' => 'ms-import-preview', 'value' => $memberships, 'field_options' => array('head_col' => false, 'head_row' => true, 'col_class' => array('preview-name', 'preview-type', 'preview-pay-type', 'preview-desc')));
     $fields['members'] = array('type' => MS_Helper_Html::TYPE_HTML_TABLE, 'class' => 'ms-import-preview', 'value' => $members, 'field_options' => array('head_col' => false, 'head_row' => true, 'col_class' => array('preview-name', 'preview-email', 'preview-count', 'preview-count')));
     $fields['settings'] = array('type' => MS_Helper_Html::TYPE_HTML_TABLE, 'class' => 'ms-import-preview', 'value' => $settings, 'field_options' => array('head_col' => true, 'head_row' => false));
     $fields['sep'] = array('type' => MS_Helper_Html::TYPE_HTML_SEPARATOR);
     $fields['back'] = array('type' => MS_Helper_Html::TYPE_HTML_LINK, 'class' => 'wpmui-field-button button', 'value' => __('Cancel', 'membership2'), 'url' => $_SERVER['REQUEST_URI']);
     $fields['skip'] = array('type' => MS_Helper_Html::TYPE_HTML_LINK, 'class' => 'wpmui-field-button button', 'value' => __('Skip', 'membership2'), 'url' => MS_Controller_Plugin::get_admin_url(false, array('skip_import' => 1)));
     $fields['import'] = array('id' => 'btn-import', 'type' => MS_Helper_Html::INPUT_TYPE_BUTTON, 'value' => __('Import', 'membership2'), 'button_value' => MS_Controller_Import::AJAX_ACTION_IMPORT, 'button_type' => 'submit');
     $fields['download'] = array('id' => 'btn-download', 'type' => MS_Helper_Html::INPUT_TYPE_BUTTON, 'value' => __('Download as Export File', 'membership2'), 'class' => 'button-link');
     return $fields;
 }
 /**
  * Sets up the 'Billing' navigation and list page.
  *
  * @since  1.0.0
  */
 public function admin_page()
 {
     $this->print_admin_message();
     // Action view page request
     $isset = array('action', 'invoice_id');
     if (self::validate_required($isset, 'GET', false) && 'edit' == $_GET['action']) {
         $invoice_id = !empty($_GET['invoice_id']) ? $_GET['invoice_id'] : 0;
         $data['invoice'] = MS_Factory::load('MS_Model_Invoice', $_GET['invoice_id']);
         $data['action'] = $_GET['action'];
         $data['memberships'] = MS_Model_Membership::get_membership_names(array('include_guest' => 0));
         $view = MS_Factory::create('MS_View_Billing_Edit');
         $view->data = apply_filters('ms_view_billing_edit_data', $data);
         $view->render();
     } else {
         $view = MS_Factory::create('MS_View_Billing_List');
         $view->render();
     }
 }
 /**
  * Returns the ListTable object for this rule.
  *
  * @since  1.0.0
  *
  * @return MS_Helper_ListTable
  */
 public function return_listtable($empty)
 {
     $base = MS_Model_Membership::get_base();
     $rule = $base->get_rule(self::RULE_ID);
     return new MS_Rule_MemberRoles_ListTable($rule);
 }
 /**
  * Add 'Test Memberships' node.
  *
  * @since  1.0.0
  *
  */
 private function add_test_membership_node()
 {
     global $wp_admin_bar;
     $base_id = MS_Model_Membership::get_base()->id;
     if ($base_id) {
         $link_url = self::get_simulation_url($base_id);
         $wp_admin_bar->add_node(apply_filters('ms_controller_adminbar_add_test_membership_node', array('id' => 'ms-test-memberships', 'title' => __('Test Memberships', 'membership2'), 'href' => $link_url, 'meta' => array('class' => 'ms-test-memberships', 'title' => __('Membership Simulation Menu', 'membership2'), 'tabindex' => '1'))));
     }
 }
 /**
  * Set specific property.
  *
  * @since  1.0.0
  *
  * @param string $property The name of a property to associate.
  * @param mixed $value The value of a property.
  */
 public function __set($property, $value)
 {
     if (property_exists($this, $property)) {
         switch ($property) {
             case 'code':
                 $value = sanitize_text_field(preg_replace('/[^a-zA-Z0-9\\s]/', '', $value));
                 $this->{$property} = strtoupper($value);
                 $this->name = $this->{$property};
                 break;
             case 'discount':
                 $this->{$property} = floatval($value);
                 break;
             case 'discount_type':
                 if (self::is_valid_discount_type($value)) {
                     $this->{$property} = $value;
                 }
                 break;
             case 'start_date':
                 $this->{$property} = $this->validate_date($value);
                 break;
             case 'expire_date':
                 $this->{$property} = $this->validate_date($value);
                 if (strtotime($this->{$property}) < strtotime($this->start_date)) {
                     $this->{$property} = null;
                 }
                 break;
             case 'membership_id':
                 $value = lib3()->array->get($value);
                 foreach ($value as $ind => $id) {
                     if (!MS_Model_Membership::is_valid_membership($id)) {
                         unset($value[$ind]);
                     }
                 }
                 if (empty($value)) {
                     $this->{$property} = array(0);
                 } else {
                     $this->{$property} = array_values($value);
                 }
                 break;
             case 'max_uses':
             case 'used':
                 $this->{$property} = absint($value);
                 break;
             default:
                 if (property_exists($this, $property)) {
                     $this->{$property} = $value;
                 }
                 break;
         }
     }
     do_action('ms_addon_coupon_model__set_after', $property, $value, $this);
 }
 /**
  * Get signup process step (multi step form).
  *
  * @since  1.0.0
  *
  * @return string The current signup step after validation.
  */
 private function get_signup_step()
 {
     static $Valid_Steps = null;
     static $Login_Steps = null;
     if (empty($Valid_Steps)) {
         $Valid_Steps = apply_filters('ms_controller_frontend_signup_steps', array(self::STEP_CHOOSE_MEMBERSHIP, self::STEP_REGISTER_FORM, self::STEP_REGISTER_FORM_ALT, self::STEP_REGISTER_SUBMIT, self::STEP_PAYMENT_TABLE, self::STEP_GATEWAY_FORM, self::STEP_PROCESS_PURCHASE));
         // These steps are only available to logged-in users.
         $Login_Steps = apply_filters('ms_controller_frontend_signup_steps_private', array(self::STEP_PAYMENT_TABLE, self::STEP_GATEWAY_FORM, self::STEP_PROCESS_PURCHASE));
     }
     lib2()->array->equip_request('step', 'membership_id');
     if (in_array($_REQUEST['step'], $Valid_Steps)) {
         $step = $_REQUEST['step'];
     } else {
         // Initial step
         $step = self::STEP_CHOOSE_MEMBERSHIP;
     }
     if (self::STEP_PAYMENT_TABLE == $step) {
         if (!MS_Model_Membership::is_valid_membership($_REQUEST['membership_id'])) {
             $step = self::STEP_CHOOSE_MEMBERSHIP;
         }
     }
     if (self::STEP_CHOOSE_MEMBERSHIP == $step && !empty($_GET['membership_id'])) {
         $step = self::STEP_PAYMENT_TABLE;
     }
     if (!MS_Model_Member::is_logged_in() && in_array($step, $Login_Steps)) {
         $step = self::STEP_REGISTER_FORM_ALT;
     }
     return apply_filters('ms_controller_frontend_get_signup_step', $step, $this);
 }