<?php namespace Bricksforge\Api; use WP_REST_Controller; /** * REST_API Handler */ class Bricksforge extends WP_REST_Controller { /** * [__construct description] */ public function __construct() { $this->namespace = 'bricksforge/v1'; } /** * Register the routes * * @return void */ public function register_routes() { register_rest_route( $this->namespace, '/get_shortcode_content', array( array( 'methods' => \WP_REST_Server::CREATABLE, 'callback' => array($this, 'get_shortcode_content'), 'permission_callback' => array($this, 'allowed'), ) ) ); register_rest_route( $this->namespace, '/get_user_roles', array( array( 'methods' => \WP_REST_Server::READABLE, 'callback' => array($this, 'get_user_roles'), 'permission_callback' => array($this, 'allow_permission'), ) ) ); register_rest_route( $this->namespace, '/get_permissions_roles', array( array( 'methods' => \WP_REST_Server::READABLE, 'callback' => array($this, 'get_permissions_roles'), 'permission_callback' => array($this, 'allow_permission'), ) ) ); register_rest_route( $this->namespace, '/save_permissions_roles', array( array( 'methods' => \WP_REST_Server::CREATABLE, 'callback' => array($this, 'save_permissions_roles'), 'permission_callback' => array($this, 'allow_permission'), ) ) ); register_rest_route( $this->namespace, '/remove_user_role', array( array( 'methods' => \WP_REST_Server::CREATABLE, 'callback' => array($this, 'remove_user_role'), 'permission_callback' => array($this, 'allow_permission'), ) ) ); register_rest_route( $this->namespace, '/get_global_classes', array( array( 'methods' => \WP_REST_Server::READABLE, 'callback' => array($this, 'get_global_classes'), 'permission_callback' => array($this, 'allow_permission'), ) ) ); register_rest_route( $this->namespace, '/save_global_classes', array( array( 'methods' => \WP_REST_Server::CREATABLE, 'callback' => array($this, 'save_global_classes'), 'permission_callback' => array($this, 'allow_permission'), ) ) ); register_rest_route( $this->namespace, '/save_tools', array( array( 'methods' => \WP_REST_Server::CREATABLE, 'callback' => array($this, 'save_tools'), 'permission_callback' => array($this, 'allow_permission'), ) ) ); register_rest_route( $this->namespace, '/save_elements', array( array( 'methods' => \WP_REST_Server::CREATABLE, 'callback' => array($this, 'save_elements'), 'permission_callback' => array($this, 'allow_permission'), ) ) ); register_rest_route( $this->namespace, '/save_popups', array( array( 'methods' => \WP_REST_Server::CREATABLE, 'callback' => array($this, 'save_popups'), 'permission_callback' => array($this, 'allow_permission'), ) ) ); register_rest_route( $this->namespace, '/save_maintenance', array( array( 'methods' => \WP_REST_Server::CREATABLE, 'callback' => array($this, 'save_maintenance'), 'permission_callback' => array($this, 'allow_permission'), ) ) ); register_rest_route( $this->namespace, '/save_whitelabel', array( array( 'methods' => \WP_REST_Server::CREATABLE, 'callback' => array($this, 'save_whitelabel'), 'permission_callback' => array($this, 'allow_permission'), ) ) ); register_rest_route( $this->namespace, '/save_panel', array( array( 'methods' => \WP_REST_Server::CREATABLE, 'callback' => array($this, 'save_panel'), 'permission_callback' => array($this, 'allow_permission'), ) ) ); register_rest_route( $this->namespace, '/save_settings', array( array( 'methods' => \WP_REST_Server::CREATABLE, 'callback' => array($this, 'save_settings'), 'permission_callback' => array($this, 'allow_permission'), ) ) ); register_rest_route( $this->namespace, '/save_option', array( array( 'methods' => \WP_REST_Server::CREATABLE, 'callback' => array($this, 'save_option'), 'permission_callback' => array($this, 'allow_permission'), ) ) ); register_rest_route( $this->namespace, '/get_option', array( array( 'methods' => \WP_REST_Server::READABLE, 'callback' => array($this, 'get_option'), 'permission_callback' => array($this, 'allow_permission'), ) ) ); register_rest_route( $this->namespace, '/reset_to_default', array( array( 'methods' => \WP_REST_Server::CREATABLE, 'callback' => array($this, 'reset_to_default'), 'permission_callback' => array($this, 'allow_permission'), ) ) ); } /** * Get Shortcode Content * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function get_shortcode_content($request) { $response = $request->get_body(); if (!$response) { return; } $output = ""; $template_id = $response; /** * Workaround: Bricks currently does not load styles if the template is loaded outside. */ $elements = get_post_meta($template_id, BRICKS_DB_PAGE_CONTENT, true); $inline_css = \Bricks\Templates::generate_inline_css($template_id, $elements); $output .= "<style id=\"bricks-inline-css-template-{$template_id}\">{$inline_css}</style>"; $output .= do_shortcode("[bricks_template id=" . $template_id . "]"); return json_encode($output); } /** * Get User Roles * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function get_user_roles($request) { global $wp_roles; $all_roles = $wp_roles->roles; $editable_roles = apply_filters('editable_roles', $all_roles); $response = rest_ensure_response($editable_roles); return $response; } /** * Get Permission Roles * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function get_permissions_roles($request) { $response = rest_ensure_response(get_option('brf_permissions_roles')); return $response; } /** * Save Permission Roles * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function save_permissions_roles($request) { global $wp_roles; $data = $request->get_body(); $roles = json_decode($data); if (!$roles || !is_array($roles)) { return false; } update_option('brf_permissions_roles', $roles); return true; } /** * Removes a custom User Role * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function remove_user_role($request) { $role = $request->get_body(); if ($role != 'administrator' && $role->value != 'editor' && $role->value != 'author' && $role->value != 'contributor' && $role->value != 'subscriber') { remove_role(json_decode($role)); } return true; } /** * Get Global Classes * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function get_global_classes($request) { $response = rest_ensure_response(get_option('brf_global_classes')); return $response; } /** * Save Global Classes * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function save_global_classes($request) { $data = $request->get_body(); $categories = json_decode($data)[0]; $activated = json_decode($data)[1]; if (!isset($categories) || count($categories) == 0) { return false; } if (!isset($activated)) { return false; } if (!is_array($categories)) { return false; } update_option('brf_global_classes_activated', $activated); update_option('brf_global_classes', $categories); $global_classes = get_option('bricks_global_classes') ? get_option('bricks_global_classes') : []; $global_classes_locked = get_option('bricks_global_classes_locked') ? get_option('bricks_global_classes_locked') : []; foreach ($categories as $category) { foreach ($category->classes as $class) { if (($key = array_search($class, $global_classes_locked)) !== false) { unset($global_classes_locked[$key]); } foreach ($global_classes as $key => $row) { if ($row["source"] === 'bricksforge') { unset($global_classes[$key]); } } } } $global_classes = array_values($global_classes); $global_classes_locked = array_values($global_classes_locked); foreach ($categories as $category) { if ($category->classes && !empty($category->classes)) { // Stop here if global classes are not activated if (!get_option('brf_global_classes_activated') || get_option('brf_global_classes_activated') == false) { update_option('bricks_global_classes', $global_classes); update_option('bricks_global_classes_locked', $global_classes_locked); return false; } foreach ($category->classes as $class) { array_push($global_classes, [ "id" => $class, "name" => $class, "settings" => array(), "source" => "bricksforge" ]); array_push($global_classes_locked, $class); } } } $global_classes = array_map("unserialize", array_unique(array_map("serialize", $global_classes))); $global_classes_locked = array_unique($global_classes_locked); $global_classes = array_values($global_classes); $global_classes_locked = array_values($global_classes_locked); update_option('bricks_global_classes', $global_classes); update_option('bricks_global_classes_locked', $global_classes_locked); $success = $this->render_css_files($categories); return $success === true; } /** * Save Tools * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function save_tools($request) { global $wp_roles; $data = $request->get_body(); $tools = json_decode($data); if (!isset($tools) || !is_array($tools)) { return false; } update_option('brf_activated_tools', $tools); return true; } /** * Save Elements * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function save_elements($request) { global $wp_roles; $data = $request->get_body(); $elements = json_decode($data); if (!isset($elements) || !is_array($elements)) { return false; } update_option('brf_activated_elements', $elements); return true; } /** * Save Popups * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function save_popups($request) { global $wp_roles; $data = $request->get_body(); $elements = json_decode($data); if (is_null($elements) || !is_array($elements)) { return false; } update_option('brf_popups', $elements); return true; } /** * Save Maintenance Settings * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function save_maintenance($request) { global $wp_roles; $data = $request->get_body(); $settings = json_decode($data); if (!$settings || !is_array($settings)) { return false; } update_option('brf_maintenance', $settings); return true; } /** * Save White Label Settings * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function save_whitelabel($request) { global $wp_roles; $data = $request->get_body(); $settings = json_decode($data); if (!$settings || !is_array($settings)) { return false; } update_option('brf_whitelabel', $settings); return true; } /** * Save Panel Settings * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function save_panel($request) { global $wp_roles; $data = $request->get_body(); $settings = json_decode($data); if (is_null($settings) || !is_array($settings)) { return false; } update_option('brf_panel', $settings); return true; } /** * Save Settings * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function save_settings($request) { $data = $request->get_body(); $settings = json_decode($data); update_option('brf_settings', $settings); return $settings; } /** * Save Option * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function save_option($request) { $data = $request->get_body(); $key = json_decode($data)[0]; $value = json_decode($data)[1]; update_option($key, $value); } /** * Get Option * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function get_option($request) { $key = $request->get_param('_key'); return get_option($key); } /** * Reset to default * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function reset_to_default($request) { delete_option('brf_permissions_roles'); delete_option('brf_global_classes_activated'); delete_option('brf_global_classes'); delete_option('brf_activated_tools'); delete_option('brf_activated_elements'); delete_option('brf_popups'); delete_option('brf_maintenance'); delete_option('brf_whitelabel'); delete_option('brf_panel'); delete_option('brf_tool_settings'); } /** * Checks if a given request has access to read the data. * * @param WP_REST_Request $request Full details about the request. * * @return true|WP_Error True if the request has read access, WP_Error object otherwise. */ public function allow_permission($request) { return is_user_logged_in(); } /** * Allow Permission * * @param WP_REST_Request $request Full details about the request. * * @return true|WP_Error True if the request has read access, WP_Error object otherwise. */ public function allowed($request) { return true; } /** * Render CSS files for the global classes */ public function render_css_files($categories) { clearstatcache(); if (!file_exists(BRICKSFORGE_CUSTOM_STYLES_FILE) || !is_readable(BRICKSFORGE_CUSTOM_STYLES_FILE)) { return false; } if (!$categories || empty($categories)) { return false; } file_put_contents(BRICKSFORGE_CUSTOM_STYLES_FILE, ' '); $css_content = file_get_contents(BRICKSFORGE_CUSTOM_STYLES_FILE); $pattern = '/(?:[\.]{1})([a-zA-Z_]+[\w_]*)(?:[\s\.\,\{\>#\:]{0})/im'; foreach ($categories as $category) { $prefix = $category->prefix; if (is_null($prefix)) { $css_content .= PHP_EOL . $category->code; } else { $category->code = preg_replace($pattern, '.' . $prefix . '-${1}', $category->code); $css_content .= PHP_EOL . $category->code; } } $result = file_put_contents(BRICKSFORGE_CUSTOM_STYLES_FILE, $css_content); return $result; } }