PageRenderTime 49ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/wp-content/plugins/membership/app/controller/class-ms-controller-protection.php

https://gitlab.com/najomie/fit-hippie
PHP | 436 lines | 265 code | 68 blank | 103 comment | 36 complexity | ad9e609025c11503189d771472fc8f39 MD5 | raw file
  1. <?php
  2. /**
  3. * Controller for managing Protecion Rules.
  4. *
  5. * @since 1.0.1.0
  6. * @package Membership2
  7. * @subpackage Controller
  8. */
  9. class MS_Controller_Protection extends MS_Controller {
  10. /**
  11. * The model to use for loading/saving Membership data.
  12. *
  13. * Access this value via $this->load_membership()
  14. *
  15. * @since 1.0.0
  16. * @var MS_Model_Membership
  17. */
  18. private $model = null;
  19. /**
  20. * The active page tab.
  21. *
  22. * @since 1.0.0
  23. * @var string
  24. */
  25. protected $active_tab;
  26. /**
  27. * Prepare the Membership manager.
  28. *
  29. * @since 1.0.0
  30. */
  31. public function __construct() {
  32. parent::__construct();
  33. }
  34. /**
  35. * Initialize the admin-side functions.
  36. *
  37. * @since 1.0.0
  38. */
  39. public function admin_init() {
  40. $hook = MS_Controller_Plugin::admin_page_hook( 'protection' );
  41. $this->run_action( 'load-' . $hook, 'admin_page_process' );
  42. $this->run_action( 'admin_print_scripts-' . $hook, 'enqueue_scripts' );
  43. $this->run_action( 'admin_print_styles-' . $hook, 'enqueue_styles' );
  44. }
  45. /**
  46. * Load membership from request.
  47. *
  48. * @since 1.0.0
  49. *
  50. * @return MS_Model_Membership The membership model object.
  51. */
  52. public function load_membership() {
  53. $membership_id = 0;
  54. if ( empty( $this->model ) ) {
  55. if ( ! empty( $_REQUEST['membership_id'] ) ) {
  56. $membership_id = absint( $_REQUEST['membership_id'] );
  57. if ( MS_Model_Membership::get_base()->id == $membership_id ) {
  58. wp_safe_redirect(
  59. esc_url_raw(
  60. remove_query_arg( array( 'membership_id' ) )
  61. )
  62. );
  63. }
  64. } else {
  65. $membership_id = MS_Model_Membership::get_base()->id;
  66. }
  67. $this->model = MS_Factory::load(
  68. 'MS_Model_Membership',
  69. $membership_id
  70. );
  71. $this->model = apply_filters(
  72. 'ms_controller_protection_load_membership',
  73. $this->model,
  74. $this
  75. );
  76. }
  77. return $this->model;
  78. }
  79. /**
  80. * Process membership pages requests
  81. *
  82. * Verifies GET and POST requests to manage memberships.
  83. * Redirect to next step after processing.
  84. *
  85. * @since 1.0.0
  86. */
  87. public function admin_page_process() {
  88. $membership = $this->load_membership();
  89. do_action(
  90. 'ms_controller_protection_admin_page_process',
  91. $this->get_active_tab()
  92. );
  93. // Only accessible to admin users
  94. if ( ! $this->is_admin_user() ) { return false; }
  95. if ( $this->verify_nonce( 'bulk' ) ) {
  96. // Bulk-edit
  97. lib3()->array->equip_post( 'action', 'action2', 'item', 'rule_type' );
  98. $action = $_POST['action'];
  99. if ( empty( $action ) || '-1' == $action ) {
  100. $action = $_POST['action2'];
  101. }
  102. $items = $_POST['item'];
  103. $rule_type = $_POST['rule_type'];
  104. /*
  105. * The Bulk-Edit action is built like 'cmd-id'
  106. * e.g. 'add-123' will add membership 123 to the selected items.
  107. */
  108. if ( empty( $action ) ) {
  109. $cmd = array();
  110. } elseif ( empty( $items ) ) {
  111. $cmd = array();
  112. } elseif ( empty( $rule_type ) ) {
  113. $cmd = array();
  114. } elseif ( '-1' == $action ) {
  115. $cmd = array();
  116. } else {
  117. $cmd = explode( '-', $action );
  118. }
  119. if ( 2 == count( $cmd ) ) {
  120. $action = $cmd[0];
  121. $action_id = $cmd[1];
  122. // Get a list of specified memberships...
  123. if ( is_numeric( $action_id ) ) {
  124. // ... either a single membership.
  125. $memberships = array(
  126. MS_Factory::load( 'MS_Model_Membership', $action_id ),
  127. );
  128. } elseif ( 'all' == $action_id ) {
  129. // ... or all memberships.
  130. $memberships = MS_Model_Membership::get_memberships();
  131. }
  132. // Loop specified memberships and add the selected items.
  133. foreach ( $memberships as $membership ) {
  134. $rule = $membership->get_rule( $rule_type );
  135. foreach ( $items as $item ) {
  136. switch ( $action ) {
  137. case 'add':
  138. $rule->give_access( $item );
  139. break;
  140. case 'rem':
  141. $rule->remove_access( $item );
  142. break;
  143. }
  144. }
  145. $membership->set_rule( $rule_type, $rule );
  146. $membership->save();
  147. }
  148. }
  149. } else {
  150. // No action request found.
  151. }
  152. }
  153. /**
  154. * Display Setup Membership2 page.
  155. *
  156. * @since 1.0.0
  157. */
  158. public function admin_page() {
  159. do_action( 'ms_controller_protection_admin_page' );
  160. $data = array();
  161. $data['tabs'] = $this->get_available_tabs();
  162. $data['active_tab'] = $this->get_active_tab();
  163. $view = MS_Factory::create( 'MS_View_Protection' );
  164. $view->data = apply_filters( 'ms_view_protection_data', $data, $this );
  165. $view->render();
  166. }
  167. /**
  168. * Get available tabs for Membership2 page.
  169. *
  170. * @since 1.0.0
  171. *
  172. * @return array The tabs configuration.
  173. */
  174. public function get_available_tabs() {
  175. static $Tabs = null;
  176. if ( null === $Tabs ) {
  177. $membership = $this->load_membership();
  178. $membership_id = $membership->id;
  179. $is_base = $membership->is_base();
  180. $settings = MS_Factory::load( 'MS_Model_Settings' );
  181. // First create a list including all possible tabs.
  182. $tabs = array(
  183. MS_Rule_Page::RULE_ID => true,
  184. MS_Rule_Post::RULE_ID => true,
  185. MS_Rule_Category::RULE_ID => true,
  186. MS_Rule_Content::RULE_ID => true,
  187. MS_Rule_Media::RULE_ID => true,
  188. MS_Rule_MenuItem::RULE_ID => true,
  189. MS_Rule_ReplaceMenu::RULE_ID => true,
  190. MS_Rule_ReplaceLocation::RULE_ID => true,
  191. MS_Rule_Shortcode::RULE_ID => true,
  192. MS_Rule_Url::RULE_ID => true,
  193. MS_Rule_Special::RULE_ID => true,
  194. MS_Rule_MemberCaps::RULE_ID => true,
  195. MS_Rule_MemberRoles::RULE_ID => true,
  196. );
  197. // Now remove items from the list that are not available.
  198. // Optionally show "Posts"
  199. if ( ! MS_Model_Addon::is_enabled( MS_Model_Addon::ADDON_POST_BY_POST ) ) {
  200. $tabs[ MS_Rule_Post::RULE_ID ] = false;
  201. }
  202. // Optionally show "Category"
  203. if ( ! MS_Model_Addon::is_enabled( MS_Addon_Category::ID ) ) {
  204. $tabs[ MS_Rule_Category::RULE_ID ] = false;
  205. }
  206. // Optionally show "Media"
  207. if ( ! MS_Model_Addon::is_enabled( MS_Addon_Mediafiles::ID ) ) {
  208. $tabs[ MS_Rule_Media::RULE_ID ] = false;
  209. }
  210. // Either "Menu Item" or "Menus" or "Menu Location"
  211. switch ( $settings->menu_protection ) {
  212. case 'menu':
  213. $tabs[ MS_Rule_MenuItem::RULE_ID ] = false;
  214. $tabs[ MS_Rule_ReplaceLocation::RULE_ID ] = false;
  215. break;
  216. case 'location':
  217. $tabs[ MS_Rule_MenuItem::RULE_ID ] = false;
  218. $tabs[ MS_Rule_ReplaceMenu::RULE_ID ] = false;
  219. break;
  220. case 'item':
  221. default:
  222. $tabs[ MS_Rule_ReplaceMenu::RULE_ID ] = false;
  223. $tabs[ MS_Rule_ReplaceLocation::RULE_ID ] = false;
  224. break;
  225. }
  226. // Maybe "Special Pages".
  227. if ( ! MS_Model_Addon::is_enabled( MS_Model_Addon::ADDON_SPECIAL_PAGES ) ) {
  228. $tabs[ MS_Rule_Special::RULE_ID ] = false;
  229. }
  230. // Maybe "URLs"
  231. if ( ! MS_Model_Addon::is_enabled( MS_Model_Addon::ADDON_URL_GROUPS ) ) {
  232. $tabs[ MS_Rule_Url::RULE_ID ] = false;
  233. }
  234. // Maybe "Shortcodes"
  235. if ( ! MS_Model_Addon::is_enabled( MS_Model_Addon::ADDON_SHORTCODE ) ) {
  236. $tabs[ MS_Rule_Shortcode::RULE_ID ] = false;
  237. }
  238. // Maybe "Membercaps"
  239. if ( MS_Model_Addon::is_enabled( MS_Model_Addon::ADDON_MEMBERCAPS ) ) {
  240. if ( MS_Model_Addon::is_enabled( MS_Model_Addon::ADDON_MEMBERCAPS_ADV ) ) {
  241. $tabs[ MS_Rule_MemberRoles::RULE_ID ] = false;
  242. } else {
  243. $tabs[ MS_Rule_MemberCaps::RULE_ID ] = false;
  244. }
  245. } else {
  246. $tabs[ MS_Rule_MemberRoles::RULE_ID ] = false;
  247. $tabs[ MS_Rule_MemberCaps::RULE_ID ] = false;
  248. }
  249. lib3()->array->equip( $_GET, 'page' );
  250. // Allow Add-ons to add or remove rule tabs
  251. $tabs = apply_filters(
  252. 'ms_controller_protection_tabs',
  253. $tabs,
  254. $membership_id
  255. );
  256. $page = sanitize_html_class( $_GET['page'], MS_Controller_Plugin::MENU_SLUG . '-memberships' );
  257. $rule_titles = MS_Model_Rule::get_rule_type_titles();
  258. $result = array();
  259. foreach ( $tabs as $rule_type => $state ) {
  260. if ( ! $state ) { continue; }
  261. $url = sprintf(
  262. '%s?page=%s&tab=%s',
  263. admin_url( 'admin.php' ),
  264. $page,
  265. $rule_type
  266. );
  267. // Try to keep the selected Membership and Status filter.
  268. if ( ! empty( $_REQUEST['membership_id'] ) ) {
  269. $url = esc_url_raw(
  270. add_query_arg(
  271. array( 'membership_id' => $_REQUEST['membership_id'] ),
  272. $url
  273. )
  274. );
  275. }
  276. if ( ! empty( $_REQUEST['status'] ) ) {
  277. $url = esc_url_raw(
  278. add_query_arg(
  279. array( 'status' => $_REQUEST['status'] ),
  280. $url
  281. )
  282. );
  283. }
  284. $result[ $rule_type ] = array(
  285. 'title' => $rule_titles[ $rule_type ],
  286. 'url' => $url,
  287. );
  288. }
  289. $Tabs = apply_filters(
  290. 'ms_controller_protection_get_available_tabs',
  291. $result,
  292. $membership_id,
  293. $this
  294. );
  295. }
  296. return $Tabs;
  297. }
  298. /**
  299. * Get the current membership page's active tab.
  300. *
  301. * @since 1.0.0
  302. *
  303. * @return string The active tab.
  304. */
  305. public function get_active_tab() {
  306. $tabs = $this->get_available_tabs();
  307. reset( $tabs );
  308. $first_key = key( $tabs );
  309. // Setup navigation tabs.
  310. $active_tab = isset( $_REQUEST['tab'] ) ? $_REQUEST['tab'] : '';
  311. $active_tab = sanitize_html_class( $active_tab, $first_key );
  312. if ( ! array_key_exists( $active_tab, $tabs ) ) {
  313. $active_tab = $first_key;
  314. }
  315. $this->active_tab = apply_filters(
  316. 'ms_controller_protection_get_active_tab',
  317. $active_tab
  318. );
  319. return $this->active_tab;
  320. }
  321. /**
  322. * Load Membership manager specific styles.
  323. *
  324. * @since 1.0.0
  325. */
  326. public function enqueue_styles() {
  327. lib3()->ui->add( 'jquery-ui' );
  328. do_action( 'ms_controller_protection_enqueue_styles', $this );
  329. }
  330. /**
  331. * Load Membership manager specific scripts.
  332. *
  333. * @since 1.0.0
  334. */
  335. public function enqueue_scripts() {
  336. /*
  337. * Get a list of the dripped memberships:
  338. * We need this info in the javascript.
  339. */
  340. $dripped = array();
  341. foreach ( MS_Model_Membership::get_dripped_memberships() as $item ) {
  342. $dripped[ $item->id ] = $item->name;
  343. }
  344. $data = array(
  345. 'ms_init' => array(),
  346. 'lang' => array(
  347. 'quickedit_error' => __( 'Error while saving changes.', 'membership2' ),
  348. ),
  349. 'dripped' => $dripped,
  350. );
  351. $data['ms_init'][] = 'view_protected_content';
  352. switch ( $this->get_active_tab() ) {
  353. case 'url':
  354. $data['valid_rule_msg'] = __( 'Valid', 'membership2' );
  355. $data['invalid_rule_msg'] = __( 'Invalid', 'membership2' );
  356. $data['empty_msg'] = __( 'Before testing you have to first enter one or more Page URLs above.', 'membership2' );
  357. $data['ms_init'][] = 'view_membership_urlgroup';
  358. break;
  359. default:
  360. wp_enqueue_script( 'jquery-ui-datepicker' );
  361. wp_enqueue_script( 'jquery-validate' );
  362. break;
  363. }
  364. lib3()->ui->data( 'ms_data', $data );
  365. wp_enqueue_script( 'ms-admin' );
  366. do_action( 'ms_controller_protection_enqueue_scripts', $this );
  367. }
  368. }