PluginProbe ʕ •ᴥ•ʔ
JetFormBuilder — Dynamic Blocks Form Builder / 3.6.4.2
JetFormBuilder — Dynamic Blocks Form Builder v3.6.4.2
3.6.5.1 3.6.5 3.6.4.2 3.6.4.1 3.6.4 3.6.3.1 3.6.3 3.6.2.2 3.6.2.1 3.6.2 3.6.1.1 3.6.1 3.6.0.1 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.3.0 1.3.1 1.3.2 1.3.3 1.4.0 1.4.1 1.4.2 1.4.3 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.1.0 2.1.1 2.1.10 2.1.11 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 3.0.0 3.0.0.1 3.0.0.2 3.0.0.3 3.0.1 3.0.1.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.0.1 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.3.2 3.3.3 3.3.3.1 3.3.4 3.3.4.1 3.3.4.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.4.5 3.4.5.1 3.4.5.2 3.4.6 3.4.7 3.4.7.1 3.5.0 3.5.1 3.5.1.1 3.5.1.2 3.5.2 3.5.2.1 3.5.3 3.5.4 3.5.5 3.5.6 3.5.6.1 3.5.6.2 3.5.6.3 3.6.0
jetformbuilder / vendor / woocommerce / action-scheduler / classes / migration / Controller.php
jetformbuilder / vendor / woocommerce / action-scheduler / classes / migration Last commit date
ActionMigrator.php 1 year ago ActionScheduler_DBStoreMigrator.php 1 year ago BatchFetcher.php 1 year ago Config.php 1 year ago Controller.php 1 year ago DryRun_ActionMigrator.php 1 year ago DryRun_LogMigrator.php 1 year ago LogMigrator.php 1 year ago Runner.php 1 year ago Scheduler.php 1 year ago
Controller.php
246 lines
1 <?php
2
3 namespace Action_Scheduler\Migration;
4
5 use ActionScheduler_DataController;
6 use ActionScheduler_LoggerSchema;
7 use ActionScheduler_StoreSchema;
8 use Action_Scheduler\WP_CLI\ProgressBar;
9
10 /**
11 * Class Controller
12 *
13 * The main plugin/initialization class for migration to custom tables.
14 *
15 * @package Action_Scheduler\Migration
16 *
17 * @since 3.0.0
18 *
19 * @codeCoverageIgnore
20 */
21 class Controller {
22 /**
23 * Instance.
24 *
25 * @var self
26 */
27 private static $instance;
28
29 /**
30 * Scheduler instance.
31 *
32 * @var Action_Scheduler\Migration\Scheduler
33 */
34 private $migration_scheduler;
35
36 /**
37 * Class name of the store object.
38 *
39 * @var string
40 */
41 private $store_classname;
42
43 /**
44 * Class name of the logger object.
45 *
46 * @var string
47 */
48 private $logger_classname;
49
50 /**
51 * Flag to indicate migrating custom store.
52 *
53 * @var bool
54 */
55 private $migrate_custom_store;
56
57 /**
58 * Controller constructor.
59 *
60 * @param Scheduler $migration_scheduler Migration scheduler object.
61 */
62 protected function __construct( Scheduler $migration_scheduler ) {
63 $this->migration_scheduler = $migration_scheduler;
64 $this->store_classname = '';
65 }
66
67 /**
68 * Set the action store class name.
69 *
70 * @param string $class Classname of the store class.
71 *
72 * @return string
73 */
74 public function get_store_class( $class ) {
75 if ( \ActionScheduler_DataController::is_migration_complete() ) {
76 return \ActionScheduler_DataController::DATASTORE_CLASS;
77 } elseif ( \ActionScheduler_Store::DEFAULT_CLASS !== $class ) {
78 $this->store_classname = $class;
79 return $class;
80 } else {
81 return 'ActionScheduler_HybridStore';
82 }
83 }
84
85 /**
86 * Set the action logger class name.
87 *
88 * @param string $class Classname of the logger class.
89 *
90 * @return string
91 */
92 public function get_logger_class( $class ) {
93 \ActionScheduler_Store::instance();
94
95 if ( $this->has_custom_datastore() ) {
96 $this->logger_classname = $class;
97 return $class;
98 } else {
99 return \ActionScheduler_DataController::LOGGER_CLASS;
100 }
101 }
102
103 /**
104 * Get flag indicating whether a custom datastore is in use.
105 *
106 * @return bool
107 */
108 public function has_custom_datastore() {
109 return (bool) $this->store_classname;
110 }
111
112 /**
113 * Set up the background migration process.
114 *
115 * @return void
116 */
117 public function schedule_migration() {
118 $logging_tables = new ActionScheduler_LoggerSchema();
119 $store_tables = new ActionScheduler_StoreSchema();
120
121 /*
122 * In some unusual cases, the expected tables may not have been created. In such cases
123 * we do not schedule a migration as doing so will lead to fatal error conditions.
124 *
125 * In such cases the user will likely visit the Tools > Scheduled Actions screen to
126 * investigate, and will see appropriate messaging (this step also triggers an attempt
127 * to rebuild any missing tables).
128 *
129 * @see https://github.com/woocommerce/action-scheduler/issues/653
130 */
131 if (
132 ActionScheduler_DataController::is_migration_complete()
133 || $this->migration_scheduler->is_migration_scheduled()
134 || ! $store_tables->tables_exist()
135 || ! $logging_tables->tables_exist()
136 ) {
137 return;
138 }
139
140 $this->migration_scheduler->schedule_migration();
141 }
142
143 /**
144 * Get the default migration config object
145 *
146 * @return ActionScheduler\Migration\Config
147 */
148 public function get_migration_config_object() {
149 static $config = null;
150
151 if ( ! $config ) {
152 $source_store = $this->store_classname ? new $this->store_classname() : new \ActionScheduler_wpPostStore();
153 $source_logger = $this->logger_classname ? new $this->logger_classname() : new \ActionScheduler_wpCommentLogger();
154
155 $config = new Config();
156 $config->set_source_store( $source_store );
157 $config->set_source_logger( $source_logger );
158 $config->set_destination_store( new \ActionScheduler_DBStoreMigrator() );
159 $config->set_destination_logger( new \ActionScheduler_DBLogger() );
160
161 if ( defined( 'WP_CLI' ) && WP_CLI ) {
162 $config->set_progress_bar( new ProgressBar( '', 0 ) );
163 }
164 }
165
166 return apply_filters( 'action_scheduler/migration_config', $config ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
167 }
168
169 /**
170 * Hook dashboard migration notice.
171 */
172 public function hook_admin_notices() {
173 if ( ! $this->allow_migration() || \ActionScheduler_DataController::is_migration_complete() ) {
174 return;
175 }
176 add_action( 'admin_notices', array( $this, 'display_migration_notice' ), 10, 0 );
177 }
178
179 /**
180 * Show a dashboard notice that migration is in progress.
181 */
182 public function display_migration_notice() {
183 printf( '<div class="notice notice-warning"><p>%s</p></div>', esc_html__( 'Action Scheduler migration in progress. The list of scheduled actions may be incomplete.', 'action-scheduler' ) );
184 }
185
186 /**
187 * Add store classes. Hook migration.
188 */
189 private function hook() {
190 add_filter( 'action_scheduler_store_class', array( $this, 'get_store_class' ), 100, 1 );
191 add_filter( 'action_scheduler_logger_class', array( $this, 'get_logger_class' ), 100, 1 );
192 add_action( 'init', array( $this, 'maybe_hook_migration' ) );
193 add_action( 'wp_loaded', array( $this, 'schedule_migration' ) );
194
195 // Action Scheduler may be displayed as a Tools screen or WooCommerce > Status administration screen.
196 add_action( 'load-tools_page_action-scheduler', array( $this, 'hook_admin_notices' ), 10, 0 );
197 add_action( 'load-woocommerce_page_wc-status', array( $this, 'hook_admin_notices' ), 10, 0 );
198 }
199
200 /**
201 * Possibly hook the migration scheduler action.
202 */
203 public function maybe_hook_migration() {
204 if ( ! $this->allow_migration() || \ActionScheduler_DataController::is_migration_complete() ) {
205 return;
206 }
207
208 $this->migration_scheduler->hook();
209 }
210
211 /**
212 * Allow datastores to enable migration to AS tables.
213 */
214 public function allow_migration() {
215 if ( ! \ActionScheduler_DataController::dependencies_met() ) {
216 return false;
217 }
218
219 if ( null === $this->migrate_custom_store ) {
220 $this->migrate_custom_store = apply_filters( 'action_scheduler_migrate_data_store', false );
221 }
222
223 return ( ! $this->has_custom_datastore() ) || $this->migrate_custom_store;
224 }
225
226 /**
227 * Proceed with the migration if the dependencies have been met.
228 */
229 public static function init() {
230 if ( \ActionScheduler_DataController::dependencies_met() ) {
231 self::instance()->hook();
232 }
233 }
234
235 /**
236 * Singleton factory.
237 */
238 public static function instance() {
239 if ( ! isset( self::$instance ) ) {
240 self::$instance = new static( new Scheduler() );
241 }
242
243 return self::$instance;
244 }
245 }
246