gravityview /
GravityView
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | /** |
||
| 3 | * @package GravityView |
||
| 4 | * @license GPL2+ |
||
| 5 | * @author Katz Web Services, Inc. |
||
| 6 | * @link https://gravityview.co |
||
| 7 | * @copyright Copyright 2015, Katz Web Services, Inc. |
||
| 8 | */ |
||
| 9 | |||
| 10 | /** |
||
| 11 | * Extend this class to create a GravityView extension that gets updates from GravityView.co |
||
| 12 | * |
||
| 13 | * @since 1.1 |
||
| 14 | * |
||
| 15 | * @version 1.1.2 Fixed `/lib/` include path for EDDSL |
||
| 16 | */ |
||
| 17 | abstract class GravityView_Extension { |
||
| 18 | |||
| 19 | /** |
||
| 20 | * @var string Name of the plugin in gravityview.co |
||
| 21 | */ |
||
| 22 | protected $_title = NULL; |
||
| 23 | |||
| 24 | /** |
||
| 25 | * @var string Version number of the plugin |
||
| 26 | */ |
||
| 27 | protected $_version = NULL; |
||
| 28 | |||
| 29 | /** |
||
| 30 | * @var int The ID of the download on gravityview.co |
||
| 31 | * @since 1.1 |
||
| 32 | */ |
||
| 33 | protected $_item_id = NULL; |
||
| 34 | |||
| 35 | /** |
||
| 36 | * @var string Translation textdomain |
||
| 37 | */ |
||
| 38 | protected $_text_domain = 'gravityview'; |
||
| 39 | |||
| 40 | /** |
||
| 41 | * @var string Minimum version of GravityView the Extension requires |
||
| 42 | */ |
||
| 43 | protected $_min_gravityview_version = '1.1.5'; |
||
| 44 | |||
| 45 | /** |
||
| 46 | * @var string Minimum version of GravityView the Extension requires |
||
| 47 | */ |
||
| 48 | protected $_min_php_version = '5.2.4'; |
||
| 49 | |||
| 50 | /** |
||
| 51 | * @var string The URL to fetch license info from. Do not change unless you know what you're doing. |
||
| 52 | */ |
||
| 53 | protected $_remote_update_url = 'https://gravityview.co'; |
||
| 54 | |||
| 55 | /** |
||
| 56 | * @var string Author of plugin, sent when fetching license info. |
||
| 57 | */ |
||
| 58 | protected $_author = 'Katz Web Services, Inc.'; |
||
| 59 | |||
| 60 | /** |
||
| 61 | * @var array Admin notices to display |
||
| 62 | */ |
||
| 63 | static private $admin_notices = array(); |
||
| 64 | |||
| 65 | /** |
||
| 66 | * @var bool Is the extension able to be run based on GV version and whether GV is activated |
||
| 67 | */ |
||
| 68 | static $is_compatible = true; |
||
| 69 | |||
| 70 | function __construct() { |
||
| 71 | |||
| 72 | add_action( 'init', array( $this, 'load_plugin_textdomain' ) ); |
||
| 73 | |||
| 74 | add_action( 'admin_init', array( $this, 'settings') ); |
||
| 75 | |||
| 76 | add_action( 'admin_notices', array( $this, 'admin_notice' ), 100 ); |
||
| 77 | |||
| 78 | add_action( 'gravityview/metaboxes/before_render', array( $this, 'add_metabox_tab' ) ); |
||
| 79 | |||
| 80 | if( false === $this->is_extension_supported() ) { |
||
| 81 | return; |
||
| 82 | } |
||
| 83 | |||
| 84 | add_filter( 'gravityview_tooltips', array( $this, 'tooltips' ) ); |
||
| 85 | |||
| 86 | // Save the form configuration. Run at 14 so that View metadata is already saved (at 10) |
||
| 87 | add_action( 'save_post', array( $this, 'save_post' ), 14 ); |
||
| 88 | |||
| 89 | $this->add_hooks(); |
||
| 90 | |||
| 91 | } |
||
| 92 | |||
| 93 | /** |
||
| 94 | * Add a tab to GravityView Edit View tabbed metabox. By overriding this method, you will add a tab to View settings |
||
| 95 | * |
||
| 96 | * @since 1.8 (Extension version 1.0.7) |
||
| 97 | * |
||
| 98 | * @see https://gist.github.com/zackkatz/6cc381bcf54849f2ed41 For example of adding a metabox |
||
| 99 | * |
||
| 100 | * @return array Array of metabox |
||
| 101 | */ |
||
| 102 | protected function tab_settings() { |
||
| 103 | // When overriding, return array with expected keys |
||
| 104 | return array(); |
||
| 105 | } |
||
| 106 | |||
| 107 | /** |
||
| 108 | * If Extension overrides tab_settings() and passes its own tab, add it to the tabbed settings metabox |
||
| 109 | * |
||
| 110 | * @since 1.8 (Extension version 1.0.7) |
||
| 111 | * |
||
| 112 | * @return void |
||
| 113 | */ |
||
| 114 | function add_metabox_tab() { |
||
| 115 | |||
| 116 | $tab_settings = $this->tab_settings(); |
||
| 117 | |||
| 118 | // Don't add a tab if it's empty. |
||
| 119 | if( empty( $tab_settings ) ) { |
||
| 120 | return; |
||
| 121 | } |
||
| 122 | |||
| 123 | $tab_defaults = array( |
||
| 124 | 'id' => '', |
||
| 125 | 'title' => '', |
||
| 126 | 'callback' => '', |
||
| 127 | 'icon-class' => '', |
||
| 128 | 'file' => '', |
||
| 129 | 'callback_args' => '', |
||
| 130 | 'context' => 'side', |
||
| 131 | 'priority' => 'default', |
||
| 132 | ); |
||
| 133 | |||
| 134 | $tab = wp_parse_args( $tab_settings, $tab_defaults ); |
||
| 135 | |||
| 136 | // Force the screen to be GravityView |
||
| 137 | $tab['screen'] = 'gravityview'; |
||
| 138 | |||
| 139 | if( class_exists('GravityView_Metabox_Tab') ) { |
||
| 140 | |||
| 141 | $metabox = new GravityView_Metabox_Tab( $tab['id'], $tab['title'], $tab['file'], $tab['icon-class'], $tab['callback'], $tab['callback_args'] ); |
||
| 142 | |||
| 143 | GravityView_Metabox_Tabs::add( $metabox ); |
||
| 144 | |||
| 145 | } else { |
||
| 146 | |||
| 147 | add_meta_box( 'gravityview_'.$tab['id'], $tab['title'], $tab['callback'], $tab['screen'], $tab['context'], $tab['priority'] ); |
||
| 148 | |||
| 149 | } |
||
| 150 | } |
||
| 151 | |||
| 152 | /** |
||
| 153 | * Load translations for the extension |
||
| 154 | * |
||
| 155 | * 1. Check `wp-content/languages/gravityview/` folder and load using `load_textdomain()` |
||
| 156 | * 2. Check `wp-content/plugins/gravityview/languages/` folder for `gravityview-[locale].mo` file and load using `load_textdomain()` |
||
| 157 | * 3. Load default file using `load_plugin_textdomain()` from `wp-content/plugins/gravityview/languages/` |
||
| 158 | * |
||
| 159 | * @return void |
||
| 160 | */ |
||
| 161 | public function load_plugin_textdomain() { |
||
| 162 | |||
| 163 | if( empty( $this->_text_domain ) ) { |
||
| 164 | do_action( 'gravityview_log_debug', __METHOD__ . ': Extension translation cannot be loaded; the `_text_domain` variable is not defined', $this ); |
||
| 165 | return; |
||
| 166 | } |
||
| 167 | |||
| 168 | // Backward compat for Ratings & Reviews / Maps |
||
| 169 | $path = isset( $this->_path ) ? $this->_path : ( isset( $this->plugin_file ) ? $this->plugin_file : '' ); |
||
| 170 | |||
| 171 | // Set filter for plugin's languages directory |
||
| 172 | $lang_dir = dirname( plugin_basename( $path ) ) . '/languages/'; |
||
| 173 | |||
| 174 | // Traditional WordPress plugin locale filter |
||
| 175 | $locale = apply_filters( 'plugin_locale', get_locale(), $this->_text_domain ); |
||
| 176 | |||
| 177 | $mofile = sprintf( '%1$s-%2$s.mo', $this->_text_domain, $locale ); |
||
| 178 | |||
| 179 | // Setup paths to current locale file |
||
| 180 | $mofile_local = $lang_dir . $mofile; |
||
| 181 | $mofile_global = WP_LANG_DIR . '/' . $this->_text_domain . '/' . $mofile; |
||
| 182 | |||
| 183 | if ( file_exists( $mofile_global ) ) { |
||
| 184 | // Look in global /wp-content/languages/[plugin-dir]/ folder |
||
| 185 | load_textdomain( $this->_text_domain, $mofile_global ); |
||
| 186 | } |
||
| 187 | elseif ( file_exists( $mofile_local ) ) { |
||
| 188 | // Look in local /wp-content/plugins/[plugin-dir]/languages/ folder |
||
| 189 | load_textdomain( $this->_text_domain, $mofile_local ); |
||
| 190 | } |
||
| 191 | else { |
||
| 192 | // Load the default language files |
||
| 193 | load_plugin_textdomain( $this->_text_domain, false, $lang_dir ); |
||
| 194 | } |
||
| 195 | } |
||
| 196 | |||
| 197 | /** |
||
| 198 | * Get license information from GravityView |
||
| 199 | * |
||
| 200 | * @since 1.8 (Extension version 1.0.7) |
||
| 201 | * @return bool|array False: GravityView_Settings class does not exist. Array: array of GV license data. |
||
| 202 | */ |
||
| 203 | protected function get_license() { |
||
| 204 | |||
| 205 | if( !class_exists( 'GravityView_Settings' ) ) { |
||
| 206 | return false; |
||
| 207 | } |
||
| 208 | |||
| 209 | $license = GravityView_Settings::getSetting('license'); |
||
| 210 | |||
| 211 | return $license; |
||
| 212 | } |
||
| 213 | |||
| 214 | /** |
||
| 215 | * Register the updater for the Extension using GravityView license information |
||
| 216 | * |
||
| 217 | * @return void |
||
| 218 | */ |
||
| 219 | public function settings() { |
||
| 220 | |||
| 221 | // If doing ajax, get outta here |
||
| 222 | if( ! is_admin() || ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) { |
||
| 223 | return; |
||
| 224 | } |
||
| 225 | |||
| 226 | if( !class_exists( 'EDD_SL_Plugin_Updater' ) ) { |
||
| 227 | |||
| 228 | $file_path = plugin_dir_path( __FILE__ ) . 'lib/EDD_SL_Plugin_Updater.php'; |
||
| 229 | |||
| 230 | // This file may be in the lib/ directory already |
||
| 231 | if( ! file_exists( $file_path ) ) { |
||
| 232 | $file_path = plugin_dir_path( __FILE__ ) . '/EDD_SL_Plugin_Updater.php'; |
||
| 233 | } |
||
| 234 | |||
| 235 | include_once $file_path; |
||
| 236 | } |
||
| 237 | |||
| 238 | $license = $this->get_license(); |
||
| 239 | |||
| 240 | // Don't update if invalid license. |
||
| 241 | if( false === $license || empty( $license['status'] ) || strtolower( $license['status'] ) !== 'valid' ) { return; } |
||
| 242 | |||
| 243 | new EDD_SL_Plugin_Updater( |
||
| 244 | $this->_remote_update_url, |
||
| 245 | $this->_path, |
||
| 246 | array( |
||
| 247 | 'version' => $this->_version, // current version number |
||
| 248 | 'license' => $license['license'], |
||
| 249 | 'item_id' => $this->_item_id, // The ID of the download on _remote_update_url |
||
| 250 | 'item_name' => $this->_title, // name of this plugin |
||
| 251 | 'author' => strip_tags( $this->_author ) // author of this plugin |
||
| 252 | ) |
||
| 253 | ); |
||
| 254 | } |
||
| 255 | |||
| 256 | /** |
||
| 257 | * Outputs the admin notices generated by the plugin |
||
| 258 | * |
||
| 259 | * @return void |
||
| 260 | */ |
||
| 261 | public function admin_notice() { |
||
| 262 | |||
| 263 | if( empty( self::$admin_notices ) ) { |
||
| 264 | return; |
||
| 265 | } |
||
| 266 | |||
| 267 | foreach( self::$admin_notices as $key => $notice ) { |
||
| 268 | |||
| 269 | echo '<div id="message" class="'. esc_attr( $notice['class'] ).'">'; |
||
| 270 | echo wpautop( $notice['message'] ); |
||
| 271 | echo '<div class="clear"></div>'; |
||
| 272 | echo '</div>'; |
||
| 273 | } |
||
| 274 | |||
| 275 | //reset the notices handler |
||
| 276 | self::$admin_notices = array(); |
||
| 277 | } |
||
| 278 | |||
| 279 | /** |
||
| 280 | * Add a notice to be displayed in the admin. |
||
| 281 | * @param array $notice Array with `class` and `message` keys. The message is not escaped. |
||
| 282 | */ |
||
| 283 | public static function add_notice( $notice = array() ) { |
||
| 284 | |||
| 285 | if( is_array( $notice ) && !isset( $notice['message'] ) ) { |
||
| 286 | do_action( 'gravityview_log_error', __CLASS__.'[add_notice] Notice not set', $notice ); |
||
| 287 | return; |
||
| 288 | } else if( is_string( $notice ) ) { |
||
| 289 | $notice = array( 'message' => $notice ); |
||
| 290 | } |
||
| 291 | |||
| 292 | $notice['class'] = empty( $notice['class'] ) ? 'error' : $notice['class']; |
||
| 293 | |||
| 294 | self::$admin_notices[] = $notice; |
||
| 295 | } |
||
| 296 | |||
| 297 | /** |
||
| 298 | * Extensions should override this hook to add their hooks instead of |
||
| 299 | */ |
||
| 300 | public function add_hooks() { } |
||
| 301 | |||
| 302 | /** |
||
| 303 | * Store the filter settings in the `_gravityview_filters` post meta |
||
| 304 | * @param int $post_id Post ID |
||
| 305 | * @return void |
||
| 306 | */ |
||
| 307 | public function save_post( $post_id ) {} |
||
| 308 | |||
| 309 | /** |
||
| 310 | * Add tooltips for the extension. |
||
| 311 | * |
||
| 312 | * Add a tooltip with an array using the `title` and `value` keys. The `title` key is the H6 tag value of the tooltip; it's the headline. The `value` is the tooltip content, and can contain any HTML. |
||
| 313 | * |
||
| 314 | * The tooltip key must be `gv_{name_of_setting}`. If the name of the setting is "example_extension_setting", the code would be: |
||
| 315 | * |
||
| 316 | * <code> |
||
| 317 | * $tooltips['gv_example_extension_setting'] = array( |
||
| 318 | * 'title' => 'About Example Extension Setting', |
||
| 319 | * 'value' => 'When you do [x] with [y], [z] happens.' |
||
| 320 | * ); |
||
| 321 | * </code> |
||
| 322 | * |
||
| 323 | * @param array $tooltips Existing GV tooltips, with `title` and `value` keys |
||
| 324 | * @return array Modified tooltips |
||
| 325 | */ |
||
| 326 | public function tooltips( $tooltips = array() ) { |
||
| 327 | |||
| 328 | return $tooltips; |
||
| 329 | |||
| 330 | } |
||
| 331 | |||
| 332 | /** |
||
| 333 | * Check whether the extension is supported: |
||
| 334 | * |
||
| 335 | * - Checks if GravityView and Gravity Forms exist |
||
| 336 | * - Checks GravityView and Gravity Forms version numbers |
||
| 337 | * - Checks PHP version numbers |
||
| 338 | * - Sets self::$is_compatible to boolean value |
||
| 339 | * |
||
| 340 | * @uses GravityView_Admin::check_gravityforms() |
||
| 341 | * @return boolean Is the extension supported? |
||
| 342 | */ |
||
| 343 | protected function is_extension_supported() { |
||
| 344 | |||
| 345 | self::$is_compatible = true; |
||
| 346 | |||
| 347 | $message = ''; |
||
| 348 | |||
| 349 | if( !class_exists( 'GravityView_Plugin' ) ) { |
||
| 350 | |||
| 351 | $message = sprintf( __('Could not activate the %s Extension; GravityView is not active.', 'gravityview'), $this->_title ); |
||
| 352 | |||
| 353 | } else if( false === version_compare(GravityView_Plugin::version, $this->_min_gravityview_version , ">=") ) { |
||
| 354 | |||
| 355 | $message = sprintf( __('The %s Extension requires GravityView Version %s or newer.', 'gravityview' ), $this->_title, '<tt>'.$this->_min_gravityview_version.'</tt>' ); |
||
| 356 | |||
| 357 | } else if( isset( $this->_min_php_version ) && false === version_compare( phpversion(), $this->_min_php_version , ">=") ) { |
||
| 358 | |||
| 359 | $message = sprintf( __('The %s Extension requires PHP Version %s or newer. Please ask your host to upgrade your server\'s PHP.', 'gravityview' ), $this->_title, '<tt>'.$this->_min_php_version.'</tt>' ); |
||
| 360 | |||
| 361 | } else { |
||
| 362 | |||
| 363 | self::$is_compatible = GravityView_Compatibility::is_valid(); |
||
|
0 ignored issues
–
show
|
|||
| 364 | |||
| 365 | } |
||
| 366 | |||
| 367 | if ( ! empty( $message ) ) { |
||
| 368 | |||
| 369 | self::add_notice( $message ); |
||
| 370 | |||
| 371 | do_action( 'gravityview_log_error', __METHOD__. ' ' . $message ); |
||
| 372 | |||
| 373 | self::$is_compatible = false; |
||
| 374 | } |
||
| 375 | |||
| 376 | return self::$is_compatible; |
||
| 377 | } |
||
| 378 | |||
| 379 | } |
||
| 380 |
This method has been deprecated. The supplier of the class has supplied an explanatory message.
The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.