GravityView  2.17
The best, easiest way to display Gravity Forms entries on your website.
Licenses/Framework.php
Go to the documentation of this file.
1 <?php
2 /**
3  * @license GPL-2.0-or-later
4  *
5  * Modified by gravityview on 13-January-2023 using Strauss.
6  * @see https://github.com/BrianHenryIE/strauss
7  */
8 
10 
11 use Exception;
17 
18 class Framework {
19  const ID = 'gk_licenses';
20 
21  const AJAX_ROUTER = 'licenses';
22 
23  /**
24  * @since 1.0.0
25  *
26  * @var Framework Class instance.
27  */
28  private static $_instance;
29 
30  /**
31  * @since 1.0.3
32  *
33  * @var LicenseManager Class instance.
34  */
36 
37  /**
38  * @since 1.0.3
39  *
40  * @var ProductManager Class instance.
41  */
43 
44  /**
45  * @since 1.0.0
46  *
47  * @var array User permissions to manage licenses/products.
48  */
49  private $_permissions;
50 
51  private function __construct() {
52  $permissions = [
53  // Licenses
54  'view_licenses' =>
55  ( ! is_super_admin() && current_user_can( 'gk_foundation_view_licenses' ) ) ||
56  ( ! is_multisite() && current_user_can( 'manage_options' ) ) ||
57  ( is_multisite() && current_user_can( 'manage_network_options' ) && CoreHelpers::is_network_admin() ),
58  'manage_licenses' =>
59  ( ! is_super_admin() && current_user_can( 'gk_foundation_manage_licenses' ) ) ||
60  ( ! is_multisite() && current_user_can( 'manage_options' ) ) ||
61  ( is_multisite() && current_user_can( 'manage_network_options' ) && CoreHelpers::is_network_admin() ),
62  // Products
63  'view_products' =>
64  ( ! is_super_admin() && current_user_can( 'gk_foundation_view_products' ) ) ||
65  ( ! is_multisite() && current_user_can( 'install_plugins' ) ) ||
66  ( is_multisite() && ( current_user_can( 'activate_plugins' ) || current_user_can( 'manage_network_plugins' ) ) ),
67  'install_products' =>
68  ( ! is_super_admin() && current_user_can( 'gk_foundation_install_products' ) ) ||
69  ( ! is_multisite() && current_user_can( 'install_plugins' ) ) ||
70  ( is_multisite() && current_user_can( 'manage_network_plugins' ) && CoreHelpers::is_network_admin() ),
71  'activate_products' =>
72  ( ! is_super_admin() && current_user_can( 'gk_foundation_activate_products' ) ) ||
73  ( ! is_multisite() && current_user_can( 'activate_plugins' ) ) ||
74  ( is_multisite() && ( current_user_can( 'activate_plugins' ) || current_user_can( 'manage_network_plugins' ) ) ),
75  'deactivate_products' =>
76  ( ! is_super_admin() && current_user_can( 'gk_foundation_deactivate_products' ) ) ||
77  ( ! is_multisite() && current_user_can( 'install_plugins' ) ) ||
78  ( is_multisite() && ( current_user_can( 'activate_plugins' ) || current_user_can( 'manage_network_plugins' ) ) ),
79  ];
80 
81  /**
82  * @filter `gk/foundation/licenses/permissions` Modifies permissions to access Licenses functionality.
83  *
84  * @since 1.0.0
85  *
86  * @param array $permissions Permissions.
87  */
88  $this->_permissions = apply_filters( 'gk/foundation/licenses/permissions', $permissions );
89  }
90 
91  /**
92  * Returns class instance.
93  *
94  * @since 1.0.0
95  *
96  * @return Framework
97  */
98  public static function get_instance() {
99  if ( is_null( self::$_instance ) ) {
100  self::$_instance = new self();
101  }
102 
103  return self::$_instance;
104  }
105 
106  /**
107  * Initializes the License framework.
108  *
109  * @since 1.0.0
110  *
111  * @return void
112  */
113  public function init() {
114  if ( ! $this->current_user_can( 'view_licenses' ) && ! $this->current_user_can( 'view_products' ) ) {
115  return;
116  }
117 
118  if ( ! is_admin() || did_action( 'gk/foundation/licenses/initialized' ) ) {
119  return;
120  }
121 
122  add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
123 
124  add_filter( 'gk/foundation/ajax/' . self::AJAX_ROUTER . '/routes', [ $this, 'configure_ajax_routes' ] );
125 
126  $this->_product_manager = ProductManager::get_instance();
127  $this->_license_manager = LicenseManager::get_instance();
128 
129  $this->_product_manager->init();
130  $this->_license_manager->init();
131 
132  EDD::get_instance()->init();
133 
134  $this->add_gk_submenu_item();
135 
136  /**
137  * @action `gk/foundation/licenses/initialized` Fires when the class has finished initializing.
138  *
139  * @since 1.0.0
140  *
141  * @param $this
142  */
143  do_action( 'gk/foundation/licenses/initialized', $this );
144  }
145 
146  /**
147  * Configures AJAX routes handled by this class.
148  *
149  * @since 1.0.0
150  *
151  * @see FoundationCore::process_ajax_request()
152  *
153  * @param array $routes AJAX route to class method map.
154  *
155  * @return array
156  */
157  public function configure_ajax_routes( array $routes ) {
158  return array_merge( $routes, [
159  'get_app_data' => [ $this, 'ajax_get_app_data' ],
160  ] );
161  }
162 
163  /**
164  * AJAX request to get products and/or licenses data.
165  *
166  * @since 1.0.0
167  *
168  * @param array $payload
169  *
170  * @throws Exception
171  *
172  * @return array
173  */
174  public function ajax_get_app_data( array $payload ) {
175  $payload = wp_parse_args( $payload, [
176  'skip_cache' => false,
177  ] );
178 
179  $response = [];
180 
181  if ( ! $this->current_user_can( 'view_products' ) && ! $this->current_user_can( 'view_licenses' ) ) {
182  throw new Exception( esc_html__( 'You do not have permission to view this page.', 'gk-gravityview' ) );
183  }
184 
185  // When skipping cache, we need to first refresh licenses and then products since the products data depends on the licenses data.
186  if ( $this->current_user_can( 'view_licenses' ) ) {
187  $response['licenses'] = LicenseManager::get_instance()->ajax_get_licenses_data( $payload );
188  }
189 
190  if ( $this->current_user_can( 'view_products' ) ) {
191  try {
192  $response['products'] = ProductManager::get_instance()->ajax_get_products_data( $payload );
193  } catch ( Exception $e ) {
194  throw new Exception( $e->getMessage() );
195  }
196  }
197 
198  return $response;
199  }
200 
201  /**
202  * Returns framework title used in admin menu and the UI.
203  *
204  * @since 1.0.0
205  *
206  * @return string
207  */
208  public function get_framework_title() {
209  if ( ! $this->current_user_can( 'view_licenses' ) && ! $this->current_user_can( 'view_products' ) ) {
210  return '';
211  }
212 
213  if ( ! $this->current_user_can( 'view_licenses' ) ) {
214  return esc_html__( 'Products', 'gk-gravityview' );
215  } else if ( ! $this->current_user_can( 'view_products' ) ) {
216  return esc_html__( 'Licenses', 'gk-gravityview' );
217  } else {
218  return esc_html__( 'Products & Licenses', 'gk-gravityview' );
219  }
220  }
221 
222  /**
223  * Adds Licenses submenu to the GravityKit top-level admin menu.
224  *
225  * @since 1.0.0
226  *
227  * @return void
228  */
229  public function add_gk_submenu_item() {
231  'page_title' => $this->get_framework_title(),
232  'menu_title' => $this->get_framework_title(),
233  'capability' => 'manage_options',
234  'id' => self::ID,
235  'callback' => '__return_false', // Content will be injected into #wpbody by gk-licenses.js (see /UI/Licenses/src/main-prod.js)
236  'order' => 1,
237  ], 'top' );
238  }
239 
240  /**
241  * Enqueues UI assets.
242  *
243  * @since 1.0.0
244  *
245  * @param string $page Current page.
246  *
247  * @throws Exception
248  *
249  * @return void
250  */
251  public function enqueue_assets( $page ) {
252  if ( strpos( $page, self::ID ) === false ) {
253  return;
254  }
255 
256  $script = 'licenses.js';
257  $style = 'licenses.css';
258 
259  if ( ! file_exists( CoreHelpers::get_assets_path( $script ) ) ||
260  ! file_exists( CoreHelpers::get_assets_path( $style ) )
261  ) {
262  LoggerFramework::get_instance()->warning( 'UI assets not found.' );
263 
264  return;
265  }
266 
267  wp_enqueue_script(
268  self::ID,
269  CoreHelpers::get_assets_url( $script ),
270  [ 'wp-i18n' ],
271  filemtime( CoreHelpers::get_assets_path( $script ) )
272  );
273 
274  $script_data = array_merge(
275  [
276  'appTitle' => $this->get_framework_title(),
277  'isNetworkAdmin' => CoreHelpers::is_network_admin(),
278  'permissions' => $this->_permissions,
279  ],
280  FoundationCore::get_ajax_params( self::AJAX_ROUTER )
281  );
282 
283  if ( $this->_permissions['view_licenses'] ) {
284  $script_data['licensesData'] = LicenseManager::get_instance()->ajax_get_licenses_data( [] );
285  }
286 
287  wp_localize_script(
288  self::ID,
289  'gkLicenses',
290  [ 'data' => $script_data ]
291  );
292 
293  wp_enqueue_style(
294  self::ID,
295  CoreHelpers::get_assets_url( $style ),
296  [],
297  filemtime( CoreHelpers::get_assets_path( $style ) )
298  );
299 
300  // WP's forms.css interferes with our styles.
301  wp_deregister_style( 'forms' );
302  wp_register_style( 'forms', false );
303 
304  // Load UI translations using the text domain of the plugin that instantiated Foundation.
305  $registered_plugins = FoundationCore::get_instance()->get_registered_plugins();
306  $foundation_source_plugin_data = CoreHelpers::get_plugin_data( $registered_plugins['foundation_source'] );
307  TranslationsFramework::get_instance()->load_frontend_translations( $foundation_source_plugin_data['TextDomain'], '', 'gk-foundation' );
308  }
309 
310  /**
311  * Checks if the current user has a certain permission.
312  *
313  * @since 1.0.0
314  *
315  * @return bool
316  */
317  function current_user_can( $permission ) {
318  return isset( $this->_permissions[ $permission ] ) ? $this->_permissions[ $permission ] : false;
319  }
320 
321  /**
322  * Returns Product Manager class instance.
323  *
324  * @since 1.0.3
325  *
326  * @return ProductManager
327  */
328  function product_manager() {
330  }
331 
332  /**
333  * Returns License Manager class instance.
334  *
335  * @since 1.0.3
336  *
337  * @return LicenseManager
338  */
339  function license_manager() {
341  }
342 
343  /**
344  * Returns link to product search in the licensing page.
345  *
346  * @since 1.0.5
347  *
348  * @param string $product_id Product ID (EDD download ID).
349  *
350  * @return string
351  */
352  function get_link_to_product_search( $product_id ) {
353  $admin_page = 'admin.php?page=' . self::ID;
354 
355  $admin_url = CoreHelpers::is_network_admin() ? network_admin_url( $admin_page ) : admin_url( $admin_page );
356 
357  return add_query_arg(
358  [
359  'filter' => 'custom',
360  'search' => 'id:' . $product_id,
361  ],
362  $admin_url
363  );
364  }
365 }
static add_submenu_item( $submenu, $position='top')
Adds a submenu to the GravityKit top-level menu in WP admin.
Definition: AdminMenu.php:233
get_framework_title()
Returns framework title used in admin menu and the UI.
add_gk_submenu_item()
Adds Licenses submenu to the GravityKit top-level admin menu.
current_user_can( $permission)
Checks if the current user has a certain permission.
ajax_get_app_data(array $payload)
AJAX request to get products and/or licenses data.
configure_ajax_routes(array $routes)
Configures AJAX routes handled by this class.
product_manager()
Returns Product Manager class instance.
license_manager()
Returns License Manager class instance.
static get_instance()
Returns class instance.
Definition: EDD.php:30
get_link_to_product_search( $product_id)
Returns link to product search in the licensing page.