* * @link http://looks-awesome.com * @copyright Looks Awesome */ abstract class LAAdminBase { /** @var LADBManager $db */ protected $db = null; protected $context = null; protected $plugin_slug = null; public function __construct($context) { $this->context = $context; $this->plugin_slug = LAUtils::slug($context); $this->db = LAUtils::dbm($context); // Load admin style sheet and JavaScript. add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_scripts' ] ); // Add the options page and menu item. add_action( 'admin_menu', [ $this, 'add_social_stream_admin_menu' ] ); $plugin_basename = $context['plugin_dir_name'] . '/' . LAUtils::slug($context) . '.php'; add_filter( 'plugin_action_links_' . $plugin_basename, [ $this, 'add_action_links' ] ); // Add the options page and menu item. add_action( 'admin_menu', [ $this, 'add_plugin_admin_menu' ] ); foreach (['date_format', 'time_format', 'timezone_string', 'WPLANG'] as $option){ add_action( "update_option_{$option}", [$this->db, 'update_wp_date_format_hook'], 10, 3); } } public function getPluginSlug() { return $this->plugin_slug; } /** * Register the administration menu for this plugin into the WordPress Dashboard menu. * * @since 1.0.0 */ public final function add_social_stream_admin_menu(){ $this->addPluginAdminMenu( [ $this, 'display_plugin_admin_page' ] ); } /** * Register the administration menu for this plugin into the WordPress Dashboard menu. * * @since 1.0.0 */ public final function add_plugin_admin_menu(){ $this->addPluginAdminSubMenu( [ $this, 'display_plugin_admin_subpage' ] ); } /** * Register and enqueue admin-specific style sheet and JavaScript. * * @param $hook * * @since 1.0.0 */ public final function enqueue_admin_scripts($hook) { $screen_id = 'social-apps_page_' . $this->getPluginSlug() . '-admin'; $plugin_directory = $this->context['plugin_url'] . $this->context['plugin_dir_name'] . '/'; $this->enqueueAdminStylesAlways($plugin_directory); $this->enqueueAdminScriptsAlways($plugin_directory); do_action('ff_enqueue_admin_resources'); if ($hook == 'toplevel_page_flow-flow'){ $this->enqueueAdminStylesOnlyAtNewsPage($plugin_directory); $this->enqueueAdminScriptsOnlyAtNewsPage($plugin_directory); } else if ( $screen_id == $hook ) { $this->initPluginAdminPage(); $this->enqueueAdminStylesOnlyAtPluginPage($plugin_directory); $this->enqueueAdminScriptsOnlyAtPluginPage($plugin_directory); do_action('ff_enqueue_admin_resources_only_at_plugin_page'); } } /** * Render the settings page for this plugin. * * @throws Exception * @since 1.0.0 */ public final function display_plugin_admin_page() { if (FF_USE_WP){ if ( !current_user_can( 'manage_options' ) ) { wp_die( __( 'You do not have sufficient permissions to access this page.', $this->getPluginSlug())); } $this->context['admin_page_title'] = esc_html( get_admin_page_title() ); } else { if (!isset($this->context['admin_page_title'])) $this->context['admin_page_title'] = 'Flow-Flow - Social Streams Plugin'; } $this->displayPluginAdminPage(); } /** * Add settings action link to the plugins page. * * @since 1.0.0 * * @param $links * * @return array */ public final function add_action_links( $links ) { return array_merge($this->addActionLinks(), $links); } /** * Render the settings page for this plugin. * @throws Exception * @since 1.0.0 */ public final function display_plugin_admin_subpage(){ $context = $this->contextForAdminPage(); /** @noinspection PhpIncludeInspection */ include_once( $context['root'] . 'views/admin.php'); } protected abstract function initPluginAdminPage(); protected abstract function addPluginAdminSubMenu($displayAdminPageFunction); protected abstract function enqueueAdminStylesAlways($plugin_directory); protected abstract function enqueueAdminScriptsAlways($plugin_directory); protected function enqueueAdminStylesOnlyAtNewsPage($plugin_directory){ wp_enqueue_style('social-streams-news-styles', $plugin_directory . 'css/news.css', [], '1.0'); } protected function enqueueAdminScriptsOnlyAtNewsPage($plugin_directory){ wp_enqueue_script('social-streams-news', $plugin_directory . 'js/news.js', [ 'jquery', 'underscore' ], '1.0'); wp_localize_script('social-streams-news', 'FFIADMIN', [ 'assets_url' => $this->context['plugin_url'] . '/' . $this->context['slug'], 'plugins' => $this->getPluginsState(), 'requirements' => [ 'php_status' => version_compare(phpversion(), '5.3', '>='), 'php' => preg_replace("(-.+)", '', phpversion()), 'wp_status' => (float)get_bloginfo('version') > 4, 'wp' => get_bloginfo('version'), 'memory_status' => preg_replace('/[^0-9]/', '', ini_get('memory_limit')) >= 32, 'memory' => ini_get('memory_limit'), 'upload_status' => preg_replace('/[^0-9]/', '', ini_get('upload_max_filesize')) >= 64, 'upload' => ini_get('upload_max_filesize') ] ] ); } protected abstract function enqueueAdminStylesOnlyAtPluginPage($plugin_directory); protected function enqueueAdminScriptsOnlyAtPluginPage($plugin_directory){ // Enqueue scripts wp_enqueue_script( $this->getPluginSlug() . '-streams-script', $plugin_directory . 'js/streams.js', [ 'jquery' ], LAUtils::version($this->context)); wp_enqueue_script( $this->getPluginSlug() . '-admin-script', $plugin_directory . 'js/admin.js', [ 'jquery', 'backbone', 'underscore' ], LAUtils::version($this->context)); wp_enqueue_script( $this->getPluginSlug() . '-zeroclipboard', $plugin_directory . 'js/zeroclipboard/ZeroClipboard.min.js', [ 'jquery' ], LAUtils::version($this->context)); wp_enqueue_script( $this->getPluginSlug() . '-tinycolor', $plugin_directory . 'js/tinycolor.js', [ 'jquery' ], LAUtils::version($this->context)); wp_enqueue_script( $this->getPluginSlug() . '-colorpickersliders', $plugin_directory . 'js/jquery.colorpickersliders.js', [ 'jquery' ], LAUtils::version($this->context)); wp_localize_script($this->getPluginSlug() . '-admin-script', 'WP_FF_admin', [] ); // old // wp_localize_script($this->getPluginSlug() . '-admin-script', '_nonce', wp_create_nonce('flow_flow_nonce')); // wp_localize_script($this->getPluginSlug() . '-admin-script', 'isWordpress', (string)FF_USE_WP); // wp_localize_script($this->getPluginSlug() . '-admin-script', '_ajaxurl', (string)$this->context['ajax_url']);//??? // wp_localize_script($this->getPluginSlug() . '-admin-script', '_siteurl', site_url()); // wp_localize_script($this->getPluginSlug() . '-admin-script', 'la_plugin_slug_down', LAUtils::slug_down($this->context)); wp_localize_script($this->getPluginSlug() . '-admin-script', 'la_plugin', array('slug_down' => LAUtils::slug_down($this->context))); } protected function addActionLinks(){ $links['settings'] = '' . 'Settings' . ''; $links['docs'] = '' . 'Docs' . ''; return $links; } /** * States: * 0 - not installer * 1 - installed * 2 - activated */ private function getPluginsState(){ $plugins = [ 'flow-flow' => [ 'flow-flow/flow-flow.php', 'flow-flow', ], 'insta-flow' => [ 'insta-flow/insta-flow.php', 'insta-flow-admin', ], 'social-stacks' => [ 'social-stacks/social-stacks.php', 'social-stacks-admin', ] ]; $result = []; foreach ($plugins as $k => $v){ $state = 0; if(file_exists(WP_PLUGIN_DIR . '/' . $v[0])){ $state = 1; } if(is_plugin_active($v[0])){ $state = 2; } $result[$k] = [ 'state' => $state, 'plugin_page_slug' => $v[1] ]; } return $result; } private function addPluginAdminMenu($displayAdminPageFunction){ $plugin_directory = $this->context['plugin_url'] . $this->context['plugin_dir_name']; $wp_version = (float)get_bloginfo('version'); if ($wp_version > 3.8) { // From 3.8 WP supports SVG icons $icon = $plugin_directory . '/assets/social-streams-icon.svg'; } else { $icon = 'dashicons-networking'; } if ( empty ( $GLOBALS['admin_page_hooks']['flow-flow'] ) ){ add_menu_page( 'Social Apps', 'Social Apps', 'manage_options', 'flow-flow', $displayAdminPageFunction, $icon ); } } /** * @throws Exception */ private function displayPluginAdminPage(){ if (FF_USE_WP){ if ( !current_user_can( 'manage_options' ) ) { wp_die( __( 'You do not have sufficient permissions to access this page.', $this->getPluginSlug())); } } $context = $this->context; $activated = $this->db->registrationCheck(); $this->db->dataInit(); $context['activated'] = $activated; /** @noinspection PhpIncludeInspection */ include_once(LAUtils::root($context) . 'views/news.php'); } /** * @return array|null * @throws Exception */ protected function contextForAdminPage() { $context = $this->context; $this->db->dataInit(); /** @var LAFacebookCacheManager $facebookCache */ $facebookCache = $context['facebook_cache']; $context['activated'] = $this->db->registrationCheck(); $context['admin_page_title'] = esc_html( get_admin_page_title() ); $context['options'] = $this->db->getOption('options', true); $context['auth_options'] = $this->db->getOption('fb_auth_options', true); $context['extended_facebook_access_token'] = $facebookCache->getAccessToken(); $context['extended_facebook_access_token_error'] = $facebookCache->getError(); $context['streams'] = $this->db->streamsWithStatus(); $context['sources'] = $this->db->sources(); return $context; } }