PageRenderTime 50ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/wp-content/plugins/types/plus/types-access/includes/admin-edit-access.php

https://bitbucket.org/cisash/fananeen
PHP | 915 lines | 853 code | 26 blank | 36 comment | 55 complexity | 608316ebbed0d8fead252c7de5ceeb5d MD5 | raw file
  1. <?php
  2. /*
  3. * Edit access page.
  4. */
  5. /**
  6. * Admin page form.
  7. */
  8. function wpcf_access_admin_edit_access($enabled = true) {
  9. global $wpcf_access;
  10. $roles = get_editable_roles();
  11. $shortcuts = array();
  12. $output = '';
  13. $output .= '<form id="wpcf_access_admin_form" method="post" action="">';
  14. // Types
  15. $types = get_option('wpcf-custom-types', array());
  16. // Merge with other types
  17. $settings_access = get_option('wpcf-access-types', array());
  18. $types_other = get_post_types(array('show_ui' => true), 'objects');
  19. foreach ($types_other as $type_slug => $type_data) {
  20. if (isset($types[$type_slug])) {
  21. continue;
  22. }
  23. $types[$type_slug] = (array) $type_data;
  24. unset($types[$type_slug]->labels, $types[$type_slug]->cap);
  25. $types[$type_slug]['labels'] = (array) $type_data->labels;
  26. $types[$type_slug]['cap'] = (array) $type_data->cap;
  27. if (isset($settings_access[$type_slug])) {
  28. $types[$type_slug]['_wpcf_access_capabilities'] = $settings_access[$type_slug];
  29. }
  30. $types[$type_slug]['_wpcf_access_outsider'] = 1;
  31. if (!empty($type_data->_wpcf_access_inherits_post_cap)) {
  32. $types[$type_slug]['_wpcf_access_inherits_post_cap'] = 1;
  33. }
  34. }
  35. if (!empty($types)) {
  36. $output .= '<h3>' . __('Custom Types', 'wpcf') . '</h3>';
  37. foreach ($types as $type_slug => $type_data) {
  38. if ($type_data['public'] === 'hidden') {
  39. continue;
  40. }
  41. // Set data
  42. $mode = isset($type_data['_wpcf_access_capabilities']['mode']) ? $type_data['_wpcf_access_capabilities']['mode'] : 'not_managed';
  43. $output .= '<a name="' . $type_slug . '">&nbsp;</a><br />';
  44. $shortcuts[__('Post types', 'wpcf-access')][] = array($type_data['labels']['name'], $type_slug);
  45. $output .= '<div class="wpcf-access-type-item">';
  46. $output .= '<strong>' . $type_data['labels']['name'] . '</strong>';
  47. $output .= '<div class="wpcf-access-mode">';
  48. $output .= '<label><input type="checkbox" value="permissions"'
  49. . ' onclick="wpcfAccessEnable(jQuery(this));"';
  50. if (!$enabled) {
  51. $output .= 'disabled="disabled" readonly="readonly" ';
  52. }
  53. $output .= $mode != 'not_managed' ? 'checked="checked" />' : ' />';
  54. $output .= '<input type="hidden" class="wpcf-enable-set" '
  55. . 'name="types_access[types]['
  56. . $type_slug . '][mode]" value="' . $mode . '" />';
  57. $output .= '&nbsp;' . __('Managed by Access', 'wpcf_access') . '</label>';
  58. // Warning fallback
  59. if ((empty($type_data['_wpcf_access_outsider'])
  60. || !empty($type_data['_wpcf_access_inherits_post_cap']))
  61. && !in_array($type_slug, array('post', 'page'))) {
  62. $output .= '<div class="warning-fallback"';
  63. if ($mode != 'not_managed') {
  64. $output .= ' style="display:none;"';
  65. }
  66. $output .= '><p>' . __('This post type will inherit the same access rights as the standard WordPress Post when not Managed by Access.',
  67. 'wpcf_access') . '</p></div>';
  68. }
  69. $permissions = !empty($type_data['_wpcf_access_capabilities']['permissions']) ? $type_data['_wpcf_access_capabilities']['permissions'] : array();
  70. $output .= wpcf_access_permissions_table($roles, $permissions,
  71. wpcf_access_types_caps_predefined(), 'types', $type_slug,
  72. $enabled, $mode != 'not_managed');
  73. $output .= '</div><!-- wpcf-access-mode -->';
  74. $output .= wpcf_access_submit_button($enabled,
  75. $mode != 'not_managed');
  76. $output .= '&nbsp;' . wpcf_access_reset_button($type_slug, 'type',
  77. $enabled, $mode != 'not_managed');
  78. $output .= '<div style="clear:both;"></div></div><!-- wpcf-access-type-item -->';
  79. }
  80. }
  81. // Taxonomies
  82. $taxonomies = get_option('wpcf-custom-taxonomies', array());
  83. // Merge with other taxonomies
  84. $settings_access = get_option('wpcf-access-taxonomies', array());
  85. $taxonomies_other = get_taxonomies(array('show_ui' => true), 'objects');
  86. foreach ($taxonomies_other as $tax_slug => $tax_data) {
  87. if (isset($taxonomies[$tax_slug])) {
  88. continue;
  89. }
  90. $taxonomies[$tax_slug] = (array) $tax_data;
  91. unset($taxonomies[$tax_slug]->labels, $taxonomies[$tax_slug]->cap);
  92. $taxonomies[$tax_slug]['labels'] = (array) $tax_data->labels;
  93. $taxonomies[$tax_slug]['cap'] = (array) $tax_data->cap;
  94. $taxonomies[$tax_slug]['supports'] = array_flip($tax_data->object_type);
  95. if (isset($settings_access[$tax_slug])) {
  96. $taxonomies[$tax_slug]['_wpcf_access_capabilities'] = $settings_access[$tax_slug];
  97. }
  98. }
  99. // See if taxonomies are shared between types with different settings
  100. if ($enabled) {
  101. $supports_check = array();
  102. foreach ($taxonomies as $tax_slug => $tax_data) {
  103. $mode = isset($tax_data['_wpcf_access_capabilities']['mode']) ? $tax_data['_wpcf_access_capabilities']['mode'] : 'follow';
  104. // Only check if in 'follow' mode
  105. // if ($mode != 'follow' || empty($tax_data['supports'])) {
  106. if (empty($tax_data['supports'])) {
  107. continue;
  108. }
  109. foreach ($tax_data['supports'] as $supports_type => $true) {
  110. if (!isset($types[$supports_type]['_wpcf_access_capabilities']['mode'])) {
  111. continue;
  112. }
  113. $mode = $types[$supports_type]['_wpcf_access_capabilities']['mode'];
  114. if (!isset($types[$supports_type]['_wpcf_access_capabilities'][$mode])) {
  115. continue;
  116. }
  117. $supports_check[$tax_slug][md5($mode . serialize($types[$supports_type]['_wpcf_access_capabilities'][$mode]))][] = $types[$supports_type]['labels']['name'];
  118. }
  119. }
  120. }
  121. if (!empty($taxonomies)) {
  122. $output .= '<br /><br /><h3>' . __('Custom Taxonomies', 'wpcf') . '</h3>';
  123. foreach ($taxonomies as $tax_slug => $tax_data) {
  124. if ($tax_data['public'] === 'hidden') {
  125. continue;
  126. }
  127. // Set data
  128. $mode = isset($tax_data['_wpcf_access_capabilities']['mode']) ? $tax_data['_wpcf_access_capabilities']['mode'] : 'not_managed';
  129. if ($enabled) {
  130. $mode = wpcf_access_get_taxonomy_mode($tax_slug, $mode);
  131. }
  132. // For built-in set default to 'not_managed'
  133. if (in_array($tax_slug, array('category', 'post_tag'))) {
  134. $mode = isset($tax_data['_wpcf_access_capabilities']['mode']) ? $tax_data['_wpcf_access_capabilities']['mode'] : 'not_managed';
  135. }
  136. $custom_data = wpcf_access_tax_caps();
  137. if (isset($tax_data['_wpcf_access_capabilities']['permissions'])) {
  138. foreach ($tax_data['_wpcf_access_capabilities']['permissions'] as $cap_slug => $cap_data) {
  139. $custom_data[$cap_slug]['role'] = $cap_data['role'];
  140. $custom_data[$cap_slug]['users'] = isset($cap_data['users']) ? $cap_data['users'] : array();
  141. }
  142. }
  143. $output .= '<a name="' . $tax_slug . '">&nbsp;</a><br />';
  144. $shortcuts[__('Taxonomy', 'wpcf-access')][] = array($tax_data['labels']['name'], $tax_slug);
  145. $output .= '<div class="wpcf-access-type-item">';
  146. $output .= '<strong>' . $tax_data['labels']['name'] . '</strong>';
  147. // Add warning if shared and settings are different
  148. $disable_same_as_parent = false; //debug($supports_check, false);
  149. if ($enabled && isset($supports_check[$tax_slug])
  150. && count($supports_check[$tax_slug]) > 1) {
  151. $txt = array();
  152. foreach ($supports_check[$tax_slug] as $sc_tax_md5 => $sc_tax_md5_data) {
  153. $txt = array_merge($txt, $sc_tax_md5_data);
  154. }
  155. $last_element = array_pop($txt);
  156. // $warning = '<br /><img src="' . WPCF_EMBEDDED_RES_RELPATH . '/images/warning.png" style="position:relative;top:2px;" />&nbsp;' . sprintf(__('Notice: %s belongs to %s and %s, which have different access settings. The WordPress admin menu might appear confusing to some users.'),
  157. // $tax_data['labels']['name'],
  158. // implode(', ', $txt), $last_element);
  159. $warning = '<br /><img src="' . WPCF_ACCESS_RELPATH . '/images/warning.png" style="position:relative;top:2px;" />&nbsp;' . sprintf(__('You need to manually set the access rules for taxonomy %s. That taxonomy is shared between several post types that have different access rules.'),
  160. $tax_data['labels']['name'],
  161. implode(', ', $txt), $last_element);
  162. $output .= $warning;
  163. $disable_same_as_parent = true;
  164. }
  165. $output .= '<div class="wpcf-access-mode">';
  166. // Managed checkbox
  167. $output .= '<label><input type="checkbox" class="not-managed" name="types_access[tax]['
  168. . $tax_slug . '][not_managed]" value="1"';
  169. if (!$enabled) {
  170. $output .= ' disabled="disabled" readonly="readonly"';
  171. }
  172. $output .= $mode != 'not_managed' ? ' checked="checked"' : '';
  173. $output .= '/>&nbsp;' . __('Managed by Access', 'wpcf_access') . '</label>';
  174. $output .= '<br />';
  175. // 'Same as parent' checkbox
  176. $output .= '<label><input type="checkbox" class="follow" name="types_access[tax]['
  177. . $tax_slug . '][mode]" value="follow"';
  178. if (!$enabled) {
  179. $output .= ' disabled="disabled" readonly="readonly" checked="checked"';
  180. } else if ($disable_same_as_parent) {
  181. $output .= ' disabled="disabled" readonly="readonly"';
  182. } else {
  183. $output .= $mode == 'follow' ? ' checked="checked"' : '';
  184. }
  185. $output .= ' />&nbsp;' . __('Same as Parent', 'wpcf_access') . '</label>';
  186. $output .= '<div class="wpcf-access-mode-custom">';
  187. $output .= wpcf_access_permissions_table($roles, $custom_data,
  188. $custom_data, 'tax', $tax_slug, $enabled,
  189. $mode != 'not_managed');
  190. $output .= '</div>';
  191. $output .= '</div><!-- wpcf-access-mode -->';
  192. $output .= wpcf_access_submit_button($enabled,
  193. $mode != 'not_managed');
  194. $output .= '&nbsp;' . wpcf_access_reset_button($tax_slug, 'tax',
  195. $enabled);
  196. $output .= '<div style="clear:both;"></div></div><!-- wpcf-access-type-item -->';
  197. }
  198. }
  199. // Allow 3rd party
  200. $third_party = get_option('wpcf-access-3rd-party', array());
  201. $areas = array();
  202. $areas = apply_filters('types-access-area', $areas);
  203. foreach ($areas as $area) {
  204. // Do not allow 'types' ID
  205. if (in_array($area['id'], array('types', 'tax'))) {
  206. continue;
  207. }
  208. $output .= '<br /><br /><h3>' . $area['name'] . '</h3>';
  209. $groups = array();
  210. $groups = apply_filters('types-access-group', $groups, $area['id']);
  211. foreach ($groups as $group) {
  212. $output .= '<a name="' . $group['id'] . '">&nbsp;</a><br />';
  213. $shortcuts[$group['name']][] = array($group['name'], $group['id']);
  214. $output .= '<div class="wpcf-access-type-item">';
  215. $output .= '<strong>' . $group['name'] . '</strong>';
  216. $output .= '<div class="wpcf-access-mode">';
  217. $caps = array();
  218. $caps_filter = apply_filters('types-access-cap', $caps, $area['id'],
  219. $group['id']);
  220. $saved_data = array();
  221. foreach ($caps_filter as $cap_slug => $cap) {
  222. $caps[$cap['cap_id']] = $cap;
  223. if (isset($cap['default_role'])) {
  224. $caps[$cap['cap_id']]['role'] = $cap['role'] = $cap['default_role'];
  225. }
  226. $saved_data[$cap['cap_id']] =
  227. isset($third_party[$area['id']][$group['id']]['permissions'][$cap['cap_id']]) ?
  228. $third_party[$area['id']][$group['id']]['permissions'][$cap['cap_id']] : array('role' => $cap['role']);
  229. }
  230. // Add registered via other hook
  231. if (!empty($wpcf_access->third_party[$area['id']][$group['id']]['permissions'])) {
  232. foreach ($wpcf_access->third_party[$area['id']][$group['id']]['permissions'] as $cap_slug => $cap) {
  233. // Don't allow duplicates
  234. if (isset($caps[$cap['cap_id']])) {
  235. unset($wpcf_access->third_party[$area['id']][$group['id']]['permissions'][$cap_slug]);
  236. continue;
  237. }
  238. $saved_data[$cap['cap_id']] = $cap['saved_data'];
  239. $caps[$cap['cap_id']] = $cap;
  240. }
  241. }
  242. if (isset($cap['style']) && $cap['style'] == 'dropdown') {
  243. } else {
  244. $output .= wpcf_access_permissions_table($roles, $saved_data,
  245. $caps, $area['id'], $group['id'], $enabled);
  246. }
  247. $output .= wpcf_access_submit_button($enabled, true);
  248. $output .= '</div>';
  249. $output .= '</div>';
  250. }
  251. }
  252. // Custom roles
  253. $output .= '<a name="custom-roles"></a><br /><br />';
  254. $output .= '<h3>' . __('Custom Roles', 'wpcf') . '</h3>';
  255. $output .= wpcf_access_admin_set_custom_roles_level_form($roles, $enabled);
  256. $output .= wp_nonce_field('wpcf-access-edit', '_wpnonce', true, false);
  257. $output .= '<input type="hidden" name="action" value="wpcf_access_save_settings" />';
  258. $output .= '</form>';
  259. $output .= '<br /><br />' . wpcf_access_new_role_form($enabled);
  260. $shortmenus = '';
  261. if (!empty($shortcuts)) {
  262. echo '<h3>' . __('On this page', 'wpcf-access') . '</h3>';
  263. foreach ($shortcuts as $section => $items) {
  264. $shortmenu = '';
  265. if (!empty($items)) {
  266. $shortmenu .= '<span class="wpcf-access-shortcut-section">'
  267. . $section . '</span>: ';
  268. foreach ($items as $item) {
  269. $shortmenu .= '&nbsp;&nbsp;<a href="#' . $item[1]
  270. . '" class="wpcf-access-shortcuts">' . $item[0]
  271. . '</a>';
  272. }
  273. $shortmenus .= rtrim($shortmenu, ',') . '<br />';
  274. }
  275. }
  276. $shortmenus .= '<br /><br />';
  277. }
  278. echo $shortmenus . $output;
  279. }
  280. /**
  281. * Renders dropdown with editable roles.
  282. *
  283. * @param type $roles
  284. * @param type $name
  285. * @param type $data
  286. * @return string
  287. */
  288. function wpcf_access_admin_roles_dropdown($roles, $name, $data = array(),
  289. $dummy = false, $enabled = true, $exclude = array()) {
  290. $output = '';
  291. $output .= '<select name="' . $name . '"';
  292. $output .= isset($data['predefined']) ? 'class="wpcf-access-predefied-'
  293. . $data['predefined'] . '">' : '>';
  294. if ($dummy) {
  295. $output .= "\n\t<option";
  296. if (empty($data)) {
  297. $output .= ' selected="selected" disabled="disabled"';
  298. }
  299. $output .= ' value="0">' . $dummy . '</option>';
  300. }
  301. foreach ($roles as $role => $details) {
  302. if (in_array($role, $exclude)) {
  303. continue;
  304. }
  305. $title = translate_user_role($details['name']);
  306. $output .= "\n\t<option";
  307. if (isset($data['role']) && $data['role'] == $role) {
  308. $output .= ' selected="selected"';
  309. }
  310. if (!$enabled) {
  311. $output .= ' disabled="disabled"';
  312. }
  313. $output .= ' value="' . esc_attr($role) . "\">$title</option>";
  314. }
  315. // For now, let's add Guest only for read-only
  316. if (isset($data['predefined']) && $data['predefined'] == 'read-only') {
  317. $output .= "\n\t<option";
  318. if (isset($data['role']) && $data['role'] == 'guest') {
  319. $output .= ' selected="selected"';
  320. }
  321. if (!$enabled) {
  322. $output .= ' disabled="disabled"';
  323. }
  324. $output .= ' value="guest">' . __('Guest', 'wp_access') . '</option>';
  325. }
  326. $output .= '</select>';
  327. return $output;
  328. }
  329. /**
  330. * Auto-suggest users search.
  331. *
  332. * @param type $data
  333. * @param type $name
  334. * @return string
  335. */
  336. function wpcf_access_admin_users_form($data, $name, $enabled = true,
  337. $managed = true) {
  338. $output = '';
  339. $output .= wpcf_access_suggest_user($enabled, $managed);
  340. $output .= '<div class="wpcf-access-user-list">';
  341. if ($enabled && isset($data['users']) && is_array($data['users'])) {
  342. foreach ($data['users'] as $user_id) {
  343. $user = get_userdata($user_id);
  344. if (!empty($user)) {
  345. $output .= '<div class="wpcf-access-remove-user-wrapper"><a href="javascript:void(0);" class="wpcf-access-remove-user">&nbsp;</a><input type="hidden" name="'
  346. . $name . '[users][]" value="' . $user->ID . '" />'
  347. . $user->display_name . ' (' . $user->user_login . ')</div>';
  348. }
  349. }
  350. }
  351. $output .= '</div><div style="clear:both;"></div></div>';
  352. return $output;
  353. }
  354. /**
  355. * Renders pre-defined table.
  356. *
  357. * @param type $type_slug
  358. * @param type $roles
  359. * @param type $name
  360. * @param type $data
  361. * @return string
  362. */
  363. function wpcf_access_admin_predefined($type_slug, $roles, $name, $data,
  364. $enabled = true) {
  365. $output = '';
  366. $output .= '<table class="wpcf-access-predefined-table">';
  367. foreach ($data as $mode => $mode_data) {
  368. if (!isset($mode_data['title']) || !isset($mode_data['role'])) {
  369. continue;
  370. }
  371. $output .= '<tr><td style="text-align:right;">' . $mode_data['title'] . '</td><td>';
  372. $output .= '<input type="hidden" class="wpcf-access-name-holder" name="wpcf_access_'
  373. . $type_slug . '_' . $mode . '" value="' . $name
  374. . '[' . $mode . ']" />';
  375. $output .= wpcf_access_admin_roles_dropdown($roles,
  376. $name . '[' . $mode . '][role]', $mode_data, false, $enabled);
  377. $output .= '</td><td>';
  378. $output .= wpcf_access_admin_users_form($mode_data,
  379. $name . '[' . $mode . ']', $enabled);
  380. $output .= '</td></tr>';
  381. }
  382. $output .= '</table>';
  383. return $output;
  384. }
  385. /**
  386. * Renders custom caps types table.
  387. *
  388. * @param type $type_slug
  389. * @param type $roles
  390. * @param type $name
  391. * @param type $data
  392. * @return string
  393. */
  394. function wpcf_access_admin_edit_access_types_item($type_slug, $roles, $name,
  395. $data, $enabled = true) {
  396. $output = '';
  397. $output .= __('Set all capabilities to users of type:') . '&nbsp;'
  398. . wpcf_access_admin_roles_dropdown($roles,
  399. 'wpcf_access_bulk_set[' . $type_slug . ']', array(),
  400. '-- ' . __('Choose user type', 'wpcf') . ' --', $enabled);
  401. $output .= wpcf_access_reset_button($type_slug, 'type', $enabled);
  402. $output .= '<table class="wpcf-access-caps-wrapper">';
  403. foreach ($data as $cap_slug => $cap_data) {
  404. $output .= '<tr><td style="text-align:right;">';
  405. $output .= $cap_data['title'] . '<td/><td>';
  406. $output .= wpcf_access_admin_roles_dropdown($roles,
  407. $name . '[' . $cap_slug . '][role]', $cap_data, false, $enabled);
  408. $output .= '<input type="hidden" class="wpcf-access-name-holder" name="wpcf_access_'
  409. . $type_slug . '_' . $cap_slug . '" data-wpcfaccesscap="'
  410. . $cap_slug . '" data-wpcfaccessname="'
  411. . $name . '[' . $cap_slug . ']" value="' . $name
  412. . '[' . $cap_slug . ']" />';
  413. $output .= '</td><td>';
  414. $output .= wpcf_access_admin_users_form($cap_data,
  415. $name . '[' . $cap_slug . ']', $enabled);
  416. $output .= '</td></tr>';
  417. }
  418. $output .= '</td></tr></table>';
  419. return $output;
  420. }
  421. /**
  422. * Renders custom caps tax table.
  423. *
  424. * @param type $type_slug
  425. * @param type $roles
  426. * @param type $name
  427. * @param type $data
  428. * @return string
  429. */
  430. function wpcf_access_admin_edit_access_tax_item($type_slug, $roles, $name,
  431. $data, $enabled = true) {
  432. $output = '';
  433. $output .= '<table class="wpcf-access-caps-wrapper">';
  434. foreach ($data as $cap_slug => $cap_data) {
  435. $output .= '<tr><td style="text-align:right;">';
  436. $output .= $cap_data['title'] . '<td/><td>';
  437. $output .= wpcf_access_admin_roles_dropdown($roles,
  438. $name . '[' . $cap_slug . '][role]', $cap_data, false, $enabled);
  439. $output .= '<input type="hidden" class="wpcf-access-name-holder" name="wpcf_access_'
  440. . $type_slug . '_' . $cap_slug . '" value="' . $name
  441. . '[' . $cap_slug . ']" />';
  442. $output .= '</td><td>';
  443. $output .= wpcf_access_admin_users_form($cap_data,
  444. $name . '[' . $cap_slug . ']', $enabled);
  445. $output .= '</td></tr>';
  446. }
  447. $output .= '</td></tr></table>';
  448. return $output;
  449. }
  450. /**
  451. * Reset caps button.
  452. *
  453. * @param type $type_slug
  454. * @param type $type
  455. * @return string
  456. */
  457. function wpcf_access_reset_button($type_slug, $type = 'type', $enabled = true,
  458. $managed = true) {
  459. $output = '';
  460. $output .= '<input type="submit" id="wpcf-access-reset-' . md5($type_slug . $type)
  461. . '" class="button-secondary wpcf-access-reset"';
  462. if (!$enabled) {
  463. $output .= ' href="javascript:void(0);" disabled="disabled"';
  464. } else {
  465. if (!$managed) {
  466. $output .= ' disabled="disabled"';
  467. }
  468. $output .= ' href="' . admin_url('admin-ajax.php?action=wpcf_access_ajax_reset_to_default&amp;_wpnonce='
  469. . wp_create_nonce('wpcf_access_ajax_reset_to_default') . '&amp;type='
  470. . $type . '&amp;type_slug=' . $type_slug . '')
  471. . '" onclick="if (confirm(\''
  472. . addslashes(__('Are you sure? All permission settings for this type will change to their default values.',
  473. 'wpcf_access'))
  474. . '\')){ wpcfAccessReset(jQuery(this)); } return false;"';
  475. }
  476. $output .= ' value="' . __('Reset to defaults', 'wpcf_access') . '" />';
  477. return $output;
  478. }
  479. /**
  480. * Submit button.
  481. *
  482. * @param type $enabled
  483. * @param type $managed
  484. * @return type
  485. */
  486. function wpcf_access_submit_button($enabled = true, $managed = true) {
  487. $output = '';
  488. if ($enabled && $managed) {
  489. $output .= '<input type="submit" value="' . __('Save Changes',
  490. 'wpcf_access') . '" id="submit-' . mt_rand() . '" class="wpcf-access-submit button-primary" />';
  491. } else {
  492. $output .= '<input type="submit" value="' . __('Save Changes',
  493. 'wpcf_access') . '" id="submit-' . mt_rand() . '" class="wpcf-access-submit button-primary" disabled="disabled" />';
  494. }
  495. if ($enabled || $managed) {
  496. $output .= '&nbsp;<img class="ajax-loading" alt="" src="'
  497. . admin_url('/images/wpspin_light.gif') . '" style="visibility: hidden;">';
  498. }
  499. return $output;
  500. }
  501. /**
  502. * Custom roles form.
  503. *
  504. * @param type $roles
  505. * @return string
  506. */
  507. function wpcf_access_admin_set_custom_roles_level_form($roles, $enabled = true) {
  508. $levels = wpcf_access_role_to_level_map();
  509. $builtin_roles = array();
  510. $custom_roles = array();
  511. $output = '';
  512. foreach ($roles as $role => $details) {
  513. if (!in_array($role,
  514. array('administrator', 'editor', 'author', 'contributor', 'subscriber'))) {
  515. $compare = 'init';
  516. foreach ($details['capabilities'] as $capability => $true) {
  517. if (strpos($capability, 'level_') !== false && $true) {
  518. $current_level = intval(substr($capability, 6));
  519. if ($compare === 'init' || $current_level > intval($compare)) {
  520. $compare = $current_level;
  521. }
  522. }
  523. }
  524. $level = $compare !== 'init' ? $compare : 'not_set';
  525. $custom_roles[$level][$role] = $details;
  526. $custom_roles[$level][$role]['level'] = $compare !== 'init' ? $compare : 'not_set';
  527. } else if (isset($levels[$role])) {
  528. $level = intval(substr($levels[$role], 6));
  529. $builtin_roles[$level][$role] = $details;
  530. $builtin_roles[$level][$role]['name'] = translate_user_role($details['name']);
  531. $builtin_roles[$level][$role]['level'] = $level;
  532. }
  533. }
  534. if (empty($custom_roles)) {
  535. return '<div id="wpcf-access-custom-roles-wrapper">'
  536. . __('No custom roles defined', 'wpcf_access') . '</div>';
  537. }
  538. $output .= '<div id="wpcf-access-custom-roles-wrapper">';
  539. $output .= '<p>' . __('The user level determines which admin actions WordPress allows different kinds of users to perform.',
  540. 'wpcf_access') . '</p>';
  541. $output .= '<div id="wpcf-access-custom-roles-table-wrapper">';
  542. $output .= '<table cellpadding="10" cellspacing="0" class="wpcf-access-custom-roles-table"><tbody>';
  543. for ($index = 10; $index >= 0; $index--) {
  544. $level_empty = true;
  545. $row = '<tr><td><div class="wpcf-access-roles-level">'
  546. . sprintf(__('Level %d', 'wpcf_access'), $index)
  547. . '</div></td><td>';
  548. if (isset($builtin_roles[$index])) {
  549. $level_empty = false;
  550. foreach ($builtin_roles[$index] as $role => $details) {
  551. $row .= '<div class="wpcf-access-roles-builtin">'
  552. . $details['name'] . '</div>';
  553. }
  554. }
  555. if (isset($custom_roles[$index])) {
  556. $level_empty = false;
  557. foreach ($custom_roles[$index] as $role => $details) {
  558. $dropdown = '<div class="wpcf-access-custom-roles-select-wrapper">'
  559. . '<select name="roles[' . $role
  560. . ']" class="wpcf-access-custom-roles-select">';
  561. for ($index2 = 10; $index2 > -1; $index2--) {
  562. $dropdown .= '<option value="' . $index2 . '"';
  563. if ($index == $index2) {
  564. $dropdown .= ' selected="selected"';
  565. }
  566. if (!$enabled) {
  567. $dropdown .= ' disabled="disabled"';
  568. }
  569. $dropdown .= '>' . sprintf(__('Level %d', 'wpcf_access'),
  570. $index2);
  571. $dropdown .= '</option>';
  572. }
  573. $dropdown .= '</select>&nbsp;<a href="javascript:void(0);" '
  574. . 'class="wpcf-access-change-level-apply button-primary">'
  575. . __('Apply', 'wpcf_access') . '</a>&nbsp;<a href="javascript:void(0);" '
  576. . 'class="wpcf-access-change-level-cancel button-secondary">'
  577. . __('Cancel') . '</a>'
  578. . '</div>';
  579. $row .= '<div class="wpcf-access-roles-custom">'
  580. . $details['name'] . '&nbsp;'
  581. . '<a href="javascript:void(0);"';
  582. if ($enabled) {
  583. $row .= ' class="wpcf-access-change-level"';
  584. }
  585. $row .= '>' . __('Change level', 'wpcf_access') . '</a>'
  586. . '&nbsp;';
  587. if ($enabled) {
  588. $row .= $dropdown;
  589. }
  590. $row .=' &nbsp;'
  591. . '<a ';
  592. if ($enabled) {
  593. $row .= 'href="#TB_inline?height=155&width=500&inlineId=wpcf-access-reassign-' . sanitize_title($role) . '&modal=true" class="wpcf-access-delete-role thickbox"';
  594. } else {
  595. $row .= 'href="javascript:void(0);"';
  596. }
  597. $row .= '>' . __('Delete role', 'wpcf_access') . '</a>'
  598. . '&nbsp;';
  599. if ($enabled) {
  600. $row .= wpcf_access_reassign_role_form($role);
  601. }
  602. $row .= '</div>';
  603. }
  604. }
  605. $row .= '</td></tr>';
  606. if (!$level_empty) {
  607. $output .= $row;
  608. }
  609. }
  610. if (isset($custom_roles['not_set'])) {
  611. $output .= '<tr><td><div class="wpcf-access-roles-level">'
  612. . __('Undefined', 'wpcf_access') . '</div></td><td>';
  613. foreach ($custom_roles['not_set'] as $role => $details) {
  614. $dropdown = '<div class="wpcf-access-custom-roles-select-wrapper">'
  615. . '<select name="roles[' . $role
  616. . ']" class="wpcf-access-custom-roles-select">';
  617. for ($index2 = 10; $index2 >= 0; $index2--) {
  618. $dropdown .= '<option value="' . $index2 . '"';
  619. if ($index2 == 1) {
  620. $dropdown .= ' selected="selected"';
  621. }
  622. if (!$enabled) {
  623. $dropdown .= ' disabled="disabled"';
  624. }
  625. $dropdown .= '>'
  626. . sprintf(__('Level %d', 'wpcf_access'), $index2)
  627. . '</option>';
  628. }
  629. $dropdown .= '</select>&nbsp;<a href="javascript:void(0);" '
  630. . 'class="wpcf-access-change-level-apply button-primary">'
  631. . __('Apply', 'wpcf_access') . '</a>&nbsp;<a href="javascript:void(0);" '
  632. . 'class="wpcf-access-change-level-cancel button-secondary">'
  633. . __('Cancel') . '</a>'
  634. . '</div>';
  635. $output .= '<div class="wpcf-access-roles-custom">'
  636. . $details['name'] . '&nbsp;'
  637. . '<a href="javascript:void(0);"';
  638. if ($enabled) {
  639. $output .= ' class="wpcf-access-change-level"';
  640. }
  641. $output .= '>' . __('Change level', 'wpcf_access') . '</a>'
  642. . '&nbsp;';
  643. if ($enabled) {
  644. $output .= $dropdown;
  645. }
  646. $output .= '<a ';
  647. if ($enabled) {
  648. $output .= 'href="#TB_inline?height=155&width=500&inlineId=wpcf-access-reassign-' . $role . '&modal=true" class="wpcf-access-delete-role thickbox"';
  649. } else {
  650. $output .= 'href="javascript:void(0);"';
  651. }
  652. $output .= '>' . __('Delete role', 'wpcf_access') . '</a>'
  653. . '&nbsp;';
  654. if ($enabled) {
  655. $output .= wpcf_access_reassign_role_form($role);
  656. }
  657. }
  658. $output .= '</div></td></tr>';
  659. }
  660. $output .= '</tbody></table>';
  661. $output .= '</div>';
  662. $output .= '</div>';
  663. return $output;
  664. }
  665. /**
  666. * HTML formatted permissions table.
  667. *
  668. * @param type $roles
  669. * @param type $permissions
  670. * @param type $name
  671. * @return string
  672. */
  673. function wpcf_access_permissions_table($roles, $permissions, $settings,
  674. $group_id, $id, $enabled = true, $managed = true) {
  675. $ordered_roles = wpcf_access_order_roles_by_level($roles);
  676. $output = '';
  677. $output .= '<table><tr><th>' . __('Action', 'wpcf-access') . '</th>';
  678. foreach ($ordered_roles as $levels => $roles_data) {
  679. if (empty($roles_data)) {
  680. continue;
  681. }
  682. $title = '';
  683. foreach ($roles_data as $role => $details) {
  684. $title .= translate_user_role($details['name']) . '<br />';
  685. }
  686. $output .= '<th>' . $title . '</th>';
  687. }
  688. // Add Guest
  689. $output .= '<th>' . __('Guest', 'wpcf-access') . '</th>';
  690. $output .= '<th>' . __('Specific user', 'wpcf-access') . '</th></tr><tbody>';
  691. foreach ($settings as $permission_slug => $data) {
  692. // Change slug for 3rd party
  693. if (!in_array($group_id, array('types', 'tax'))) {
  694. $permission_slug = $data['cap_id'];
  695. }
  696. $check = true;
  697. $output .= '<tr><td>' . $data['title'] . '</td>';
  698. $name = 'types_access[' . $group_id . '][' . $id . '][permissions]'
  699. . '[' . $permission_slug . '][role]';
  700. // If no settings saved use default setting [role]
  701. $role_check = !empty($permissions[$permission_slug]['role']) ? $permissions[$permission_slug]['role'] : $data['role'];
  702. foreach ($ordered_roles as $levels => $roles_data) {
  703. if (empty($roles_data)) {
  704. continue;
  705. }
  706. // Render only first (built-in)
  707. $role = key($roles_data);
  708. $details = array_shift($roles_data);
  709. $att_id = $group_id . '_' . $id . '_permissions_' . $permission_slug . '_'
  710. . $role . '_role';
  711. $attributes = $check ? ' checked="checked"' : '';
  712. $attributes .=!$managed ? ' readonly="readonly" disabled="disabled"' : '';
  713. $output .= '<td><input type="checkbox" name="';
  714. $output .= $role_check == $role ? $name : 'dummy';
  715. $output .= '" id="' . $att_id . '" value="' . $role . '"'
  716. . $attributes . ' class="wpcf-access-check-left wpcf-access-'
  717. . $permission_slug . '" data-wpcfaccesscap="'
  718. . $permission_slug . '" data-wpcfaccessname="'
  719. . $name . '" '
  720. . 'onclick="wpcfAccessAutoThick(jQuery(this), \''
  721. . $permission_slug . '\', \''
  722. . $name . '\');"';
  723. if (!$enabled) {
  724. $output .= ' disabled="disabled" readonly="readonly"';
  725. }
  726. $output .= '/></td>';
  727. // Turn off onwards checking
  728. if ($role_check == $role) {
  729. $check = false;
  730. }
  731. }
  732. // Add Guest
  733. $name = 'types_access[' . $group_id . '][' . $id . '][permissions]'
  734. . '[' . $permission_slug . '][role]';
  735. $attributes = $check ? ' checked="checked"' : '';
  736. $attributes .=!$managed ? ' readonly="readonly" disabled="disabled"' : '';
  737. $output .= '<td><input type="checkbox" name="';
  738. $output .= $role_check == 'guest' ? $name : 'dummy';
  739. $output .= '" id="' . $group_id . '_' . $id . '_permissions_'
  740. . $permission_slug
  741. . '_guest_role" value="guest"'
  742. . $attributes . ' class="wpcf-access-check-left wpcf-access-'
  743. . $permission_slug . '" data-wpcfaccesscap="'
  744. . $permission_slug . '" data-wpcfaccessname="'
  745. . $name . '" '
  746. . 'onclick="wpcfAccessAutoThick(jQuery(this), \''
  747. . $permission_slug . '\', \''
  748. . $name . '\');"';
  749. if (!$enabled) {
  750. $output .= ' disabled="disabled" readonly="readonly"';
  751. }
  752. $output .= ' />';
  753. // Add admin if all disabled
  754. $output .= '<input type="hidden" name="types_access[' . $group_id . '][' . $id . '][__permissions]'
  755. . '[' . $permission_slug . '][role]" value="administrator" />';
  756. $output .= '</td>';
  757. $data['users'] = !empty($permissions[$permission_slug]['users']) ? $permissions[$permission_slug]['users'] : array();
  758. $output .= '<td>'
  759. . '<input type="hidden" class="wpcf-access-name-holder" name="wpcf_access_'
  760. . $id . '_' . $permission_slug . '" data-wpcfaccesscap="'
  761. . $permission_slug . '" data-wpcfaccessname="'
  762. . 'types_access[' . $group_id . ']['
  763. . $id . ']'
  764. . '[permissions][' . $permission_slug . ']" value="types_access[' . $group_id . ']['
  765. . $id . ']'
  766. . '[permissions][' . $permission_slug . ']" />'
  767. . wpcf_access_admin_users_form($data,
  768. 'types_access[' . $group_id . '][' . $id . '][permissions]'
  769. . '[' . $permission_slug . ']', $enabled, $managed)
  770. . '</td></tr>';
  771. }
  772. $output .= '</tbody></table>';
  773. return $output;
  774. }
  775. /**
  776. * Suggest user form.
  777. *
  778. * @global type $wpdb
  779. * @return string
  780. */
  781. function wpcf_access_suggest_user($enabled = true, $managed = false) {
  782. global $wpdb;
  783. // Select first 5 users
  784. $users = $wpdb->get_results("SELECT ID, user_login, display_name FROM $wpdb->users LIMIT 5");
  785. $output = '';
  786. $output = '<div class="types-suggest-user types-suggest" id="types-suggest-user-'
  787. . mt_rand() . '">';
  788. $output .= '<input type="text" class="input" placeholder="' . esc_attr__('search',
  789. 'wpcf_access') . '"';
  790. if (!$enabled || !$managed) {
  791. $output .= ' readonly="readonly" disabled="disabled"';
  792. }
  793. $output .= ' />';
  794. $output .= '<img src="' . esc_url(admin_url('images/wpspin_light.gif')) . '" class="img-waiting" alt="" />';
  795. $output .= '&nbsp;<a href="javascript:void(0);" class="confirm toggle button-primary">'
  796. . __('OK', 'wpcf_access') . '</a>';
  797. $output .= '&nbsp;<a href="javascript:void(0);" class="cancel toggle button-secondary">'
  798. . __('Cancel', 'wpcf_access') . '</a>';
  799. $output .= '<br /><select size="' . count($users)
  800. . '" class="dropdown">';
  801. foreach ($users as $u) {
  802. $output .= '<option value="' . $u->ID . '">' . $u->display_name . ' (' . $u->user_login . ')' . '</option>';
  803. }
  804. $output .= '</select>';
  805. $output .= '</div>';
  806. return $output;
  807. }
  808. /**
  809. * New role form.
  810. *
  811. * @return string
  812. */
  813. function wpcf_access_new_role_form($enabled) {
  814. $output = '';
  815. $output .= '<div id="wpcf-access-new-role">';
  816. $output .= '<a href="javascript:void(0);" class="button button-primary"';
  817. if (!$enabled) {
  818. $output .= ' disabled="disabled" readonly="readonly"';
  819. }
  820. $output .= '>' . __('New role', 'wpcf_access') . '</a>';
  821. $output .= '<div class="toggle">';
  822. $output .= '<input type="text" name="types_access[new_role]" class="input" value="" />';
  823. $output .= '<img src="' . esc_url(admin_url('images/wpspin_light.gif')) . '" class="img-waiting" alt="" />';
  824. $output .= '&nbsp;<a href="javascript:void(0);" class="confirm toggle button-primary" disabled="disabled">'
  825. . __('OK', 'wpcf_access') . '</a>';
  826. $output .= '&nbsp;<a href="javascript:void(0);" class="cancel toggle button-secondary">'
  827. . __('Cancel', 'wpcf_access') . '</a>';
  828. $output .= '</div>';
  829. $output .= '<div class="ajax-response"></div>';
  830. $output .= '</div>';
  831. return $output;
  832. }
  833. /**
  834. * Reassing role form.
  835. *
  836. * @param type $role
  837. * @return string
  838. */
  839. function wpcf_access_reassign_role_form($role) {
  840. $output = '';
  841. $output .= '<div class="wpcf-access-reassign-role" id="wpcf-access-reassign-'
  842. . sanitize_title($role) . '"><div class="wpcf-access-reassign-role-popup">';
  843. $users = get_users('role=' . $role . '&number=5');
  844. $users_txt = '';
  845. foreach ($users as $user) {
  846. $users_txt[] = $user->display_name;
  847. }
  848. if (!empty($users)) {
  849. $users_txt = implode(', ', $users_txt);
  850. $output .= sprintf(__('Choose what role to change current %s users to:',
  851. 'wpcf_access'), '<em>' . $users_txt . '</em>');
  852. $output .= wpcf_access_admin_roles_dropdown(get_editable_roles(),
  853. 'wpcf_reassign', array(),
  854. __('--- chose role ---', 'wpcf_access'), true, array($role));
  855. } else {
  856. $output .= '<input type="hidden" name="wpcf_reassign" value="ignore" />';
  857. $output .= __('Do you really want to remove this role?', 'wpcf_access');
  858. }
  859. $output .= '<input type="hidden" name="wpcf_access_delete_role" value="'
  860. . $role . '" />
  861. <input type="hidden" name="wpcf_access_delete_role_nonce" value="'
  862. . wp_create_nonce('delete_role') . '" />
  863. <div class="modal">
  864. <a href="javascript:void(0);" class="button-primary confirm"';
  865. if (!empty($users)) {
  866. $output .= ' disabled="disabled">' . __('Save', 'wpcf_access');
  867. } else {
  868. $output .= '>' . __('Delete', 'wpcf_access');
  869. }
  870. $output .= '</a>
  871. <a href="javascript:void(0);" class="button-secondary cancel" onclick="javascript:tb_remove();">'
  872. . __('Cancel', 'wpcf_access') . '</a>&nbsp;<img src="' . esc_url(admin_url('images/wpspin_light.gif')) . '" class="img-waiting" alt="" />
  873. </div>';
  874. $output .= '<div class="ajax-response"></div></div></div>';
  875. return $output;
  876. }