Refactoring Menu 1st step: Permissions

- added config permissions to setup our capabilities
- added debug mode for Twig so that we can use "dump()" when WP_DEBUG is on
This commit is contained in:
Jonathan Labreuille
2015-10-14 16:58:50 +02:00
parent e24263e067
commit c8c3f09fb2
10 changed files with 240 additions and 54 deletions

View File

@ -22,6 +22,7 @@ class Initializer {
$this->setupMenu(); $this->setupMenu();
$this->setupRouter(); $this->setupRouter();
$this->setupWidget(); $this->setupWidget();
$this->setupPermissions();
} }
function setupDB() { function setupDB() {
@ -82,4 +83,9 @@ class Initializer {
$widget = new Widget(); $widget = new Widget();
$widget->init(); $widget->init();
} }
function setupPermissions() {
$permissions = new Permissions();
$permissions->init();
}
} }

View File

@ -3,6 +3,7 @@ namespace MailPoet\Config;
use \MailPoet\Models\Segment; use \MailPoet\Models\Segment;
use \MailPoet\Models\Setting; use \MailPoet\Models\Setting;
use \MailPoet\Settings\Hosts; use \MailPoet\Settings\Hosts;
use \MailPoet\Settings\Permissions;
use \MailPoet\Util\DKIM; use \MailPoet\Util\DKIM;
if(!defined('ABSPATH')) exit; if(!defined('ABSPATH')) exit;
@ -151,51 +152,7 @@ class Menu {
'ISO-8859-15', 'Windows-1251', 'Windows-1252' 'ISO-8859-15', 'Windows-1251', 'Windows-1252'
); );
// Roles & Permissions
global $wp_roles;
$editable_roles = apply_filters('editable_roles', $wp_roles->roles);
$roles = array();
foreach($editable_roles as $role => $role_data) {
$roles[$role] = translate_user_role($role_data['name']);
}
$capabilities = array(
'mailpoet_newsletters' =>
__('Who can create newsletters?'),
'mailpoet_newsletter_styles' =>
__('Who can see the styles tab in the visual editor?'),
'mailpoet_subscribers' =>
__('Who can manage subscribers?'),
'mailpoet_settings' =>
__("Who can change MailPoet's settings?"),
);
$capabilities = apply_filters('mailpoet_capabilities', $capabilities);
// go over each capability
foreach($capabilities as $capability => $label) {
$capability_roles = array();
// go over each role and check permission
foreach($roles as $role_key => $role_data) {
// get role object based on role key
$role = get_role($role_key);
// assign role capability
$capability_roles[$role_key] = array(
'capability' => $capability,
'is_capable' => (
in_array($role_key, array('administrator', 'super_admin'))
|| ($role->has_cap($capability))
),
'is_disabled' =>(
in_array($role_key, array('administrator', 'super_admin'))
)
);
}
$capabilities[$capability] = array(
'label' => $label,
'roles' => $capability_roles
);
}
// dkim: check if public/private keys have been generated // dkim: check if public/private keys have been generated
if( if(
@ -219,8 +176,7 @@ class Menu {
'flags' => $flags, 'flags' => $flags,
'charsets' => $charsets, 'charsets' => $charsets,
'current_user' => $current_user, 'current_user' => $current_user,
'capabilities' => $capabilities, 'permissions' => Permissions::get(),
'roles' => $roles,
'hosts' => array( 'hosts' => array(
'web' => Hosts::getWebHosts(), 'web' => Hosts::getWebHosts(),
'smtp' => Hosts::getSMTPHosts() 'smtp' => Hosts::getSMTPHosts()

View File

@ -0,0 +1,43 @@
<?php
namespace MailPoet\Config;
class Permissions {
function __construct() {
}
function init() {
add_action(
'admin_init',
array($this, 'setup')
);
}
function setup() {
// administrative roles
$roles = array('administrator', 'super_admin');
// mailpoet capabilities
$capabilities = array(
'mailpoet_newsletters',
'mailpoet_newsletter_styles',
'mailpoet_subscribers',
'mailpoet_settings',
'mailpoet_statistics'
);
foreach($roles as $role_key){
// get role based on role key
$role = get_role($role_key);
// if the role doesn't exist, skip it
if($role !== null) {
// add capability
foreach($capabilities as $capability) {
if(!$role->has_cap($capability)) {
$role->add_cap($capability);
}
}
}
}
}
}

View File

@ -12,11 +12,15 @@ class Renderer {
$file_system = new TwigFileSystem(Env::$views_path); $file_system = new TwigFileSystem(Env::$views_path);
$this->renderer = new TwigEnv( $this->renderer = new TwigEnv(
$file_system, $file_system,
array('cache' => $this->detectCache()) array(
'cache' => $this->detectCache(),
'debug' => WP_DEBUG
)
); );
} }
function init() { function init() {
$this->setupDebug();
$this->setupTranslations(); $this->setupTranslations();
$this->setupFunctions(); $this->setupFunctions();
$this->setupHandlebars(); $this->setupHandlebars();
@ -61,4 +65,10 @@ class Renderer {
} }
return false; return false;
} }
function setupDebug() {
if(WP_DEBUG === true) {
$this->renderer->addExtension(new \Twig_Extension_Debug());
}
}
} }

View File

@ -21,4 +21,8 @@ class Settings {
wp_send_json(in_array(false, $results)); wp_send_json(in_array(false, $results));
} }
function save($data = array()) {
// TODO
}
} }

