diff --git a/lib/Config/Initializer.php b/lib/Config/Initializer.php index 77c71b5d9d..30c7aea82c 100644 --- a/lib/Config/Initializer.php +++ b/lib/Config/Initializer.php @@ -22,6 +22,7 @@ class Initializer { $this->setupMenu(); $this->setupRouter(); $this->setupWidget(); + $this->setupPermissions(); } function setupDB() { @@ -82,4 +83,9 @@ class Initializer { $widget = new Widget(); $widget->init(); } + + function setupPermissions() { + $permissions = new Permissions(); + $permissions->init(); + } } diff --git a/lib/Config/Menu.php b/lib/Config/Menu.php index aefafebd78..0a0faa3491 100644 --- a/lib/Config/Menu.php +++ b/lib/Config/Menu.php @@ -3,6 +3,7 @@ namespace MailPoet\Config; use \MailPoet\Models\Segment; use \MailPoet\Models\Setting; use \MailPoet\Settings\Hosts; +use \MailPoet\Settings\Permissions; use \MailPoet\Util\DKIM; if(!defined('ABSPATH')) exit; @@ -151,51 +152,7 @@ class Menu { '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 if( @@ -219,8 +176,7 @@ class Menu { 'flags' => $flags, 'charsets' => $charsets, 'current_user' => $current_user, - 'capabilities' => $capabilities, - 'roles' => $roles, + 'permissions' => Permissions::get(), 'hosts' => array( 'web' => Hosts::getWebHosts(), 'smtp' => Hosts::getSMTPHosts() diff --git a/lib/Config/Permissions.php b/lib/Config/Permissions.php new file mode 100644 index 0000000000..b0ea848c73 --- /dev/null +++ b/lib/Config/Permissions.php @@ -0,0 +1,43 @@ +has_cap($capability)) { + $role->add_cap($capability); + } + } + } + } + } +} \ No newline at end of file diff --git a/lib/Config/Renderer.php b/lib/Config/Renderer.php index 68bcaf37da..90db4ec83a 100644 --- a/lib/Config/Renderer.php +++ b/lib/Config/Renderer.php @@ -12,11 +12,15 @@ class Renderer { $file_system = new TwigFileSystem(Env::$views_path); $this->renderer = new TwigEnv( $file_system, - array('cache' => $this->detectCache()) + array( + 'cache' => $this->detectCache(), + 'debug' => WP_DEBUG + ) ); } function init() { + $this->setupDebug(); $this->setupTranslations(); $this->setupFunctions(); $this->setupHandlebars(); @@ -61,4 +65,10 @@ class Renderer { } return false; } + + function setupDebug() { + if(WP_DEBUG === true) { + $this->renderer->addExtension(new \Twig_Extension_Debug()); + } + } } diff --git a/lib/Router/Settings.php b/lib/Router/Settings.php index 574c751d50..5c1ff6bf2c 100644 --- a/lib/Router/Settings.php +++ b/lib/Router/Settings.php @@ -21,4 +21,8 @@ class Settings { wp_send_json(in_array(false, $results)); } + + function save($data = array()) { + // TODO + } } diff --git a/lib/Settings/Permissions.php b/lib/Settings/Permissions.php new file mode 100644 index 0000000000..ce4a4565c7 --- /dev/null +++ b/lib/Settings/Permissions.php @@ -0,0 +1,94 @@ + + __('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']); + } + } + } + } + } +} \ No newline at end of file diff --git a/lib/Twig/Functions.php b/lib/Twig/Functions.php index 09dec05141..cc2cd4c148 100644 --- a/lib/Twig/Functions.php +++ b/lib/Twig/Functions.php @@ -46,8 +46,7 @@ class Functions extends \Twig_Extension { 'sending_frequency', array($this, 'getSendingFrequency'), array('is_safe' => array('all')) - ), - + ) ); } diff --git a/views/settings.html b/views/settings.html index 1935c064b1..cd8a9c5ba1 100644 --- a/views/settings.html +++ b/views/settings.html @@ -62,6 +62,77 @@ jQuery(function($) { // on dom loaded $(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(""); + // } else if(response.error !== undefined) { + // MailPoet.Notice.error(""); + // } + + // // hide loading screen + // // MailPoet.Modal.loading(false); + // }, function(error) { + // // hide loading screen + // // MailPoet.Modal.loading(false); + // }); + }); + // setup toggle checkboxes function toggleContent() { $('#'+$(this).data('toggle'))[ diff --git a/views/settings/advanced.html b/views/settings/advanced.html index 8ffb5d4887..ab87d4c1c5 100644 --- a/views/settings/advanced.html +++ b/views/settings/advanced.html @@ -4,7 +4,7 @@ <%= __('Roles and permissions') %> - <% for role in roles %> + <% for role in permissions.roles %> <%= role %> @@ -12,18 +12,18 @@ - <% for capability in capabilities %> + <% for capability in permissions.capabilities %> <%= capability.label %> - <% for role in capability.roles %> + <% for role_key, role in capability.roles %> checked="checked" diff --git a/views/settings/basics.html b/views/settings/basics.html index bd8d5356f2..e89b234f8c 100644 --- a/views/settings/basics.html +++ b/views/settings/basics.html @@ -121,6 +121,9 @@ ><%= segment.name %> <% endfor %> +   + <%= __('Please select a list.') %> +