clearSampleData()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 8
c 1
b 0
f 0
nc 2
nop 0
dl 0
loc 13
rs 10
1
<?php declare(strict_types=1);
2
3
/**
4
 * You may not change or alter any portion of this comment or credits
5
 * of supporting developers from this source code or any supporting source code
6
 * which is considered copyrighted (c) material of the original comment or credit authors.
7
 * This program is distributed in the hope that it will be useful,
8
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10
 *
11
 * @copyright       XOOPS Project (https://xoops.org)
12
 * @license         GNU GPL 2 (https://www.gnu.org/licenses/old-licenses/gpl-2.0.html)
13
 * @since           2.5.9
14
 * @author          Michael Beck (aka Mamba)
15
 */
16
17
use Xmf\Database\TableLoad;
18
use Xmf\Request;
19
use Xmf\Yaml;
20
use XoopsModules\Xoopsmembers\{
21
    Common\Configurator,
22
    Helper,
23
    Utility
24
};
25
26
/** @var Helper $helper */
27
/** @var Utility $utility */
28
/** @var Configurator $configurator */
29
require \dirname(__DIR__, 3) . '/include/cp_header.php';
30
require \dirname(__DIR__) . '/preloads/autoloader.php';
31
32
$op = Request::getCmd('op', '');
33
34
$moduleDirName      = \basename(\dirname(__DIR__));
35
$moduleDirNameUpper = \mb_strtoupper($moduleDirName);
36
37
$helper = Helper::getInstance();
38
// Load language files
39
$helper->loadLanguage('common');
40
41
switch ($op) {
42
    case 'load':
43
        if (Request::hasVar('ok', 'REQUEST') && 1 === Request::getInt('ok', 0)) {
44
            if (!$GLOBALS['xoopsSecurity']->check()) {
45
                redirect_header($helper->url('admin/index.php'), 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
46
            }
47
            loadSampleData();
48
        } else {
49
            xoops_cp_header();
50
            xoops_confirm(['ok' => 1, 'op' => 'load'], 'index.php', constant('CO_' . $moduleDirNameUpper . '_' . 'LOAD_SAMPLEDATA_CONFIRM'), constant('CO_' . $moduleDirNameUpper . '_' . 'CONFIRM'), true);
51
            xoops_cp_footer();
52
        }
53
        break;
54
    case 'save':
55
        saveSampleData();
56
        break;
57
    case 'clear':
58
        if (Request::hasVar('ok', 'REQUEST') && 1 === Request::getInt('ok', 0)) {
59
            if (!$GLOBALS['xoopsSecurity']->check()) {
60
                redirect_header($helper->url('admin/index.php'), 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
61
            }
62
            clearSampleData();
63
        } else {
64
            xoops_cp_header();
65
            xoops_confirm(['ok' => 1, 'op' => 'clear'], 'index.php', sprintf(constant('CO_' . $moduleDirNameUpper . '_' . 'CLEAR_SAMPLEDATA')), constant('CO_' . $moduleDirNameUpper . '_' . 'CONFIRM'), true);
66
            xoops_cp_footer();
67
        }
68
        break;
69
}
70
71
// XMF TableLoad for SAMPLE data
72
73
/**
74
 * @return void
75
 */
76
function loadSampleData(): void
77
{
78
    global $xoopsConfig;
79
    $moduleDirName      = \basename(\dirname(__DIR__));
80
    $moduleDirNameUpper = \mb_strtoupper($moduleDirName);
81
82
    $utility      = new Utility();
83
    $configurator = new Configurator();
84
85
    $tables = \Xmf\Module\Helper::getHelper($moduleDirName)->getModule()->getInfo('tables');
86
87
    $language = 'english/';
88
    if (is_dir(__DIR__ . '/' . $xoopsConfig['language'])) {
89
        $language = $xoopsConfig['language'] . '/';
90
    }
91
92
    // load module tables
93
    foreach ($tables as $table) {
94
        $tabledata = Yaml::readWrapped($language . $table . '.yml');
95
        TableLoad::truncateTable($table);
96
        TableLoad::loadTableFromArray($table, $tabledata);
97
    }
98
99
    // load permissions
100
    $table     = 'group_permission';
101
    $tabledata = Yaml::readWrapped($language . $table . '.yml');
102
    $mid       = \Xmf\Module\Helper::getHelper($moduleDirName)->getModule()->getVar('mid');
103
    loadTableFromArrayWithReplace($table, $tabledata, 'gperm_modid', $mid);
0 ignored issues
show
Bug introduced by
It seems like $mid can also be of type array and array; however, parameter $replace of loadTableFromArrayWithReplace() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

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

103
    loadTableFromArrayWithReplace($table, $tabledata, 'gperm_modid', /** @scrutinizer ignore-type */ $mid);
Loading history...
104
105
    //  ---  COPY test folder files ---------------
106
    if (is_array($configurator->copyTestFolders) && count($configurator->copyTestFolders) > 0) {
107
        //        $file =  \dirname(__DIR__) . '/testdata/images/';
108
        foreach (array_keys($configurator->copyTestFolders) as $i) {
109
            $src  = $configurator->copyTestFolders[$i][0];
110
            $dest = $configurator->copyTestFolders[$i][1];
111
            $utility::rcopy($src, $dest);
112
        }
113
    }
114
    \redirect_header('../admin/index.php', 1, \constant('CO_' . $moduleDirNameUpper . '_' . 'LOAD_SAMPLEDATA_SUCCESS'));
115
}
116
117
/**
118
 * @return void
119
 */
120
function saveSampleData(): void
121
{
122
    global $xoopsConfig;
123
    $moduleDirName      = \basename(\dirname(__DIR__));
124
    $moduleDirNameUpper = \mb_strtoupper($moduleDirName);
125
    $helper             = Helper::getInstance();
126
    $tables             = $helper->getModule()->getInfo('tables');
127
128
    $languageFolder = __DIR__ . '/' . $xoopsConfig['language'];
129
    if (!file_exists($languageFolder . '/')) {
130
        Utility::createFolder($languageFolder . '/');
131
    }
132
    $exportFolder = $languageFolder . '/Exports-' . date('Y-m-d-H-i-s') . '/';
133
    Utility::createFolder($exportFolder);
134
135
    // save module tables
136
    foreach ($tables as $table) {
137
        TableLoad::saveTableToYamlFile($table, $exportFolder . $table . '.yml');
138
    }
139
140
    // save permissions
141
    $criteria = new \CriteriaCompo();
142
    $criteria->add(new \Criteria('gperm_modid', $helper->getModule()->getVar('mid')));
0 ignored issues
show
Bug introduced by
It seems like $helper->getModule()->getVar('mid') can also be of type array and array; however, parameter $value of Criteria::__construct() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

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

142
    $criteria->add(new \Criteria('gperm_modid', /** @scrutinizer ignore-type */ $helper->getModule()->getVar('mid')));
Loading history...
143
    $skipColumns[] = 'gperm_id';
0 ignored issues
show
Comprehensibility Best Practice introduced by
$skipColumns was never initialized. Although not strictly required by PHP, it is generally a good practice to add $skipColumns = array(); before regardless.
Loading history...
144
    TableLoad::saveTableToYamlFile('group_permission', $exportFolder . 'group_permission.yml', $criteria, $skipColumns);
145
    unset($criteria);
146
147
    \redirect_header('../admin/index.php', 1, \constant('CO_' . $moduleDirNameUpper . '_' . 'SAVE_SAMPLEDATA_SUCCESS'));
148
}
149
150
/**
151
 * @return void
152
 */
153
function exportSchema(): void
154
{
155
    $moduleDirName      = \basename(\dirname(__DIR__));
156
    $moduleDirNameUpper = \mb_strtoupper($moduleDirName);
0 ignored issues
show
Unused Code introduced by
The assignment to $moduleDirNameUpper is dead and can be removed.
Loading history...
157
158
    try {
159
        // TODO set exportSchema
160
        //        $migrate = new Migrate($moduleDirName);
161
        //        $migrate->saveCurrentSchema();
162
        //
163
        //        redirect_header('../admin/index.php', 1, constant('CO_' . $moduleDirNameUpper . '_' . 'EXPORT_SCHEMA_SUCCESS'));
164
    } catch (\Throwable $e) {
0 ignored issues
show
Unused Code introduced by
catch (\Throwable $e) is not reachable.

This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.

Unreachable code is most often the result of return, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

Loading history...
165
        exit(constant('CO_' . $moduleDirNameUpper . '_' . 'EXPORT_SCHEMA_ERROR'));
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
166
    }
167
}
168
169
/**
170
 * loadTableFromArrayWithReplace
171
 *
172
 * @param string $table  value with should be used insead of original value of $search
173
 *
174
 * @param array  $data   array of rows to insert
175
 *                       Each element of the outer array represents a single table row.
176
 *                       Each row is an associative array in 'column' => 'value' format.
177
 * @param string $search name of column for which the value should be replaced
178
 * @param string $replace
179
 * @return int number of rows inserted
180
 */
181
function loadTableFromArrayWithReplace($table, $data, $search, $replace)
182
{
183
    /** @var \XoopsMySQLDatabase $db */
184
    $db = \XoopsDatabaseFactory::getDatabaseConnection();
185
186
    $prefixedTable = $db->prefix($table);
187
    $count         = 0;
188
189
    $sql = 'DELETE FROM ' . $prefixedTable . ' WHERE `' . $search . '`=' . $db->quote($replace);
190
191
    $result = $db->queryF($sql);
0 ignored issues
show
Unused Code introduced by
The assignment to $result is dead and can be removed.
Loading history...
192
193
    foreach ($data as $row) {
194
        $insertInto  = 'INSERT INTO ' . $prefixedTable . ' (';
195
        $valueClause = ' VALUES (';
196
        $first       = true;
197
        foreach ($row as $column => $value) {
198
            if ($first) {
199
                $first = false;
200
            } else {
201
                $insertInto  .= ', ';
202
                $valueClause .= ', ';
203
            }
204
205
            $insertInto .= $column;
206
            if ($search === $column) {
207
                $valueClause .= $db->quote($replace);
208
            } else {
209
                $valueClause .= $db->quote($value);
210
            }
211
        }
212
213
        $sql = $insertInto . ') ' . $valueClause . ')';
214
215
        $result = $db->queryF($sql);
216
        if (false !== $result) {
217
            ++$count;
218
        }
219
    }
220
221
    return $count;
222
}
223
224
/**
225
 * @return void
226
 */
227
function clearSampleData(): void
228
{
229
    $moduleDirName      = \basename(\dirname(__DIR__));
230
    $moduleDirNameUpper = \mb_strtoupper($moduleDirName);
231
    $helper             = Helper::getInstance();
232
    // Load language files
233
    $helper->loadLanguage('common');
234
    $tables = $helper->getModule()->getInfo('tables');
235
    // truncate module tables
236
    foreach ($tables as $table) {
237
        \Xmf\Database\TableLoad::truncateTable($table);
238
    }
239
    redirect_header($helper->url('admin/index.php'), 1, constant('CO_' . $moduleDirNameUpper . '_' . 'CLEAR_SAMPLEDATA_OK'));
240
}
241