View File

@ -0,0 +1,94 @@
<?php
namespace MailPoet\Settings;
class Permissions {
static function getCapabilities() {
$capabilities = array(
'mailpoet_newsletters' =>
__('Who can create newsletters?'),
'mailpoet_newsletter_styles' =>
__('Who can see the styles tab in the visual editor?'),
'mailpoet_subscribers' =>
__('Who can manage subscribers?'),
'mailpoet_settings' =>
__("Who can change MailPoet's settings?")
);
$capabilities = apply_filters('mailpoet_capabilities', $capabilities);
return $capabilities;
}
static function getRoles() {
$roles = array();
global $wp_roles;
$editable_roles = apply_filters('editable_roles', $wp_roles->roles);
foreach($editable_roles as $role => $role_data) {
$roles[$role] = translate_user_role($role_data['name']);
}
return $roles;
}
static function get() {
$roles = static::getRoles();
$capabilities = static::getCapabilities();
// go over each capability
foreach($capabilities as $capability => $label) {
$capability_roles = array();
// go over each role and check permission
foreach($roles as $role_key => $role_data) {
// get role object based on role key
$role = get_role($role_key);
// assign role capability
$capability_roles[$role_key] = array(
'capability' => $capability,
'is_capable' => (
in_array($role_key, array('administrator', 'super_admin'))
|| ($role->has_cap($capability))
),
'is_disabled' =>(
in_array($role_key, array('administrator', 'super_admin'))
)
);
}
$capabilities[$capability] = array(
'label' => $label,
'roles' => $capability_roles
);
}
return array(
'roles' => $roles,
'capabilities' => $capabilities
);
}
static function set($permissions = array()) {
if(!empty($permissions)) {
foreach($permissions as $permission) {
// ignore administrator & superadmin roles
if(in_array(
$permission['role'],
array('administrator', 'superadmin'))
) {
continue;
}
// get role
$role = get_role($permission['role']);
if((bool)$permission['is_capable'] === true) {
// add capability to role
$role->add_cap($permission['capability']);
} else {
// remove capability to role
if($role->has_cap($permission['capability'])) {
$role->remove_cap($permission['capability']);
}
}
}
}
}
}

View File

@ -46,8 +46,7 @@ class Functions extends \Twig_Extension {
'sending_frequency', 'sending_frequency',
array($this, 'getSendingFrequency'), array($this, 'getSendingFrequency'),
array('is_safe' => array('all')) array('is_safe' => array('all'))
), )
); );
} }

