AdminPageFrameworkLoader_AdminPage_Tool_Compiler_Compiler   B
last analyzed

Complexity

Total Complexity 45

Size/Duplication

Total Lines 680
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 45
eloc 312
dl 0
loc 680
rs 8.8
c 0
b 0
f 0

23 Methods

Rating   Name   Duplication   Size   Complexity  
A replyToDownloadFramework() 0 15 2
A ___isAllowedArchivePath() 0 11 3
A ___getDisallowedArchiveDirectoryPaths() 0 35 4
A replyToGetPathInArchiveModified() 0 6 2
A ___getTextDomainModified() 0 9 2
A _replyToModifyPathName() 0 2 1
A ___getFormSubmitValueByFieldIDAsString() 0 14 2
A ___isAllowedToModifyContent() 0 25 5
A ___getCheckedComponents() 0 12 1
A ___getClassNameModifiedByPath() 0 21 3
A ___getFileDocblockModified() 0 16 1
A validate() 0 30 5
A ___getDownloadFrameworkZipFile() 0 23 2
A ___getComponentLabels() 0 12 1
A ___getFieldValuesSanitized() 0 16 1
B addFields() 0 89 1
A replyToFilterFileName() 0 2 1
A ___getClassNameModified() 0 9 2
A replyToGetFileContentModified() 0 23 2
A ___getClassNameOfIncludeListModified() 0 12 1
A construct() 0 23 1
A replyToGetExportHTTPHeaderModified() 0 16 1
A ___getDownloadFileName() 0 17 1

How to fix   Complexity   

Complex Class

Complex classes like AdminPageFrameworkLoader_AdminPage_Tool_Compiler_Compiler often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use AdminPageFrameworkLoader_AdminPage_Tool_Compiler_Compiler, and based on these observations, apply Extract Interface, too.

1
<?php
2
/**
3
 * Admin Page Framework Loader
4
 *
5
 * http://admin-page-framework.michaeluno.jp/
6
 * Copyright (c) 2013-2022, Michael Uno; Licensed GPLv2
7
 */
8
9
/**
10
 * Adds the 'Compiler' section to the 'Compiler' tab.
11
 *
12
 * @since 3.5.4
13
 */
