* @package View_Admin_As */ if ( ! defined( 'VIEW_ADMIN_AS_DIR' ) ) { die(); } /** * Store class that stores the VAA data for use. * * @author Jory Hogeveen * @package View_Admin_As * @since 1.6 * @version 1.8 * @uses \VAA_View_Admin_As_Settings Extends class */ final class VAA_View_Admin_As_Store extends VAA_View_Admin_As_Settings { /** * The single instance of the class. * * @since 1.6 * @static * @var \VAA_View_Admin_As_Store */ private static $_instance = null; /** * The nonce. * * @since 1.3.4 * @since 1.6 Moved to this class from main class. * @var string */ private $nonce = ''; /** * The parsed nonce. * * @since 1.6.2 * @var string */ private $nonce_parsed = ''; /** * View type data. * You can add custom view data with VAA_View_Admin_As_Store::set_data(). * * @see \VAA_View_Admin_As_Store::set_data() * @since 1.7 * @var array { * Default view data. * @type bool[] $caps Since 1.3 Array of available capabilities. * @type \WP_Role[] $roles Since 0.1 Array of available roles (WP_Role objects). * @type string[] $rolenames Since 1.6.4 Array of role names (used for role translations). * @type \WP_User[] $users Since 0.1 Array of available users (WP_User objects). * @type string[] $languages Since 1.8 Array of available locale/languages. * } */ private $data = array( 'caps' => array(), 'roles' => array(), 'rolenames' => array(), 'users' => array(), 'languages' => array(), ); /** * Current (initial) user object. * * @since 0.1 * @since 1.6 Moved to this class from main class. * @var \WP_User */ private $curUser; /** * Current (initial) user session. * * @since 1.3.4 * @since 1.6 Moved to this class from main class. * @var string */ private $curUserSession = ''; /** * Current (initial) user data. * Will contain all properties of the original current user object. * * @since 1.6.3 * @since 1.7.3 Not static anymore. * @var array */ private $curUserData = array(); /** * Does the current (initial) user has full access to all features of this plugin? * * @since 1.6.3 * @since 1.7.3 Not static anymore. * @since 1.7.6 Renamed from $isCurUserSuperAdmin * @var bool */ private $curUserHasFullAccess = false; /** * Selected view data as stored in the user meta. * Format: array( VIEW_TYPE => VIEW_DATA ). * * @since 0.1 * @since 1.6 Moved to this class from main class. * @var array */ private $view = array(); /** * The selected user object (if a view is selected). * Can be the same as $curUser depending on the selected view. * * @since 0.1 * @since 1.6 Moved to this class from main class. * @var \WP_User */ private $selectedUser; /** * The selected capabilities (if a view is selected). * * @since 1.6.2 * @var bool[] */ private $selectedCaps = array(); /** * Populate the instance. * @since 1.6 */ protected function __construct() { parent::__construct( 'view-admin-as' ); self::$_instance = $this; $this->init( true ); } /** * Store the current user and other user related data. * * @since 1.6.3 Moved to this class. * @access public * @param bool $redo (optional) Force re-init? */ public function init( $redo = false ) { static $done = false; if ( $done && ! $redo ) return; $this->set_nonce( 'view-admin-as' ); // Get the current user. $this->set_curUser( wp_get_current_user() ); // Get the current user session (WP 4.0+). $this->set_curUserSession( (string) wp_get_session_token() ); $this->curUserHasFullAccess = VAA_API::user_has_full_access( $this->get_curUser() ); $this->curUserData = get_object_vars( $this->get_curUser() ); // Get database settings. $this->store_optionData( VAA_View_Admin_As::is_network_active() ); // Get database settings of the current user. $this->store_userMeta( get_current_user_id() ); $done = true; } /** * Does the current (original) user has full access to this plugin? * @since 1.8 * @return bool */ public function cur_user_has_full_access() { return (bool) $this->curUserHasFullAccess; } /** * Compare user to the current (original) user. * * @since 1.8 * @param \WP_User|int $user The user to compare. * @return bool */ public function is_curUser( $user ) { if ( $user instanceof WP_User ) { $user = $user->ID; } if ( ! is_numeric( $user ) ) { return false; } return (bool) ( (int) $this->get_curUser()->ID === (int) $user ); } /** * Helper function for is_super_admin(). * Will validate the original user if it is the current user or no user ID is passed. * This can prevent invalid checks after a view is applied. * * @see \VAA_API::is_super_admin() * @deprecated * @todo Remove in 1.9 * * @since 1.6.3 * @since 1.7.3 Not static anymore. * @access public * @param int $user_id (optional). * @return bool */ public function is_super_admin( $user_id = null ) { _deprecated_function( __FUNCTION__, '1.8', 'VAA_API::is_super_admin()' ); if ( null === $user_id || (int) $this->curUser->ID === (int) $user_id ) { return $this->curUserHasFullAccess; } return VAA_API::user_has_full_access( $user_id ); } /** * Get data from the current user, similar to the WP_User object. * Unlike the current user object this data isn't modified after in a view. * This has all public WP_User properties stored as an array. * * @since 1.6.3 * @since 1.7.3 Not static anymore. * @access public * @param string $key (optional). * @return mixed */ public function get_originalUserData( $key = null ) { return VAA_API::get_array_data( $this->curUserData, $key ); } /** * Get current user. * @return \WP_User $curUser Current user object. */ public function get_curUser() { return $this->curUser; } /** * Get current user session. * @return string */ public function get_curUserSession() { return (string) $this->curUserSession; } /** * Get view data (meta). * @since 1.7 * @param string $key Key for array. * @return mixed */ public function get_view( $key = null ) { return VAA_API::get_array_data( $this->view, $key ); } /** * Get view type data * * @since 1.7 * @param string $type Type key. * @param string $key (optional) Type data key. * @return mixed */ public function get_data( $type, $key = null ) { if ( isset( $this->data[ $type ] ) ) { return VAA_API::get_array_data( $this->data[ $type ], $key ); } return null; } /** * Get available capabilities. * @param string $key Cap name. * @return bool[]|bool Array of capabilities or a single capability value. */ public function get_caps( $key = null ) { return $this->get_data( 'caps', $key ); } /** * Get available roles. * @param string $key Role slug/key. * @return \WP_Role[]|\WP_Role Array of role objects or a single role object. */ public function get_roles( $key = null ) { return $this->get_data( 'roles', $key ); } /** * Get the role names. Translated by default. * If key is provided but not found it will return the key (untranslated). * @since 1.6.4 * @param string $key Role slug. * @param bool $translate Translate the role name? * @return string[]|string */ public function get_rolenames( $key = null, $translate = true ) { $val = $this->get_data( 'rolenames', $key ); if ( ! $val ) { /** * Try to fetch role name from WP core. No security risk here. * Check for the wp_roles() function in WP 4.3+. * @since 1.8 */ if ( function_exists( 'wp_roles' ) ) { $wp_roles = wp_roles(); } else { global $wp_roles; } if ( isset( $wp_roles->role_names[ $key ] ) ) { $this->set_rolenames( $wp_roles->role_names[ $key ], $key, true ); return $this->get_rolenames( $key, $translate ); } return ( $key ) ? $key : $val; } if ( $translate ) { if ( is_array( $val ) ) { $val = array_map( 'translate_user_role', $val ); } else { $val = translate_user_role( $val ); } } return $val; } /** * Get available users. * @param string $key User key. * @return \WP_User[]|\WP_User Array of user objects or a single user object. */ public function get_users( $key = null ) { return $this->get_data( 'users', $key ); } /** * Get available languages. * @param string $key Locale key. * @return string[]|string Array of language names or a single language name. */ public function get_languages( $key = null ) { return $this->get_data( 'languages', $key ); } /** * Get the selected user object of a view. * @return \WP_User */ public function get_selectedUser() { return $this->selectedUser; } /** * Get selected capabilities of a view. * @param string $key Cap name. * @return bool[]|bool Array of capabilities or a single capability value. */ public function get_selectedCaps( $key = null ) { return VAA_API::get_array_data( $this->selectedCaps, $key ); } /** * Get the nonce. * @param string $parsed Return parsed nonce? * @return string */ public function get_nonce( $parsed = null ) { return ( $parsed ) ? $this->nonce_parsed : $this->nonce; } /** * Get plugin version. * @todo Move to API. * @return string */ public function get_version() { return strtolower( (string) VIEW_ADMIN_AS_VERSION ); } /** * Get plugin database version. * @todo Move to API. * @return string */ public function get_dbVersion() { return strtolower( (string) VIEW_ADMIN_AS_DB_VERSION ); } /** * Set the current user object. * @param \WP_User $val User object. * @return void */ public function set_curUser( WP_User $val ) { $this->curUser = $val; } /** * Set the current user session. * @param string $val User session ID. * @return void */ public function set_curUserSession( $val ) { $this->curUserSession = (string) $val; } /** * Set the view data. * @param mixed $val Value. * @param string $key (optional) View key. * @param bool $append (optional) Append if it doesn't exist? * @return void */ public function set_view( $val, $key = null, $append = false ) { $this->view = (array) VAA_API::set_array_data( $this->view, $val, $key, $append ); } /** * Set view type data. * * @since 1.7 * @param string $type * @param mixed $val * @param string $key * @param bool $append * @return void */ public function set_data( $type, $val, $key = null, $append = false ) { if ( VAA_API::exists_callable( array( $this, 'set_' . $type ) ) ) { $method = 'set_' . $type; $this->$method( $val, $key, $append ); return; } $current = ( isset( $this->data[ $type ] ) ) ? $this->data[ $type ] : array(); $this->data[ $type ] = (array) VAA_API::set_array_data( $current, $val, $key, $append ); } /** * Set the available capabilities. * @param mixed $val Value. * @param string $key (optional) Cap key. * @param bool $append (optional) Append if it doesn't exist? * @return void */ public function set_caps( $val, $key = null, $append = false ) { $this->data['caps'] = (array) VAA_API::set_array_data( $this->data['caps'], $val, $key, $append ); } /** * Set the available roles. * @param mixed $val Value. * @param string $key (optional) Role name. * @param bool $append (optional) Append if it doesn't exist? * @return void */ public function set_roles( $val, $key = null, $append = false ) { $this->data['roles'] = (array) VAA_API::set_array_data( $this->data['roles'], $val, $key, $append ); } /** * Set the role name translations. * @since 1.6.4 * @param mixed $val Value. * @param string $key (optional) Role name. * @param bool $append (optional) Append if it doesn't exist? * @return void */ public function set_rolenames( $val, $key = null, $append = false ) { $this->data['rolenames'] = (array) VAA_API::set_array_data( $this->data['rolenames'], $val, $key, $append ); } /** * Set the available users. * @param mixed $val Value. * @param string $key (optional) User key. * @param bool $append (optional) Append if it doesn't exist? * @return void */ public function set_users( $val, $key = null, $append = false ) { $this->data['users'] = (array) VAA_API::set_array_data( $this->data['users'], $val, $key, $append ); } /** * Set the languages. * @since 1.8 * @param mixed $val Value. * @param string $key (optional) Role name. * @param bool $append (optional) Append if it doesn't exist? * @return void */ public function set_languages( $val, $key = null, $append = false ) { $this->data['languages'] = (array) VAA_API::set_array_data( $this->data['languages'], $val, $key, $append ); } /** * Set the selected user object for the current view. * @param \WP_User $val User object. * @return void */ public function set_selectedUser( $val ) { $this->selectedUser = $val; } /** * Set the selected capabilities for the current view. * @param array $val Selected capabilities. * @return void */ public function set_selectedCaps( $val ) { $this->selectedCaps = array_filter( (array) $val ); } /** * Set the nonce. * Also sets a parsed version of the nonce with wp_create_nonce(). * @param string $val Nonce. * @return void */ public function set_nonce( $val ) { $this->nonce = (string) $val; $this->nonce_parsed = wp_create_nonce( (string) $val ); } /** * Main Instance. * * Ensures only one instance of this class is loaded or can be loaded. * * @since 1.6 * @access public * @static * @param \VAA_View_Admin_As $caller The referrer class. * @return \VAA_View_Admin_As_Store $this */ public static function get_instance( $caller = null ) { if ( is_null( self::$_instance ) ) { self::$_instance = new self( $caller ); } return self::$_instance; } } // End class VAA_View_Admin_As_Store.