View File

@ -62,6 +62,77 @@
jQuery(function($) { jQuery(function($) {
// on dom loaded // on dom loaded
$(function() { $(function() {
// save settings
$('.mailpoet_settings_submit').on('click', function(e) {
e.preventDefault();
// serialize form data
var data = $('#mailpoet_settings_form').serializeObject(),
permissions = $('.mailpoet_role_permission'),
data_permissions = [],
has_error = false;
// check if "subscribe in comments" is enabled
if(parseInt(data.subscribe_on_comment) === 1) {
if(data.subscribe_on_comment_lists === undefined) {
$('#subscribe_on_comment_lists').next('.mailpoet_error').show();
has_error = true;
} else {
$('#subscribe_on_comment_lists').next('.mailpoet_error').hide();
}
}
// check if "subscribe in registration form" is enabled
if(parseInt(data.subscribe_on_register) === 1) {
if(data.subscribe_on_register_lists === undefined) {
$('#subscribe_on_register_lists').next('.mailpoet_error').show();
has_error = true;
} else {
$('#subscribe_on_register_lists').next('.mailpoet_error').hide();
}
}
// fail fast...
if(has_error === true) {
return false;
}
// format permissions
for(var i = permissions.length - 1; i >= 0; i--) {
var permission = $(permissions[i]);
data_permissions.push({
role: permission.data('role'),
capability: permission.data('capability'),
is_capable: (permission.is(':checked') ? 1 : 0)
});
};
// show loading screen
//MailPoet.Modal.loading(true);
console.log(data);
console.log(data_permissions);
// // save permissions
// mailpoet_post_wpi('settings_set_permissions.php', { permissions: data_permissions });
// // save settings
// mailpoet_post_json('settings_set.php', data, function(response) {
// if(response.success !== undefined && response.success === true) {
// // display success message
// MailPoet.Notice.success("<?php _e('Settings saved.'); ?>");
// } else if(response.error !== undefined) {
// MailPoet.Notice.error("<?php _e('Settings could not be saved.'); ?>");
// }
// // hide loading screen
// // MailPoet.Modal.loading(false);
// }, function(error) {
// // hide loading screen
// // MailPoet.Modal.loading(false);
// });
});
// setup toggle checkboxes // setup toggle checkboxes
function toggleContent() { function toggleContent() {
$('#'+$(this).data('toggle'))[ $('#'+$(this).data('toggle'))[

View File

@ -4,7 +4,7 @@
<th class="manage-column"> <th class="manage-column">
<%= __('Roles and permissions') %> <%= __('Roles and permissions') %>
</th> </th>
<% for role in roles %> <% for role in permissions.roles %>
<th class="manage-column"> <th class="manage-column">
<%= role %> <%= role %>
</th> </th>
@ -12,18 +12,18 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<% for capability in capabilities %> <% for capability in permissions.capabilities %>
<tr class="<%= cycle(['alternate', ''], loop.index0) %>"> <tr class="<%= cycle(['alternate', ''], loop.index0) %>">
<td> <td>
<%= capability.label %> <%= capability.label %>
</td> </td>
<% for role in capability.roles %> <% for role_key, role in capability.roles %>
<td> <td>
<input <input
class="mailpoet_role_permission" class="mailpoet_role_permission"
type="checkbox" type="checkbox"
data-role="<%= role %>" data-role="<%= role_key %>"
data-capability="<%= capability %>" data-capability="<%= role.capability %>"
value="1" value="1"
<% if(role.is_capable) %> <% if(role.is_capable) %>
checked="checked" checked="checked"

View File

@ -121,6 +121,9 @@
><%= segment.name %></option> ><%= segment.name %></option>
<% endfor %> <% endfor %>
</select> </select>
&nbsp;<span class="mailpoet_error">
<%= __('Please select a list.') %>
</span>
</p> </p>
</div> </div>
</td> </td>