14
class AdminPageFrameworkLoader_AdminPage_Tool_Compiler_Compiler extends AdminPageFrameworkLoader_AdminPage_Section_Base {
15
16
    /**
17
     * Stores the admin page factory object.
18
     * @var AdminPageFramework
19
     */
20
    public $oFactory;
21
22
    /**
23
     * A user constructor.
24
     *
25
     * @param AdminPageFramework $oFactory
26
     * @since 3.5.4
27
     */
28
    protected function construct( $oFactory ) {
29
30
        // Store the factory object in a property.
31
        $this->oFactory = $oFactory;
32
33
        add_action(
34
            'export_name_' . $this->sPageSlug . '_' . $this->sTabSlug,
35
            array( $this, 'replyToFilterFileName' ),
36
            10,
37
            5
38
        );
39
        add_action(
40
            // export_{instantiated class name}_{section id}_{field id}
41
            "export_{$oFactory->oProp->sClassName}_{$this->sSectionID}_download",
42
            array( $this, 'replyToDownloadFramework' ),
43
            10,
44
            4
45
        );
46
        add_action(
47
            "export_header_{$oFactory->oProp->sClassName}_{$this->sSectionID}",
48
            array( $this, 'replyToGetExportHTTPHeaderModified' ),
49
            10,
50
            6
51
        );
52
53
    }
54
55
    /**
56
     * Adds form fields.
57
     * @since 3.5.4
58
     */
59
    public function addFields( $oFactory, $sSectionID ) {
60
61
        $oFactory->addSettingFields(
62
            $sSectionID, // the target section id
63
            array(
64
                'field_id'          => 'version',
65
                'title'             => __( 'Version', 'admin-page-framework-loader' ),
66
                'type'              => 'text',
67
                'save'              => false,
68
                'value'             => AdminPageFramework_Registry::VERSION,
69
                'attributes'        => array(
70
                    'size'          => 20,
71
                    'readonly'      => 'readonly',
72
                ),
73
            ),
74
            array(
75
                'field_id'          => 'class_prefix',
76
                'title'             => __( 'Class Prefix', 'admin-page-framework-loader' ),
77
                'type'              => 'text',
78
                'tip'               => array(
79
                    __( 'Set alphanumeric characters for the class names.', 'admin-page-framework-loader' ),
80
                    __( 'For example, if you set here <code>MyPluginName_</code>, you will need to extend the class named <code>MyClassName_AdminPageFramework</code> instead of <code>AdminPageFramework</code>.', 'admin-page-framework-loader' ),
81
                ),
82
                'description'       => 'e.g.<code>MyPluginName_</code>',
83
                'attributes'        => array(
84
                    'size'          => 30,
85
                    // 'required' => 'required',
86
                    'placeholder'   => __( 'Type a prefix.', 'admin-page-framework-loader' ),
87
                ),
88
            ),
89
            array(
90
                'field_id'          => 'text_domain',
91
                'title'             => __( 'Text Domain', 'admin-page-framework-loader' ),
92
                'type'              => 'text',
93
                'tip'               => __( 'The default text domain of your project.', 'admin-page-framework-loader' ),
94
                'description'       => 'e.g.<code>my-plugin</code>',
95
                'attributes'        => array(
96
                    'size'          => 40,
97
                    // 'required' => 'required',
98
                    'placeholder'   => __( 'Type your text domain.', 'admin-page-framework-loader' ),
99
                ),
100
            ),
101
            array(
102
                'field_id'          => 'components',
103
                'title'             => __( 'Components', 'admin-page-framework-loader' ),
104
                'type'              => 'checkbox',
105
                'description'       => array(
106
                    __( 'Select the components you would like to include in your framework files.', 'admin-page-framework-loader' ),
107
                    __( 'If you are not sure what to select, check them all.', 'admin-page-framework-loader' ),
108
                ),
109
                'label'               => $this->___getComponentLabels(),
110
                'default'             => array_fill_keys(
111
                    array_keys( $this->___getComponentLabels() ),
112
                    true // all true
113
                ),
114
                'select_all_button'     => true,
115
                'select_none_button'    => true,
116
                'label_min_width'       => '100%',
117
                'attributes'            => array(
118
                    'core'      => array(
119
                        'disabled' => 'disabled',
120
                    ),
121
                ),
122
            ),
123
            array(
124
                'field_id'          => 'download',
125
                'title'             => __( 'Compile', 'admin-page-framework-loader' ),
126
                'type'              => 'export',
127
                'label_min_width'   => 0,
128
                'order'             => 100,
129
                'value'             => __( 'Download', 'admin-page-framework-demo' ),
130
                'file_name'         => 'admin-page-framework.zip',  // the default file name. This will be modified by the filter.
131
                'format'            => 'text',  // 'json', 'text', 'array'
132
                'description'       => $oFactory->oUtil->getAOrB(
133
                    class_exists( 'ZipArchive' ),
134
                    __( 'Download the compiled framework files as a zip file.', 'admin-page-framework-loader' ),
135
                    __( 'The zip extension needs to be enabled to use this feature.', 'admin-page-framework-loader' )
136
                ),
137
                'attributes'        => array(
138
                    'disabled'  => $oFactory->oUtil->getAOrB(
139
                        class_exists( 'ZipArchive' ),
140
                        null,
141
                        'disabled'
142
                    ),
143
                ),
144
            )
145
        );
146
147
        new AdminPageFrameworkLoader_AdminPage_Tool_Compiler_CustomFieldTypes( $oFactory, $sSectionID );
148
149
    }
150
        /**
151
         * Returns component labels as an array.
152
         * @since       3.5.4
153
         * @return      array
154
         */
155
        private function ___getComponentLabels() {
156
            return array(
157
                'admin_pages'           => __( 'Admin Pages', 'admin-page-framework-loader' ),
158
                'network_admin_pages'   => __( 'Network Admin Pages', 'admin-page-framework-loader' ),
159
                'post_types'            => __( 'Custom Post Types', 'admin-page-framework-loader' ),
160
                'taxonomies'            => __( 'Taxonomy Fields', 'admin-page-framework-loader' ),
161
                'term_meta'             => __( 'Term Meta', 'admin-page-framework-loader' ),
162
                'meta_boxes'            => __( 'Post Meta Boxes', 'admin-page-framework-loader' ),
163
                'page_meta_boxes'       => __( 'Page Meta Boxes', 'admin-page-framework-loader' ),
164
                'widgets'               => __( 'Widgets', 'admin-page-framework-loader' ),
165
                'user_meta'             => __( 'User Meta', 'admin-page-framework-loader' ),
166
                'utilities'             => __( 'Utilities', 'admin-page-framework-loader' ),
167
            );
168
        }
169
170
    /**
171
     * Validates the submitted form data.
172
     *
173
     * @since  3.5.4
174
     * @param  array $aInputs
175
     * @param  array $aOldInputs
176
     * @param  AdminPageFramework $oAdminPage
177
     * @param  array $aSubmitInfo
178
     * @return array
179
     */
180
    public function validate( $aInputs, $aOldInputs, $oAdminPage, $aSubmitInfo ) {
181
182
        $_bVerified = true;
183
        $_aErrors   = array();
184
        $aInputs    = $this->___getFieldValuesSanitized( $aInputs, $oAdminPage );
185
186
        // the class prefix must not contain white spaces and some other characters not supported in PHP class names.
187
        preg_match(
188
            '/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/',     // pattern - allowed characters for variables in PHP.
189
            $aInputs[ 'class_prefix' ],     // subject
190
            $_aMatches
191
        );
192
        if ( $aInputs[ 'class_prefix' ] && empty( $_aMatches ) ) {
193
            $_aErrors[ $this->sSectionID ][ 'class_prefix' ] = __( 'The prefix must consist of alphanumeric with underscores.', 'admin-page-framework-loader' );
194
            $_bVerified = false;
195
        }
196
197
        if ( ! $aInputs[ 'text_domain' ] ) {
198
            $_aErrors[ $this->sSectionID ][ 'text_domain' ] = __( 'The text domain cannot be empty.', 'admin-page-framework-loader' );
199
            $_bVerified = false;
200
        }
201
202
        // An invalid value is found. Set a field error array and an admin notice and return the old values.
203
        if ( ! $_bVerified ) {
204
            $oAdminPage->setFieldErrors( $_aErrors );
205
            $oAdminPage->setSettingNotice( __( 'There was something wrong with your input.', 'admin-page-framework-loader' ) );
206
            return $aOldInputs;
207
        }
208
209
        return $aInputs;
210
211
    }
212
        /**
213
         * Sanitizes user-submitted form field values.
214
         * @since  3.5.4
215
         * @param  array $aInputs
216
         * @param  AdminPageFramework $oAdminPage
217
         * @return array The modified input array.
218
         */
219
        private function ___getFieldValuesSanitized( array $aInputs, $oAdminPage ) {
220
            $aInputs[ 'class_prefix' ] = trim(
221
                $oAdminPage->oUtil->getElement(
222
                    $aInputs,
223
                    'class_prefix',
224
                    ''
225
                )
226
            );
227
            $aInputs[ 'text_domain' ] = trim(
228
                $oAdminPage->oUtil->getElement(
229
                    $aInputs,
230
                    'text_domain',
231
                    ''
232
                )
233
            );
234
            return $aInputs;
235
        }
236
237
    /**
238
     * Lets the user download their own version of Admin Page Framework.
239
     *
240
     * @since    3.5.4
241
     * @param    array              $aSavedData
242
     * @param    string             $sSubmittedFieldID
243
     * @param    string             $sSubmittedInputID
244
     * @param    AdminPageFramework $oAdminPage
245
     * @callback add_filter() export_{instantiated class name}_{section id}_{field id}
246
     */
247
    public function replyToDownloadFramework( $aSavedData, $sSubmittedFieldID, $sSubmittedInputID, $oAdminPage ) {
248
249
        $_sFrameworkDirPath = AdminPageFrameworkLoader_Registry::$sDirPath . '/library/apf';
250
        if ( ! file_exists( $_sFrameworkDirPath ) ) {
251
            return $aSavedData;
252
        }
253
254
        $_sTempFile = $oAdminPage->oUtil->setTempPath( 'admin-page-framework.zip' );
255
        $_sData     = $this->___getDownloadFrameworkZipFile(
256
            $_sFrameworkDirPath,
257
            $_sTempFile
258
        );
259
        header( "Content-Length: " . strlen( $_sData ) );
260
        unlink( $_sTempFile );
261
        return $_sData;
262
263
    }
264
        /**
265
         * Generates the framework zip data.
266
         *
267
         * @since  3.5.4
268
         * @return string The binary zip data.
269
         */
270
        private function ___getDownloadFrameworkZipFile( $sFrameworkDirPath, $sDestinationPath ) {
271
272
            $_oZip = new AdminPageFramework_Zip(
273
                $sFrameworkDirPath,
274
                $sDestinationPath,
275
                array(
276
                    'include_directory'             => false,   // wrap contents in a sub-directory
277
                    'additional_source_directories' => apply_filters(
278
                        AdminPageFrameworkLoader_Registry::HOOK_SLUG . '_filter_generator_additional_source_directories',
279
                        array() // directory paths
280
                    ),
281
                ),
282
                array(  // callbacks
283
                    'file_name'         => array( $this, 'replyToGetPathInArchiveModified' ),
284
                    'directory_name'    => array( $this, 'replyToGetPathInArchiveModified' ),
285
                    'file_contents'     => array( $this, 'replyToGetFileContentModified' ),
286
                )
287
            );
288
            $_bSucceed = $_oZip->compress();
289
            if ( ! $_bSucceed ) {
290
                return '';
291
            }
292
            return file_get_contents( $sDestinationPath );
293
294
        }
295
            /**
296
             * Modifies the path in the archive which include the file name.
297
             *
298
             * Return an empty string to drop the item.
299
             *
300
             * @remark Gets called earlier than the callback for file contents.
301
             * @param  string $sPathInArchive The internal path of the archive including the parsing file name.
302
             * @since  3.5.4
303
             * @return string
304
             */
305
            public function replyToGetPathInArchiveModified( $sPathInArchive ) {
306
                // Check if it belongs to selected components.
307
                if ( false === $this->___isAllowedArchivePath( $sPathInArchive ) ) {
308
                    return '';  // empty value will drop the entry
309
                }
310
                return $sPathInArchive;
311
            }
312
                /**
313
                 * Checks whether the passed archive path is allowed.
314
                 *
315
                 * @since  3.5.4
316
                 * @param  string  $sPath The path to check. It can be a directory or a file.
317
                 * @return boolean
318
                 */
319
                private function ___isAllowedArchivePath( $sPath ) {
320
                    foreach( $this->___getDisallowedArchiveDirectoryPaths() as $_sDisallowedPath ) {
321
                        $_bHasPrefix = $this->oFactory->oUtil->hasPrefix(
322
                            ltrim( $_sDisallowedPath, '/' ), // needle
323
                            ltrim( $sPath, '/' ) // haystack
324
                        );
325
                        if ( $_bHasPrefix ) {
326
                            return false;
327
                        }
328
                    }
329
                    return true;
330
                }
331
                /**
332
                 * Defines the archive paths of components.
333
                 *
334
                 * @remark      Make sure to have a trailing slash.
335
                 * Otherwise, 'factory/AdminPageFramework' will match items that belong to other components.
336
                 * @since       3.5.4
337
                 */
338
                private $_aComponentPaths = array(
339
                    'admin_pages'           => array(
340
                        'factory/admin_page/',
341
                    ),
342
                    'network_admin_pages'   => array(
343
                        'factory/admin_page/',
344
                        'factory/network_admin_page/',
345
                    ),
346
                    'post_types'            => array(
347
                        'factory/post_type/',
348
                    ),
349
                    'taxonomies'            => array(
350
                        'factory/taxonomy_field/',
351
                    ),
352
                    'term_meta'             => array(
353
                        'factory/taxonomy_field/',
354
                        'factory/term_meta/',
355
                    ),
356
                    'meta_boxes'            => array(
357
                        'factory/meta_box/',
358
                    ),
359
                    'page_meta_boxes'       => array(
360
                        'factory/meta_box/',
361
                        'factory/page_meta_box/',
362
                    ),
363
                    'widgets'               => array(
364
                        'factory/widget/',
365
                    ),
366
                    'user_meta'             => array(
367
                        'factory/user_meta/',
368
                    ),
369
                    'utilities'             => array(
370
                        'utility/',
371
                    ),
372
                );
373
                /**
374
                 * Returns an array holding allowed paths set to the archive.
375
                 * @since  3.5.4
376
                 * @return array
377
                 */
378
                private function ___getDisallowedArchiveDirectoryPaths() {
379
380
                    // Cache
381
                    static $_aDisallowedPaths;
382
                    if ( isset( $_aDisallowedPaths ) ) {
383
                        return $_aDisallowedPaths;
384
                    }
385
386
                    // User selected items
387
                    $_aSelectedComponents = $this->___getCheckedComponents();
388
389
                    // List paths.
390
                    $_aAllComponentsPaths       = array();
391
                    $_aSelectedComponentsPaths  = array();
392
                    foreach( $this->_aComponentPaths as $_sKey => $_aPaths ) {
393
394
                        // Extract all component paths.
395
                        $_aAllComponentsPaths = array_merge(
396
                            $_aAllComponentsPaths,
397
                            $_aPaths
398
                        );
399
400
                        // Extract selected components paths.
401
                        if ( in_array( $_sKey, $_aSelectedComponents, true ) ) {
402
                            $_aSelectedComponentsPaths = array_merge(
403
                                $_aSelectedComponentsPaths,
404
                                $_aPaths
405
                            );
406
                        }
407
408
                    }
409
410
                    return array_diff(
411
                        array_unique( $_aAllComponentsPaths ),
412
                        array_unique( $_aSelectedComponentsPaths )
413
                    );
414
415
                }
416
                    /**
417
                     * Returns an array holding elements that the user has selected in the form.
418
                     * @since  3.5.4
419
                     * @return array
420
                     */
421
                    private function ___getCheckedComponents() {
422
                        $_aChecked = $this->oFactory->oUtil->getElementAsArray(
423
                            $_POST,
424
                            array(
425
                                $this->oFactory->oProp->sOptionKey,
426
                                $this->sSectionID,
427
                                'components' // field id
428
                            ),
429
                            array()
430
                        );
431
                        $_aChecked = array_filter( $_aChecked );
432
                        return array_keys( $_aChecked );
433
                    }
434
435
            /**
436
             * Modifies the file contents of the archive.
437
             *
438
             * @since  3.5.4
439
             * @return string The modified file contents.
440
             */
441
            public function replyToGetFileContentModified( $sFileContent, $sPathInArchive, $sSourceItemPath ) {
442
443
                if ( ! $this->___isAllowedToModifyContent( $sPathInArchive, $sSourceItemPath ) ) {
444
                    return $sFileContent;
445
                }
446
447
                // Modify the file contents.
448
                $sFileContent = apply_filters(
449
                    AdminPageFrameworkLoader_Registry::HOOK_SLUG . '_filter_generator_file_contents',
450
                    $sFileContent,
451
                    $sPathInArchive,
452
                    $this->oFactory->oUtil->getElement(
453
                        $_POST,
454
                        array(
455
                            $this->oFactory->oProp->sOptionKey,
456
                        ),
457
                        array()
458
                    ),
459
                    $this->oFactory
460
                );
461
462
                // At this point, it is a php file.
463
                return $this->___getClassNameModifiedByPath( $sFileContent, $sPathInArchive );
464
465
            }
466
                /**
467
                 * @return boolean
468
                 * @since  3.9.0
469
                 */
470
                private function ___isAllowedToModifyContent( $sPathInArchive, $sSourceItemPath ) {
471
472
                    // Store ignore directory paths
473
                    static $_aIgnoreDirPaths = array();
474
                    $_sSourceItemDirPath = dirname( $sSourceItemPath );
475
                    if ( basename( $sSourceItemPath ) === 'ignore-apf-build.txt' ) {
476
                        $_aIgnoreDirPaths[] = $_sSourceItemDirPath;
477
                    }
478
479
                    // Check the file extension.
480
                    $_aAllowedExtensions = apply_filters(
481
                        AdminPageFrameworkLoader_Registry::HOOK_SLUG . '_filter_generator_allowed_file_extensions',
482
                        array( 'php', 'css', 'js' )
483
                    );
484
                    if ( ! in_array( pathinfo( $sPathInArchive, PATHINFO_EXTENSION ), $_aAllowedExtensions, true ) ) {
485
                        return false;
486
                    }
487
488
                    // Check if it is inside an ignored directory.
489
                    foreach( $_aIgnoreDirPaths as $_sIgnoreDirPath ) {
490
                        if ( false !== strpos( $sSourceItemPath, $_sIgnoreDirPath ) ) {
491
                            return false;
492
                        }
493
                    }
494
                    return true;
495
496
                }
497
                /**
498
                 * Modifies the given file contents.
499
                 *
500
                 * @since  3.5.4
501
                 * @return string
502
                 */
503
                private function ___getClassNameModifiedByPath( $sFileContent, $sPathInArchive ) {
504
505
                    // The inclusion class list file needs to be handled differently.
506
                    if ( $this->oFactory->oUtil->hasSuffix( 'admin-page-framework-class-map.php', $sPathInArchive ) ) {
507
                        return $this->___getClassNameOfIncludeListModified( $sFileContent );
508
                    }
509
510
                    // Insert notes in the header comment.
511
                    if ( $this->oFactory->oUtil->hasSuffix( 'admin-page-framework.php', $sPathInArchive ) ) {
512
                        $sFileContent = $this->___getFileDocblockModified( $sFileContent );
513
                        return $this->___getClassNameModified( $sFileContent );
514
                    }
515
516
                    $sFileContent = $this->___getClassNameModified( $sFileContent );
517
518
                    // If it is the message class, modify the text domain.
519
                    // @deprecated  3.6.0+
520
                    // if ( ! $this->oFactory->oUtil->hasSuffix( 'AdminPageFramework_Message.php', $sPathInArchive ) ) {
521
                        // return $sFileContent;
522
                    // }
523
                    return $this->___getTextDomainModified( $sFileContent );
524
525
                }
526
                    /**
527
                     * Inserts additional information such as an included component list and a date to the file doc-block (the header comment part).
528
                     * @since  3.5.4
529
                     * @return string
530
                     */
531
                    private function ___getFileDocblockModified( $sFileContent ) {
532
533
                        $_aCheckedComponents = $this->oFactory->oUtil->getArrayElementsByKeys(
534
                            $this->___getComponentLabels(),
535
                            $this->___getCheckedComponents()
536
                        );
537
                        $_aInsert            = array(
538
                            'Compiled on ' . date( 'Y-m-d' ),  // today's date
539
                            'Included Components: ' . implode( ', ', $_aCheckedComponents ),
540
                        );
541
                        $_sInsertComment     = apply_filters( AdminPageFrameworkLoader_Registry::HOOK_SLUG . '_filter_generator_header_comment', implode( PHP_EOL . ' * ', $_aInsert ) );
542
                        return preg_replace(
543
                            '#[^\S\r\n]+?\*/#', // needle - matches '*/' or ' */'
544
                            ' * ' . trim( $_sInsertComment ) . PHP_EOL . '\0', // replacement \0 is a back-reference to '*/'
545
                            $sFileContent, // subject
546
                            1 // replace only the first occurrence
547
                        );
548
549
                    }
550
                    /**
551
                     * Modifies the class inclusion list.
552
                     * @since       3.5.4
553
                     * @return      string
554
                     */
555
                    private function ___getClassNameOfIncludeListModified( $sFileContents ) {
556
                        // Replace the array key names.
557
                        $sFileContents = preg_replace_callback(
558
                            '/(["\'])(.+)\1(?=\s?+=>)/',  // pattern '
559
                            array( $this, '_replyToModifyPathName' ),   // callable
560
                            $sFileContents // subject
561
                        );
562
                        // Replace the registry class names.
563
                        return preg_replace_callback(
564
                            '/(=>\s?+)(.+)(?=::)/',  // pattern '
565
                            array( $this, '_replyToModifyPathName' ),   // callable
566
                            $sFileContents // subject
567
                        );
568
                    }
569
                        /**
570
                         * Modifies the regex-matched string.
571
                         * @callback    function        preg_replace_callback()
572
                         * @since       3.5.4
573
                         */
574
                        public function _replyToModifyPathName( $aMatches ) {
575
                            return $this->___getClassNameModified( $aMatches[ 0 ] );
576
                        }
577
578
                /**
579
                 * Modifies the given class name.
580
                 *
581
                 * @since  3.5.4
582
                 * @return string
583
                 */
584
                private function ___getClassNameModified( $sSubject ) {
585
                    $_sPrefix = $this->___getFormSubmitValueByFieldIDAsString( 'class_prefix' );
586
                    return strlen( $_sPrefix )
587
                        ? str_replace(
588
                            'AdminPageFramework', // search
589
                            $_sPrefix . 'AdminPageFramework', // replace
590
                            $sSubject // subject
591
                        )
592
                        : $sSubject;
593
                }
594
                
595
                /**
596
                 * Modifies the text domain in the given file contents.
597
                 *
598
                 * @since  3.5.4
599
                 * @return string
600
                 */
601
                private function ___getTextDomainModified( $sFileContents ) {
602
                    $_sTextDomain = $this->___getFormSubmitValueByFieldIDAsString( 'text_domain' );
603
                    return strlen( $_sTextDomain )
604
                        ? str_replace(
605
                            'admin-page-framework', // search
606
                            $_sTextDomain, // replace
607
                            $sFileContents // subject
608
                        )
609
                        : $sFileContents;
610
                }
611
                    /**
612
                     * Retrieves the value from the $_POST array by the given field ID.
613
                     *
614
                     * @since  3.5.4
615
                     * @return string
616
                     */
617
                    private function ___getFormSubmitValueByFieldIDAsString( $sFieldID ) {
618
                        static $_aCaches=array();
619
                        $_aCaches[ $sFieldID ] = isset( $_aCaches[ $sFieldID ] )
620
                            ? $_aCaches[ $sFieldID ]
621
                            : $this->oFactory->oUtil->getElement(
622
                                $_POST,
623
                                array(
624
                                    $this->oFactory->oProp->sOptionKey,
625
                                    $this->sSectionID,
626
                                    $sFieldID
627
                                ),
628
                                ''
629
                            );
630
                        return trim( ( string ) $_aCaches[ $sFieldID ] );
631
                    }
632
633
    /**
634
     * Modifies the HTTP header of the export field.
635
     *
636
     * @callback  add_filter()      export_header_{...}
637
     * @since     3.5.4
638
     * @return    array
639
     */
640
    public function replyToGetExportHTTPHeaderModified( $aHeader, $sFieldID, $sInputID, $mData, $sFileName, $oFactory ) {
0 ignored issues
show
Unused Code introduced by
The parameter $mData is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

640
    public function replyToGetExportHTTPHeaderModified( $aHeader, $sFieldID, $sInputID, /** @scrutinizer ignore-unused */ $mData, $sFileName, $oFactory ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $oFactory is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

640
    public function replyToGetExportHTTPHeaderModified( $aHeader, $sFieldID, $sInputID, $mData, $sFileName, /** @scrutinizer ignore-unused */ $oFactory ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $sFileName is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

640
    public function replyToGetExportHTTPHeaderModified( $aHeader, $sFieldID, $sInputID, $mData, /** @scrutinizer ignore-unused */ $sFileName, $oFactory ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $sFieldID is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

640
    public function replyToGetExportHTTPHeaderModified( $aHeader, /** @scrutinizer ignore-unused */ $sFieldID, $sInputID, $mData, $sFileName, $oFactory ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $sInputID is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

640
    public function replyToGetExportHTTPHeaderModified( $aHeader, $sFieldID, /** @scrutinizer ignore-unused */ $sInputID, $mData, $sFileName, $oFactory ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
641
642
        $sFileName = $this->___getDownloadFileName();
643
        return array(
644
            'Pragma'                    => 'public',
645
            'Expires'                   => 0,
646
            'Cache-Control'             => array(
647
                'must-revalidate, post-check=0, pre-check=0',
648
                'public',
649
            ),
650
            'Content-Description'       => 'File Transfer',
651
            'Content-type'              => 'application/octet-stream',   // 'application/zip' may work as well
652
            'Content-Transfer-Encoding' => 'binary',
653
            'Content-Disposition'       => 'attachment; filename="' . $sFileName .'";',
654
            // 'Content-Length'            => strlen( $mData ),
655
        ) + $aHeader;
656
657
    }
658
659
    /**
660
     * Filters the exporting file name.
661
     *
662
     * @callback add_filter()    "export_name_{page slug}_{tab slug}" filter.
663
     * @return   string
664
     */
665
    public function replyToFilterFileName( $sFileName, $sFieldID, $sInputID, $vExportingData, $oAdminPage ) {
0 ignored issues
show
Unused Code introduced by
The parameter $sInputID is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

665
    public function replyToFilterFileName( $sFileName, $sFieldID, /** @scrutinizer ignore-unused */ $sInputID, $vExportingData, $oAdminPage ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $sFileName is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

665
    public function replyToFilterFileName( /** @scrutinizer ignore-unused */ $sFileName, $sFieldID, $sInputID, $vExportingData, $oAdminPage ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $sFieldID is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

665
    public function replyToFilterFileName( $sFileName, /** @scrutinizer ignore-unused */ $sFieldID, $sInputID, $vExportingData, $oAdminPage ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $vExportingData is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

665
    public function replyToFilterFileName( $sFileName, $sFieldID, $sInputID, /** @scrutinizer ignore-unused */ $vExportingData, $oAdminPage ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $oAdminPage is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

665
    public function replyToFilterFileName( $sFileName, $sFieldID, $sInputID, $vExportingData, /** @scrutinizer ignore-unused */ $oAdminPage ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
666
        return $this->___getDownloadFileName();
667
    }
668
669
    /**
670
     * Returns the user-set file name.
671
     *
672
     * The user set text domain will be added as a prefix to `admin-page-framework.zip`.
673
     *
674
     * @since       3.5.4
675
     * @return      string
676
     */
677
    private function ___getDownloadFileName() {
678
        $_sFileNameWOExtension = $this->oFactory->oUtil->getElement(
679
            $_POST,
680
            array(
681
                $this->oFactory->oProp->sOptionKey,
682
                $this->sSectionID,
683
                'text_domain' // field id
684
            )
685
        );
686
        $_sFileNameWOExtension = trim( sanitize_text_field( $_sFileNameWOExtension ) );
687
        return $this->oFactory->oUtil->getAOrB(
688
                $_sFileNameWOExtension,
689
                $_sFileNameWOExtension . '-admin-page-framework',
690
                'admin-page-framework'
691
            )
692
            . '.' . AdminPageFramework_Registry::VERSION
693
            . '.zip';
694
    }
695
696
}