container = $container; $this->settingsService = new SettingsService(); /** * The code that runs during plugin activation */ register_activation_hook( IVYFORMS_FILE, [ self::class, 'activation' ] ); register_activation_hook( IVYFORMS_FILE, [ self::class, 'activationSettings' ] ); /** * The code that runs during plugin deactivation */ register_uninstall_hook( IVYFORMS_FILE, [ self::class, 'deletion'] ); /** Init load */ add_action('plugins_loaded', [ $this, 'init' ]); /** Register API calls */ add_action('rest_api_init', [$this, 'registerRoutes']); /** Isolate API calls */ add_action('wp_ajax_ivyforms_api', [ $this, 'registerRoutes' ]); add_action('wp_ajax_nopriv_ivyforms_api', [ $this, 'registerRoutes' ]); /** Activation hook for new site on multisite setup */ add_action('wpmu_new_blog', [ $this, 'initNewSite' ]); add_filter('wp_script_attributes', ['IvyForms\Services\Shortcode\ShortcodeService', 'addScriptAttribute']); add_action('admin_init', [$this, 'adminInit']); add_filter('admin_body_class', [$this, 'addAdminBodyClass']); } /** * Handle admin initialization tasks * * @return void */ public function adminInit(): void { $this->checkVersionAndHandleActivation(); $this->removeAdminNotices(); } /** * Check a plugin version and handle activation/deactivation if needed * * @return void */ private function checkVersionAndHandleActivation(): void { if (!function_exists('activate_plugin')) { // @phpstan-ignore requireOnce.fileNotFound require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $settingsService = new SettingsService(); $currentVersion = IVYFORMS_VERSION; $savedVersion = $settingsService->getSetting('general', 'version'); if ($savedVersion !== $currentVersion) { deactivate_plugins(IVYFORMS_PLUGIN_SLUG); // @phpstan-ignore argument.type activate_plugin(IVYFORMS_PLUGIN_SLUG); // @phpstan-ignore argument.type $settingsService->setSetting('general', 'version', $currentVersion); } } /** * @throws DependencyException * @throws NotFoundException */ public function registerRoutes(): void { // Register REST API routes after the container is built Routes::registerRoutes($this->container); } /** * Remove admin notices on IvyForms admin pages */ public function removeAdminNotices(): void { // Check if we're on an IvyForms admin page if ($this->isIvyFormsAdminPage()) { // Remove all admin notices remove_all_actions('admin_notices'); remove_all_actions('all_admin_notices'); // For plugins using user_admin_notices or network_admin_notices remove_all_actions('user_admin_notices'); remove_all_actions('network_admin_notices'); wp_register_style( 'ivyforms_admin_global', IVYFORMS_URL . 'frontend/css/global-admin.css', array(), IVYFORMS_VERSION ); wp_enqueue_style('ivyforms_admin_global'); } } /** * Check if current page is an IvyForms admin page * * @SuppressWarnings(PHPMD) * * @return bool */ private function isIvyFormsAdminPage(): bool { if (!is_admin()) { return false; } // Adjust this based on your page's actual slug/identifier return (isset($_GET['page']) && strpos($_GET['page'], 'ivyforms') !== false); } /** * @param bool $networkWide */ public static function activation(bool $networkWide): void { //Network activation if ($networkWide && function_exists('is_multisite') && is_multisite()) { ActivationMultisite::init(); } ActivationDatabaseHook::init(); } /** * @param int $siteId */ public static function initNewSite(int $siteId): void { ActivationNewSiteMultisite::init($siteId); } /** * @throws Exception */ public static function activationSettings(): void { ActivationSettingsHook::init(); } /** * Uninstall function when plugin is deleted * @throws InvalidArgumentException */ public static function deletion(): void { $settingsService = new SettingsService(); if ($settingsService->getSetting('activation', 'deleteTables')) { //Network deletion if ( function_exists('is_multisite') && is_multisite() ) { DeletionMultisite::delete(); } DeleteDatabaseHook::delete(); } } /** * Init * @return void */ public function init(): void { new PreviewService(); try { /** @var MenuManager $menuManager*/ $menuManager = $this->container->get(MenuManager::class); // Register the admin menus and submenus using the 'admin_menu' hook $menuManager->registerMenus(); } catch (DependencyException | NotFoundException $e) { if (defined('WP_DEBUG') && WP_DEBUG) { error_log('Menu error: ' . $e->getMessage()); } } if (!is_admin()) { add_shortcode('ivyforms', function ($atts = []) { return ShortcodeService::shortcodeHandler($atts); }); } } /** * Add admin body class * * @param string $classes * @return string */ public function addAdminBodyClass(string $classes): string { if ($this->settingsService === null) { return $classes; } if ($this->settingsService->getSetting('general', 'fullscreen')) { $classes .= ' ivyforms-fullscreen-mode '; } return $classes; } }